이야기박스
운영체제) 고전적인 프로세스간 통신 문제들 본문
반응형
▣ 식사하는 철학자 문제 (Dining Philosophers)
- 철학자들이 원탁에 모여 식사함
- 먹는데는 양쪽의 두개의 포크가 필요하다
- 하나씩 포크를 들면, 다른 하나의 포크를 얻기 위해 기다리게 됨 (기아상태)
- 어떻게 이러한 데드락을 피할 수 있는가
#define TRUE 1
#define FALSE 0
#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
typedef int semaphore;
int state[N];
semaphore mutex = 1;
semaphore s[N];
void philosophere(int i) {
while (TRUE) {
think();
take_forks(i);
eat();
put_forks(i);
}
}
void take_forks(int i) {
down(&mutex);
state[i] = HUNGRY;
test(i);
up(&mutex);
down(&s[i]);
// 포크를 사용하였다면 : 1->0
// 포크를 사용하지 않았다면 : 0->sleep
}
void put_forks(int i) {
down(&mutex);
state[i] = THINKING;
test(LEFT);
test(RIGHT);
// 블락된 양 옆 사람 시그널을 주는 과정
up(&mutex);
}
void test(int i) {
if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) {
state[i] = EATING;
up(&s[i]);
}
}
- state : 철학자가 식사중인지, 생각중인지, 배고파하는지 결정
- 필요한 포크가 사용중이라면, 배고픈 철학자라도 블락된다
▣ 읽는자 쓰는자 (The Readers and Writers Problem)
- 식사하는 철학자 문제가 I/O와 같이 제한된 수의 자원에 접근하는 문제라면
- 읽는자 쓰는자는 데이터베이스에 접근하는 모델
- 여러 리더가 존재 가능
- Reader 와 Writer의 배타적 접근
#define TRUE 1
#define FALSE 0
typedef int semaphore;
semaphore mutex = 1;
semaphore db = 1;
int rc = 0; // reader counter
void reader(void)
{
while (TRUE) {
down(&mutex);
rc = rc + 1;
if (rc == 1) down(&db); // 첫 Reader라면
up(&mutex);
read_data_base();
down(&mutex);
rc = rc - 1;
if (rc == 0) up(&db); // 마지막 Reader라면
up(&mutex);
use_data_read();
}
}
void writer(void)
{
while (TRUE) {
think_up_data();
down(&db);
write_data_base();
up(&db);
}
}
- mutex : read간 rc의 배제
- db : reader- writer 간
▣ 잠자는 이발사 (The Sleeping Barber)
- 한명의 이발사, 하나의 이발용 의자, 기다리는 손님을 위한 n개의 의자
- 손님이 없으면 이발사는 sleep
- 손님이 오면 이발사는 wakeup
- 이발 중 손님이 오면 대기용 의자에서 기다림
- 대기용 의자도 만석이면 손님은 그냥 이발소를 떠남
==> 이발사와 손님이 경쟁조건에 빠지지 않도록 하는 것
#define TRUE 1
#define FALSE 0
#define CHAIRS 5
typedef int semaphore;
semaphore customers = 0;
semaphore barbers = 0;
semaphore mutex = 1;
int waiting = 0;
void barber(void)
{
while (TRUE) {
down(&customers);
down(&mutex);
waiting = waiting - 1;
up(&barbers);
up(&mutex);
cut_hair();
}
}
void customer(void) {
down(&mutex);
if (waiting < CHAIRS) {
waiting = waiting + 1;
up(&customer);
up(&mutex);
down(&barbers);
get_haircut();
}
else {
up(&mutex);
}
}
- 경쟁조건에 빠지지 않도록 --> 3개의 semaphore
a. customers : 기다리는 손님의 수
b. barbers : 이발사 수 (0 or 1 )
c. mutex : 상호배제
반응형
'Computer & Data > Operating System' 카테고리의 다른 글
| 운영체제) 메모리 관리2 (Memory Management) (0) | 2017.06.06 |
|---|---|
| 운영체제) 메모리 관리1 (Memory Management) (0) | 2017.05.26 |
| 운영체제) 스케줄링 (0) | 2017.05.14 |
| 운영체제) 프로세스간 통신 (0) | 2017.04.17 |
| 운영체제란, (복습) (1) | 2017.04.03 |