ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] - Semaphore / Mutex
    CS/면접준비 2022. 9. 30. 00:09

    Semaphore


    MultiProgramming 환경에서 Shared Resource에 대한 접근을 제한
    • Shared Resource에 여러 Process가 동시에 접근하면서, 문제가 발생 할 수 있다.
    • Resource에는 그렇기에 하나의 Process만 접근이 가능하다.

     

    Critical Section

    • 여러 Process가 data를 Share하면 수행 할 때, 각 Process에서 Shared Data를 접근하는 코드 부분
    • Shared Data를 여러 Process 가 접근하면 잘못된 결과가 발생 할 수 있다.

     

    Semaphore P,V

    • P : Critical Section에 들어가기 전에 수행
    • V : Critical Section에서 나올 때 수행
    #SemaPhore
    
    P(S)
    
    # Critical Section Code
    
    V(S)
    procedure P(S)   --> 최초 S값은 1임
        while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함
        S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
    end P
    
    --- 임계 구역 ---
    
    procedure V(S) --> 현재상태는 S가 0임
        S := S+1   --> S를 1로 원위치시켜 해제하는 과정
    end V
    • 이와 같은 방식을 통해 P,V를 통해 Resource에 대해 Mutual Exclusion 구현이 가능

     

    Mutex


    • Critical Section을 가진 Thread들의 실행 시간을 겹치지 않고 각각 실행 가능하게 해준다.
    • Mutual Exclusion의 약자
    • 접근을 위해 Lock , Unlock을 사용
    • Lock = Critical Section에 들어갈 권한
    • UnLock = Critical Section을 모두 사용했음을 알린다.
    • Mutex는 0,1 상태인 binary Semaphore라고 부른다.

     

    Mutex Algorithm

    1. Dekker Algorithm

    • 프로세스 두 개일때 상호 배제를 보장하는 최초의 알고리즘입니다.
    • Flag, Turn 변수를 통해 Critical Section에 들어갈 Process,Thread를 결정
    • Flag = Process 중 누가 Critical Section에 들어갈 것인지
    • Turn = 누가 임계 구역에 들어갈 차례인지
    • i = 자신의 Process
    • j = 상대 Process
    while(true) {
        flag[i] = true; // 프로세스 i가 임계 구역 진입 시도
        while(flag[j]) { // 프로세스 j가 현재 임계 구역에 있는지 확인
            if(turn == j) { // j가 임계 구역 사용 중이면
                flag[i] = false; // 프로세스 i 진입 취소
                while(turn == j); // turn이 j에서 변경될 때까지 대기
                flag[i] = true; // j turn이 끝나면 다시 진입 시도
            }
        }
    
    // ------- Critical Section ---------
    
    turn = j; // end Critical Section -> turn change
    flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림
    
    }

     

    2. Peterson Algorithm

    • 데커의 알고리즘과 유사하지만 상대방에게 진입 기회를 양보한다는 차이가 있고 보다 더 간단하게 구현되었습니다.
    while(1) {                        // 프로세스i의 진입 영역
    
      flag[i] = ture;                 // 프로세스i가 임계구역에 진입하기 위해 진입을 알림.
      turn = j;                       // 프로세스j에게 진입을 양보함.
                                      //  (두 프로세스중 먼저 양보한쪽이 먼저 임계구역에 들어가게 됨.)
      while (flag[j] && turn = j);    // 프로세스i의 차례가 될 때까지 대기를 함.
    
    // critical section
    
      flag[i] = false                 // 임계구역 사용완료를 알림.
    
    }

     

    3. 다익스트라 Algorithm

    • 프로세스 n개의 상호배제 문제를 해결한 최초의 알고리즘입니다.
    • CS에 진입하기 위해 단계를 2단계로 나누어 단계마다 진입할 수 있는 프로세스를 걸러내어 최종적으로 하나의 프로세스만 CS에 접근할 수 있게 구현되었습니다.
    • flag [i] 변수 상태
      • idle : 프로세스가 임계 구역에 진입 시도를 하고 있지 않은 상태
      • want-in : 프로세스의 임계구역 진입 시도 1단계
      • in-CS : 프로세스의 임계구역 진입 시도 2 단계 및 임계구역 내에 있을 때
    while(1) {                                // 프로세스i의 진입 영역
    
    	do {
    	// 임계구역 진입시도 1단계
    	  flag[i] = want-in                     // 1단계 진입시도를 한다고 알림
    	  while (turn != i ) {                  // 자신의 차례가 될 때까지 대기를 함.
    	    if (flag[turn] == idle) {           // 임계구역에 프로세스가 없다면,
    	      turn = i;                         // 자신의 차례로 변경함.
    	    }
    	  }
    	
    	// 임계구역 진입시도 2단계
    	  flag[i] = in-CS                      // 임계구역에 진입하겠다고 알림.
    	  j = 0;
    	  while ((j < n) && (j == i|| flag[j] != in-CS ){ // 자신을 제외한 in-CS 상태의 프로세스가 있는지 검사 함.
    	    j = j + 1;
    	  }
    	} while(j < n)   // 자신 외에 2단계 진입을 시도하는 프로세스가 있다면 다시 1단계로 돌아감.
    	
    	// critical section   // in-CS 상태의 프로세스가 자신밖에 없다면 임계영역에 진입함.
    	
    	flag[i] = idle;  // 임계구역 사용완료를 알림.
    	
    }

     

    4. Bakery Algorithm

    • 프로세스 n개의 상호 배제 문제를 해결한 알고리즘입니다.
    • bakery 알고리즘은 프로세스에게 고유한 번호를 부여하고, 번호를 기준으로 우선순위를 정하여 우선순위가 높은 프로세스가 먼저 임계 구역에 진입하도록 구현되었습니다.
    • 번호가 낮을수록 우선순위가 높음.
    while(1) {              // 프로세스i의 진입 영역
    
      choosing[i] = true;   // 번호표 받을 준비
      number[i] = max(number[0], number[1], ..., number[n-1]) + 1;  // 번호표 부여 
                                                                    // (번호표 부여중 선점이 되어 같은 번호를 부여 받는 프로세스가 발생할 수 있음)
      chossing[i] = false;  // 번호표를 받음
    
      for (j = 0; j < n; j++) { // 모드 프로세스와 번호표를 비교함.
        while (choosing[j]);    // 프로세스j가 번호표를 받을 때까지 대기
    
        while ((number[j] != 0) &&    
                ((number[j] < number[i])               // 프로세스 j가 프로세스 i보다 번호표가 작거나(우선순위가 높고)
                || (number[j] == number[i] && j < i)); // 또는 번호표가 같을 경우 j 가 i 보다 작다면 
                                                       // 프로세스 j가 임계구역에서 나올 때까지 대기.     
      }
    
    
    // Critical Section
    
      number[i] = 0;  // 임계구역 사용완료를 알림.
    }

    'CS > 면접준비' 카테고리의 다른 글

    [OS] - Paging Algorithm  (0) 2022.09.30
    [OS] - Paging / Segmentation  (0) 2022.09.30
    [OS] - DeadLock  (0) 2022.09.29
    [OS] - CPU Scheduling  (0) 2022.09.29
    [OS] - IPC  (0) 2022.09.29

    댓글

Designed by Tistory.