본문 바로가기

Computer Science/운영체제

Chapter 07-2. Windows API

728x90
반응형

스레드 동기화 기법에는 두 종류가 있다.

1. 실행 순서의 동기화) 스레드의 실행 순서를 정의하고 이 순서에 따르도록 하는 것

2. 메모리 접근의 동기화) 메모리의 동시 접근을 막고 실행 순서보다는 하나의 스레드만 메모리에 접근하도록 하는 것 

 

Microsoft의 Windows의 동기화 객체는 크게 두 종류가 있다.

1. 유저 모드 동기화 기법(스레드 간 동기화 객체)

- 동기화 과정에서 커널 코드가 실행되지 않는다.

- 동기화를 위해서 커널 모드로 전환이 불필요해 성능상 이점이 존재

- 기능상의 제한도 존재

 

2. 커널 모드 동기화 기법(프로세스/스레드 간 동기화 객체)

- 커널에서 제공하는 동기화 기능을 활용

- 동기화 관련 함수를 실행할 때마다 커널 모드로 전환으로 인해 성능 저하 유발

- 유저 모드 동기화 보다 기능상의 이점이 존재

 

<유저 모드 동기화>

1. Criticial Section: 동일 프로세스에 여러 개의 스레드가 공유 자원에 접근할 때 배타적인 제어, 프로세스 간 동기화에 사용 불가능

2. Interlocked Family of Function

 

<커널 모드 동기화> 

1. Mutex: 리소스의 배타적 제어

2. Semaphore: 리소스를 동시에 사용할 수 있는 프로세스/스레드 수 제어

3. Event: 다른 스레드에 이벤트를 통지하여 객체의 시그널/비 시그널 상태를 자유롭게 제어

객체의 signal, non signal 상태

위의 자료에서 대기용 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 객체)

Event 객체 기본 개념

 

 

수동 Reset형의 SetEvent(), PulseEvent()

수동 Reset의 특징을 보면 우선 SetEvent()의 경우 ResetEvent()를 만날 때까지 Signal 상태가 유지된다.

따라서 non-signaling 상태가 되면 thread1,2 가 non signaling 상태를 만나 waitForSingleObject()에 의해 block 된다.

즉 waiting 상태에 들어간다.

 

PulseEvent의 경우 wait 상태에 있던 프로세스를 하나만 실행하고 마친 후 이를 재개한다. 

그러나 PulseEvent의 경우 thread 1,2 가 계속 waiting 상태에 있는 것이 아니라 pulseEvent()를 다시 만나면

전부 ready() 상태로 보낸다. 

 

자동 Reset형의 SetEvent(), PulseEvent()

수동 Reset과 차이점은 setevent()가 실행될 때 wait 상태에 들어간 스레드를 한 개만 깨운다.(누가 깨울지는 OS가 안다.)

pulseEvent도 wait 상태에 들어간 스레드를 한개만 깨운다.

 

728x90
반응형

'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