명품 운영체제

6. 스레드 동기화

코딩 못하는 감자 2024. 4. 18. 00:12

임계구역

상호배제 

 

상호배제의 위치 

entry코드 

---------------------------

임계구역

--------------------------

exit 코드 

 

상호배제 구현

1. 소프트웨어적 방법 

2. 하드웨어적 방법 

but 소프트웨어적 방법 사용 x

 

하드웨어적 방법 

1. 인터럽트 서비스 금지 

2. 원자명령 사용

 

인터럽트 서비스 금지 

entry 코드에서의 인터럽트 서비스를 금지하고 

exit 코드에서 임계구역에서 벗어나면 다시 허용한다.

 

cli 와 sti 

cli 는 cpu 내부의 인터럽트 플래그(IF)를 0으로 리셋하여 인터럽트 무시 

sti는 1로 설정 인터럽트 서비스 루틴 실행 

 

인터럽트 서비스 금지의 문제점

1. 모든 인터럽트가 무시되어 중요한 인터럽트 서비스 루틴이 제때 실행되지 못할 수도 있다.

2. 멀티 코어 CPU에서 사용하지 못한다. 

- 다른 코어에서 실행되는 스레드가 임계구역을 공유할 때 그 스레드까지 인터럽트 서비스 금지가 불가능하다.

 

원자명령

 

원자명령 없이 lock 변수를 이용한 상호배제 

lock 변수 0이나 1의 값을 가짐 

lock이 0이면 임계구역에 들어갈 수 있음

 

 

entry 코드를 보면 

초기 lock 변수의 값은 0이고 ax레지스터에 lock의 값을 저장 

lock에 1을 넣고 

ax와 0을 비교해서 

같으면 임계구역 통과 

같지 않으면 l1으로 점프한다.

 

하지만 여기서 문제점이 

1번 스레드가 mov ax, lock 코드를 진행하고 인터럽트가 발생하게 되고

2번 스레드가 임계구역을 통과

그리고 1번 스레드의 인터럽트가 종료되고 이어서 임계구역으로 들어가게 되면

두 스레드가 임계구역에서 충돌하게 되어 상호배제가 실패하게 된다.