第四章
1.
process-run.py -l 5:100,5:100
两进程都只使用CPU,不发起I/O请求
进程状态用下表表示:
每一时刻都有进程运行,因此CPU利用率为100%。
2.
process-run.py -l 4:100,1:0
一个进程有4个需要CPU完成的指令,另一个进程只发出一次I/O请求
进程状态如下表:
进程完成需要的时间与I/O等待完成需要的时间有关,若设这个时间为t0,则两个进程需要的时间t=4+t0+2。(表中假设t0为5个单位时间,两进程所需时间为11)
3.
process-run.py -l 4:1:0,4:100
两进程与题2中相同,交换顺序
进程状态如下表:
当第一个进程发起I/O进入阻塞状态后,第二个进程开始运行,运行完成且I/O完成后第一个进程运行。与题2中相比,两个进程需要7个单位时间就可以完成。(2)中进程一先运行完成,进程二发出I/O请求并阻塞时,CPU为空闲状态,本题中交换运行顺序后,进程一阻塞时,进程二使用CPU,比题2中CPU利用率高,所需时间也更短。
4.
process-run.py -l 4:1:0,4:100 -S SWITCH_ON_END
两进程与题3中相同,顺序也相同,但进程0发起I/O时不切换到进程1运行,则运行情况如下表:
如果系统不进行进程切换,两进程完成时间与题2中相同,交换顺序不对运行时间产生影响。
5.
等待I/O时切换到另一个进程,运行情况与(3)中相同。如下表:
第五章
1.
子进程与父进程中变量的值相同
子进程与父进程同时改变x的值,不会互相影响。
2.
使用如下代码,让父进程和子进程都访问文件描述符并写入文件。
结果如下,即两进程都可以访问文件描述符,写入的是子进程的内容。
4.
查看exec()的变体
参数可以单独传入,也可以按数组的方式传入,并可以传入环境变量,路径,可执行文件名。
调用execl():
调用execv(),:
其他形式的调用:
多种exec()调用的参数传递方式不同,方便以不同的形式使用。
第七章
1.
SJF调度与FIFO调度结果相同,情况如下
平均响应时间为200,平均周转时间为400
2.
SJF调度与FIFO调度结果相同,情况如下
平均响应时间为133.3,平均周转时间为333.3
3.
采用RR方式,时间片为1,则
平均响应时间为1,平均周转时间为599
4.
当作业长度相同时,SJF调度的情况与FIFO相同,因此有相同的周转时间。
5.
当作业长度均相同,且长度等于RR时间片的长度时,SJF调度与RR调度情况相同,有相同的响应时间。
6.
使用如下python程序,假设有三个作业需要调度,长度递增,绘制平均长度和平均响应时间图
响应时间随工作长度的增加而增加
7.
使用时间片为t的RR,N个工作的响应时间为0,t,2t,3t,4t….。平均响应时间为(t+2t+3t+…+(n-1)t)/n=(n-1)t/2,随着量子长度的增加,RR的响应时间也会增加。最坏情况即最后一个工作的响应时间为(n-1)t。
第八章.
1.
设置两个工作和两个队列,限制作业长度小于100,关闭I/O
工作长度为84,42,时间片为10,执行记录为:
平均响应时间为5,平均周转时间为109
更换种子,两工作两队列,关闭I/O
工作长度为14,76,时间片为10,执行记录为:
平均响应时间为5,平均周转时间为69
3.
当工作在同一队列时,进行轮转调度工作,因此只需要将mlfq调度的队列数设置为1,mlfq调度以轮转调度的方式工作。
5.
每隔200ms将所有任务提高至最高优先级,这样能使这个长时间运行的工作至少在200ms内能够轮转一个时间片10ms,即至少占用5%的CPU。
第九章
1.
随机种子为1:
模拟运行情况如下:
随机种子为2:
模拟运行情况如下:
随机种子为3:
模拟运行情况如下:
2.
两个工作长度相同,份额为1:100
模拟运行情况
彩票数量的极大不平衡导致了持有份额小的工作几乎不占用cpu运行,在工作1完成之前工作0没有运行过。这种情况下,持有份额小的工作响应时间很长,而且如果还有其他工作存在并一直占用cou,这个份额小的工作可能会饿死。
3.
使用不同的种子运行两个相同的工作,统计结果如下:
提前完成的工作所用时间平均比后完成的快了8左右,对比工作长度只能保证基本接近公平,假设以提前完成时间比工作长度为指标,不公平度约为8.5%。