12장 프로세스 동기화

prana·2024년 1월 19일
0

12-1 동기화란

동기화의 의미

  • 프로세스 동기화: 프로세스들 사이의 수행 시기를 맞추는 것을 의미

👩동기화

  • 특정 자원에 접근할 때, 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것을 의미
  • 실행 순서 제어
  • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
    • 스레드도 동기화 대상이다. 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.

공유 자원과 임계 구역

  • 공유 자원: 예시에서 동시에 실행되는 프로세스들은 전역변수 잔액, 총합이라는 공동의 자원을 두고 작업을 함

    • 전역변수, 파일, 입출력장치, 보조기억장치가 될 수도 있다
  • 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

    두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기!

  • 두 개 이상의 프로세스가 잘못된 실행으로 인해 임계 구역의 코드를 실행하여 문제가 발생-> 레이스 컨디션

    • 일관성이 깨지는 문제
  • 이 때, 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 관리

임계 구역 문제를 3가지 원칙 하에 해결
1. 상호 배제
2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았을 경우 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
3. 유한 대기: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.

p351
1. 실행 순서 제어, 상호 배제
2. 1

12-2 동기화 기법

  • 뮤텍스 락
  • 세마포
  • 모니터

뮤텍스 락

  • 자물쇠 기능
  • 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구, 다시 말해 상호 배제를 위한 동기화 도구
  • 내가 지금 임계 구역에 있음을 알리기 위해 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있다.
  • 자물쇠 역할: 프로세스들이 공유하는 전역변수 lock
  • 임계 구역을 잠그는 역할: acquire 함수
  • 임계 구역의 잠금을 해제: release 함수
  • acquire 함수

    • 임계 구역에 진입하기 전에 호출하는 함수
    • 임계 구역이 열려 있다면 임계 구역을 잠그는(lock을 true로 바꾸는) 함수
    • 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인한다.
      • 쉴 새 없이 반복하며 확인: 바쁜 대기
  • 하나의 프로세스에만 임계 구역에 진입할 수 있다.

acquire(){
	while(lock == true) // 임계 구역이 만약 잠겨 있다면
    ; // 임계 구역이 잠겨있는지 반복적으로 확인
    lock = true; // 잠겨있지 않다면 임계 구역 잠금
}
release(){
	lock = false;
}

세마포

  • 뮤텍스 락: 하나의 공유 자원에 접근하는 프로세스를 상정

    • 탈의실이 하나 있는 경우를 가정하고 만든 동기화 도구

      세마포는 여러 개의 탈의실이 있는 경우라고 생각하면 된다.

    • 이진 세마포(뮤텍스 락과 비슷한 개념)
    • 카운팅 세마포
  • 하나의 변수와 두 개의 함수(전공서마다 변수명 다를 수 있다)

    • 전역변수 S : 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)
    • wait함수: 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려줌
    • signal 함수: 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 줌
wait(){
// 임계 구역
	while(S <= 0)
    ;
    S--;
}
signal(){
	S++;
}
  • 하염없이 기다려야 한다면?
    • wait 함수는 사용할 수 있는 자원이 없는 경우
      • 해당 프로세스 상태를 대기 상태로 만들고
    • 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다.
    • 다른 프로세스가 임계 구역에서의 작업 마치고 signal 함수를 호출
      • signal 함수는 대기 중인 프로세스를 대기 큐에서 제거
      • 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨준다.
wait(){
	S--;
    if(S<0){
    	add this process to Queue; // 프로세스 PCB를 대기 큐에 삽입
        sleep(); // 대기상태
    }
}
signal(){
	S++
    if(S<=0){
    	remove a process p from Queue;
        wakeup(p);
    }
}

동기화의 개념

  • 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 제어하는 것
    • (상호 배제를 위한 동기화)
  • 특정 조건이 만족되어야만 실행할 수 있는 상황에서 올바른 순서대로 실행하게 하는 것
    • (실행 순서 제어를 위한 동기화)

세마포: 프로세스의 순서를 제어하는 방법

  • 세마포 변수 S를 0으로 두고, 먼저 실행할 프로세스 뒤 signal 함수, 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다.

모니터

  • 세마포: 매번 임계구역에 앞뒤로 일일이 wait와 signal 함수를 명시하는 것은 번거로운 일이기 때문이다.

  • 모니터: 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리

    • 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근
  • 모니터를 통해 공유 자원에 접근하고자 하는 프로세스 큐에 삽입

  • 큐에 삽입된 순서대로 하나씩 공유자원 이용

    • 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고
    • 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화 제공
  • 조건 변수: 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 사용

    • 조건변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
  • 상호 배제를 위한 큐
    • 모니터에 한 번에 하나의 프로세스만 진입하도록 하기 위해 만들어진 큐
  • 조건변수에 대한 큐
    • 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐
    1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
    1. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

p365

  1. 4
  • 반드시 바쁜 대기를 할 필요는 없고, 대기 상태로 접어들 게 할 수도 있다.
  1. B
  2. 상호배제, 실행 순서 제어

0개의 댓글

관련 채용 정보