Study/혼자 공부하는 컴퓨터구조+운영체제 정리

12장 프로세스 동기화

공부하기 좋은 날 2023. 2. 12. 20:00

12-1. 동기화란

동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고받는다.
이때 실행 순서와 자원의 일관성을 보장해야하는데,
이 과정을 동기화라고 한다.

 


1) 동기화의 의미

협력적으로 동시에 실행되는 프로세스와 스레드는 올바른 실행을 위해 동기화가 필수적이다.
프로세스 동기화란 프로세스들 사이 수행 시기를 맞추는 것.

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

 


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

: 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것.
ex) 빈 종이에 쓴 다음에 읽을 수 있는 것 처럼
write 값이 있을 때 read수행

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

: 공유 불가능 한 자원의 동시 사용을 피하기 위해 동시 접근을 할 수 없도록 사용하는 알고리즘
ex) 입금 출금을 할 때 '잔액'이라는 데이터 동시 사용 시기에 한 프로세스가 데이터 접근했을 때 다른프로세스는 기다리고, 접근하지 못하게 함.

 

[상호배제를 위한 동기화 문제]

1) 생산자와 소비자 문제

: 생산자와 소비자는 '총합'이라는 데이터를 공유하고, 생산자-버퍼에 1증가 / 소비자-버퍼에 1감소

작업을 수행한다. 이때 생산자와 소비자가 총합 데이터에 동시접근하면 어떤 생산자가 얼마나 총합을 증가시킨 지 모른채 소비자가 총 합을 수정할 수 있기 때문에 예상치 못한 결과를 낳을 수 있다.

즉, 접근해서는 안되는 자원에 동시접근하여 발생하는 문제.

 

2) 공유자원과 임계구역

그렇다면 동시에 접근해서는 안되는 자원이란 무엇인가?

 

공유 자원: 동시에 실행되는 프로세스들이 갖는 공동의 자원. 전역변수, 파일, 입출력, 보조기억장치가 될 수 있음.
임계구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
상호 배제를 위한 동기화를 위해서는 두 개 이상의 프로세스가 임계구역에 진입하려면 하나는 무조건 대기해야 함.

- 여러 프로세스가 임계구역의 코드를 동시 실행하여 문제가 생기는 것을 레이스 컨디션 이라고 한다.

 

레이스 컨디션이 발생하는 이유:

한 줄의 고급언어는 여러줄의 저급언어로 변환되어 실행되므로 문맥교환이 일어나기 때문에 임계구역에 여러 프로세스가 동시접근하면 문맥교환의 타이밍이 맞지 않아 변경된 공유 자원을 반영하지 못하고 공유자원에 반영하여 잘못된 공유자원 값을 도출한다.

 


이 때, 상호배제를 위한 동기화는 이와같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계구역에 동시 접근 못하도록 하는 것. 이것은 다음 세개의 원칙을 지켜야한다.
1) 상호배제: 한 프로세스가 임계구역에 있으면 다른 프로세스는 임계구역에 못들어감
2) 진행: 임계구역에 아무 프로세스도 없으면 진입하고자 하는 프로세스는 들어가야 한다.
3) 유한대기: 한 프로세스가 임계구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계구역에 들어와야 한다.

 

[확인문제]

1. 동기화의 의미에 대한 설명

1) 실행순서 제어를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기

2) 상호배제를 위한 동기화: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기

 

2. 임계 구역에 대한 설명으로 옳지 않은 것

정답: 1번 -> 임계구역에서 여러개의 프로세스가 동시에 실행하면 레이스컨디션이 발생하므로 하나의 프로세스만 수행되어야 한다.

 

12-2. 동기화 기법

예기치 못한 작동을 막고 올바르게 결과를 나타내도록 돕는 동기화의 대표적 도구에는 어떤것들이 있을까?

 

1) 뮤텍스 락

손님을 프로세스, 탈의실을 임계구역이라고 비유해보자.

어떤 손님이 탈의실을 사용하기 위해 다른 손님이 탈의실 안에 있는지 없는지 알고 싶을 때, 어떻게 해야하는가?

뮤텍스락 비유 (출처: 혼공컴운 책)

-> 탈의실을 열어보고 자물쇠가 걸려있다면 사람이 있으니 기다린다/ 자물쇠가 없다면 사람이 없으니 탈의실을 이용한다

 

이 자물쇠 기능을 구현한 것이 바로 뮤텍스 락

뮤텍스락은 동시에 접근해서는 안되는 자원에 동시 접근하지 못하도록 하는 상호 배제를 위한 동기화 도구

 

뮤텍스 락은 하나의 전역변수와 두개의 함수로 구현

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

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

