운영체제(OS) - 11. 쓰레드

Walker·2021년 10월 20일
0

운영체제(OS)

목록 보기
11/14

쓰레드의 가장 큰 특징이자 장점은 프로세스 안에 동시 실행이 가능하면서도
프로세스안의 데이터를 모두 접근 가능하다는 점이다.

쓰레드를 가장 간단하게 이해하자면 한 프로세스 안에 여러개의 Stack을 가지는 것이라고 할 수 있다.
위와 같이 된다면 Data는 공유하되 각 실행은 Stack 함수에서 병렬적으로 가능하다.
(실제로는 Stack과 Heap 사이에 별도의 쓰레드 공간이 존재 )

요즘은 CPU가 멀티코어로 만들어진 경우가 많기 때문에
쓰레드로 한 프로세스 내의 실행을 분할해 여러 코어에 병렬실행한다면
비약적인 성능향상을 기대할 수 있다.

만약 하나의 서버(server)여러 사용자(client)가 접근하여 자원을 요청한다면
하나하나의 요청을 여러개의 쓰레드로 대응하여 빠르게 응답이 가능해진다.

쓰레드는 기본적으로 Data를 한 프로세스 내에서 공유하므로 IPC와 같은 추가적인 작업이 필요없고
리눅스 기준 한 프로세스 당 기본 4GB를 할당하게 되는데 병렬 실행을 하더라도
여러 프로세스를 만들 필요가 없으므로 한 작업에 할당하는 전체 메모리를 줄일 수 있다.

작업 A, B를 한번에 순차적으로 쓰지 않고 쓰레드 단위로 분리하여
모듈화 할 수 있으므로 Code를 정돈하는데 좀 더 용이 할 수 있다.

한 프로세스 내의 실행이기 때문에 여러개중 하나의 쓰레드만 문제가 생겨도
전체 프로세스
가 처리되지 않는 것이 될 수 있다.

쓰레드 간의 내부처리는 Context Switching이 빈번하게 일어나므로
그 교체 과정에서 자원이 많이 소모될 수 있으니 적절한 수의 쓰레드 선택이 필요하다.

쓰레드의 가장 큰 단점 중 하나는 Data 동기화 문제라고 할 수 있는데
여러 스레드가 동일한 Data에 접근하여 동시에 수정/사용시
각 스레드 결과에 영향을 주고 순서가 정해지지 않았기 때문에 디버깅도 어렵다.

위의 python 코드는 쓰레드의 동기화 문제의 예시로
50개의 쓰레드를 만들어 전역변수 g_count 하나에 1000000번씩 1을 더하는 코드다.
예상대로라면 50 x 1000000 = 50000000이 출력값으로 나와야 하나
12470682가 나왔고 이 출력값은 실행 때마다 달라진다.

왜 이런 출력값이 나오는지 원인을 파악하자면 위 Code의 세부실행을 이해해야 한다.

g_count = g_count + 1 코드는 실제적으로 3가지 실행단계를 거친다

  1. Data 영역에 있는 g_count를 읽어온다
  2. 덧셈 register에 1을 더한다.
  3. 덧셈 register 값(1)을 g_count에 덮어씌운다.

그런데 만약 쓰레드 실행 중에서 1~3 단계 사이에서 Context Switching이 발생한다면
g_count 값의 갱신이 누락되고 이러한 일이 반복되면서 결과적으로 총 합계가 줄게된다.

이러한 쓰레드 간 동기화 문제를 해결하기 위한 방법을 상호 배제(mutual_exclusion)라하며
위의 코드로 이해하자면 lock.aquire()와 lock.release() 함수를 통해
임계영역(g_count = g_count + 1)의 온전한 실행을 보장하여 실행중 Context Switching을 막는다.

세마포어
임계영역에 하나의 스레드만 들어갈 수 있으면 성능상에 아쉬움이 있기 때문에
정해진 갯수까지는 스레드 수를 허가하는 Locking 메커니즘

교착상태(Deadlock)
서로간의 자원 Lock이 중첩되어 무한대기가 발생하는 상태

이러한 4가지 조건을 해결하는 것이 교착상태 해결방안인데
일반적인 방법이 있다기 보다는 프로그래밍을 통해 4가지 중 하나라도 제거하도록 접근

기아상태(Starvation)
특정 프로세스/쓰레드가 우선순위가 낮은데 주어진 자원은 한정적이라
계속해서 자원을 사용하지 못하는 상태

기아상태의 해결도 교착상태와 유사하게 결국은 프로그래밍으로 해결해야 하는 것이고
위의 사항을 염두에 두고 로직을 작성하는 것이 필요하다.

profile
I walk slowly, but I never walk backward. -Abraham Lincoln-

0개의 댓글