我的操作系统探索之路----------------进程篇(1)

来源:互联网 发布:python机器人编程 ros 编辑:程序博客网 时间:2024/05/29 21:33

    开这个类别(我的操作系统探索之路)也是为了自己在以后能来回顾之前的学习历程,有的东西久了也就忘了,写在书上吧,但又不能把书随时给带在身上,所以就只好放博客里了;其次是书上的内容什么的你用一支笔勾画下来就完事儿了,感觉完全没有自己重新写下来理解的那么深刻。

    由于之前忘了要把这给记在博客上,所以今天就从进程开始记了,前面的等有空了再来给它补上。

    老师给我们介绍的参考书是 操作系统--精髓与设计原理(第7版),所以整个记录顺序和标题也是参照这本书的顺序!去图书管看,居然只有第5版的(图书管,你有这么落后么?)。没办法,也就将就着看吧,我想主体内容应该还是一样的。另外透露一下,其实这书我早在开学前的寒假就借回去了,当时原想着自己能提前学习一下;后来发现我真是多想了,带着这么厚回去硬是没翻一下,我想我也真是够厉害的!越来越佩服我了! 哈哈哈哈。


进入正题,回顾一下昨天看过的知识!


    说明一下,以后记录的对各种概念的理解均没有照搬书上原模原样的话(除非没理解的),这样对我们也没什么好处,我尽量都是用自己的理解来解释!


第3章 进程描述和控制


