前趋图和程序执行:引入前驱图是为了更好地了解进程的执行顺序问题
前趋图,有向无环图,用来描述程序的顺序执行
两个节点之间的关系具有偏序关系或者前驱关系时,构成的图
当程序能够顺序执行时,需要有的特性
顺序性、
封闭性(是指独占操作系统资源)、
可再现性(是指当出初始条件和执行环境相同时,程序重复执行后能够得到相同的结果)
程序的并发执行
不存在前趋关系的程序段可以实现并发执行,提高系统资源利用率
特征:
间断性:只有使程序暂停的因素消失后,程序才会继续执行,例如,将要计算两个数,必须要等待两个数输入完成。
失去封闭性:并发执行时,资源是共享的,所以就不独占系统资源了。
失去可再现性:因为当并发程序中,有共享资源时,他们可以改变资源的状态,所以值会变化。
进程的描述:本来程序是不能并发执行的,但是我们为了让他并发执行,提出了进程的概念。
首先给出定义:
进程是程序的一次执行。
进程是一个程序已经数据在处理机上顺序执行时所发生的活动。
进程是一个有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配的基本单位。
所以说,为了实现并发执行,一个进程需要什么呢?当然是程序、程序运行时所需要得到数据、还有一个最重要:描述程序运行时的状态信息的进程控制块,就是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