스레드 동기화 기법에는 두 종류가 있다.
1. 실행 순서의 동기화) 스레드의 실행 순서를 정의하고 이 순서에 따르도록 하는 것
2. 메모리 접근의 동기화) 메모리의 동시 접근을 막고 실행 순서보다는 하나의 스레드만 메모리에 접근하도록 하는 것
Microsoft의 Windows의 동기화 객체는 크게 두 종류가 있다.
1. 유저 모드 동기화 기법(스레드 간 동기화 객체)
- 동기화 과정에서 커널 코드가 실행되지 않는다.
- 동기화를 위해서 커널 모드로 전환이 불필요해 성능상 이점이 존재
- 기능상의 제한도 존재
2. 커널 모드 동기화 기법(프로세스/스레드 간 동기화 객체)
- 커널에서 제공하는 동기화 기능을 활용
- 동기화 관련 함수를 실행할 때마다 커널 모드로 전환으로 인해 성능 저하 유발
- 유저 모드 동기화 보다 기능상의 이점이 존재
<유저 모드 동기화>
1. Criticial Section: 동일 프로세스에 여러 개의 스레드가 공유 자원에 접근할 때 배타적인 제어, 프로세스 간 동기화에 사용 불가능
2. Interlocked Family of Function
<커널 모드 동기화>
1. Mutex: 리소스의 배타적 제어
2. Semaphore: 리소스를 동시에 사용할 수 있는 프로세스/스레드 수 제어
3. Event: 다른 스레드에 이벤트를 통지하여 객체의 시그널/비 시그널 상태를 자유롭게 제어
위의 자료에서 대기용 API가 존재하는데 이는 지정된 개체를 시그널 상태가 될 때까지 혹은 비 시그널 상태로 제한시간동안 기다리게 한다.
시그널 상태란 Task가 공유 자원에 접근이 가능한 경우를 말한다.
비시그널 상태란 Task가 공유 자원에 접근이 불가능한 경우를 말한다.
Semaphore)
// 세마포어는 카운트를 지니는데, 세마포어가 생성될 때 lInitialCount에 의해서 초기 카운트가 결정됨.
// 초기 카운트 0: Non0Signaled 상태
// 초키 카운트 1: Signaled 상태
// 초기 카운트 10이면, WaitForSingleObject 함수를 호출하여 세마포어 핸들을 인자로 전달하면서
// 그 값이 하나씩 감소하면서 함수를 반환하고 11번 째 호출 시 세마포어 카운트가 0인 관계로 블로킹
// 상태에 들어감. 따라서, 총 열개의 쓰레드가 임계 영역에 동시에 들어갈 수 있음.
Critical Section에 접근 가능한 스레드의 숫자를 조절할 수 있다.
OS에서의 정의와 Windows에서의 정의를 구분할 필요가 있다.
윈도 API의 WaitForSingleObject()는 OS 세마포어의 Wait()과 같은 기능을 하고
ReleaseSemaPhore()는 OS 세마포어의 Signal()과 같은 기능을 한다.
OS 세마포어에서 일반적으로 singnal 연산 수행 시 count를 1씩 증가시키는 것이 일반적이지만
윈도에서는 꼭 그렇지는 않은 것 같다.
Event 객체)
수동 Reset의 특징을 보면 우선 SetEvent()의 경우 ResetEvent()를 만날 때까지 Signal 상태가 유지된다.
따라서 non-signaling 상태가 되면 thread1,2 가 non signaling 상태를 만나 waitForSingleObject()에 의해 block 된다.
즉 waiting 상태에 들어간다.
PulseEvent의 경우 wait 상태에 있던 프로세스를 하나만 실행하고 마친 후 이를 재개한다.
그러나 PulseEvent의 경우 thread 1,2 가 계속 waiting 상태에 있는 것이 아니라 pulseEvent()를 다시 만나면
전부 ready() 상태로 보낸다.
수동 Reset과 차이점은 setevent()가 실행될 때 wait 상태에 들어간 스레드를 한 개만 깨운다.(누가 깨울지는 OS가 안다.)
pulseEvent도 wait 상태에 들어간 스레드를 한개만 깨운다.
'Computer Science > 운영체제' 카테고리의 다른 글
chapter 09. Main Memory (0) | 2022.06.04 |
---|---|
Chapter 08. Deadlocks (0) | 2022.06.03 |
Chapter 07-1. Synchronization Examples (0) | 2022.06.02 |
Chapter 06. Synchronization Tools (0) | 2022.06.01 |
Chapter 05. CPU Scheduling (0) | 2022.05.30 |