6. 프로세스 동기화 & 상호 배제 (3) - HW solution

728x90
반응형

출처 : https://www.youtube.com/watch?v=Zps0ckSvKys&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=14

 

 

 

SW solution 들은 비효율적이라는 문제점이 있었다. 이 문제를 해결하고자 HW를 활요해서 비효율성을 해결하는 HW solution을 알아보자.

 

 

Synchronization Hardware

 

  • TestAndSet(TAS) instruction
    • Test와 Set을 한 번에 수행하는 기계어
    • Machine instruction
      • Atomicity, Indivisible
      • 실행 중 interrupt를 받지 않음 (preemptive 되지 않음)
    • Busy waiting
      • Inefficient

 

 

이 TestAndSet 명령들이 중간의 인터럽트 없이 한 번에 수행된다.

 

temp의 입력으로 주어진 target 값을 저장하고 target을 true로 설정하고 temp를 출력한다. 이 과정들이 한번에 수행된다.

 

 

lock이라는 변수를 만들었고, lock의 초기값은 false이다.

 

lock을 TAS에 넣으면 false를 반환하고, lock은 true가 된다. false가 리턴되었으므로 Pi는 반복문을 무시하고 CS에 진입하게 된다. Pj는 lock을 TAS에 넣으면 true를 반환하게 되므로 반복문을 돌게된다(기다리게 된다).

 

Pi가 작업을 마치고 CS에서 나오면 lock을 false로 설정한다. 그러면 기다리던 Pj는 CS에 진입하게 된다.

 

ME 문제가 굉장히 쉽게 해결된다.

 

 

하지만 3개 이상의 프로세스의 경우, Bounded waiting 조건을 위배하게 된다.

 

P0가 CS에서 작업을 마쳤을 때, P1과 P2 중 랜덤으로 먼저 반복문을 돈 프로세스가 먼저 CS에 진입하게 된다. 그 사이 P3, P4, ... 등이 들어왔을 때, 재수가 없으면 P1은 계속 CS에 진입을 할 수 없게 된다.

 

 

N-Process mutual exclusion

 

waiting이라는 변수를 만들어서 내가 기다려야하는가? 를 확인하게한다.

 

2. waiting과 key라는 변수를 만들고 초기값은 true로 설정한다.

 

3~4. lock의 값을 key에 넣어서 내가 들어갈 조건이 아니라면 반복문을 계속 돌게 만든다.

 

5. waiting을 false로 설정한다. 즉, 기다리지 않아도 된다는 것을 나타낸다.

 

CS 진입 및 탈출

 

6~7. 작업을 끝내고 나갈 때, 나보다 번호가 큰 프로세스들을 확인해서 대기 중인 프로세스를 찾는다.

 

9. 대기 중인 프로세스가 있으면 그 대기 프로세스의 waiting을 false로 설정해준다. 즉, 나와 가장 가까운 대기 프로세스에게 기다리지 말라고 적어주는 것이다.

 

8. 만약 대기 중인 프로세스가 없으면 lock을 false로 만든다.

 

 

HW solution

 

  • 장점
    • 구현이 간단해 짐
  • 단점
    • 여전히 Busy waiting 문제는 존재
      • Inefficient
  • Busy waiting 문제를 해소한 상호배제 기법
    • Semaphore
      • 대부분의 OS들이 사용하는 기법
728x90
반응형