进程是操作系统最核心的的概念,它是对正在运行程序的一个抽象。
1、进程模型
在进程模型中,计算机上所有可运行的软件,包括操作系统,被组织成若干顺序进程,简称进程(process)。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。
一个进程是某种类型的一个活动,它有程序、输入、输出以及状态。当个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。
2、进程的创建
操作系统需要有一种方式来创建进程,其中,进程的创建因素:
- 系统初始化。
- 正在运行的程序执行了创建进程的系统调用。
- 用户请求创建一个新进程。
- 一个批处理作业的初始化。
停留在后台处理之类活动的进程称为守护进程。
在UNIX系统中,只有一个系统调用可以用来创建新进程:fork。这个系统调用会创建一个与调用进程相同的副本。
在windows和UNIX系统中,进程创建之后,父进程和子进程有各自不同的地址空间。如果其中某个进程在其地址空间中修改一个字,这个修改对其他进程而言是不可见的。
3、进程的终止
进程在创建后,执行相应的工作后,会因为不同的方式终止,通常有以下因素:
- 正常退出(自愿的)。
- 出错退出(自愿的)。
- 严重错误(非自愿)。
- 被其他进程杀死(非自愿)。
在UNIX中调用exit来表示已经完成工作结束进程,而Windows中,则调用的是ExitProcess。
4、进程的层次结构
一个进程只有一个父进程,但是可以有零个、一个、两个或多个子进程。
在UNIX中,进程和它所有子进程以及后裔共同组成一个进程组。而在windows系统系统中没有进程层次概念,所有的进程都是地位相同的。
5、进程的状态以及实现
1. 状态
尽管每个进程有一个独立的实体,有其自己的程序计数器和内部状态,但是进程之间经常需要相互作用,一个进程的输出结果可能作为另一个进程的输入。
进程的三种状态:
- 运行态(该时刻进程实际占用CPU)。
- 就绪态(可运行,但因为其他进程正在运行而暂时停止)。
- 阻塞态(除非某种外部事件发生,否则进程不能进行)。
运行和就绪状态在逻辑上类似,处于这两种状态的进程都可以运行,只是对于就绪态,暂时没有CPU分配给它。而阻塞态的进程不能运行,即使CPU空闲也不行。
一个进程可处于运行态、阻塞态和就绪态,各状态之间的转换如下: - 进程因为等待输入而被阻塞。
- 调度程序选择另一个进程。
- 调度程序选择这个进程。
- 出现有效输入。
基于进程的操作系统中最底层的是中断和调度处理,在该层之上是顺序进程。
2. 实现
操作系系统维护进程表进行实现进程模型,每个进程占用一个进程表项。该表项包含了进程状态的重要信息(程序计数器、堆栈指针、内存分配状态、所打开文件的状态、账号和调度信息,以及其他在进程由运行到就绪态),保证该进程随后能再次启动,就像从未被中断过一样。
与每一I/O类关联的是一个称作中断向量的位置,它包含中断服务程序的入口地址。所有的中断都是从保存寄存器开始的,对于当前进程而言,通常是保存在进程表项中。随后会从堆栈中删除由中断硬件机制存入堆栈的那部分信息,并将堆栈指针指向由一个由进程处理程序所使用的临时堆栈。
一个进程在执行过程中可能被中断数千次,但关键是每次中断后,被中断的进程都返回到与中断发生前完全相同的状态。
6、多道程序设计模型
采用多道程序设计可以提高CPU利用率。严格地说,如果进程用于计算机的平均时间是进程在内存中停留时间的20%,且内存中同时有5个进程,则CPU将一直满负载运行。
更好的模型是从概率的角度来看CPU的利用率。CPU利用率是内存中进程数目的函数:CPU利用率=1-P^n;p表示一个进程等待I/O操作的时间与其停留在内存中时间的比。当内存中同时有n个进程时,则所有n个进程都在等待I/O(此时CPU空转)的概率的p的n次方。
以n为变量的函数表示了CPU的利用率,n称为多道程序设计的道数。