计算机操作系统作业
第二单元
第一次作业
5.假设系统就绪队列中有10个进程,这10个进程轮换执行,每隔300ms轮换一次,CPU在进程切换时所花费的时间是10ms,试问系统化在进程切换上的开销占系统整个时间的比例是多少 ?
**答:**进程的总时间为:300ms+10ms=310ms;
有10个进程,则切换时间为:10ms×10=100ms;
进程切换时间占整个时间的比例=进程切换时间/总时间
100ms÷10×310ms=0.03226
所以,系统化在进程切换上的开销占系统整个时间的比例是3.226%。
7. (3)根据图2-18所示的进程状态转换图说明该系统CPU调度的策略和效果。
**答:**当进程调度时,首先从高优先级就绪队列选择一个进程,赋予它的时间片为100ms。如果高优先级就绪队列为空,则从低优先级就绪队列选择进程,并且赋予该进程的时间片为500ms。
这种策略一方面照顾了短进程,一个进程如果在100ms运行完毕它将退出系统,更主要的是照顾了I/O量大的进程,进程因I/O进入阻塞队列,当I/O完成后它就进入了高优先级就绪队列,在高优先级就绪队列等待的进程总是优于低优先级就绪队列的进程。而对于计算量较大的进程,它的计算如果在100ms的时间内不能完成,它将进入低优先级就绪队列,在这个队列的进程被选中的机会要少,只有当高优先级就绪队列为空,才从低优先级就绪队列选择进程,但对于计算量大的进程,系统给予的适当照顾时间片增大为500ms。
第二次作业
4.设有一个售票大厅可容纳200人购票,如果厅内不足200人则允许进入,超过则在厅外等候;售票员某时只能给一个购票者服务,购票者买完票后就离开。
(1)购票者之间是同步关系还是互斥关系?
**答:**购票者之间是互斥关系。一个资源不能同时被多个进程使用。在售票大厅中,如果大厅内已经容纳了200人,那么新的购票者就不能进入,必须等待现有购票者完成购票并离开后才能进入。即使大厅内未达到200人,由于售票员某时只能给一个购票者服务,因此两个购票者不能同时接受服务。
(2)用P、V操作描述购票者的工作过程。
**答:**P操作表示获取信号量,而V操作表示释放信号量。购票者首先尝试进入售票大厅,如果售票大厅已满(即empty信号量为0),则购票者会等待。当有位置时,购票者会获取进入售票大厅的权限(即mutex信号量为1)。在售票大厅内完成购票操作后,购票者会释放进入售票大厅的权限(即mutex信号量加1),并通知其他购票者可以进入售票大厅(即full信号量加1)。
Semaphore mutex = 1; // 用于控制进入售票大厅的互斥量
Semaphore full = 0; // 用于表示售票大厅已满的信号量
Semaphore empty = 200; // 用于表示售票大厅未满的信号量
void purchaser() {
while (true) {
P(empty); // 尝试进入售票大厅,如果已满则等待
P(mutex); // 获取进入售票大厅的权限
buyTicket();// 在售票大厅内进行购票操作
V(mutex); // 释放进入售票大厅的权限
V(full); // 通知其他购票者可以进入售票大厅
}
}
5.进程之间的关系如图3-16所示,试用P、V操作描述它们之间的同步
**答:**设:s1→s2为a ,s1→s3为b,s2→s6为c,s3→s4为d,s3→s5为e,s4→s6为f,s5→s6为g。
Semaphore a,b,c,d,g,f,g=0,0,0,0,0,0,0;
p1(){s1;v(a);v(b);}
p2(){p(a);s2;v(c);}
p3(){p(b);s3;v(b);v(e);}
p4(){p(d);s4;v(f);}
p5(){p(e);s5;v(g);}
p6(){p(c);{p(f);p(g);s6;}
6.有四个进程P1、P2、P3和P4共享一个缓冲区,进程P1向缓冲区中存入消息,进程P2和P4从缓冲区中取消息,要求发送者必须等三个进程都取过本条消息后才能发送下一条消息。缓冲区内每次只能容纳一个消息,用P、V操作描述四个进程存取消息的情况。
**答:**使用三个信号量:mutex用于互斥访问缓冲区,设初始值为1;full用于表示缓冲区中有消息,设初始值为0;empty用于表示缓冲区为空,设初始值为3。
Semaphore mutex = 1; // 用于控制对缓冲区的互斥访问
Semaphore full = 0; // 用于表示缓冲区中有消息
Semaphore empty = 3; // 用于表示缓冲区为空,可以存放新消息
void sender() {
while (true) {
prepareMessage(); // 准备消息
P(empty); // 等待缓冲区有空位
P(mutex); // 获取对缓冲区的互斥访问权限
depositMessage();// 将消息存入缓冲区
V(mutex); // 释放对缓冲区的互斥访问权限
V(full); // 通知取消息的进程有新消息
}
}
void receiver(int id) {
while (true) {
P(full); // 等待缓冲区中有消息
P(mutex); // 获取对缓冲区的互斥访问权限
retrieveMessage(id); // 从缓冲区中取出消息
V(mutex); // 释放对缓冲区的互斥访问权限
V(empty); // 通知发送者可以存入新消息
}
}
sender
函数代表进程P1,负责向缓冲区中存入消息;receiver
函数代表进程P2和P4,负责从缓冲区中取出消息。每个进程都会首先尝试获取对缓冲区的互斥访问权限(通过P(mutex)
),然后根据是发送者还是接收者执行相应的操作。发送者在存入消息后会释放互斥访问权限并通知其他进程有新消息(通过V(mutex)
和V(full)
)。接收者在取出消息后也会释放互斥访问权限并通知发送者可以存入新消息(通过V(mutex)
和V(empty)
)。