본문 바로가기
책/혼공 컴퓨터구조+운영체제

운영체제 - 동기화 기법(뮤텍스 락,세마포,모니터)

by 코딩하는 돼징 2024. 2. 1.
반응형

1. 뮤텍스 락(Mutex lock)

상호배제를 위한 동기화 도구(자물쇠 역할)

 

뮤텍스 락의 단순한 형태

전역 변수 하나, 함수 두 개

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

임계 구역을 잠그는 역할 : acquire 함수

임계 구역의 잠금을 해제하는 역할 : release 함수

 

01 auquire 함수

프로세스가 임계 구역에 진입하기 전에 호출

임계 구역이 잠겨 있다면 - 임계구역이 열릴때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인

임계 구역이 열려 있다면 - 임계 구역을 잠그기(lock을 true로 바꾸)

출처 : 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

While문을 통해 계속 임계 구역이 잠겨있는지 없는지 확인하므로 Busy Waiting(바쁜 대기)이다.


02 release 함수

임계 구역에서의 작업이 끝나고 호출

현재 잠긴 임계 구역을 열기(lock을 false로 바꾸기)

출처 : 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

임계 구역에서의 작업 전 후로 acquire와 release를 호출하면 된다.

출처 : 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

 


세마포(Semaphore)

뮤텍스 락과 비슷하지만 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식이고 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.

세마포의 작동 원리는 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역에 진입한다.

 

세마포의 단순한 형태

전역 변수 하나, 함수 두 개

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

임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait함수

임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수

출처 : 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


01 wait함수

출처 : 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

 


02 signal 함수

출처 : 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

 


03 예시

세 개의 프로세스 P1, P2, P3가 두 개의 공유 자원 (S = 2)에 P1,P2,P3순서로 접근한다고 가정

출처 : 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

문제 - CPU 낭비

이렇게 실행되는 경우 while문을 사용하므로 Busy Waiting이다. 하지만 이렇게 사용하게되면 while문을 사용하는 것도 CPU를 사용하게 된다. 그러므로 쓸데없는 일에 CPU의 사이클이 낭비될 수 있다.

 

해결 방법

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

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

출처 : 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

05 해결 방법에 대한 예시

세 개의 프로세스 P1, P2, P3가 두 개의 공유 자원 (S = 2)에 P1,P2,P3순서로 접근한다고 가정

출처 : 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


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

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

출처 : 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

그러면 매번 임계구역 앞뒤로 wait(), signal()을 호출해야하는 걸까?

아래와 같은 예시로 잘못된 코드로 인해 예기치 못한 결과를 얻을 수 있다.

출처 : 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


모니터(Monitor)

세마포에 비하면 사용자가 사용하기에 훨씬 편리한 도구이다. 공유 자우너과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리한다. 그리고 프로세스는 반드시 인터페이스를 통해서만 접근하도록한다.

 

모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한)큐에 삽입하고 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유자원을 이용하도록한다. 그러므로 모니터 안에는 하나의 프로세스만이 있을 수 있다.

출처 : 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

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

01 조건 변수(condition variable)

프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수이다.

출처 : 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


02 wait

대기 상태로 변경, 조건 변수에 대한 큐에 삽입한다. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.

출처 : 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


03 siganl

wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경한다. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

출처 : 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

 

 

 

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 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

 

 

 

 

 

반응형

댓글