Free Lines Arrow
본문 바로가기
Development/OS

[OS] Process Synchronization(프로세스 동기화)

by skahn1215 2021. 8. 18.
728x90
반응형

Process Synchronization(프로세스 동기화)

  • 앞서 멀티 쓰레드와 멀티프로세스를 공부하였습니다.
  • 그럼 멀티쓰레드와 멀티프로세스에서 동기화란 무엇인지 살펴 보겠습니다.

 

 

프로세스 동기화 란?

  • 프로세스 사이에서 실행 순서를 지켜 자원의 일관성을 보장하는 것이다.
  • 여러개의 프로세스가 동시적으로 자원에 접근하면 공유 자원을 신뢰 할 수 없다.
  • 공유자원: 공동으로 쓸수 있는 자원을 말한다.
  • Race Condition: 여러 프로세스가 동시에 공유 자원에 접근하여 읽거나 쓰는 상황
  • Critical Section: 여러 프로세스가 동시에 접근 해서 안되는 공유자원 일부를 말한다.
public synchronized void test(){
    // 전체가 임계구역이 된다.
}


public synchronized void test1(){
   
   synchronized (object) {
       // 임계구역
   }
   
}

 

 

 

동기화 관련 문제

 

독자 저자 문제 (Readers Writers Problem)

  • 독자는 공유저장 공간에 쓰여있는 글을 읽는다.
  • 저자는 책에 글을 써서 추가한다
    - 이때 독자들은 공유 저장 공간에서 글을 읽지 못한다.
  • Critcal Section 은 공유저장공간이 된다.

 

 

 

 

임계구역 문제 해결 조건

  • 상호배제(Mutual exclusion) : 하나의 프로세스가 임계 구역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.

  • 진행(Progress) : 임계 구역에 들어간 프로세스가 없는 상태에서, 들어가려고 하는 프로세스가 여러 개 있다면 어느 것이 들어갈지를 적절히 결정해주어야 한다.

  • 한정대기(Bounded waiting) : 다른 프로세스의 기아(Starvation)를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 구역에 들어갈 때 제한을 두어야 한다.

 

 

 

임계구역 해결 방법

 

피터슨의 알고리즘

공유 메모리를 활용하여 여러 개의 프로세스가 하나의 자원을 함께 사용할 때 문제가 발생하지 않도록 해준다.

 

 bool flag[2] // 불린 배열(Boolean array)
 int turn // 정수형 변수
 
 flag[0]   = false // false은 임계 구역 사용을 원하지 않음을 뜻함.
 flag[1]   = true
 
 turn      = 0 // 0 은 0번 프로세스를 가리킴, 1은 1번 프로세스를 가리킴
 
 
 P0: flag[0] = true // 임계 구역 사용을 원함
     turn = 1 // 1번 프로세스에게 차례가 감
     while( flag[1] && turn == 1 )
     {
          // flag[1] 이 turn[1] 을 가지고 있으므로
          //현재 사용중임
          // 임계 구역이 사용 가능한지 계속 확인
     }
    
    // 임계 구역
     ...
    // 임계 구역의 끝
    
   flag[0] = false
   
   
P1: flag[1] = true
    turn = 0
    while( flag[0] && turn == 0 )
    {
         // 임계 구역이 사용 가능한지 계속 확인
    }
    
    // 임계 구역
    ...
    // 임계 구역의 끝
    
    flag[1] = false

 

 

 

세마포어

  • 세마포어 S는 정수값변수
  • P와 V라는 명령을 통해 동기화를 유지한다.
 P(S) {
     while S <=0; // 아무것도 하지 않음 (반복문)
     S--;
 }

 V(S) {
     S++;
 }
 
 
 test() { 
    P(S);
    // 임계구역
    
    // p1 이 실행중이면
    // S값은 0이다.
    V(S);
    // S값을 증가 했다.
    // 임계 구역을 다음 프로세스가 사용 할 수 있다.
 }

 

 

 

 

세마포어와 뮤텍스의 차이

 

접근 가능한 프로세스 차이

  • 세마포어는 공유 자원에 세마포어의 변수만큼의 프로세스(또는 쓰레드)가 접근할 수 있습니다.
    - 여러개가 접근 가능하다.
  • 반면에 뮤텍스는 오직 1개만의 프로세스(또는 쓰레드)만 접근할 수 있습니다.

락을 해제 할수 있는 차이

  • 현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있습니다.
    - V(S) 를 다른 프로세스가 호출시 해제된다.
  • 하지만 뮤텍스는 락(lock)을 획득한 프로세스가 반드시 그 락을 해제해야 합니다.

 

 

 

 

 

참고: https://ko.wikipedia.org/wiki/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4

 

세마포어 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

728x90
반응형

댓글