Study/OS

Chapter 06. Process Syncronization and Mutual Exclusion (2of7) - SW solutions

zzoo-ppaamm 2021. 7. 5. 12:55

Mutual Exclusion Solutions

  • SW solutions
    • Dekker's algorithm (Peterson's alogorithm)
    • Dijstra's algorithm, Knuth's algo, Eisenberg and McGuire's algo, Lamport's algo
  • HW solution
    • TestAndSet(TAS) instruction
  • OS supported SW solution
    • Spinlock
    • Semaphore
    • Eventcount/sequencer
  • Language-Level solution
    • Monitor

Dekker's Algorigthm

Two process ME을 보장하는 최초의 알고리즘

flag와 turn 둘 다 사용.

// P0 입장
flag[0] = true; // 일단 내깃발 들고
while(flag[1]){ 
// 상대방 깃발 들고 있다면
    if(turn == 1){ // 상대방 턴이네
        flag[0] = false; // 깃발 내리고
        while(turn == 1){ // 내 턴 기다리자

        }
        flag[0] = true; // 내 턴왔으면 깃발 올리자
    }
}  // 상대방 깃발 내려가있으면 건너띄고 cs접근
// cs 앞 부분
// cs 뒷 부분
turn = 1;
flag[0] = false; 
// 깃발 내리고 턴 넘기기;

N-Process Mutual Exclusion

2개짜리말고 N개짜리

  • Dijstra's algorithm
    • 최초로 프로세스 n개의 상호배제 문제를 소프트웨어적으로 해결
    • 실행 시간이 가장 짧은 프로세스에 프로세서 할당하는 세마포어 방법
    • 가장 짧은 평균 대기시간 제공
  • Knuth's algo, Eisenberg and McGuire's algo, Lamport's algo

Dijkstra's Algorithm

flag[] 값 의미
idle 프로세스가 임계 지역(cs) 진입을 시도하고 있지 않을 때
want-in 프로세스가 임계 지역 진입 시도 1단계일 때 ("들어가고 싶어" 의사밝히는 단계)
in-CS 프로세스가 임계 지역 진입 시도 2단계 및 임계 지역 내에 있을 때 (들어가기 직 전)
while(j < n){
    /* 임계 지역 진입 시도 1단계*/
    flag[i] = "want-in"; // 의사 밝힘
    while(turn != i){ // 내 턴이 아니면 기다린다
        if(flag[turn] == "idle"){ // 현재 turn인 process가 idle일 때까지!
            turn = i; // 턴을 뺏음
        }
    }

    /* 임계 지역 진입 시도 2단계*/
    // 여기도 여러명이 진입할 수 있음
    flag[i] = "in-CS"; // "나 2단계야" 
    j = 0; // 카운팅 변수
    while(j < n && (j == i || flag[j] != "in-CS")){
        // 나일때는 체크안해도 되니까 패스하겠다
        // 내가 아닌 누군가가 2단계라면 빠져나오겠다
        j ++;
    } // 나혼자 2단계라면 j가 n이되어서 나온다.
}// j가 n보다 작으면(누군가 있으면) 다시 위로....
// j가 n이 되면 (나혼자 2단계~) cs 접근
// cs 앞 부분
// cs 뒷 부분
flag[i] = "idle";

SW Solutions

  • SW Solutions들의 문제점
    • 속도가 느림
    • 구현이 복잡하다
    • ME primitive 실행 중 preemption 될 수 있다.
      • (지금까지 한 줄의 코드가 실행된다는 가정하에 진행한것. 한줄의 코드도 instruction으로 바꾸면 여러줄. 보장받지 못한다.)
      • 공유 데이터 수정 중은 interrupt를 억제해서 해결 가능하지만 overhead가 크다
    • Busy waiting
      • 기다리는데 뺑뻉 돌면서 기다리는거 while(true)
      • 비효율적이다