本文目录:
一、什么是进程
1.1 背景
开发操作系统是为了给应用程序提供一个方便、安全和一致的接口。操作系统是计算机硬件和应用程序之间的一层软件,对应用程序和工具提供支持。
目标:资源对多个应用程序是可用的;物理处理器在多个应用程序间切换以保障所有程序都在执行中;处理器和 IO 设备 能得到充分利用。
所有现代操作系统采用的方法都是依据对应于一个或多个进程存在的应用程序执行的一种模型。
1.2 进程和进程控制块
进程的几种定义:
1、正在执行的程序;
2、正在计算机上执行的程序实例;
3、能分配给处理器并由处理器执行的实体;
4、具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。
进程的两个基本元素:程序代码和代码相关联的数据集。
在执行进程时,进程可以唯一的表征为以下元素:标示符,状态,优先级,程序计数器,内存指针,上下文数据,IO 状态信息,记账信息。上述的列表信息被存放在一个称为进程控制块的数据结构中,该控制块由操作系统创建和管理。进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像进程未被中断过一样。进程控制块是操作系统能够支持多进程和提供多重处理技术的关键工具。
进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中的相应位置,进程状态也被改变为其他的值,例如阻塞态或就绪态。现代操作系统可以自由的把其他进程设置为运行态,把其他进程的程序计数器和进程上下文数据加载到处理器寄存器中,这样其他进程就可以开始执行。
可以说,进程是由程序代码、相关数据、进程控制块组成的。
二、进程状态
对一个被执行的程序,操作系统会为该程序创建一个进程或任务。从处理器的角度看,它在指令序列中按某种顺序执行指令,这个顺序根据程序计数器的寄存器中不断变化的值来指示,程序计数器可能指向不同进程中不同部分的程序代码。从程序自身角度看,它的执行涉及程序中的一系列指令。
2.1 两状态进程模型
一个进程或者正在执行,或者没有执行。
当操作系统创建一个新进程时,它将该进程以未运行态加入到系统中,操作系统知道这个进程是存在的,并且正在等待执行机会。当前正在运行的进程不时被中断,操作系统中的分派器部分将选择一个新的进程运行。
必须有一些与进程相关的信息,包括进程在内存中的当前状态和位置,及进程控制块。未运行的进程必须保持在某种类型的队列中,并等待他们的执行时机。分派器从队列中选择一个进程来执行。
如上图所示的结构,结构中有个队列,队列中的每一项都指向某个特定进程的指针,或队列可以由数据块构成的链表组成,每个数据块表示一个进程。
2.2 进程的创建和终止
进程的生存期围绕着进程的创建和终止。
-
进程的创建
当一个新进程添加到那些正在被管理的进程集合中去时,操作系统需要建立用于管理该进程的数据结构,并在内存中给它分配地址空间。
通常有 4 个事件会导致创建一个进程:
1、在批处理环境中,作业提交时会创建进程;
2、交互登陆:终端用户登陆到系统;
3、操作系统因为提供一项服务而创建;
4、由现有的进程派生。
传统的,操作系统创建进程的方式对用户和应用程序都是透明的。但是,当操作系统为另一个进程显式请求创建一个进程时,这个动作称为进程派生。当一个进程派生另一个进程时,前一个称为父进程,被派生的进程称为子进程。在典型情况下,相关进程需要互相之间的通信合作。
-
进程的终止
进程可以被创建它的进程终止,或当父进程终止时而终止。导致进程终止的原因有:正常完成、超过时限、无可用内存、越界、算术错误、时间超出、I/O失败、无效指令、特权指令、数据误用、父进程终止、父进程请求等等。
2.3 五状态模型
队列是“先进先出”的表,对于可运行的进程处理器是一种轮转方式操作(依次给队列中的每个进程一定的执行时间,然后进程返回队列,阻塞情况除外)。
因为,存在一些处于非运行状态但已经就绪等待执行的进程,而同时存在另外的一些处于阻塞状态等待I/O操作结束的进程。因此,如果使用单个队列,分派器不能只考虑选择队列中最老的进程,相反,它应该扫描这个列表,查找那些未被阻塞且在队列中时间最长的进程。
解决这种情况的一种比较自然的方法是将非运行状态分成两个状态:就绪(ready)和阻塞(blocked)。
1、运行态:该进程正在执行;
2、就绪态:进程做好了准备,只要有机会就开始执行;
3、阻塞/等待态:进程在某些事件发生前不能执行,如 I/O 操作完成;
4、新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。通常进程控制块已经创建但还没有加载到内存中的新进程;
5、退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消。
新建态:操作系统可能基于性能或内存局限性的原因,限制系统中的进程数量。当进程处于新建态时,操作系统所需要的关于该进程的信息保存在内存的进程表中,但进程自身还未进入内存,就是即将执行的程序代码不在内存中,也没有为与这个程序相关的数据分配空间。当进程处于新建态时,程序保留在外存中,通常是磁盘中。
进程状态之间的转换如下所示:
1、新建 ---> 就绪:操作系统准备好再