4,阻塞→就绪:阻塞态进程所等待的事件发生了,例如读数据的操作完成。
⑵ 当我们观察系统中某些进程时,能够看到某一进程产生的一次状态转换能引起另一个进程作一次状态转换。在什么情况下,当一个进程发生转换3时,能立即引起另一进程发生转换1?试说明是否会发生这些因果转换:2→1;3→2;4→1。
答:2—1:可以。运行进程用完了本次分配给它的时间片,让出CPU,从就绪队列中选一个进程投入运行。
3—2:不可以。任何时候一个进程只能处于一种状态,它既然由运行态变为阻塞态,就不能再变为就绪态。 4—1:可以。某一阻塞态进程等待的事件出现了,而且此时就绪队列为空,该进程进入就绪队列后马上又被调度运行。
⑤ 运行 等待磁盘读文件 ③ 等待打印机输出结果 ② ⑥ ① 就绪进程队列 ④ 2、某分时系统的进程出现如上图所示的状态变化。
试问 ⑴ 你认为该系统采用的是何种进程调度算法? 答:该分时系统采用的进程调度算法是时间片轮转法。
⑵ 把图中所示的每一个状态变化的原因填写在下表中。
变 化 ① ② ③ ④ ⑤ ⑥ 原 因 进程被选中,变成运行态 时间片到,运行的进程排入就绪队列尾部 运行的进程启动打印机,等待打印 打印工作结束,等待的进程排入就绪队列尾部 等待磁盘读文件工作 磁盘传输信息结束,等待的进程排入就绪队列尾部
3、四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
⑴ 如何定义信号量及初值;
答:两个信号量m和s,s和m的初值均为1。
⑵ 在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:
进程A 进程B 进程C 进程D ? ? ? ?
[1] [3] [5] [7] read F read F read F read F [2] [4] [6] [8] 答:进程A 进程 B 进程 C 进程 D
P(m) P(s) P(m) P(s)
read F read F read F read F V(m) V(s) V(m) V(s) 4、判断下面的同步问题的算法是否正确?若有错,请指出错误原因并予以改正。
⑴ 设A、B两进程共用一个缓冲区Q,A向Q写入信息,B则从Q读出信息,算法框图如图所示。
⑵ 设A、B为两个并发进程,它们共享一临界资源。其运行临界区的算法框图如图所示。
答:这个算法不对。因为A、B两进程共用一个缓冲区Q,如果A先运行,且信息数量足够多,那么缓冲区Q中的信息就会发生后面的冲掉前面的,造成信
息丢失,B就不能从Q中读出完整的信息。
进行改正:A、B两进程要同步使用缓冲区Q。为此,设立两个信号量: empty表示缓冲区Q为空,初值为1; full表示缓冲区Q为满,初值为0。 算法框图如图所示。
A进程 B进程 P(empty) P(full) 向Q写入信息 从Q中读出信息 V(full) V(empty)
5、设有一台计算机,有两条I/O通道,分别接一台输入机和一台打印机。输入机把一批数据逐一输入到缓冲区B1中,加工处理后再搬到B2中,并在打印机上打印,请问:
⑴ 系统要设几个进程来完成这个任务?各自的工作是什么? ⑵ 这些进程间有什么样的相互制约关系? ⑶ 用P、V操作写出这些进程同步算法。 答:(1)系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。
②R进程受C进程影响,B1放满信息后R进程要等待——等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进行打印。
③信号量含义及初值:
B1full—— 缓冲区B1满,初值为0;
B1empty——缓冲区B1空,初值为0; B2full—— 缓冲区B2满,初值为0; B2empty——缓冲区B2空,初值为0;
R进程 C进程 P进程 输入信息写入缓冲区B1 P(B1full) P(B2full)
V(B1full) 从B1中取出信息 从B2中取出信息进行打印 P(B1empty) 加工信息 V(B2empty) 结果送入B2 V(B1empty) V(B2full) P(B2empty)
6、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P,V原语实现爸爸、儿子、女儿三个并发进程的同步。
答:Var dish,apple,banana:Semaphore:=1,0,0;
Main() { cobegin
Father(); son();daugher(); Coend } Father()
{ while (true) { p(dish);
if 放的是苹果 v(apple); else V(banana)}
}
son()
{ while (true)
{ p(banana);从盘子取香蕉;v(dish); 吃香蕉;} }
daugher()
{ while (true)
{ p(apple);从盘子取苹果;v(dish); 吃苹果;} }