进程

来源:互联网 发布:java项目总结 编辑:程序博客网 时间:2024/06/09 16:16

进程

进程是操作系统提供的的最古老的也是最重要的抽象之一。即使可以利用的CPU只有一个,但它们也支持(伪)并发操作的能力。它们将一个单独的CPU变成多个虚拟的CPU。

1 进程模型

在进程模型中,计算机上所有可运行的软件,通常包括操作系统,被组织成若干顺序进程,简称进程。一个进程就是一个正在执行程序的实例,包括程序计数器,寄存器和变量的当前值。从概念上说,每个进程拥有它自己的虚拟CPU,但是实际上真正的CPU在各个进程之间来回切换。这个设计成为多道程序设计

进程模型

如图,在一台多道程序计算机的内存中有4道程序。这4道程序被抽象为4个各自拥有自己控制流程(逻辑程序计数器)的进程,并且每个程序都独立地运行,实际上只有一个物理程序计数器,所以当一个程序运行的时候,它的逻辑程序计数器被装入实际程序计数器中,因此任何时候仅有一个进程真正在运行。而当程序执行完毕后,物理程序计数器被保存在内存中程序逻辑程序计数器中。

由于CPU在个进程之间来回快速切换,所以每个进程执行其运算的速度是不确定的。而当程序再次运行的时候,其运算速度通常也不可再现。所以,在对进程编程时绝不能对时序做任何确定的假设。

进程和程序的区别:
- 程序是代码的数据
- 进程是一个正在执行的程序,包括程序,输入,输出和状态

2 创建进程

有4种主要事件导致进程的创建:
- 系统初始化
- 执行了正在运行的进程所调用的进程创建系统调用
- 用户请求创建一个新进程
- 一个批处理作业的初始化

前台进程:同用户(人类)交互并且替他们完成工作的那些进程
后台进程:与特定的用户没用关系,却具有某些专门的功能

从技术上说,新进程都是由于一个已存在的进程执行了一个用于创建进程的系统调用而创建的。

UNIX:只用一个系统调用可以用来创建进程:fork。这个系统调用会创建一个与调用进程相同的副本。在调用了fork之后,这两个进程(父进程和子进程)拥有相同的储存映像,同样的环境字符串和同样的打开文件。通常,子进程接着执行execve或一个类似的系统调用,以修改其储存器映像并运行一个新的程序。之所以要安排两步建立进程,是为了在fork之后但在execve之前允许该子进程处理其文件描述符,这样可以完成对标准输入,标准输出和标准出错的重定向。

Windows:一个win32函数调用CreateProcess既处理进程的创建,也负责把程序装入新的进程。该调用有10个参数。

3 进程的终止

进程的终止通常有以下的条件引起的:
- 正常退出(自愿的)
- 出错退出(自愿的)
- 严重错误(非自愿的)
- 被其他进程杀死(非自愿的)

在有些系统中,当一个进程终止时,不管是自愿的还是其他原因,由该进程所创建的所有进程也一律立即被杀死。不过,UNIX和Windows都不是这种工作方式。

4 进程的层次结构

某些系统中,当进程创建了另一个进程后,父进程和子进程就以某种形式继续保持关联。子进程本身可以创建更多的进程,组成一个进程的层次结构。

UNIX中,进程和它的所有子女以及后裔共同组成一个进程组。当用户从键盘输入一个信号时,该信号被送往当前与键盘相关的进程的所有成员。

Windows没有进程层次的概念,所有的进程的地位都是相同的。唯一类似进程层次的是在创建进程的时候,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程。但是,它有权将这个令牌传送给某个其他进程。

5 进程的状态

进程有三种状态:
- 运行态(该时刻进程实际占用CPU)
- 就绪态(可运行,但因为其他进程正在运行而暂时停止)
- 阻塞态(除非某件外部事件发生,否则进程不能运行)

这三种状态之间的转换关系如下:
这里写图片描述

6 进程的实现

为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表,每个进程占用一个进程表项(也称为进程控制块)。进程表项记载的信息如下:

这里写图片描述

与每一I/O类关联的是一个称作中断向量的位置(靠近内存底部的固定区域)。它包含中断服务程序的入口地址。所有的终端都从保存寄存器开始,对于当前进程而言,通常实在进程表项中。随后,会从堆栈中删除由中断硬件机制存入堆栈的那部分信息,并将堆栈指针指向一个由进程处理程序所使用的临时堆栈。

中断发生后操作系统最底层的工作步骤:
- 硬件压入堆栈程序计数器等
- 硬件从中断向量装入新的程序计数器
- 汇编语言过程保存寄存器值
- 汇编语言过程设置新的堆栈
- C中断服务例程运行(典型地读和缓冲输入)
- 调度程序决定下一个要运行的进程
- C过程返回至汇编代码
- 汇编语言过程开始运行新的当前过程

7 多道程序设计模型

采用多道程序可以提高CPU的利用率。如果进程用于计算的平均时间是进程在内存中停留时间的20%,且内存中同时有5个进程,则CPU将一直满载运行。

更好的模型是从概率的角度来看CPU的利用率。假设一个进程等待I/O操作的时间与其停留在内存中的时间比例为p,当内存中同时有n个进程,则所用n个进程都在等待I/O(此时CPU空转)的概率是 pn

CPU的利用率有下面的公式给出

CPU=1pn

0 0
原创粉丝点击