操作系统导论:第四章
写在前面:
- 英文原版和作业代码可以前往http://pages.cs.wisc.edu/~remzi/OSTEP/下载或者在线阅览。相关的代码下载下来可以用tar xvzf指令进行解压。
- 不出意外,希望能把相关的作业完成以后,用学习日志记录下来。
本书序言部分(第2章)就大致介绍了书的组成,也就是学习部分。包括三部分:虚拟化,并发和持久性。虚拟化部分又分为两部分,CPU和内存的虚拟化。
现在谈第一部分,虚拟化。
第四章的主要内容可以概括为以下几部分:
1.虚拟化CPU采用的机制和策略:时分共享,上下文切换和调度策略。
2.进程的组成:内存信息(指令和数据等);寄存器(通用寄存器,PC,栈指针,帧指针等);持久存储设备等。
3.进程的API包括:创建,销毁,等待,其他控制,状态。
4.进程的创建:
- 将代码和静态数据从磁盘拷贝到内存中(现在CPU惰性拷贝,按需拷贝)
- 给运行时栈分配空间(保存局部变量,函数参数,返回地址等)
- 给堆分配空间:动态分配空间(回想一下malloc和free函数)
- 其他的初始化(和IO相关)
- 转移控制权(从父进程转到创立的新的进程)
5.进程状态的转换:
数据结构部分如果有时间想起来再来补充。
Homework
Options:
-h, 查看帮助文档
-s,产生随机
-l ,给出进程列表,进程由X:Y 标识,X标识进程运行的指令数,Y标识进程使用CPU的概率是多少,进程和进程之间用冒号隔开.
-L,一次IO操作耗时多少,缺省值是5
-S,进程转换
-I,IO行为的类型
-c,算一下答案
-p, 打印状态,要跟在-c后面
中间最重要的是-l操作,制定了进程要做什么.一条指令往往能做两种事情,占用CPU或者是使用IO.当一个进程使用CPU时,进程只会在运行和等待中转换.
譬如运行./process-run.py -l 5:100 ,说明进程有五条指令,然后每条指令是CPU操作的可能是百分之百.
运行结果:
然后带上-c参数,我们就可以看到:
它始终再使用CPU,一直处于RUN状态
然后下面是两个例子辅助理解
1.运行 ./process-run.py -l 5:100,5:100程序,CPU的利用率是多少?
答案是百分之百,因为两个进程都是百分百的CPU操作,然后我们执行下来可以看到是进程0先执行完,然后进程1再继续执行
- ./process-run.py -l 3:0 -L 5运行以后的样子:
然后这里说明的是,尽管三条指令都是IO操作,并且每条指令占用时间为5个单位,单其实并不是15个单位时间都没有使用CPU,IO操作的第一个单位时间会和CPU有关,CPU发出IO请求.
加上-p,我们就可以看到进程的状态
就可以看到CPU操作3次,IO操作12次.
现在是书后问题
- 就是上面的第一个例子,答案是百分之百
- 运行./process-run.py -l 4:100,1:0,预测时间多少.
答案应该是4±L参数值,因为缺省,多以应该是9.这里是先运行了4条指令,然后开始IO操作.IO操作期间,CPU就没有事情可以做了,因为没有其他需要运行的CPU相关的指令了.
- 运行./process-run.py -l 1:0,4:100,预测时间.答案应该是5
因为这里是在第0个进程进行IO操作时,CPU空闲就可以执行第1个进程的指令了.
- 运行-l 1:0,4:100 -c -S SWITCH_ON_END,观察一下结果.
然后这里会先补充一下-S参数.有两个
- SWITCH_ON_IO:系统在一个进程发出IO请求时切换进程
- SWITCH_ON_END:系统在一个进程发出IO请求时不会切换进程.
我们可以发现就和先执行4:100再执行1:0是一样的,这里是因为系统设置了请求IO期间操作系统不会允许进程切换让CPU执行其他指令.所以这里用了九个单位时间.
- 这里就是把-S参数设置为SWITCH_ON_IO,然后我们就知道应该是和第三个问题一样的运行结果.
运行结果:
- 运行./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_LATER -c -p
在这里先补充一下-I的两个参数
-IO_RUN_IMMEDIATE:立即切换进程
-IO_RUN_LATER:自然切换进程,比如说依赖进程切换习惯
运行结果:
u@u-virtual-machine:/mnt/hgfs/share/homework/1$ ./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_LATER -c -p
Time PID: 0 PID: 1 PID: 2 PID: 3 CPU IOs
1 RUN:io READY READY READY 1
2 WAITING RUN:cpu READY READY 1 1
3 WAITING RUN:cpu READY READY 1 1
4 WAITING RUN:cpu READY READY 1 1
5 WAITING RUN:cpu READY READY 1 1
6* READY RUN:cpu READY READY 1
7 READY DONE RUN:cpu READY 1
8 READY DONE RUN:cpu READY 1
9 READY DONE RUN:cpu READY 1
10 READY DONE RUN:cpu READY 1
11 READY DONE RUN:cpu READY 1
12 READY DONE DONE RUN:cpu 1
13 READY DONE DONE RUN:cpu 1
14 READY DONE DONE RUN:cpu 1
15 READY DONE DONE RUN:cpu 1
16 READY DONE DONE RUN:cpu 1
17 RUN:io DONE DONE DONE 1
18 WAITING DONE DONE DONE 1
19 WAITING DONE DONE DONE 1
20 WAITING DONE DONE DONE 1
21 WAITING DONE DONE DONE 1
22* RUN:io DONE DONE DONE 1
23 WAITING DONE DONE DONE 1
24 WAITING DONE DONE DONE 1
25 WAITING DONE DONE DONE 1
26 WAITING DONE DONE DONE 1
27* DONE DONE DONE DONE
Stats: Total Time 27
Stats: CPU Busy 18 (66.67%)
Stats: IO Busy 12 (44.44%)
分析:这里用的-S参数是申请IO时切换,所以我们知道process0的第一条指令第一个单位时间用了CPU申请IO,然后process0剩下的四个单位时间用IO设备,然后此时process1也开始运行.process0的第一条指令结束以后,并不能马上执行第二条,而是等到process1,process2,process3结束以后才运行.所以总时间是:
1+5*5=26个单位时间
7.将-I参数编程IO_RUN_IMMEDIATE.
运行结果:
u@u-virtual-machine:/mnt/hgfs/share/homework/1$ ./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_IMMEDIATE -c -p
Time PID: 0 PID: 1 PID: 2 PID: 3 CPU IOs
1 RUN:io READY READY READY 1
2 WAITING RUN:cpu READY READY 1 1
3 WAITING RUN:cpu READY READY 1 1
4 WAITING RUN:cpu READY READY 1 1
5 WAITING RUN:cpu READY READY 1 1
6* RUN:io READY READY READY 1
7 WAITING RUN:cpu READY READY 1 1
8 WAITING DONE RUN:cpu READY 1 1
9 WAITING DONE RUN:cpu READY 1 1
10 WAITING DONE RUN:cpu READY 1 1
11* RUN:io DONE READY READY 1
12 WAITING DONE RUN:cpu READY 1 1
13 WAITING DONE RUN:cpu READY 1 1
14 WAITING DONE DONE RUN:cpu 1 1
15 WAITING DONE DONE RUN:cpu 1 1
16* DONE DONE DONE RUN:cpu 1
17 DONE DONE DONE RUN:cpu 1
18 DONE DONE DONE RUN:cpu 1
Stats: Total Time 18
Stats: CPU Busy 18 (100.00%)
Stats: IO Busy 12 (66.67%)
时间明显缩短了,因为每次都会在运行完IO以后回到process0继续操作.
所以对应的时间是15+3=18.即process1,2,3中间的12个时间点可以和process0一起运行.
8.就是给了两个进程,每个进程有三条指令,每条指令可以是io操作,也可以是和cpu有关.然后用-s随机化,让我们用-I和-S的两个参数观察一下
然后我的运行结果是:
这是加了-I参数,是让io操作一结束就返回process0继续操作.这里的随机是process0有1条cpu相关指令和两条io指令.
然后换成io操作结束不立刻返回是上图所示.
修改-S参数结果如下:
我的想法是最好IO操作时切换进程,CPU使用效率会高一些.
那么今天的学习就到这里啦!
本篇博客是关于《操作系统导论》第四章内容的学习,相关知识在作业的readme文件当中有英文版。
博客中如有错误,欢迎指正!