Jost Do It.

그냥 IT해.

Study/컴퓨터공학

[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 12 프로세스 동기화

그냥하Jo. 2022. 12. 9. 08:59
반응형

Chapter 12. 프로세스 동기화 

 

 

요약

프로세스 동기화의 의미와 다양한 기법들에 대해 알 수 있었다.

 

내용 정리

 

12-1. 동기화란

 

동기화의 의미

 

프로세스 동기화(synchronization)

  • 프로세스 사이 수행 시기를 설정하는 것
  • 동시다발적으로 실행되는 프로세스들은 독립적이거나, 서로 정보를 주고받고 협력할 수 있다.
  • 서로 영향을 주는 프로세스들은 실행 순서와 자원 사용의 일관성을 보장해야 하기에 동기화 돼야 한다.
  • 참고> 프로세스 뿐 아니라 스레드도 동기화의 대상이다. 즉, 실행의 흐름을 갖는 모든 것은 동기화 대상이다.

 

프로세스 동기화 시 요구조건

  1. 실행 순서 제어: 프로세스를 올바른 순서로 실행
  2. 상호 배제: 동시에 접근하면 안되는 자원에 하나의 자원만 접근할 수 있도록 하기

 

 

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

  • 프로세스를 올바른 순서대로 실행해야 한다.
  • 예시
    • reader와 write 프로세스가 동시에 실행 중이라 가정
    • write 프로세스는 book.txt 에 값을 저장함
    • reader 프로세스가 book.txt 에 값을 읽어들임
    • write 프로세스가 값을 저장한 후에 read 프로세스가 값을 읽어들여야 함

 

2. 상호 배제를 위한 동기화

  • 상호배제(mutual exclusion): 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
  • 한 프로세스가 자원에 접근했을 때 다른 프로세스는 대기해야한다.
    • 대기하지 못하면 충돌이 일어나 자원의 결과값이 예상과 달라질 수 있다.
    • ex> 은행에 100만원이 입금돼 있다고 하자. 그리고 10만원을 입금하는데, 입금이 기록되기 전에 100만원을 출금하는 프로세스가 시작되는 경우, 은행의 잔고는 0원으로 오표기될 수 있다.

 

 

생산자와 소비자 문제

  • 상호배제를 위한 동기화 예시 문제
  • 물건을 계속 생산하는 생산자 프로세스와 물건을 계속 소비하는 소비자 프로세스로 구성됨. 물건의 총합은 변수로 존재
  • 생산자와 소비자를 동시에 계속해서 실행하면 예상값과 다른 결과를 얻을 수 있다.
  • 이는 두 프로세스가 제대로 동기화되지 않았기 때문이다.
    • 동기화가 제대로 안되면 생산자와 소비자가 상대 프로세스가 종료되기 전에 총합을 수정할 수 있다.
  • 즉, 동시에 접근하면 안되는 자원에 동시에 접근해서 생기는 문제이다.

 

 


 

 

공유 자원과 임계구역

 

 

공유 자원(shared resource)

  • 동시에 실행되는 프로세스들이 공동으로 사용하는 자원
  • 전역 변수, 파일, 입출력 장치, 보조기억장치 등 다양한 자원이 공유될 수 있다.
  • 공유 자원 중에서 두 개 이상 프로세스가 동시에 접근하면 문제가 발생하는 경우가 있다.

 

임계 구역(critical section)

  • 공유 자원에 동시에 접근해 문제를 발생시키는 영역
  • 임계 구역에는 두 개 이상 프로세스가 동시에 실행되면 안된다.
    • 두 개 이상 프로세스가 임계 구역에 진입하려 하면 하나는 대기해야 한다.
    • 임계 구역에 선진입한 프로세스가 종료되면 후진입한 프로세스가 진입해야 한다.

 

레이스 컨디션(race condition)

  • 여러 프로세스가 동시 다발적으로 임계 구역 코드에 접근해 문제가 발생하는 경우
  • 레이스 컨디션 발생 시, 데이터 일관성이 깨지는 문제가 발생한다.
    • 컴퓨터는 고급 언어를 저급 언어로 변환해 사용하는 과정에서 문맥 교환이 발생한다.
    • 문맥 교환이 임계 구역에서 발생하는 경우, 문제가 생길 수 있다.
    • 상호 배제를 위한 동기화는 두 개 이상 프로세스가 임계 구역에 접근하지 못하도록 관리한다.

 

운영체제의 동기화 원칙

  1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역 진입 시 다른 프로세스는 임계 구역에 진입할 수 없다.
  2. 진행(progress): 임계 구역에 프로세스가 없으면 프로세스는 임계 구역에 진입할 수 있다.
  3. 유한 대기(bounded wating): 프로세스가 임계 구역에 진입하고 싶으면 언젠가는 임계 구역에 진입할 수 있어야 한다. (무한정 대기가 일어나면 안된다.)

 

 


 

12-2. 동기화 기법

 

동기화의 대표적인 도구

1. 뮤텍스 락

2. 세마포

3. 모니터

 

 

1. 뮤텍스 락

 

뮤텍스 락(Mutex lock: MUTual EXclusion lock)

  • 상호배제를 위한 동기화 도구로 동시에 접근하면 안되는 자원에 프로세스/스레드의 동시접근을 막는다.
  • 임계구역이 비었을 때 임계구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계구역에 자물쇠를 걸어둔다.
  • 다른 프로세스는 임계구역이 잠겨 있으면 기다리고, 비게되면 뮤텍스 락을 걸고 임계구역에 진입한다.

 

뮤텍스 락의 구현

  • 하나의 전역 변수와 2개의 함수로 구현된다.
    • 전역변수 lock: 임계구역의 자물쇠 역할로 프로세스들이 공유하는 전역 변수
    • 함수 acquire: 임계구역을 잠그는 함수
    • 함수 release: 임계구역의 잠금을 해제하는 함수

 

  • acquire 함수
    • 프로세스가 임계구역에 진입 전 호출한다.
    • 임계 구역이 열려 있으면 임계 구역을 잠근다 (lock을 false -> true로 변경).
    • 임계 구역이 잠겨 있으면 열릴 때 까지(true -> false 상태가 될 때 까지) 임계 구역을 반복적으로 확인한다.

 

  • release 함수
    • 프로세스가 임계 구역에서 작업을 끝내고 호출하는 함수이다.
    • 잠긴 임계 구역을 열어주는 함수 (lock을 true -> false로 변경함).

 

  • acquire와 release의 pseudo code
acquire() {
    while (lock == true)		/* 만약 임계 구역이 잠겨 있다면 */
        ;				/* 임계 구역이 잠겨 있는지를 반복적으로 확인 */
    lock = ture;			/* 만약 임계 구역이 잠겨 있지 않으면 임계 구역을 잠금 */
}

release() {
    lock = false;			/* 임계 구역 작업이 끝났으니 잠금 해제 */
}

 

  • 프로세스의 임계 구역 진입
acquire();	// 자물쇠 잠겨 있는지 확인, 잠겨 있지 않으면 잠그고 들어가기
// 임계 구역	// 임계 구역에서의 작업 진행
release();	// 자물쇠 반환

 

  • 뮤텍스 락에서 프로세스 임계 구역 접근 과정 정리
    • 락을 획득할 수 없으면 (임계 구역 진입이 불가하면) 무작정 기다린다.
    • 락을 획득할 수 있으면 (임계 구역 진입이 가능하면) 임계 구역을 잠근 뒤 임계 구역에서 작업을 진행한다.
    • 임계 구역을 빠져 나올 땐 임계 구역 잠금을 해제한다.

 

  • 바쁜 대기(busy wait): 반복적으로 상태가 변경되었는지 확인하며 대기하는 방식
    • 뮤텍스 락에서는 acquire함수가 lock 전역변수 상태 변경을 끊임없이 확인하며 대기한다.

 

  • 뮤텍스 락의 한계
    • 사용할 수 있는 공유 자원이 없으면 프로세스는 무한히 반복하며 공유 자원 사용 가능 여부를 확인해야 한다.
    • 즉, 바쁜 대기 상태로 CPU의 주기를 낭비하게 된다.

 


 

2. 세마포

 

세마포(semaphore)

  • 뮤텍스 락보다 조금 더 일반화된 동기화 도구
  • 공유 자원이 여러 개 있는 상황에서도 적용이 가능하다.
  • 철도 신호기에서 세마포란 단어가 유래되었다.

 

 

  • 세마포의 종류
    • 이진 세마포(binary semaphore): 뮤텍스 락과 비슷한 개념(공유 자원이 하나)
    • 카운팅 세마포(counting semaphore): 공유 자원이 여러 개일 때

 

세마포의 구현

  • 하나의 전역 변수와 두개의 함수로 구현된다.
    • 전역 변수 S: 임계 구역 진입 가능 프로세스 개수 (사용 가능 공유 자원 개수)를 나타냄
    • wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 하는지를 확인하는 함수
    • signal 함수: 임계 구역에서 기다리는 프로세스에 진입이 가능하다고 신호를 주는 함수

 

  • wait 함수와 signal 함수 구현
# wait 함수
wait () {
    while (S <= 0 )	# 1 임계 구역에 진입할 수 있는 프로세스 개수가 0개 이하라면
    	;		# 2 사용할 수 있는 자원이 있는지를 반복 확인
    S--;		# 3 임계 구역 진입 가능 프로세스가 1개 이상이면 S를 1 감소시키고 임계구역 진입
}


# signal 함수
signal () {
    S++		# 임계 구역에서 작업을 마친 후 S를 1 증가 시킨다.
}

 

 

 

  • 세마포를 통한 프로세스의 공유자원 접근
wait()
// 임계 구역
signal()

 

  • 세마포의 바쁜 대기 극복
    • 세마포는 wait 함수에서 사용 가능 자원이 없을 때 프로세스를 대기상태로 만들어 바쁜 대기를 방지한다.
    • 프로세스의 PCB를 대기 큐에 집어넣고, signal 함수 호출을 대기한다.
    • 다른 프로세스가 임계 구역 작업이 끝나고 signal 함수를 호출하면, signal 함수는 대기 중인 프로세스를 대기 큐에서 제거한다.
    • 대기 큐에서 제거된 프로세스는 준비 상태로 변경되고 준비 큐로 이동된다.
# 변경된 wait 함수
wait () {
    S--;
    if ( S < 0 ) {
        add process p to Queue;  /* 1. 프로세스 p의 PCB를 대기큐에 삽입 */
        sleep();                 /* 2. 대기 상태로 변경 */
    }
}



# 변경된 signal 함수
signal () {
    S++
    if (S <= 0 ) {
        remove a process p from Queue /* 1. 대기 큐의 프로세스 p 제거 */
        wakeup(p)                     /* 2. 프로세스 p를 대기 상태에서 준비 상태로 변경 */
    }
}

 

  • S 값이 0 이하인 경우 프로세스 진입은 방지된다. 이 경우, S 값은 계속 감소하지만, 프로세는 대기큐로 보내진다.
  • 어떤 프로세스가 종료되서 signal 함수가 호출되면 S 값이 1 증가한다. 그리고 S값이 0 이하인 경우, 대기큐에 프로세스가 있다는 것을 의미한다.
  • 이 경우, 대기 큐의 프로세스를 꺼내 준비 상태로 변경한다.

 

세마포를 이용해 프로세스 순서를 제어하는 방법

  • 프로세스 P1과 P2가 동시에 실행될 때, P1이 먼저 실행되야 하는 경우
  • S는 0으로 설정하고, P1은 임계구역 뒤에 signal() 함수를, P2는 임계구역 앞에 wait()를 두면 순서는 무조건 P1, P2로 실행된다.
  • 이 경우, P1은 바로 임계구역으로 진입, P2는 S값이 -1이 되어 무조건 대기가 걸린다.

 

 

세마포의 한계

  • 사용하기 불편하다.
    • 임계구역 앞뒤로 wait와 signal을 명시하는 일 

 

  •  잘못된 코드로 인해 오류가 발생할 수 있다.
    • 세마포를 누락한 경우(wait와 signal 함수 누락)
    • wait와 signal 순서를 반대로 쓴 경우
    • wait 또는 signal을 중복해서 사용한 경우

 

3. 모니터

 

모니터(monitor)

  • 공유 자원과 옹유 자원에 접근하는 인터페이스(통로)를 묶어서 관리
  • 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근
  • 인터페이스에 접근할 프로세스는 큐(모니터에 진입하기 위한 큐)에 삽입되고, 모니터 내에는 항상 하나의 프로세스만 들어오도록 하여 상호배제를 위한 동기화를 실현한다.
  • 조건 변수를 통해 특정 조건을 바탕으로 프로세스 실행 및 일시 중단하여 실행 순서를 위한 동기화를 실현한다.
    • 조건 변수(conditional variable): 프로세스나 스레드 실행 순서를 제어할 때 사용하는 변수

 

 

모니터의 조건 변수

  • 조건 변수는 wait와 signal 연산을 수행할 수 있다.
  • wait는 호출한 프로세스 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
    • 여기서 상호 배제를 위한 큐(모니터에 진입하기 위한 큐)와 조건 변수에 대한 대기 큐(wait 호출 후 실행 중단된 프로세스들이 삽입되는 큐)는 다르다.
    • 모니터에 진입하기 위한 큐는 하나의 프로세스만 모니터에 진입하게 만들어진 큐다.
    • 조건 변수에 대한 대기 큐는 모니터에 진입한 프로세스가 실행 조건 만족 때까지 대기하기 위해 만들어진 큐다.
  • 조건변수는 여러가지가 있을 수 있다.
    • 예를 들어 특정 프로세스가 모니터에 들어오고 x.wait()가 호출되면 조건 변수 x가 만족할 때까지 대기한다.
  •  wait 연산으로 실행이 일시 중지된 프로세스는 다른 프로세스의 signal 연산을 통해 실행이 재개될 수 있다.
    • 예를 들어 x.signal은 조건변수 x 대기 큐에 삽입된 프로세스 실행을 재개하는 함수이다.

 

 

모니터에서 프로세스의 실행 조건

  1. wait 호출한 프로세스는 signal 호출한 프로세스가 모니터를 떠난 뒤 실행될 수 있다.
  2. signal 호출한 프로세스 실행을 일시 중지될 때

 

 

모니터의 프로세스 실행 순서 제어 동기화

  • 조건 변수를 이용해서 실현된다.
  • 특정 프로세스가 아직 실행될 조건이 되지 않으면 wait를 통해 실행을 중단한다.
  • 특정 프로세스 실행 조건이 충족된 경우, signal을 통해 실행을 재개한다.

 

 

모니터 장점

  • 세마포에 비해 사용자가 이용하기 편한 도구

 

참고

반응형