Be ready to study forever - 개발자 꿈나무

Thread의 이해 본문

Programming/Operating System

Thread의 이해

루눌룹 2021. 1. 6. 21:33

스레드란?

스레드는 Light Weight Process라고도 불리며, 프로세스보다 작은 단위의 작업이다. 그러므로, 프로세스는 여러 개의 스레드를 가질 수 있다. 하나의 프로세스를 멀티 스레드로 여러 작업으로 만들면 작업 효율을 높일 수 가 있다. 하지만, 단점으로는 너무 많은 스레드를 돌리게 되면 컨택스트 스위칭이 많이 발생할 수 있기 때문에 더 작업이 느려 질 가능성이 있다.

그림에서 보듯 스레드는 프로세스안에 작은 단위로 존재하고 프로세스의 Stack영역에 별도의 공간을 가지게 된다. 이럴 경우, 부모 프로세스의 Heap영역, Data영역을 공유하므로 프로세스간 데이터 접근이 불가능한 것과는 다르게 다른 프로세스로 접근이 가능하다.

프로세스 내에서 별도의  Stack 영역을 가지지만 프로세스의  Data 영역 , Heap 영역의 값을 공유한다

 

멀티 스레드로 돌릴 경우 ( 멀티 프로세싱 )

프로세스 vs 스레드

-      프로세스는 독립적, 스레드는 프로세스에 종속적임

-      프로세스는 독립적인 자원(Heap, Data, Code, Stack)을 가지지만 스레드는 프로세스 내에서 자원을 공유하고 Stack영역만 별도로 가짐

-      프로세스는 IPC기법으로 통신한다면, 스레드는 Heap영역을 통해 통신이 가능하기 때문에 그럴 필요하 없음

스레드와 동기화 이슈

스레드는 부모 프로세스의 Heap영역과 Data영역을 공유하기 때문에 쓰레드가 동시에 같은 값에 접근하거나 컨택스트 스위칭이 발생해서 값이 저장 되기 전에 다른 스레드에서 값을 바꾸어 놓는다면 매우 곤란하다. (실행할때마다 결과값이 달라 질 수도 있음!)

이러한 동기화 이슈를 해결하기 위해 상호 배제(Mutual Exclusion) 또는 세마포어(Semaphore)기술을 사용함.

-      상호 배제(Mutual Exclusion)

한 스레드가 작업을 마치는 동안 다른 스레드들은 특정한 변수에 접근하지 못하게 하는 방법

파이썬에서 상호 배제 예제코드

Python에서는 lock.acuire() lock.release()로 작업을 마칠 때까지 다른 스레드가 해당 블록(임계 영역) 내에 변수(임계 자원)에 접근 할 수가 없다.

-      세마포어(Semaphore)

상호 배제는 임계 영역에 접근 할 수 있는 스레드가 하나이지만 세마포어는 임계 영역에 접근하는 스레드의 수를 제어할 수 있음. counter를 두어서 다른 스레드가 접근 할 때마다 countercounter—가 되고 counter0이 될 경우 접근 불가. 해제시에는 counter++

세마포어 예제코드

스레드의 교착상태(Deadlock)

서로 다른 스레드들이 상호 배제가 되어 Thread1Thread2작업이 끝나길 기다리고, Thread2Thread1이 끝나길 기다리는 상태

교착상태 해결방법

교착상태는 4가지 해결방법이 있는데, 교착상태 예방, 회피, 발견, 회복 등이 있다

-      교착상태 예방

-      교착상태 회피

-      교착상태 발견 과 회복

'Programming > Operating System' 카테고리의 다른 글

파일 시스템  (0) 2021.01.07
가상 메모리와 페이징  (0) 2021.01.07
프로세스 구조와 IPC(Inter Process Communication)  (0) 2021.01.06
운영체제의 스캐쥴러 이해  (0) 2021.01.06
운영체제 배경지식  (0) 2021.01.05
Comments