[혼공컴운]5주차_Chap12 | 프로세스 동기화

곽나현·2024년 2월 4일
0

혼공컴운

목록 보기
15/16
post-thumbnail

<학습목표>

  • 동기화란 무엇인지 알아본다.
  • 공유 자원과 임계 구역 문제를 이해한다.
  • 임계 구역 문제를 해결하기 위한 동기화 기법들을 학습한다.

🎇 동기화

동기화란 작업들 사이의 수행 시기를 맞추는 것

동기화의 종류
실행 순서 제어프로세스를 올바른 순서대로 실행하기
상호 배제동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

⚪ 실행 순서 제어를 위한 동기화

  • 프로세스는 특정 조건이 만족되어야만 실행을 이어나갈 수 있음 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화

⚪ 상호 배제를 위한 동기화

  • 상호 배제 : 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘

  • 공유 자원 : 여러 프로세스에서 사용하는 공동의 자원 (Ex. 전역 변수, 파일, 입출력장치, 보조기억장치 등)

  • 임계 구역 : 공유 자원 중 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

  • 레이스 컨디션 : 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우

⭐ 컴퓨터는 저급 언어를 실행하기 때문에 여러 줄의 저급언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥교환이 발생할 수 있음

➡ 이는 레이스 컨디션을 야기함

이러한 문제가 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것이 상호 배제를 위한 동기화


⚪ 상호 배제를 위한 동기화의 세가지 원칙

세가지 원칙이 지켜져야 상호 배제를 위한 동기화를 할 수 있음

  • 상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없음
  • 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함
  • 유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함 (임계 구역에 들어오기 위해 무한정 대기하면 안 됨)

🎇 동기화 기법

<대표적인 동기화 도구>

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

🔗 뮤텍스 락 (Mutex lock)

동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구. 즉, 상호 배제를 위한 동기화 도구

⚪ 뮤텍스 락의 구현

자물쇠 역할프로세스들이 공유하는 전역변수 lock
임계 구역을 잠그는 역할acquire 함수
임계 구역의 잠금을 해제하는 역할release 함수

◼ acquire 함수

  • 임계 구역에 진입하기 전에 호출하는 함수

  • 만약 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 임계 구역을 잠그는 함수

acquire() {
	while ( lock == true )
    ;
    lock = true;
}
  • 임계 구역이 잠겨 있는 경우 프로세스는 반복적으로 lock을 확인함 ➡ 바쁜 대기

◼ release 함수

  • 임계 구역에서의 작업이 끝나고 호출하는 함수

  • 현재 잠긴 임계 구역을 열어주는 함수

release() {
	lock = false;
}

➡ 즉, 뮤텍스 락을 이용하면 상호 배제를 위한 동기화를 할 수 있음


🔗 세마포 (semahore)

뮤텍스 락과 비슷하지만, 조금 더 일반화 된 방식의 동기화 도구

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

  • 세마포 : 여러 개의 공유 자원이 있는 상황에서 적용가능한 동기화 도구

    • 이진 세마포카운팅 세마포 가 있는데 이진 세마포뮤텍스 락과 비슷한 개념 ➡ 이 글에선 카운팅 세마포를 다룸

⚪ 세마포의 구현

전역 변수 S임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)
wait 함수임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
signal 함수임계 구역 앞에서 기다리는 프로세스에게 진입가능한 것을 알려주는 함수

◼ 임계 구역 집입 전후로 wait() 과 signal() 을 호출함

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

⚪ 세마포를 이용한 상호 배제를 위한 동기화

◼ wait 함수

wait() {
	while ( S <= 0 ) 
    ;
    S--;
}

◼ signal 함수

signal() {
	S++;
}

🔎 뮤텍스 락과 세마포의 공통적인 문제점

  • 사용할 수 있는 공유 자원이 없는 경우 프로세스는 무작정 무한히 반복하며 임계 구역을 확인해야 함 ➡ 바쁜 대기

바쁜 대기를 반복하며 확인할 시간에 CPU는 더 생상성 있는 작업을 할 수 있으므로 이는 CPU 주기낭비한다는 점에서 손해

⭐ 이 문제를 해결하기 위해 세마포는 더 좋은 방법을 사용함

  • wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣음

  • 임계 구역에 있던 프로세스의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중이었던 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮김

◼ wait 함수

wait() {
	S--;
    if ( S < 0 ) {
    	add this process to Queue;
        slepp();
    }
}

◼ signal 함수

signal() {
	S++;
    if ( S <= 0 ){ 
    	remove a process p from Queue
        wakeup(p)
    }
}

⚪ 세마포를 이용한 실행 순서 제어를 위한 동기화

  • 세마포의 변수 S를 0으로 두고, 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait() 함수를 붙임

🔗 모니터 (monitor)

세마포에 비해 사용자가 사용하기 편리한 동기화 도구로 조건 변수를 사용함

  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리함

  • 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 함

⚪ 모니터를 이용한 상호 배제를 위한 동기화

모니터공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록하여 상호 배제를 위한 동기화를 제공

⚪ 모니터를 이용한 실행 순서 제어를 위한 동기화

  • 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터조건 변수를 사용함

  • 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수

  • 조건 변수waitsignal 연산을 수행함

    • wait 연산 : 호출한 프로세스의 상태를 대기 상태로 전환하고, 일시적으로 조건 변수에 대한 대기 큐에 삽입

    • signal 연산 : 조건 변수에 대해 signal 을 호출하면 대기 상태에 있던 프로세스가 재개됨

모니터조건 변수를 사용하여 프로세스 실행 순서 제어를 위한 동기화를 제공

0개의 댓글