본문 바로가기
CS/운영체제

18. 상호배제 구현 방법

by D.O.T 2024. 6. 16.

먼저, 해당 포스팅은 단일 프로세서 상호배제 구현 방법인 것을 알고 있어야 한다.

인터럽트 서비스 금지 방법

그림1. 인터럽트 서비스 금지

 

진입 코드(Entry Code)에서 cli(clear interrupt flag) 명령으로 인터럽트 서비스를 중지하고

임계 구역(Critical Code)에서 인터럽트가 발생하면 무시한다.

진출 코드(Exit Code)에서 sti(set interrupt flag) 명령으로 인터럽트 서비스를 재실행한다.

 

그림2. T1 인터럽트 발생

 

인터럽트 서비스를 중지하지 않을 경우, 그림2와 같이 T1이 임계구역을 접근했을 때, T1에게서 인터럽트 서비스가 발생하면 스레드는 대기 상태가 되고 T2를 스케줄한다. 이 때, T2가 임계 구역에 접근하게 된다면 공유 자원에 T1과 T2가 공존하는 현상이 발생한다. 즉 T1이 변수의 값을 읽고 인터럽트가 발생한다면 변수의 값이 동기화되지 않는다.

 

인터럽트 서비스 금지 상호배제 방법은 스레드 동기화를 해결할 수 있지만 문제점도 존재한다.

  • Single Core CPU에서 고안된 방법으로 임계구역을 처리하는 도중 모든 인터럽트 서비스를 무시하게 된다.
  • Multi Core CPU에서도 다른 CPU의 인터럽트 서비스를 무시하는 문제점이 발생한다.

위 문제의 해결 방법으로 CPU의 LOCK 핀에 신호를 발생시키는 LOCK 신호를 이용해서 현재 액세스 중인 메모리에 다른 프로세스가 접근하지 못하도록 할 수 있다.

 

그림 3. Locking / UnLocking

 

Lock 신호를 이용하는 방식도 문제점이 발생할 수 있다.

1. T1이 mov ax, lock 까지 처리 중일 때, &ax 에는 0이 저장되어 있으므로 임계구역에 접근할 수 있다.

2. 이 때, T1의 Time Slice가 만료되어 T2가 스케줄된다. 

3. T1이 mov lock, 1을 연산을 수행하지 않았으므로 T2는 mov ax, lock 연산을 처리하면서 &ax는 0이 된다.

4. T2는 ax가 0이므로 임계구역에 진입하였고 도중 Time Slice가 만료되어 T1이 재수행된다.

5. T1은 컨텍스트 정보에 다음 명령인 mov lock, 1을 수행해야한다. 하지만 이미 lock은 1이지만 상관없다.

6. T1은 1에서 ax 값이 0이므로 cmp ax, 0 연산을 수행하고 임계구역에 진입하게 된다.

위 6개 과정에서 임계구역에는 T1과 T2이 공존하게 되는 문제점이 발생한다.


원자 명령(Atmoic Instruction) 사용

 

Locking의 문제점을 해결하기 위해 고안된 방식이다.

mov ax, lock 과 move lock, 1 을 동시에 수행하는 TSL ax, lock 이라는 원자 명령을 통해 ax에 lock 정보를 담으면서 locking을 수행한다.

 

이번 포스팅에서는 인터럽트 서비스 금지와 원자 명령 사용을 통해 상호배제를 구현하는 방법을 알아봤다. 하지만, 이 방법은 단일 프로세스에서도 문제가 존재하고 멀티 프로세서가 도입되면서 복잡해지는 문제가 발생한다.

다음 포스팅에는 멀티 프로세서에서는 어떻게 상호배제를 처리하는지 포스팅해보자.

'CS > 운영체제' 카테고리의 다른 글

17. 상호 배제 (Mutual Exclusion)  (0) 2024.06.15
16. 스레드 동기화 (Thread Synchronization)  (0) 2024.06.15
15. CPU Scheduling Algorithm  (1) 2024.04.22
14. CPU Scheduling  (0) 2024.04.22
13. 멀티스레드 구현  (0) 2024.04.22