3.1 什么是进程

    我们可以把进程理解为:由一组元素组成的实体(A),其中实体 A 的最基本元素就是程序代码(可以是共享的代码)和与代码相关联的数据集,当处理器执行该程序代码时,我们就把这个执行实体称为进程;简单点说就是动态执行的一个实体(注意,一定是执行的实体才是进程,所以说进程是动态的)。且进程是系统进行资源分配和调度的基本单位

    在进程执行时,任意给定一个时刻进程都可以用以下几个元素来静态描述:

  • 标识符:用来区别于其它进程,就像学号一样;
  • 状态:此时刻进程所处的状态(如:等待,就绪,执行等);
  • 优先级:相对于其它进程的优先级
  • 程序计数器:即将被执行的下一条指令的地址,那PC;
  • 内存指针:进程代码和进程相关数据的指针,也有和其它进程共享内存块的指针;
  • 上下文数据用户进程传递给内核的参数以及内核要保存的变量和寄存器值,因此进程的执行总是在其上下文之中。实在弄不清楚就暂时理解成进程在执行过程中所用到各种参数(详细http://blog.csdn.net/mc_hust/article/details/38656575)
  • I/O状态信息:各种I/O当前的状态(被哪个进程在使用,处于什么状态等);
  • 审计信息:可包括处理器时间总和、使用的时钟数总和,时间限制
    上述的8条列表信息都被存放在一个叫进程控制块(Process Control Block,PCB)的数据结构中,并由操作系统创建和管理。PCB包含了充分的信息,这样一个进程被中断之后,在后来的恢复执行中,就好像进程未被中断过一样。当进程中断时,操作系统会把PC上下文数据保存到PCB中的相应位置,此时的进程状也被改变为其它值。


3.2进程的特征

  • 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进;(因为所需的资源不一定时刻都处于空闲状态,所以进程的执行通常都不是“一气呵成”,而是以“停停走走”的方式运行)
  • 结构特征:进程由程序、数据和进程控制块三部分组成;
  • 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。(即可以共享一个程序)
这儿随便提一下并发和并行:

并发:两个进程在宏观上同时发生,微观上交替执行;

并行:两个进程在宏观上同时发生,微观上也同时发生;(并行中你可以把行理解成两个进程平行发生,所以微观上也同时发生)


3.3进程状态

 

   进程的执行通常都不是“一气呵成”,而是以“停停走走”的方式运行,所以就出现了各种进程状态(如运行、等待、就绪等)


3.3.1 两状态进程模型

   在任何时刻,一个进程或者正在执行,或者没有执行,即:运行态与未运行态,因而可以构造最简单的模型。


     如图3.5(a)所示,OS创建一个新进程时,它将该进程以未运行的状态加入到系统中,且OS是知道这个进程存在的;当正在运行的进程被中断之后,OS中的分派器(进程调试器)将选择一个新的未运行的进程,前一个进程从运行态转换到未运行态;图3.5(b)给出了一个结构,即所有的处于未运行态的进程都必须保存在某种类型的队列中,并等待它们的执行时机。结构中有一个队列,队列中的第一项都指向某个特定的进程指针。

当一个进程从运行态转换到未运行态后,就被OS调度到等待队列中,直到当前的进程中断或结束,队列中的未运行态进程才又转换为运行态。总之,在任何一各情况下,调度器均从队列中选择一个进程来执行。


3.3.2进程的创建和终止


进程的创建

    通常有四个事件会导致创建一个进程,1、新的批处理作业;2、终端用户登陆到系统;3、os因提供一项服务而创建(如:打印服务,这样使进程代表用户执行一个功能,用户就不用等待了);4、由不现有的进程派生而来;


进程的终止

    进程的终止原因;1、正常完成;2、超过时限(在分时OS中,一个进程的时间片到达之后就轮到下一个进程执行);3、无可用内存;4、无效指令等;



3.3.3五状态模型


如图3.6

新建态:刚刚建立的进程,os还没有把它加入到主存中

阻塞态:当某个进程在执行的过程中,需要等待某个事件的发生(比如需要等待打印服务,而该服务又被其它进程给占用了),此时该进程就被中断,转换到阻塞态;直到这个等待事件(打印服务空闲)发生之后,该进程又从阻塞态转换为就绪态,进入到就绪队列中,等待CPU的控制权。

就绪态:某个阻塞进程所需要的所有资源都已准备完毕,只须等待CPU的控制权即可执行的进程所处的状态叫就绪态;同时就绪态也可由运行态的进程因时间片用完(或其它优先级高于该进程)而被暂时中断而产生。

退出态:因自身停止了或是因为某种原因被取消

注:其实在任意一个状态下,进程都可以由该状态转换到退出态。1、在某些系统中,父进程可以在任意时刻终止一个子进程。2、如果一个父进程终止,与该父进程有关的所有子进程都将被终止



3.3.4被挂起的进程


被挂起的进程,处于挂起态的进程。先根据图3.8简单说一下增加挂起态的原由。


 在图3.8(a)中,当执行过程中的进程因超时或其它原因被中断时,又被转换成了就绪态,保存在就绪队列中;而其它执行过程中因等待不同事件(I/O、打印等)的发生而被转换成阻塞态的进程全都保存在一个阻塞队列中并驻留在内存中,或此时若某个事件发生,处理器又要去扫描整个阻塞队列,是哪个进程的等待的事件发生了。这样极大降低了cpu的效率;于是在此之上引入了多条阻塞队列,把所有等待同一事件发生的进程都放入一个队列中,这样当某个事件发生之后,cpu就能直从某个队列中直接调入一个进程。但这样的方案并没有完全解决这个问题。在这种情况下,内存当中就驻留了大量的进程(主要是阻塞态进程),因为当一个进程等待时,处理器马上执行下一个进程,但处理器的速度要比I/O快得多,以至于内存中所有的进程都在等待I/O的情况很常见。

    解决这个问题的一种方案是扩充内存,但由于这样治标不治本依然会出现这样的情况,且内存昂贵。而另外一种方法便是交换,即当内存中没有处于就绪态的进程时,此时内存中就停留了大量的阻塞态进程在等待事件的发事,但为了不浪费CPU就必须得调入新的进程,但由于大量的阻塞态进程占据了内存的空间,所以OS就把所有的阻塞态进程全部移动 磁盘中的“挂起队列”,以便添加新的进程。


挂起态

    因为了不浪费CPU资源,而内存当中此时又没有就绪态的进程,所以不得不把处于阻塞态的进程暂时“驱逐”到磁盘中,而调入新的进程;而被挂到磁盘中的进程就称为挂起态。注意,挂起不是丢弃,当磁盘中的阻塞态进程所等待的某个事件发生之后,OS就把该进程又调入内存中的就绪队列中,其实OS在创建新进程和调入阻塞态进程之间,更倾向于后者以减少系统中的总负载。



先说说图3.9(a):

  新创建的进程A获得了除CPU外的各种资源,此时进程A就处于就绪态;

->当进程A获得了CPU的控制权之后,就进入到运行态中

->处于运行态的进程:1.可能是正常结束,然后退出;

    2.可能是因时间片结束,或是遇到优先级更高的进程而被中断,又转换去就绪态中,等待CPU的控制权; 

    3.可能是因为等待某个事件的发生而被转换到阻塞态中;


->处于阻塞态的进程 :1.当等待的某个事件发生之后,就被转换到就绪队列中,等待CPU的控制权;

     2.因内存中阻塞态的进程越来越多,而此时内存中又没有就绪态的进程,为了留出空间来创立新进程,牌阻塞态的进程就被OS转换为挂起态;


->处于挂起态的进程:在等待事件发生之后,OS又将其调入到内存中的就绪队列中,等待CPU


再说说图3.9(b):


图中的虚线与实线的作用一样,仅为了避免不让图看起来乱。

阻塞/挂起态:进程在辅存(磁盘)中并等待一个事件的发生

就绪/挂起态:进程在辅存中,但是只要被载入主存就可以执行


    在这儿就要提一个广义上的挂起态了,虽然书没有百度也没(可能是我没找到),但书上的这个图3.9(b)却说明了,除了退出态的进程不可以处于挂起状态外,其它态进程都可能被挂起,所以我觉得理论上任何一种状态的进程都能被挂起(有空向老师求证一下)。 所以广义上的挂起态其实就是指任何一种状态下的进程,由于内存容量不够或为了降低系统负载而被暂时放到磁盘中的进程的状态。


这个图具体的转换过程就不说了,和(a)图类似,就是多增加了几种挂起态。


暂时就扯到这儿,后续学习之后再来!!!!! 未完待续!


2015年4月9日16:11:34







0 0