cs/운영체제

6강-2. Process Synchronization 2

Tomato_Coffee 2023. 11. 5. 11:46

어떤 프로세스를 공유 데이터를 접근하거나 접근하지 않거나

entry section에서 lock을 걸고, exit section에서 lock을 푼다.


Mutual Exclusion (상호 배제) ---> 파란색 코드 부분 (entry, exit section)

Progress(진행) 

Bounded Waiting(유한 대기)


lock을 잘 걸었다가 푸는 방법에 대해

 -> 이런 문제가 생기는 이유

 -> critical section에 들어갔다가 나가는 것을 cpu를 빼앗기지 않고 한 번에 해결하면 문제가 되지 않음.

 -> 그러나 cpu에서 단일 instruction이 끝나면 cpu를 빼앗길 수 있다.

 -> 그런데 우리가 쓰는 고급언어(c언어, 자바..)가 단일 instruction이 아니기 때문에 위에 노란색 부분의 코드를 실행 중에 cpu를 빼앗길 수 있어서 문제가 생긴다.

do{
	while(turn != 0); // 프로세스가 0 이 아니면 대기함.
    critical section
    turn  = 1; // 상대방 차례로 만들어줌. process 1 차례로 만들어줌.
    remainder section
} while(1);
  • Algorithm 1
    • 상호 배제 => 충족
    • 진행 => 불충족
      • 코드를 보면 critical section이 교대로 들어가는 알 수 있다.
      • 프로세스들이 critical section에 들어가려는 빈도가 다르다면?
        • 극단적인 예시
        • P0가 1000번 critical section에 들어가길 원하고, P1은 1번만 critical section에 들어가게 된다면
        • P0은 나머지 critical section을 수행하지 못한다. 상대 프로세스인 P1이 turn을 변경해주지 않기 때문이다.

  • flag : 자신이 critical section에 들어가고 싶은지 나타내는 용도
    • 처음에는 flag가 모두 false이다.
    • 들어가고 싶으면 true로 변경.
  • Algorithm 2
    • Pi가 flag [i] = true로 만들고 Pj에게 cpu를 뺏겼을 때 flag [j] = true 가 된다면?
    • 깃발이 둘 다 true인 상태고, critical section에 둘 다 못 들어가는 상태가 발생.
    • 무한 양보 상황 발생

turn을 상대방으로 변경 = > [turn = j;]

  • 이 방법은 중간에 어디서든 cpu를 빼앗겨도 충족 조건 전부를 만족시킨다.
  • 단점
    • Busy Waiting(= spin lock)! 
      • spin lock 이란?
        • while 문을 계속 돌면서 lock을 건다는 의미 
          • 쓸 때 없이 자신에게 할당된 cpu 시간을 while을 돌면서 기다린다는 뜻
          • 비효율적이다.
참고)
하나의 instruction을 실행 중에 cpu를 빼앗지 않는다.
고급언어의 코드는 여러 개의 instruction으로 구성되어 있다. 

 


Test_and_set(a)

1. 원래 값을 읽고

2. 그 자리를 true(1)로 세팅

( cf) false == 0)

1, 2를 atomic( 하나의  instruction)으로 처리한다.

이렇게 하드웨어적으로 어떤 값을 읽고, 세팅하는 작업을 atomic 하게 실행할 수 있다면 lock을 걸고 푸는 게 간단하게 해결된다.