操作系统系列----进程与程序
程序
1.程序的概念
程序是一组有序的指令集合
2.程序的执行方式
在早期的单道批处理系统中,程序的执行方式是顺序执行,即在内存仅仅转入一道程序,让他独占系统中的所有资源。一个程序执行完毕后另一个程序才能执行,这种执行效率极其低,而且十分浪费资源
而在多道程序处理系统中,内存中可以同时装入多个程序,这多个程序可以共享资源,并发执行,但是程序的并发执行会导致一系列问题,所以才引入了进程的概念
2.1什么是顺序执行
所谓顺序执行就是比如我们去食堂排队打饭,排成一列列队伍,我们可以理解为一个个程序,而打饭的阿姨可以理解为cpu,我们按照队列一个个去打饭,而阿姨则按照顺序一个个给我们打饭,一次只能给一个人打饭,这就是顺序执行
2.1.1顺序执行时的特征
1.顺序性:这个我们在上面已经说过了,就是程序一个个执行,而且一次只可以执行一个
2.封闭性:程序在执行的时候占用整个计算机的资源,只有本程序能改变自己,这也可理解为一个封闭的环境,因为整个计算机只有他一个程序在运行
3.可再现性:只要程序的执行环境与初始条件相同,当程序重复执行的时候,获得的都是相同的结果,比如我们使用计算器算1+1等于2,只要这个计算器没坏,只要我们输入的是1+1,那么结果就一定为2
2.2 程序的并发执行
顺序执行的方式虽然十分方便,但是效率实在是太低了,看看我们今天一边听歌一边打游戏,这显然不是顺序执行所能实现的。
多道程序技术,即多个程序并发执行,多个程序并发执行指的相互之间不存在前驱关系的程序才可以并发执行,如果一个程序 依赖另
一个程序的执行结果而执行,那么这两个程序显然是不可以并发执行的
程序并发执行时的特征
我们可以思考,在并发执行中,系统的吞吐量和执行效率虽然不断提高了,但是他们在共享系统资源的时候,以及他们在为了实现同一个目的而合作的时候,他们之间必然会形成相互制约的关系。这时候程序就具备了许多新特性
间断性
程序并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了互相制约的关系:并发程序具有“执行--暂停--执行”的间断性的活动规律。
失去封闭性
这个就很好理解了,在顺序执行中整个计算机的资源都被一个程序所占用,但是在并发执行中,系统的资源被各个程序所共享,这也就导致程序的状态不再由自身决定,会受到其他程序的影响
失去可再现性
程序在并发执行的过程中失去了封闭性,,也导致程序失去可再现性
两个循环程序A和B,它们共享一个变量N。
程序A每执行一次时,都要做N=N+1操作;
程序B每执行一次时,都要做执行Print(N)操作,之后执行N=0操作;
A、B以不同的速度运行,则可能出现下述3种情况(假设某时刻变量N的值为n)
n+1,n+1,0
n,n+1,0
n,0,n+1
进程
为什么引入进程?进程的作用是什么?
在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性及不可再现性的特征。这决定了通常的程序是不能参与并发执行的,因为程序执行的结果是不可再现的,程序的运行也就失去了意义。
所以为了使并发执行的每个程序能够独立的运行,所以操作系统就为之配备了一个专属的数据结构,称为进程控制模块(PCB Process C ontrol Bolck),这样子程序段,相关的数据段进程和PCB三部分就构成了进程实体。一般情况下我们把进程实体称为进程,而创建进程的实质就是创建进程实体中的PCM,而撤销进程就是撤销进程中的PCB
这是因为并发执行的程序(即进程)是“停停走走”地执行,只有在为它创建进程后,在它停下时,方能将其现场信息保存在它的PCB中,待下次被调度执行时,再从PCB中恢复CPU现场并继续执行,而传统的程序却无法满足上述要求。
建立进程所带来的好处是使多个程序能并发执行,这极大地提高了资源利用率和系统吞吐量。但管理进程也需付出一定的代价,包括进程控制块及协调各运行机构所占用的内存空间开销,以及为进行进程间的切换、同步及通信等所付出的时间开销。
进程的相关定义:
1.进程是程序的一次执行
2.进程是一个程序及其数据在处理及顺序执行时所发生的活动
3.进程是一个独立功能的程序在数据集合上运行的过程,进程是系统资源分配和调度的基本单位
PCB概念及其功能
为了便于系统描述和管理进程的运行,在OS中专门为每个进程专门定义了一个数据结构---进程控制块PCB(Process Control Block)
PCB记录了当前情况以及管理进程运行运行的全部信息,是操作系统中最重要的记录型数据结构
作用
使在多道程序环境下不能独立运行的程序(含数据)成为一个能运行的基本单位,一个能与其他进程并发执行的进程
1.作为独立运行的基本标志,,当系统创建进程时就为他创建一个PCB,当结束时收回其PCB,进程也随之消亡,PCB已经成为进程存在系统中的唯一标识
2.能实现间断性运行方式。在多道程序环境下,程序采用的是走走停停的方式运行的,当进程由于阻塞而停止运行的时候,系统将CPU现场保留在被中断进程的CPU中,当该进程再次被调度的时候,就可以恢复CPU现场,而传统意义的静态程序不具备保留现场的能力,无法保留结果的可再现性,从而失去运行的意义
3.提供进程管理所需的信息。操作系统总是根据PCB实施对进程的控制和管理,调度程序调度到程序运行的时候,只能根据PCB中记录的程序和数据在内存或外存中的始址指针,找到对应的程序和数据,还可根据资源清单中的数据了解到该进程所需的全部资源
4.提供进程调度所需的信息。只有处于就绪状态的程序才可以被调度执行,而在PCB中就提供了进程处理哪种状态的信息。还有进程的优先级,甚至是进程的等待时间和已执行时间。
5.实现与其他进程的同步与通信。进程同步机制是用于实现,诸进程的协调运行,在采用信号量机制的时候,他要求每个进程中都设置相应的用于同步的信号量
进程的特征
动态性
由创建而生,由调度而执行,由撤销而消亡,进程是有生命周期的,而程序是一组有序的指令集合,存放于某种介质上(硬盘),是静态的,没有活动意义
并发性
引入进程的目的就是为了解决程序并发执行所导致的问题,,程序是没有PCB的,不能参与独立并发执行
独立性
进程是系统分配资源与调度的基本单位,他自然也是一个可独立运行的基本单位,凡是没有建立PCB的程序都不可以作为一个独立的单位运行
异步性:
实质程序按照异步的方式运行,即按各自独立的不可预知的速度向前,也正是由于这点,才导致了传统意义上的程序如果参与并发执行会导致结果的不可再现性,为了使程序在运行的时候有异步性当是同时也保证程序并发执行的结果是可再现的,这才引入了进程并配备了进程同步机制
进程的状态
就绪
进程已经处于准备好运行的状态,即进程已经分配到了除了cpu以外的所有资源,只要再获取cpu即可立即执行,系统中有许多处于就绪的进程,系统会按照优先级排成一个优先级队列
执行
即进程已经获取了CPU,程序正在执行状态,,在单处理机中只要一个程序处于执行状态,而在多处理机中有多个程序处于执行状态
阻塞
当正在执行的程序发生了某个事件(IO请求,申请缓存区失败等等),这时候系统就会把处理机分配给另一个就绪进程,而该进程就进入阻塞状态,主色状态的进程也会构成一个阻塞队列,根据阻塞原因的不同还会构成多个阻塞队列。
创建状态与等待状态
创建状态
进程由创建而生,创建进程是一个很复杂的过程
创建步骤
进程申请一个空白的PCB,并向PCB中加入控制和管理进程的信息,让后为该进程分配所需资源,然后把进程插入就绪队列中
如果为该进程分配的资源尚未得到满足,比如系统的内存不够把进程插入其中,则此时经常就不能被调度运行,仍然处于创建状态
这是为了确保对进程控制的完整性,同时创建进程的引入也增加了管理的灵活性。OS可以根据系统性能或主存容量的限制推迟新进程的提交
终止状态
步骤
1.等待操作系统的进行善后处理,最后将其PCB清零,并将PCB返还给系统。
终止的原因:
1.到达自然的结束点,即程序执行完毕
2.被操作系统终结
3.被有其他终止权的程序终结
进入终止状态的程序不再执行,但是操作系统中仍然保留一个记录,保存状态码和一些计时统计数据,给其他进程收集,提取完成后,操作系统删除该进程,并将PCB清零,将空白PCB返还给系统
挂起状态与进程状态的切换
挂起:即让程序暂时停止运行,处于静止状态,如果程序正在执行他将暂停执行,如果程序原本就处于就绪状态,则该进程暂时不接受调度。挂起操作会把进程从内存转入外存。
为什么引入挂起操作
1.负荷调节的需要,当实时系统中的工作负荷较重的时候,已可能影响到对实时任务的控制时,为了让系统正常运行就会挂起某些不重要的进程
2.操作系统的需要,操作系统有时候希望挂起某些进程,以便检查运行中的资源使用情况
3.父进程的请求,有时候父进程希望挂起自己的某个子进程,以便考察和修改该子进程或则协调个各进程之间的活动
4.终端用户的需要,当终端用户发现自己的程序在运行期间有问题,希望暂停程序的运行,就让他先停下来,以便考察其执行情况,并对其做修改
引入挂起原语Suspend操作后和激活原语Active后,在他们的作用下,进程将可能发生一下几种状态的切换,
1.活动就绪------>静止就绪,当进程处于未挂起的就绪状态时,此成此活动就绪状态表示为Readya,此时的进程可以接受调度,而使用挂起原语Suspend将进程挂起后,进程就变为静止就绪状态,表示为Readys。此时的进程不接受调度
2.活动阻塞-->静止阻塞,当进程处于未被挂起的阻塞状态的时候 ,称它为活动阻塞,表示为Blockeda,当使用Suspend原语挂起后,进程就转换为静止阻塞状态,处于该进程转状态的某个事件出现后,该进程就由静止阻塞状态转为静止就绪状态
3.静止就绪---->活动就绪,处于Readys状态的进程使用Active激活后,该进程就变为活动就绪状态,即由Readys转为Readya
4.静止阻塞------>活动阻塞,处于Blockeds状态的进程使用激活原语Active激活后,进程将转换为Blockeda(活动阻塞)状态
图一:
图二:
1.NULL---->创建,当一个新进程产生时,该进程处于创建状态,
2.创建--->活动就绪,当前系统的性能和内存容量都允许的时候,完成对进程创建的必要操作后,相应的系统进程将系统的状态转为活动就绪状态
3.创建--->静止就绪,考虑到当前系统的资源状况与性能要求,不分配给新建进程所需资源,。相应的进程状态转为静止就绪状态安放于外存
4.执行--->终止,当一个进程已经完成任务的时候,,或者出现了无法克服的错误,或者被其他进程终结,则转为终止状态
进程控制块PCB(Process Control Block)
1.进程控制块的组织方式
1.1线性方式,即所有PCB保留在一张线性表中
优点:开销小,实现简单
缺点:每次扫描都需要扫描整张表
2.链接方式,把具有相同状态进程的PCB分别通过PCB中的链接关键字链接成一个队列,从而形成就绪队列、阻塞队列、运行队列等。
3. 索引方式:系统根据进程状态的不同建立几张索引表,,并把各索引表在内存的首地址记录在内存的一些专用单元中系统按照进程的状态分别建立就绪索引表、阻塞索引表等。
2.进调度所需的信息
1.进程的优先级
2.进程进入阻塞状态的原因
3.进程档当前的状态
4.进程调度所需的其他信息
3.进程控制信息
1.进程的同步与通信机制
2.程序和数据的地址
3.资源清单
4.链接指针,他给出了本进程(PCB)在所在队列的下一个进程的PCB的首地址