운영체제 OS

[운영체제/OS] Threads & Synchronization 스레드&동기화_Mutex Lock, Semaphore

프로세스 내의 제어 흐름은 단일 스레드 프로세스가 있고

멀티 스레드 프로세스가 있습니다. 멀티에서는 하나의 프로세스 내에 여러 제어(control)이 존재합니다.

 

스레드는 CPU 이용의 기본 단위로서 프로세스와의 차이는

프로세스는 독립적 주소 공간을 가지지만

스레드는 주소공간을 공유하고 명령어만 다르게 합니다.

 

따라서 동일 프로세스의 여러 스레드는 코드 영역, 데이터 영역, 운영체제 자원 등을 공유합니다.

그리고 각자 flow는 병렬적으로 제어되는 것입니다.

그 덕에 동시에 하나 이상의 작업을 실행할 수 있습니다. 

 

단일 vs 멀티 스레드 프로세스

스레드 풀(Thread Pool)

작업을 기다리는 스레드들의 집합 

프로세스는 시작할 때 일정 수의 스레드를 생성하여 스레드 풀에 놓는다.

요청 받으면, 풀로부터 서버가 스레드를 깨워 요청 전달.

요청완료 후 풀로 반환되고 다음 작업을 기다린다.

 

장점: 이미 존재하는 스레드에 요청하는 것이 새 스레드 생성보다 빠르다. 

 

 

임계 구역(Critical Section) 문제 

while(true){

  진입 영역(entry section)

  임계 구역(critical section)

  진출 영역(exit section)

  나머지 영역(remainder section)

}

 

임계 구역 문제 해결을 위해서 3가지 요구사항을 충족해야 합니다. 

1. 상호배제(mutual exclusion): 만약 한 프로세스가 임계 구역 수행중이라면, 다른 어떤 프로세스도 수행할 수 없다.

2. 진행(progress): 임계구역 수행 프로세스가 없고, 그 영역 진입을 희망하는 프로세스들이 있다면, 무한 지연되어선 안된다.->교착상태 없는 deadlock-free 조건

3. 한정된 대기(bounded waiting): 다른 프로세스들이 임계 구역에 들어가는 것이 허락되는 한계 시간(요청하고 요청 허락 전까지 기다리는 시간)은 일정 시간으로 유한해야 한다. 기아없는 starvation-free 조건 

 

이 3가지가 만족하도록 하는 도구 두 가지가 바로 mutex lock과 semaphore입니다.

 

Mutex Lock

쉽게 말해 문을 잠그는 것. 할일 다 하면 문을 연다.

임계 구역에 들어가기 전에 반드시 lock획득해야 하고, 나올 땐 lock을 반환해야 합니다.

acquire()과 release()는 원자적으로 수행되어야 합니다.

while(true){
	acquire lock
     critical section
    release lock
     remainder section
}
acquire(){
 	while(!available)
 	 ;/*busy wait*/
  	available = false;
 }
 release(){
 	available = true;
}

 

Semaphore

세마포어는 정수++이나 정수--로 

더 많은 애들이 한번에 특정 임게 영역에 들어갈 수 있게 해줍니다.

하지만 wait해서 들어갈 땐 한번에 하나만! 수행해야합니다.

wait(S){
	while(S<=0)
    	;//busy wait
    S--;
}
signal(S){
	S++;
}

wait()는 획득하는 연산, signal()은 풀어주는 연산