课程作业
课程名称:操作系统
作业名称:课后习题1
学号:21281280
姓名:柯劲帆
班级:物联网2101班
---
## 1. 问题1
**哲学家进餐问题的变形。假设5支筷子都放在圆桌的中间,哲学家进餐时拿起任意两支筷子就可以进餐。其他条件不变。请用信号量实现5个哲学家进程的同步。**
```pascal
Var
chopsticks, eating_philosophers: Semaphore := 5, 4;
Procedure Philosopher(i: integer);
Begin
Repeat
wait(eating_philosophers);
wait(chopsticks);
wait(chopsticks);
Eat;
signal(chopsticks);
signal(chopsticks);
signal(eating_philosophers);
Think;
Until False;
End;
```
## 2. 问题2
**四个进程P0,P1,P2,P3和四个信箱M0,M1,M2,M3进程间借助相邻的信箱传递消息:Pi每次从Mi中取出一条消息,经加工送入Mi+1(mod 4)中。其中M0,M1,M2,M3分别设有3,3,2,2个格子,每个格子放一条消息,初始时,M0装满了三条消息,其余为空。写出使用信号量实现进程 (i=0,1,2,3)同步的算法。**
```pascal
Var
full, empty, mutex: array[0..3] of Semaphore := (3, 0, 0, 0), (0, 3, 2, 2), (1, 1, 1, 1);
Procedure ProcessPi(i: integer);
Var
message: Message;
Begin
Repeat
wait(full[i]);
wait(mutex[i]);
message := Get_Message_From_Mailbox(i);
signal(mutex[i]);
signal(empty[i]);
ProcessMessage;
wait(empty[(i + 1) mod 4]);
wait(mutex[(i + 1) mod 4]);
Send_Message_To_Mail_box((i + 1) mod 4, message);
signal(mutex[(i + 1) mod 4]);
signal(full[(i + 1) mod 4]);
Until False;
End;
```
## 3. 问题3
**汽车司机与售票员之间必须协同工作,汽车每到一个站后,一方面,只有当司机已经停下,售票员才能开门上下客,另一方面,只有售票员把车门关好了司机才能开车。假定某辆公共汽车上有前后门各有一名售票员以及一名司机,汽车初始状态是正在始发站停车上客。试设必要的信号量及赋初值,实现售票员进程和司机进程的同步。**
```pascal
Var
driver, ticket_seller: Semaphore := 1, 2;
Procedure Driver;
Begin
Repeat
wait(driver);
Move;
Stop;
signal(ticket_seller);
signal(ticket_seller);
Until False;
End;
Procedure Ticket_seller(i: integer);
Begin
Repeat
wait(ticket_seller);
wait(ticket_seller);
Open;
signal(driver);
Close;
Until False;
End;
```