进程的描述与控制(1)

前趋图和程序执行:引入前驱图是为了更好地了解进程的执行顺序问题
 前趋图,有向无环图,用来描述程序的顺序执行
  两个节点之间的关系具有偏序关系或者前驱关系时,构成的图

 当程序能够顺序执行时,需要有的特性
  顺序性、
  封闭性(是指独占操作系统资源)、
  可再现性(是指当出初始条件和执行环境相同时,程序重复执行后能够得到相同的结果)

程序的并发执行
 不存在前趋关系的程序段可以实现并发执行,提高系统资源利用率
 特征:
  间断性:只有使程序暂停的因素消失后,程序才会继续执行,例如,将要计算两个数,必须要等待两个数输入完成。
  失去封闭性:并发执行时,资源是共享的,所以就不独占系统资源了。
  失去可再现性:因为当并发程序中,有共享资源时,他们可以改变资源的状态,所以值会变化。

进程的描述:本来程序是不能并发执行的,但是我们为了让他并发执行,提出了进程的概念。
 首先给出定义:
  进程是程序的一次执行。
  进程是一个程序已经数据在处理机上顺序执行时所发生的活动。
  进程是一个有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配的基本单位。

 所以说,为了实现并发执行,一个进程需要什么呢?当然是程序、程序运行时所需要得到数据、还有一个最重要:描述程序运行时的状态信息的进程控制块,就是PCB(process control block)。以上三者构成了进程得到实体。前两个是本身存在的,那么我们说创建进程就是创建PCB,撤销进程就是撤销PCB。所以说,进程是动态的就很容易理解了。那当然,一个程序可以对应多个进程,一个进程可以对应多个程序。

 这时候,进程的特征就可以推出来了:动态性、并发性、独立性、异步性(是指一个进程以不可预知的速度向前推进)

 我们说,进程的出现是为了解决并发中资源共享的问题,那么对共享资源的使用就应该遵循某种规律,所以进程在其生命周期中因为这种规律我们为他创建了不同的状态。
  就绪状态:除了CPU,其他的都准备好了。
  运行状态:有了CPU,正在运行。
  阻塞状态:正在执行,由于某种事件(如I/O),导致无法继续执行。一般一旦一个进程一阻塞,就会引起进程调度。

 现在,我们有了状态,接下来就需要状态转换了:
  Ready到running,是因为进程调度(什么时候调度这个算法是由调度算法决定的)。
  running到ready,是因为分配的时间片到了进程还没有结束。(时间片的产生是为了给各进程更好地被调度)
  running到终止,是因为进程执行完了。
  running到block,是因为I/O等因素。
  block到ready,是因为I/O等因素消除了。

  状态转换的经典问题:
   问题1:为什么不能从阻塞态变为运行态呢?!三种状态的变换体现了OS的资源管理作用
   问题2:为什么不能从就绪态变为阻塞态呢?!进程的核心思想在于运行——CPU资源的分配

 为了满足PCB对数据和操作的完整性要求和增强管理的灵活性,我们又引入了两种状态,有
  创建状态:有好多步,首先创建一个空的PCB,然后填写管理和控制进程的信息,然后为该进程分配运行时(内存等现在就分配,除了CPU,为什么呢,进程的核心思想在于运行——CPU资源的分配,而且,一进了就绪队列,就说明除了CPU其他的都分配好了呀。)所必须的资源,最后,把它添加到就绪队列中,如果,系统此时无法满足需要分配的资源,如内存不够了,就一直处于创建状态。
  终止状态:各种因素让进程终止后,如有权终止该进程的进程、遇到错误被操作系统终止、自然结束。就进入了终止状态,但是操作系统依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。一旦收集结束后,就将这个PCB清0,返回给操作系统。

 为了系统和用户观察和分析进程的需要,还引入了一个操作,挂起操作。与其对应的是激活操作。一旦一个进程被挂起,意味着被静止,将暂停执行。也就是说,它暂时不能参与CPU的调度。什么情况下回挂起呢?1、终端用户发现一些问题,希望暂停运行,以便于用户研究执行情况和程序更改。2、父进程有需要让其暂停运行,以便协调各个子进程之间的活动,以及考查修改子进程。3、操作系统,以便于检查运行中资源的使用情况或进行记账。4、负荷调节的需要,当实时系统的负荷过重时,挂起不重要的进程,保证任务的完成时间,和系统的正常运行。

 引入挂起原语后,三个进程的状态转换就改变了,现在是这样的:
  Readya到running,是因为进程调度(什么时候调度这个算法是由调度算法决定的)。
  running到readya,是因为分配的时间片到了进程还没有结束。(时间片的产生是为了给各进程更好地被调度)
  running到终止,是因为进程执行完了。
  running到blockeds,是因为I/O等因素。
  blockeda到ready,是因为I/O等因素消除了。

  上面的还是这些,因为挂起原语的目的是某个进程暂时不让其参与获取CPU的整个调度过程,改变的是这些:

  running挂起到readys,是因为挂起了,不参与CPU调度的过程了。为什么就到readys呢,因为当你在running的进程挂起之后,你要有一个新的状态,而这个状态的除了CPU之外的资源是都具备的,所以我们叫readys,一旦激活,就让他参与CPU的调度过程,就进入readya了。
  readys激活到readya,是因为激活了,参与CPU调度的过程了。而且CPU之外的资源是都具备的。
  readya挂起到readys,是因为挂起了,不参与CPU调度的过程了。CPU之外的资源是都具备的。但是不参与调度。
  blockeda挂起到blockeds,是因为挂起了,不参与CPU调度的过程了。而且这时候I/O因素还没有消除。
  blockeds到readys,是因为I/O因素消除了,但是还没有激活,并且CPU之外的资源是都具备的。所以到了readys.
  blockeds激活到blockeda,是因为激活了,参与CPU调度的过程了。而且这时候I/O因素还没有消除。

 现在你如果还不懂就找个图看。吃饭去了。
 
 一些英文关键字需要了解:
 – Cocurrency & Parallel & MultiProgramming
 – Program & Process & Thread
 – Running & Ready & Block & Suspend
 – Dispatch & Activate & Suspend & Wake
  

 

转载于:https://www.cnblogs.com/mhzhou-whyj/p/7688438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值