본문 바로가기

한권떼기/운영체제(Operating System Concepts)

[한권떼기] 운영체제 08번째. Thread와 Lock, Semaphore

728x90
반응형

**본 글의 일부분은 서적 'Operating Systems: Three Easy Pieces by Remzi H.Arpaci-Dusseau, Andrea C.Arpaci-Dusseau', 'Operation System Concepts Abraham Silberschatz 외 2' 내의 이미지와 내용을 포함하고 있습니다

 

 

Thread

CPU utilization의 기본 단위이며, 하나의 프로세스가 여러 개의 쓰레드를 가질 수 있음

 

100개의 요청이 들어온다고 가정할 때, 프로세스가 하나만 있다면 1개의 요청을 처리하기 위해서 99개의 요청이 대기해야 함

이를 해결하기 위해서 100개의 프로세스를 만들 수 있다면 좋겟지만, 메모리 공간이 많이 필요하고 프로세스 생성에 걸리는 시간때문에 비효율적임

따라서 code, data, resources영역은 공유 (+open files, signal handlers)하고

register value, stack은 자신만의 메모리로 갖는 (+thread ID) 쓰레드를 사용

 

 

Process vs Thread

아래는 프로세스 하나에서 작업을 수행했을 때와 프로세스에서 쓰레드 3개를 만들어서 작업을 수행했을 때의 모습임

Process에서 fork()를 이용하여 다른 Process를 만들면 data, code, stack 영역이 모두 새로 만들어지지만,

Process에서 thread를 생성하면 data, code 영역은 공유하고 stack 영역만 새로 할당됨

 

이로 인해 작업을 수행하다가 blocked 상태가 되면 다른 쓰레드가 다른 요청을 받으면 되기 때문에 응답성이 좋아짐

또한 메모리 공유와 생성비용적으로도 절약이고, 병렬처리가 가능하여 멀티프로세서 환경에서 효율성이 좋아짐

 

 

Race Condition

자원을 공유하기 때문에 여러 개의 프로세스들이 하나의 자원에 동시에 접근하고 변경하는 상황이 생기는데 이것이 race condition임

해결책

동시에 동작하는 프로세스 간에 동기화를 시켜줌.

CPU가 하나만 있다면 race condition은 생기지 않을까?
그렇지 않습니다. 싱글 코어 프로세서에서도 CPU 스케쥴러에 따라서 race condition이 발생할 수 있습니다.

Critical Section

공유 data가 접근되는 코드의 부분

Critical Section에 하나의 프로세스만 접근할 수 있도록 하여서 문제가 생기지 않도록 해야 함

Mutual exclusion을 통해서 오직 하나의 쓰레드만 critical section에 들어가고, 나머지는 다 exclusion이 풀리기까지 대기하여 해결

 

 

 

Lock (=Mutex)

Critical Section 에 진입하는 프로세스는 Lock 을 획득하고 Critical Section 을 빠져나오면서 unlock하여,

락 해제 전까지는 다른 프로세스가 공유 자원에 접근하지 못하도록 함

임계구역에 들어갈 수 있는지를 ture, false 상태를 두 개의 상태를 이용하여 구현할 수 있음

-> 하나의 쓰레드가 들어가면 다른 쓰레드는 들어갈 수 없음

 

Lock은 spinlock 방식, sleep 방식이 있으며, 두 개의 방식을 섞은 형태도 있음.(Two-phase Locks)

spinlock: CPU를 계속 소모하여 무한 루프를 돌며 lock이 풀리길 기다림. 임계구역이 짧을때 좋음.

sleep: lock이 걸려있으면 block 상태로 변경하여 대기하다가 lock이 풀리면 깨어남. 임계구역이 길 때 좋음.

 

Semaphore

Semaphore은 프로세스끼리 공유되는 하나의 정수를 의미. 이 값을 가지고 mutual exclustion을 함.

Lock과 비슷하지만 Semphore는 0~n까지 다양한 상태를 가질 수 있음

자원을 사용하면 하나씩 숫자가 줄어들고, 해제하면 하나씩 숫자가 늘어나기 때문에

0이 잠금상태, 1~n까지의 숫자가 잠금해제 상태임

 

Lock과 Semaphore의 가장 핵심적인 차이는?
Lock의 경우에는 Lock을 건 쓰레드만이 Lock을 해제하고, 변경시킬 수 있습니다.
하지만 Semaphore의 경우 여러 쓰레드가 접근할 수 있고, 값 또한 Semaphore로 접근 권한을 획득한 쓰레드가 아닌 다른 쓰레드가 변경시킬 수 있습니다. 이런 이유 때문에 사실상 Lock이 더 자주 사용된다고 합니다.

 

Deadlock

프로세스A가 Lock을 걸고 리소스A'를 사용중이던 때 프로세스B가 Lock을 걸고 사용하는 리소스B'가 필요해지고,

프로세스B또한 프로세스A가 가지고 있는 리소스가 필요해지면서 프로세스가 서로의 Lock으로 인해 무한정으로 기다리게 되는 상태

 

 

 

728x90
반응형