ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Operating System] 프로세스 동기화 : 동기화 기법
    Operating System 2024. 5. 20. 11:30

    여러 프로세스 동기화 기법 중
    뮤텍스 락, 세마노, 모니터에 대해 정리하였습니다.



    참조 : 인프런 '개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제'


    < 뮤텍스 락 Mutex Lock >

    동기화의 두 가지 종류(실행 순서 제어, 상호 배체) 중 상호 배제를 위한 동기화 도구입니다.

    자물쇠 역할을 하여 임계구역을 관리합니다.

     

    뮤텍스 락 이미지

     

    [ 뮤텍스 락 구현 방법 ]

    • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock

    • 임계 구역을 잠그는 역할 : acquire 함수
      - 프로세스가 임계 구역에 진입하기 전에 호출
      - 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인
      (이를 busy waiting이라고 합니다. 반복적으로 계속해서 확인하는 이러한 방식은 좋은 방식이 아닙니다.)
      - 임계 구역이 열려 있다면 임계 구역을 잠그기(lock을 true로 바꾸기)

    • 임계 구역의 잠금을 해제하는 역할 : release 함수
      - 임계 구역에서의 작업이 끝나고 호출
      - 현재 잠긴 임계  구역을 열기(lock을 false로 바꾸기)

    뮤텍스 락 코드 구현(C언어)

     

     


    < 세마포 Semaphore >

    공유 자원이 여러 개 있는 경우에도 적용 가능한, 뮤텍스 락보다 좀 더 일반화된 방식의 상호 배제를 위한 동기화 도구입니다.
    (세마포를 활용한 실행 순서 제어 동기화 또한 가능합니다.)

    다음과 같은 방식으로 구현합니다.
    - 임계 구역 앞에서 멈춤 신호를 받으면 잠시 대기.
    - 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입.

     

    세마포 이미지

     

    [ 세마포 구현 방법 ]

    • 임계구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S

    • 임계구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수 (임계구역 진입 전 호출)

    wait 함수

    - 임계구역에 진입할 수 있는 프로세스 개수가 0 이하라면 사용할 수 있는 자원이 있는지 반복적으로 확인(busy waiting)
     임계구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역 진입

     

    • 임계구역 앞에서 기다리는 프로세스에 '가도 좋다'고 신호를 주는 signal 함수 (임계구역 진입 후 호출)

    signal 함수

    - 임계구역에서의 작업을 마친 뒤 S를 1 증가

     

     


    [ Busy Waiting 해결 방법 ]

    : Busy Waiting 방식은 CPU를 사이클을 낭비합니다. 이를 해결하기 위해 대기상태와 준비상태를 활용합니다.

     

    • 사용할 수 있는 자원이 없을 경우 해당 프로세스를 대기 상태로 만듦
      (해당 프로세스의 PCB를 대기 큐에 삽입)

    : 해당 프로세스를 대기 큐에 삽입 후 대기 상태로 전환

     

    • 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦
      (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)

    : 대기 큐에 있는 프로세스 P 제거 후 대기 상태에서 준비 상태로 전환

     

     


    [ 세마포를 활용한 실행 순서 동기화 ]

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

     

    Ex) P1, P2가 동시에 실행 중에 있는데 P1이 반드시 먼저 실행되어야 하는 경우

    세마포를 활용한 실행 순서 동기화

    - P1이 P2보다 먼저 실행 되는 경우 : P1 먼저 임계 구역 진입

    - P2가 P1보다 먼저 실행 되는 경우 : wait() 함수를 만나기 때문에 P1 먼저 임계 구역 진입

     

     

    세마포에는 이진세마포와 카운팅 세마포가 있는데 여기서는 카운팅 세마포를 다루었습니다.

     

     


    < 모니터 Monitor >

    실행 순서 제어를 위한 동기화, 상호 배제를 위한 동기화 모두 제공해주는 동기화 도구입니다.

     

     

    [ 모니터 상호 배제 동기화 구현 방법 ]

    • 특정 인터페이스를 통해서만 공유 자원에 접근 가능

    • 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
    • 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유 자원 이용

     

     


     

     

     


    [ 모니터 실행 순서 제어 구현 방법 ]

    1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단합니다.

    2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개합니다.

     

    • 조건 변수 condition variable 를 이용합니다.
      (프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수입니다.)

    • 조건변수.wait() : 프로세스를 대기 상태로 변경, 조건 변수에 대한 큐에 삽입

    : 큐의 두번째 프로세스가 먼저 실행되어야 할 경우 첫 번째 프로세스의 wait함수 호출하여 대기 상태로 변경 → 두 번째 프로세스가 먼저 임계 구역 진입

     

    • 조건변수.signal() : wait으로 대기 상태에 접어든 조건 변수를 실행 상태로 변경

    : 두 번째 프로세스가 signal함수 호출 시 두 가지 방식이 있습니다.

    1. wait()를 호출했던 첫 번째 프로세스는 signal()을 호출한 두 번째 프로세스가 모니터를 떠난 뒤 수행 시작
    2. signal()을 호출한 두 번째 프로세스의 실행을 일시 중단하고 첫 번째 프로세스가 실행된 뒤 다시 signal()을 호출한 두 번째 프로세스의 수행 재개

     

     

     

     

    댓글

Designed by Tistory.