操作系统导论:第四章

操作系统导论:第四章

写在前面:

  • 英文原版和作业代码可以前往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再继续执行
在这里插入图片描述

在这里插入图片描述

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

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

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

在这里插入图片描述

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

现在是书后问题

  1. 就是上面的第一个例子,答案是百分之百
  2. 运行./process-run.py -l 4:100,1:0,预测时间多少.
    答案应该是4±L参数值,因为缺省,多以应该是9.这里是先运行了4条指令,然后开始IO操作.IO操作期间,CPU就没有事情可以做了,因为没有其他需要运行的CPU相关的指令了.

在这里插入图片描述

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

在这里插入图片描述

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

  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执行其他指令.所以这里用了九个单位时间.

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

运行结果:

在这里插入图片描述

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

在这里插入图片描述

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文件当中有英文版。
博客中如有错误,欢迎指正!

猜你喜欢

转载自blog.csdn.net/weixin_43329358/article/details/104654622
今日推荐