컴퓨터 공학/운영체제

[혼공컴운] chapter.12 프로세스 동기화

hhzinistic 2023. 8. 13. 02:19

2023.07.29 - [컴퓨터 공학/운영체제] - [혼공컴운] chapter.11 CPU 스케줄링

 

[혼공컴운] chapter.11 CPU 스케줄링

2023.07.29 - [컴퓨터 공학/운영체제] - [혼공컴운] chapter.10 프로세스와 스레드 [혼공컴운] chapter.10 프로세스와 스레드 2023.07.29 - [컴퓨터 공학/운영체제] - [혼공컴운] chapter.09 운영체제 시작하기 [혼

zinistic.tistory.com

 

 

12-1 동기화란

  • 프로세스 동기화(synchronization): 프로세스 사이의 수행 시기를 맞추는 것.
    * 프로세스뿐 아니라 스레드 또한 동기화의 대상. 
    • 실행 순서 제어를 위한 동기화
      : 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것.
      * 프로세스들에 따라서 아무 순서대로 실행되어선 안되는 프로세스가 있음.
    • 상호 배제(mutual exclusion)를 위한 동기화
      : 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘. 동시에 접근하지 못하게 하는 것.


  • 생산자와 소비자 문제

- 생산자

produce()
{
	//버퍼에 데이터 삽입
	result++;
}

- 소비자

consume()
{
	//버퍼에서 데이터 빼내기
	result--;
}


→ 이를 동시에 실행하면 result 값이 예상하지 못한 값이 나올 수 있다!


 

  • 공유 자원과 임계 구역
    • 공유 자원(shared resource): 프로세스에서 공동으로 접근할 수 있는 자원.
      ex) 전역 변수, 파일, 입출력장치, 보조기억장치 등
    • 임계 구역(critical section): 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역.
    • 레이스 컨디션(race condition): 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하는 경우

- 두 개 이상의 프로세스가 임계 구역에 진입하려는 상태 그래프

시간에 따른 프로세스 임계구역 진입 상태 그래프

  • T1: 프로세스 A가 임계 구역에 진입.
  • T2: 프로세스 B가 임계 구역에 진입하려 시도.
  • T2~T3: 프로세스 B는 대기.
  • T3: 프로세스 B 임계 구역에 진입.
  • T4: 프로세스 B 임계 구역에서 나옴.

 

  • 임계 구역 문제를 해결하기 위한 세 가지 원칙
    • 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
    • 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
    • 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.




 

 


12-2 동기화 기법

  • 뮤텍스 락(Mutex lock; MUTual EXclusion lock)
    => 자물쇠 기능을 코드로 구현한 동기화 기법.

    - 전역 변수 lock: 프로세스들이 공유
    - acquire (): 임계 구역을 잠그는 역할 
    - release (): 임계 구역의 잠금을 해제하는 역할
acquire()
{
	while ( lock == 1 ); // lock 이 잠겨있는지 확인. lock이 nonzero 라면 잠겨있는 상태
	lock = 1; // lock이 zero라면 while 문 실행 x. 임계 구역 잠금
}


release()
{
	lock = 0; // 임계 구역 잠금 해제
}


< acquire()와 release()로 구현한 뮤텍스 락 >

acquire();
// 임계 구역
release();


→ 임계 구역 진입 불가능 => 계속 대기.
→ 임계 구역 진입 가능 => 임계 구역을 잠근 뒤 임계 구역에서 작업 진행.
→ 임계 구역에서 나올 시 => 임계 구역의 잠금 해제

* 바쁜 대기(busy wait): 프로세스가 임계 구역의 잠금 상태를 계속 확인하는 것과 같은 대기 방식. 뮤텍스 락에서는 while문을 계속 반복하는 행위.



  • 세마포(semaphore)(세마포어)
    : 공유 자원이 여러 개 있을 때의 상호 배제를 위한 동기화 기법.
    * 뮤텍스 락은 공유 자원이 한 개 일 때의 동기화 기법.


    - 전역변수 S: 임계 구역에 진입할 수 있는 프로세스의 개수
    - wait(): 임계 구역에 들어가도 되는지 여부를 알리는 역할 
    - signal(): 임계 구역을 진입하려는 프로세스에게 신호를 보내는 역할

< wait()와 signal()로 구현한 세마포 >

wait();
// 임계 구역
signal();

* 임계 구역 전후로 wait()와 signal()을 호출.

 

wait()
{
	while( s <= 0 ); // 임계 구역에 진입할 수 있는 프로세스의 개수 확인.
	s--; // 임계 구역에 진입할 수 있는 프로세스가 0개 초과라면 s 감소 후 임계 구역 진입
}

signal()
{
	s++; // 임계 구역의 작업을 끝내고 S 증가
}


* 세마포는 바쁜 대기를 해소한 방법을 사용.
→ 임계 구역에 진입할 수 있는 프로세스의 개수가 0 미만일 경우 PCB(프로세스 제어 블록)를 대기큐에 삽입. 다른 프로세스가 임계 구역에서 작업을 끝내고 signal()을 호출하면 대기 중이던 프로세스를 대기 큐에서 삭제하고 준비 큐로 이동.

 

 

 

  • 세마포를 이용한 프로세스 순서 제어
    → 변수 S의 초기값을 0으로 설정. 먼저 실행할 프로세스 뒤에 signal(), 다음에 실행할 프로세스 앞에 wait()을 붙임.

  • 프로세스 A가 먼저 실행될 시
    => 어떠한 함수도 통과하지 않은 채 바로 임계 구역 진입.
  • 프로세스 B가 먼저 실행될 시.
    => S값을 확인하는 wait() 함수를 만나 임계 구역 진입 불가능(S 초기값은 0이기 때문에). A가 임계 구역에 먼저 진입하게 된 후 signal() 호출된 후 B가 임계 구역 진입 가능.



    * signal()과 wait()의 순서를 바꾸거나 각 함수를 중복해서 사용하는 것은 안됨!

 

  • 모니터(monitor)
    : 공유자원에 접근하는 프로세스들을 큐를 이용하여 상호 배제를 위한 동기화를 제공하고,  실행 순서 제어를 위한 동기화도 제공하는 동기화 도구.

상호 배제와 실행 순서 제어를 위한 동기화를 제공하는 모니터

* 조건 변수(condition variable): 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수. wait과 signal 연산 수행.
 → 상호 배제를 위한 큐와 실행 순서 제어를 위한 큐는 다른 큐이다.

모니터

- 조건 변수에 대한 큐는 이미 모니터 내에 진입 상태.
- 상호 배제를 위한 큐는 모니터에 진입하기 위한 큐.

어떤 프로세스가 x.wait()를 통해 조건 변수 x 에 대한 wait() 을 호출
=> 다른 프로세스가 모니터에 들어와 공유 자원 사용. x.signal()을 이용하여 조건 변수 x 에 대한 signal()을 호출하여 일시 중지된 프로세스가 재개될 수 있다.


  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행 중단.
  • 특정 프로세스가 실행될 조건이 되었을 때는 signal을 통해 실행 재개.

 

 

 

 

 

 

 


 

 

* 오류 지적은 환영입니다.^^ *