- 프로세스가 임계 구역 진입 전에 호출하는 함수. 임계 구역이 잠겨있다면 열릴때까지 반복적으로 확인(바쁜대기), 임계 구역이 열려있다면 임계구역을 잠그는(1)의 lock변수를 true로 바꾸는) 함수

3) 임계구역의 잠금 해제 역할: release함수

- 임계 구역에서의 작업이 끝나고 호출하는 함수. 잠긴 임계구역을 열어주는(1)의 lock변수를 false로 바꾸는) 함수

 

lock을 획득하지 못하면 무작정 대기, lock을 획득할 수 있다면 임계구역을 잠근 뒤 작업 진행, 빠져나올 때 임계 구역 잠금 해제의 과정을 통해 상호배제 동기화 방식으로 임계구역을 보호한다.

 

 

2) 세마포

세마포 비유(출처: 혼공컴운 책)

세마포는 뮤텍스 락과 비슷하지만 탈의실이 여러개 있는 상황처럼 공유자원이 여러개 있을 경우에 적용이 가능한 동기화 도구

세마포 비유(출처: 혼공컴운 책)

세마포는 철도 신호기에서 유래한 단어로, 멈춤 신호와 가도 좋다는 신호로 임계구역을 관리한다.

즉, 프로세스는 임계구역 앞에서 멈춤 신호를 받으면 잠시 기다리고, 가도 좋다는 신호를 받으면 그때 임계구역에 들어감.

 

 

세마포도 뮤텍스락처럼 하나의 변수와 두개의 함수로 구현

1) 임계 구역에 진입할 수 있는(사용가능한 공유자원의 개수) 프로세스의 개수변수 s

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

3) 임계구역 앞에서 기다리는 프로세스에 가도 좋다고 신호를 보내는 signal 함수

 

임계구역 진입 전후로 2) wait와 3) signal함수를 호출한다. 이 두 함수는 공유자원의 개수 1) s만큼 사용하여 구현

 

사용할 수 있는 공유 자원이 없는 경우 뮤텍스 기법에서 일어났던 것 처럼의 바쁜 대기를 피하기 위해 대기큐라는 개념을 사용한다.

계속 확인하며 다른 프로세스가 작업이 끝날때까지 바쁘게 기다리는 것이 아닌, '대기상태'를 만들어 다음에 들어가고 싶은 프로세스의 PCB를 대기큐에 집어넣는다.

그리고 다른 프로세스가 임계구역에서의 작업 후에 signal 함수 호출시 대기큐에 있던 프로세스를 준비큐로 옮겨 프로세스가 실행되는 구조.

 

세마포 기법은 앞서 설명한 방법의 상호 배제를 위한 동기화 뿐 아니라 프로세스의 순서를 제어하는 방법 또한 사용할 수 있다. 

세마포 변수 s(사용가능한 공유자원의 개수)를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait함수를 붙여서 실행 순서를 임의로 지정할 수 있다.

3) 모니터

세마포 동기화 방법에서 매번 임계 구역에 앞뒤로 일일이 wait와 signal함수를 붙이는것은 번거롭고, 순서를 헷갈려 잘못 된 코드를 기재할 경우 예기치 못한 오류가 발생할 수 있다. 이러한 이유로 세마포가 발전된 형태인 모니터 기법이 나옴.

모니터 구조(출처: 혼공컴운 책)

모니터는 공유자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다.

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

모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 하여 상호배제를 위한 동기화 제공

 

조건변수를 이용해 실행순서 제어를 위한 동기화도 제공함.

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

실행될 조건이 충족되었을 때는 signal을 통해 실행을 재개

 

<확인 문제>

1) 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요

정답: 4번 -> 세마포는 바쁜대기를 하지 않기 위해 대기큐라는 개념을 만들어 대기 할 프로세스의 pcb를 큐에 삽입한 후 임계구역의 프로세스가 작업 수행을 완료하면 대기큐에 있던 프로세스가 준비큐로 넘어간다.

2) 조건변수 x와 y가 있을 때 스레드 a는 x.wait, b는 y.wait를 호출. 스레드 c가 y.signal을 호출했을 때 실행이 재개되는 스레드는? -> b

3) 세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드 간에 상호배제를 위한 동기화와 실행순서 제어를 위한 동기화를 할 수 있습니다.

'Study > 혼자 공부하는 컴퓨터구조+운영체제 정리' 카테고리의 다른 글

14. 가상메모리  (0) 2023.02.20
13장. 교착상태  (0) 2023.02.12
11. CPU스케쥴링  (0) 2023.02.05
10장. 프로세스와 스레드  (0) 2023.02.05
9장. 운영체제 시작하기  (0) 2023.02.05