进程的描述
进程(processes)的定义
一个程序可能调用多条线路占用CPU,因此不用程序描述,引出进程的概念。
进程是指,一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
进程的组成
一个进程应该包括:
- 程序的代码;
- 程序处理的数据;
- 程序计数器中的值,指示下一条将运行的指令;
- 一组通用寄存器的当前值,堆、栈;
- 一组系统资源(如打开的文件)。
总之,进程包含了正在运行的一个程序的所有状态信息。
进程与程序
进程与程序的联系
程序,可以理解为源代码。
- 程序是产生进程的基础;
- 程序的每次运行构成了不同的进程;
- 进程是程序功能的体现;
- 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
进程与程序的区别
- 进程是动态的,程序是静态的;程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态;
- 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存;
- 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。
上图把进程与程序的关系进行了类比。
进程的特点
- 动态性: 可动态地创建,结束进行;
- 并发性: 进程可以被独立调度并占用处理机运行;并发并行;
- 独立性: 不同进程的工作不互相影响;(页表保证操作系统可以给不同的进程分配不同的页表,保证独立性)
- 制约性: 因访问共享数据/资源或进程间同步而产生制约。
上图中,(a)描述了进程间需要相互切换,(b)描述了就进程的独立性,(c)描述了进程间的调度。
如何设计OS进行进程调度?
- 程序 = 算法 + 数据结构
- 操作系统也是一个程序,因此需要相应的数据结构描述进程:即, 进程控制块(Process Control Block) 。
- 操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息。
进程控制结构
进程控制块
进程控制块:操作系统管理控制进程运行所用的信息集合。操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志。
- 进程的创建:为该进程生成一个PCB;
- 进程的终止:回收它的PCB;
- 进程的组织管理:通过对PCB的组织管理来实现。
因此PCB到底包含什么信息?如何组织?
PCB包含三大信息
- 进程标识信息。如本进程的标识,本进程的生产者标识(父进程标识);用户标识。
- 处理机状态信息保存区。保存进程的运行现场信息:
- 用户可见寄存器,用户程序可以使用的数据,地址等寄存器。
- 控制和状态寄存器,如程序计数器(PC),程序状态字(PSW)。
- 栈指针,过程调用/系统调用/中断处理器和返回时需要用到它。
- 进程控制信息。包括:
- 调度和状态信息,用于操作系统调度进程并占用处理机使用。
- 进程间通讯信息,为支持进程间的与通信相关的各种标识、信号、信件等,这些信息存在接受方的进程控制块中。
- 存储管理信息,包含有指向本进程映像存储空间的数据结构。
- 进程所用资源,说明由进程打开、使用的系统资源,如打开的文件等。
- 有关数据结构连接信息,进程可以连接到一个进程队列中,或连接到相关的其他进程的PCB。
PCB的组织方式
一般使用链表进行组织。
链表:同一状态的进程,多个状态对应多个不同链表。适于动态插入,动态删除。
当然如果是特殊的OS,进程个数固定,可以使用索引表进行组织。
上图展示了链表、索引表的组织结构。
进程的状态
进程的生命期管理
进程创建
引起进程创建的3个主要事件:
- 系统初始化时;
- 用户请求创建一个新进程;
- 正在运行的进程执行了创建进程的系统调用。
进程运行
内核选择一个就绪进程,让它占用处理机并执行。如何选择?此类问题将在调度算法中讨论。
进程等待
在以下情况下,进程等待(阻塞):
- 请求并等待系统服务,无法马上完成;
- 启动某种操作,无法马上完成;
- 需要的数据没有到达。
进程只能自己阻塞自己,因为只用进程自身才能知道何时需要等待某种事件的发生。
进程唤醒
进程唤醒的原因:
- 被阻塞进程需要的资源可以被满足;
- 被阻塞进程等待的事件到达;
- 将该进程的PCB插入到就绪队列。
进程只能被别的进程或者操作系统唤醒。
进程结束
在以下四种情况下,进程结束:
- 正常退出(自愿的);
- 错误退出(自愿的);
- 致命错误(强制性的);
- 被其他进程所杀(强制性的)。
进程状态变化模型
进程在生命结束前处于且仅处于三种基本状态之一:
- 运行状态(Running);
- 就绪状态(Ready);
- 等待状态(又称阻塞状态,Blocked)。
上图描述了三种状态的关系。
上图描述了考虑五种状态的关系。
给每个处于就绪态的进程都分配一个小的时间片,让每个进程轮流运行。
可能的状态变化:
- NULL到New:一个新进程被产生出来执行一个程序。
- New到Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。不会持续很久。
- Ready到Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。
- Running到Exit:当进程表示它已经完成或者出错,当前运行的进程就好由操作系统作结束处理。
- Running到Ready:处于运行状态的进程在其运行过沉中,由于分配给它的处理机时间片用完而让出处理机。由操作系统完成:操作系统有一个时钟,感知到进程超出其时间片,则切换进程。
- Running到Blocked:当进程请求某样东西且必须等待时。例如等待读写文件。
- Blocked到Ready:当进程要等待某事件到来时,它从阻塞状态变到就绪状态。
进程挂起
进程没有占有内存空间,是挂起。
为了更合理且充分地利用系统资源。
如上图,进程在挂起状态时,意味着进程没有占用内存空间。处在挂起状态的进程映像在磁盘上。
挂起状态
- 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现;
- 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可执行。
与挂起相关的状态转换
挂起(Suspend):把一个进程从内存转到外存,可能有以下几种情况:
- 阻塞到阻塞挂起:没有进程处于就绪状态或者就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;
- 就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先就绪进程时,系统会选择挂起低优先级就绪进程;
- 运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态。
在外存时的状态转换:
- 阻塞挂起到就绪挂起:当有阻塞挂起进程因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程。
解挂/激活(Activate):把一个进程从外存转到内存,可以有以下几种情况:
- 就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;
- 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高级优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程。
状态队列
思考:OS如何通过PCB和定义的进程状态来管理PCB,帮助完成进程的调度?
- 由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态;
- 不同的状态分别用不同的队列表示(就绪队列、各种类型的阻塞队列)
- 每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个队列。
如上图就绪队列有多个,因为优先级不同。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删