본문 바로가기
CS(Computer Science)

[CS] 스레드(thread) 간략 정리

by 개발지망생 2023. 2. 22.

📖 스레드 정리

  • 하나의 프로세스에 여러 개의 스레드 생성 가능하다.
  • 스레드들은 동시에 실행 가능하다.
  • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능하다.

✅ 스레드의 장단점

📌 스레드 장점

  1. 사용자에 대한 응답성 향상
    • 작업을 분할함으로써 속도를 향상해 사용자에 대한 빠른 반응이 가능하다.
  2. 자원 공유 효율
    • IPC 기법과 같이 프로세스 간 자원 공유를 위해 번거로운 작업이 필요 없다.
    • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능하다.
  3. 작업이 분리되어 코드가 간결
    • 하지만 작성하기 나름이다.

📌 스레드 단점

  1. 여러개의 스레드 중 한 스레드만 문제가 돼도, 전체 프로세스가 영향을 받는다.
  2. 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능이 저하된다.
    • 이 단점은 케바케이다. 그 이유는 리눅스에서는 스레드를 프로세스와 같이 다루는데 스레드를 많이 생성하면 모든 스레드를 스케쥴링해야 하므로, Context Switching이 빈번할 수밖에 없기 때문이다.
  3. 동기화 이슈로 비정상적으로 동작가능하다.
    • 스레드의 가장 큰 단점이다. (동기화 코드를 별도로 적절히 추가해줘야 한다.)

 

✅ 스레드 VS 프로세스

스레드 프로세스
프로세스의 서브셋 독립적
프로세스 자원 공유 각각 독립적인 자원
주소영역 공유 자신만의 주소영역
IPC기법 필요 없음 IPC기법으로 통신

 

📖 스레드 동기화 이슈

스레드의 단점 중에 동기화 이슈가 있다.

 

✅ 동기화 이슈란?

동기화는 작업들 사이에 실행 시기를 맞추는 것인데 여러 스레드가 동일한 자원(데이터)을 동시 수정 했을 때 각 스레드의 결과에 영향을 줌으로써 동기화 이슈가 발생하는 것을 말한다.

 

📌 코드로 다가가 보는 동기화 원인 이해

let a = 0;

a = a + 1;

이라는 간단한 코드가 있다고 가정해 보자.
정상적으로 코드가 온전히 실행된 후 스레드 간 Context Switching이 된 경우면 정상적으로 더해질 것이다. 

하지만,

let a = 0;
for (let i = 0; i < 100000000; i++) {
    a = a + 1;
}

위 예제처럼 반복문의 횟수가 많아져 처리가 많아진다면 코드가 온전히 실행하지 못한 상태에서 스레드 간 Context Switching이 일어난다면 비정상적으로 작동하여 잘못된 값을 도출시킬 수 있는데 이걸 스레드 동기화 이슈의 간단한 예로 들 수 있을 것이다.

 

✅ 동기화 이슈 해결 방법

  • Mutual exclusion (상호 배제) 
    • 특정 데이터를 변경하려 할 때 다른 스레드가 동작하지 못하게 막는 기법이다.
    • 대부분의 스레드 관련 라이브러리는 LOCKING 관련 메서드가 있으며 해당 메서드를 임계영역코드 앞뒤로 넣어주는 방식이다.
👀 임계자원(critical resource)
동시에 읽고 쓰는 데이터를 말한다. 위의 코드 예시를 가져왔을 때
 a = a + 1에서 전역변수인 a가 해당된다.

👀 임계영역(critical section)
임계자원을 읽고 쓰는 코드 자체를 말한다. 위의 코드 예시를 가져왔을 때
a = a + 1 이나 더 나아가 ,
for (let i = 0; i < 100000000; i++) {
    a = a + 1;
}
위처럼 반복을 해주는 반복문의 영역까지도 임계영역이라 할 수 있다.

 

✅ Mutex와 semaphore(세마포어)

📌 Mutex(binary semaphore)

임계구역에 하나의 스레드만 들어갈 수 있다.

 

📌 Semaphore

Mutex같이 하나의 스레드만 들어가는 경우 성능에 지장을 줄 수 있다는 이슈가 있었다. 그래서 counter를 두어서 동시에 리소스에 접근할 수 있는 허용 가능한 스레드 수를 제어해 임계구역에 허용한 스레드 수가 들어갈 수 있게 했다.
하나의 스레드만도 지정가능 하며, 그럴 경우 Mutex와 같은 기능이라 볼 수 있다

 

대게 Mutex기법을 사용한다.

 

✅ deadlock과 starvation 개념 이해

📌 교착상태(deadlock)란?

  • 무한 대기 상태 : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태를 뜻한다.
  • 배차 처리 시스템에서는 일어나지 않는 문제이나 프로세스, 스레드는 이와 같은 상태가 일어날 수 있다.
💡 일상에서 적용하는 deadlock
휴대폰에서 특정 앱이 실행 중 동작이 안될 때 이유 중 하나가 데드락일 경우가 있다.
이를 디버깅하기 위해, 데드락이 무엇인지 이해가 필요하며 운영체제가
해당 앱이 특정 기간 동안 반응이 없으면, 강제 종료시킨다.

📌 기아상태(starvation)란?

프로세스가 동작을 하지 않을 수 있는 경우가 하나 더 있는데 그것이 starvation 이다.
특정 프로세스와 우선순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태를 뜻한다.

 

💡 교착상태와 기아상태 정리
교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생하며,
기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원 할당이 안 되는 경우를 주로 의미한다.

📌 기아상태 해결 방안

  • 우선순위 변경이 있다.
    • 프로세스 우선순위를 수시로 변경해서, 각 프로세스가 높은 우선순위를 가질 기회 주기.
    • 오래 기다린 프로세스의 우선순위를 높여주기.
    • 우선순위가 아닌, 요청 순서대로 처리하는 FIFO 기반 요청큐 사용하기.

댓글