1. 뮤텍스 락(Mutex lock)
상호배제를 위한 동기화 도구(자물쇠 역할)
뮤텍스 락의 단순한 형태
전역 변수 하나, 함수 두 개
자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
임계 구역을 잠그는 역할 : acquire 함수
임계 구역의 잠금을 해제하는 역할 : release 함수
01 auquire 함수
프로세스가 임계 구역에 진입하기 전에 호출
임계 구역이 잠겨 있다면 - 임계구역이 열릴때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인
임계 구역이 열려 있다면 - 임계 구역을 잠그기(lock을 true로 바꾸)
While문을 통해 계속 임계 구역이 잠겨있는지 없는지 확인하므로 Busy Waiting(바쁜 대기)이다.
02 release 함수
임계 구역에서의 작업이 끝나고 호출
현재 잠긴 임계 구역을 열기(lock을 false로 바꾸기)
임계 구역에서의 작업 전 후로 acquire와 release를 호출하면 된다.
세마포(Semaphore)
뮤텍스 락과 비슷하지만 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식이고 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.
세마포의 작동 원리는 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역에 진입한다.
세마포의 단순한 형태
전역 변수 하나, 함수 두 개
임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait함수
임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수
01 wait함수
02 signal 함수
03 예시
세 개의 프로세스 P1, P2, P3가 두 개의 공유 자원 (S = 2)에 P1,P2,P3순서로 접근한다고 가정
문제 - CPU 낭비
이렇게 실행되는 경우 while문을 사용하므로 Busy Waiting이다. 하지만 이렇게 사용하게되면 while문을 사용하는 것도 CPU를 사용하게 된다. 그러므로 쓸데없는 일에 CPU의 사이클이 낭비될 수 있다.
해결 방법
사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 - 해당 프로세스의 PCB를 대기 큐에 삽입
사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 - 해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입한다.
05 해결 방법에 대한 예시
세 개의 프로세스 P1, P2, P3가 두 개의 공유 자원 (S = 2)에 P1,P2,P3순서로 접근한다고 가정
04 세마포를 이용해 프로세스의 순서를 제어하는 방법
세마포의 변수 S를 0으로 두고 먼저 실행할프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait함수를 붙이면 된다.
그러면 매번 임계구역 앞뒤로 wait(), signal()을 호출해야하는 걸까?
아래와 같은 예시로 잘못된 코드로 인해 예기치 못한 결과를 얻을 수 있다.
모니터(Monitor)
세마포에 비하면 사용자가 사용하기에 훨씬 편리한 도구이다. 공유 자우너과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리한다. 그리고 프로세스는 반드시 인터페이스를 통해서만 접근하도록한다.
모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한)큐에 삽입하고 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유자원을 이용하도록한다. 그러므로 모니터 안에는 하나의 프로세스만이 있을 수 있다.
실행 순서 제어를 위한 동기화
01 조건 변수(condition variable)
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수이다.
02 wait
대기 상태로 변경, 조건 변수에 대한 큐에 삽입한다. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
03 siganl
wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경한다. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.
참고 : 본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard
'책 > 혼공 컴퓨터구조+운영체제' 카테고리의 다른 글
운영체제 - 교착 상태 해결 방법(예방, 회피, 검출 후 회복) (0) | 2024.02.15 |
---|---|
운영체제 - 교착 상태(식사하는 철학자 문제,자원할당 그래프, 교착 상태 발생 조건) (0) | 2024.02.15 |
운영체제 - 동기화, 공유 자원, 임계 구역, 상호 배제 (1) | 2024.02.01 |
운영체제 - CPU스케줄링 알고리즘(선입 선처리, 최단 작업 우선, 라운드 로빈, 최소 잔여 시간 우선, 우선순위, 다단계 큐, 다단계 피드백 큐) (0) | 2024.01.21 |
운영체제 - 스레드, 단일 스레드 프로세스와 멀티 스레드 프로세스, 스레드의 구성요소, 멀티프로세스와 멀티 스레드 (0) | 2023.12.20 |
댓글