[Computer Science]/[운영체제(OS)]

[운영체제(OS)] 7) 고전적인 동기화 이슈

극꼼 2023. 2. 10. 20:41
반응형


1. 유한 버퍼 문제(The Bounded-Buffer Problem)

: 다른 말로는 생산자-소비자 문제(Producer and Consumer Problem)이라 합니다.

유한한 저장공간으로 n개의 버퍼가 존재하며, 각 버퍼는 한 항목(item)을 저장할 수 있습니다. 생산된 데이터는 버퍼에 일단 저장하고, 생산자는 버퍼가 가득 차면 더 넣을 수 없고, 소비자는 버퍼가 비면 뺄 수 없습니다. 

(ex) 컴파일러 - 어셈블러, 서버 - 클라이언트

 

<세마포어를 사용한 busy-wait 회피>

: buffer size == count일 때 무한루프를 돌면서 기다리게 되는데 CPU가 다른 일을 하지 못하게 됩니다(busy wait). 이런 상황을 피해서 성능을 높여주기 위해 세마포어를 사용합니다. 버퍼가 가득 차있다면 생산자쪽에 semaphore가 block 처리를 시켜줌으로서 더이상 cpu가 무한루프를 돌지 않도록 해줍니다. 소비자가 이 버퍼에서 빼내줘서 빈 공간이 생기면 생산자가 다시 사용할 수 있게 됩니다.

 

* Mutex 세마포어 : 버퍼 풀을 접근하기 위한 상호 배제 기능 제공. 1로 초기화.

* Full 세마포어 : 꽉 찬 버퍼의 수를 기록. 0으로 초기화.

* Empty 세마포어 : 비어있는 버퍼의 수를 기록. n으로 초기화.


2. Reader-Writer Problem

: 공통된 DB에 접근할 때 발생하는 문제. DB는 공통이기 때문에 임계구역이 반드시 존재해야 하는데, writer는 임계구역으로 제한하지만 reader는 여러명이 들어오기를 허용합니다.

* reader : DB 읽기만 수행하고, 업데이트하지 않음.

* writer : DB 업데이트 가능.

 

<해결 방법>

1. writer가 DB 사용 허가를 받기 전에는, 모든 reader는 기다리지 않고 수행합니다. writer에게 기아 현상이 발생할 수 있습니다.

* mutex 세마포어 : 1로 초기화. 변수 read_count가 업데이트될 때 상호 배제를 보장하기 위해 사용합니다.

* rw_mutex 세마포어 : 1로 초기화. writer들을 위한 상호 배제 세마포어. 임계구역으로 진입하는 첫번째 reader와 임계구역을 빠져나오는 마지막 reader가 사용합니다.

* read_count 정수 : 0으로 초기화. 현재 몇 개의 프로세스들이 객체를 읽고 있는지 알려줍니다. 

 

2. writer가 준비되면 가능한 한 빨리 쓰기부터 수행할 것을 요청합니다. reader에게 기아 현상이 발생할 수 있습니다.


3. 식사하는 철학자들 문제 (The Dining-Philosophers Problem)

: 5명의 철학자가 5개의 젓가락(한 쌍x), 밥 한그릇을 가지고 식사를 하는 것에 비유. 식사를 하기 위해서는 양 옆 2개의 젓가락이 필요하고, 한 철학자가 식사를 하면 양 옆의 철학자들은 젓가락을 두개 만들지 못해 식사를 할 수 없게 됩니다. 

철학자 = 스레드
밥 = 공유 데이터
젓가락에 대한 접근 = 공유 데이터에 접근
한 철학자가 젓가락 사용 = 임계구역에 접근

 

<데드락>

: 세마포어에 wait() 연산을 실행하여 젓가락을 집기위해 시도하고, signal() 연산을 수행하여 젓가락을 내려놓는데, 인접한 두 철학자가 동시에 식사하지 않음을 보장하는데, 모두 동시에 왼쪽 젓가락을 잡는다면(모두 함께 wait) 데드락 상태에 걸릴 수 있습니다. 

 

- 데드락 해결안

1) 최대 4명의 철학자만 테이블에 동시에 앉을 수 있도록 함

2) 한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용함

3) 비대칭 해결안. 홀수 번호의 철학자는 왼쪽 젓가락, 짝수 번호의 철학자는 짝수 젓가락부터 사용함

 

 

반응형