Skip to content

Commit

Permalink
增加哲学家就餐问题+代码
Browse files Browse the repository at this point in the history
  • Loading branch information
wolverinn authored May 6, 2020
1 parent 6d60d59 commit ae2a4ca
Showing 1 changed file with 81 additions and 37 deletions.
118 changes: 81 additions & 37 deletions Operating Systems.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,47 +100,91 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急
<summary>生产者-消费者问题</summary>

> 问题描述:使用一个缓冲区来存放数据,只有缓冲区没有满,生产者才可以写入数据;只有缓冲区不为空,消费者才可以读出数据
>
> ```c
> // 伪代码描述
> // 定义信号量 full记录缓冲区物品数量 empty代表缓冲区空位数量 mutex为互斥量
> semaphore full = 0, empty = n, mutex = 1;
>
> // 生产者进程
> void producer(){
> do{
> P(empty);
> P(mutex);
>
> // 生产者进行生产
>
> V(mutex);
> V(full);
> } while(1);
> }
>
> void consumer(){
> do{
> P(full);
> P(mutex);
>
> // 消费者进行消费
>
> V(mutex);
> V(empty);
> } while(1);
> }
>
> ```
>
>
>
> </details>
代码实现:
```c
// 伪代码描述
// 定义信号量 full记录缓冲区物品数量 empty代表缓冲区空位数量 mutex为互斥量
semaphore full = 0, empty = n, mutex = 1;

// 生产者进程
void producer(){
do{
P(empty);
P(mutex);

// 生产者进行生产

V(mutex);
V(full);
} while(1);
}

void consumer(){
do{
P(full);
P(mutex);

// 消费者进行消费

V(mutex);
V(empty);
} while(1);
}

```
</details>

<details>
<summary>哲学家就餐问题</summary>

> 问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每只筷子必须由两位哲学家共享。
代码实现:
```c
#define N 5 // number of philosopher
#define LEFT (i + N - 1)%N // number of i's left neighbors
#define RIGHT (i + 1)%N // number of i's right neighbors
#define THINKING 0
#define HUNGRY 1
#define EATING 2
typedef int semaphore;
int state[N]; // array to keep track of everyone's state
semaphore mutex = 1; // mutual exclusion of critical region
semaphore s[N];

void philosopher(int i) {
while (TRUE) {
think();
take_forks(i);
eat();
put_forks(i);
}
}

void take_forks(int i) {
down(&mutex); // enter critical region
state[i] = HUNGRY; // record that i is hungry
test_forks(i); // try to acquire two forks
up(&mutex); // exit critical region
down(&s[i]); // block if forks are not acquired
}

void put_forks(int i) {
down(&mutex); // enter critical region
state[i] = THINKING; // record that has finished eating
test_forks(LEFT); // see if left neighbor can now eat
test_forks(RIGHT); // see if right neighbor can now eat
up(&mutex); // exit critical region
}

void test_forks(int i) {
if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) {
state[i] = EATING;
up(&s[i]);
}
}
```
</details>
<details>
Expand Down

0 comments on commit ae2a4ca

Please sign in to comment.