目录

操作系统导论第四章

操作系统导论:第四章

操作系统导论:第四章

写在前面:

  • 英文原版和作业代码可以前往http://pages.cs.wisc.edu/~remzi/OSTEP/下载或者在线阅览。相关的代码下载下来可以用tar xvzf指令进行解压。
  • 不出意外,希望能把相关的作业完成以后,用学习日志记录下来。

本书序言部分(第2章)就大致介绍了书的组成,也就是学习部分。包括三部分:虚拟化,并发和持久性。虚拟化部分又分为两部分,CPU和内存的虚拟化。

现在谈第一部分,虚拟化。

第四章的主要内容可以概括为以下几部分:

1.虚拟化CPU采用的机制和策略 :时分共享,上下文切换和调度策略。

2.进程的组成 :内存信息(指令和数据等);寄存器(通用寄存器,PC,栈指针,帧指针等);持久存储设备等。

3.进程的API包括 :创建,销毁,等待,其他控制,状态。

4.进程的创建

  • 将代码和静态数据从磁盘拷贝到内存中(现在CPU惰性拷贝,按需拷贝)
  • 给运行时栈分配空间(保存局部变量,函数参数,返回地址等)
  • 给堆分配空间:动态分配空间(回想一下malloc和free函数)
  • 其他的初始化(和IO相关)
  • 转移控制权(从父进程转到创立的新的进程)

5.进程状态的转换

https://i-blog.csdnimg.cn/blog_migrate/afa4f4fa3e9025a801bdec5afa59ad88.jpeg

数据结构部分如果有时间想起来再来补充。

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操作的可能是百分之百.

运行结果:

https://i-blog.csdnimg.cn/blog_migrate/171475d0fc08392a8b70301cf6361a8d.jpeg

然后带上-c参数,我们就可以看到:

https://i-blog.csdnimg.cn/blog_migrate/33eca4a10a8269f1406d16d0c32adb44.jpeg

它始终再使用CPU,一直处于RUN状态

然后下面是两个例子辅助理解

1.运行 ./process-run.py -l 5:100,5:100程序,CPU的利用率是多少?

答案是百分之百,因为两个进程都是百分百的CPU操作,然后我们执行下来可以看到是进程0先执行完,然后进程1再继续执行

https://i-blog.csdnimg.cn/blog_migrate/8267e378c6717405f93484998943520c.jpeg

https://i-blog.csdnimg.cn/blog_migrate/2456e60cca737db68948fa19f1963ba7.jpeg

  1. ./process-run.py -l 3:0 -L 5运行以后的样子:

https://i-blog.csdnimg.cn/blog_migrate/3a7a15acb79ab23b4647a7aadb10832a.jpeg

然后这里说明的是,尽管三条指令都是IO操作,并且每条指令占用时间为5个单位,单其实并不是15个单位时间都没有使用CPU,IO操作的第一个单位时间会和CPU有关,CPU发出IO请求.

加上-p,我们就可以看到进程的状态

https://i-blog.csdnimg.cn/blog_migrate/788ff4688404a15f7604814aa833072a.jpeg

就可以看到CPU操作3次,IO操作12次.

现在是书后问题

  1. 就是上面的第一个例子,答案是百分之百

  2. 运行./process-run.py -l 4:100,1:0,预测时间多少.

    答案应该是4±L参数值,因为缺省,多以应该是9.这里是先运行了4条指令,然后开始IO操作.IO操作期间,CPU就没有事情可以做了,因为没有其他需要运行的CPU相关的指令了.

https://i-blog.csdnimg.cn/blog_migrate/00295e7b26c289a5c9a3776b5d075826.jpeg

  1. 运行./process-run.py -l 1:0,4:100,预测时间.答案应该是5

https://i-blog.csdnimg.cn/blog_migrate/0023f592fbdad5310d16d36c7f9b6ef6.jpeg

因为这里是在第0个进程进行IO操作时,CPU空闲就可以执行第1个进程的指令了.

  1. 运行-l 1:0,4:100 -c -S SWITCH_ON_END,观察一下结果.

然后这里会先补充一下-S参数.有两个

  • SWITCH_ON_IO:系统在一个进程发出IO请求时切换进程
  • SWITCH_ON_END:系统在一个进程发出IO请求时不会切换进程.

https://i-blog.csdnimg.cn/blog_migrate/fc773cecce0d3cc0f1ae7f402ea25adc.jpeg

我们可以发现就和先执行4:100再执行1:0是一样的,这里是因为系统设置了请求IO期间操作系统不会允许进程切换让CPU执行其他指令.所以这里用了九个单位时间.

  1. 这里就是把-S参数设置为SWITCH_ON_IO,然后我们就知道应该是和第三个问题一样的运行结果.

运行结果:

https://i-blog.csdnimg.cn/blog_migrate/4eb3fd9f4731f0644e84e4c6fed27398.jpeg

  1. 运行./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结束以后才运行.所以总时间是:

https://i-blog.csdnimg.cn/blog_migrate/c698e06df6f28a9f80dd4a348f8e3674.png

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的两个参数观察一下

然后我的运行结果是:

https://i-blog.csdnimg.cn/blog_migrate/c0f0dc6c46739af7cab934fa3953cc36.jpeg

这是加了-I参数,是让io操作一结束就返回process0继续操作.这里的随机是process0有1条cpu相关指令和两条io指令.

https://i-blog.csdnimg.cn/blog_migrate/a6ae6ba3b12a2a4b1ff9d21b35fa6e98.jpeg

然后换成io操作结束不立刻返回是上图所示.

修改-S参数结果如下:

https://i-blog.csdnimg.cn/blog_migrate/35ff97fdd5300496f7c4fe7cc4ac6145.jpeg https://i-blog.csdnimg.cn/blog_migrate/d07e34046ca0baa6b9060dff2f2458c2.jpeg

我的想法是最好IO操作时切换进程,CPU使用效率会高一些.

那么今天的学习就到这里啦!

本篇博客是关于《操作系统导论》第四章内容的学习,相关知识在作业的readme文件当中有英文版。

博客中如有错误,欢迎指正!