first commit
This commit is contained in:
107
Assignment/Assignment1/source/21281280-柯劲帆-课后习题1.md
Normal file
107
Assignment/Assignment1/source/21281280-柯劲帆-课后习题1.md
Normal file
@@ -0,0 +1,107 @@
|
||||
<h1><center>课程作业</center></h1>
|
||||
|
||||
<div style="text-align: center;">
|
||||
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">操作系统</span></div>
|
||||
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">课后习题1</span></div>
|
||||
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
|
||||
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
|
||||
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
|
||||
</div>
|
||||
---
|
||||
|
||||
## 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;
|
||||
```
|
||||
Reference in New Issue
Block a user