进程可以看作是正在执行的程序。进程需要一定的资源(如CPU时间、内存、文件和I/O设备)来完成其任务。这些资源可以在创建进程或执行进程时被分配。
进程是大多数系统的工作单元。系统有一组进程组成:操作系统进程执行系统代码,用户进程执行用户代码。所有这些进程可以并发执行。
虽然从传统意义上讲,进程运行时只包含一个单一的控制线程,但是目前大多数现代操作系统都支持多线程进程。
操作系统负责对进程和线程的管理:用户和系统进程的创建与删除、进程调度、进程同步机制、通信和进程死锁处理机制。
早期的计算机系统只允许一次执行一个程序。这种程序对系统有完全的控制,能访问所有的系统资源。现代计算机系统允许将多个程序调入内存并发执行。这一要求对各种程序提供更严格的控制和更好的划分。这一要求产生了进程的概念,即执行中的程序。进程是现代分时系统的工作单元。
操作系统越复杂,就越能为用户做更多的事情。虽然操作系统的主要目标是执行用户程序,但是也需要顾及内核之外的各种系统任务。因此,系统由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。通过CPU多路复用,所有进程可以并发执行。通过进程之间的切换,操作系统可以使计算机更为高效。
一、进程概念
正如前述,进程是正在执行中的程序,这是一种非正式的说法。进程不只是程序代码,程序代码有时称为文本(text)段。进程还包括当前活动,这些活动通过程序计数器的值和CPU寄存器的内容来表示。另外,进程通常还包括进程栈(stack)——包含临时数据(如函数参数、返回地址和局部变量)和数据段(包括全局变量)。进程还可能包括堆(heap),这是在进程运行期间动态分配的内存。内存中进程结构如下图所示:
图:内存中的进程结构
这里强调:一个程序本身不是一个进程。一个程序只是一个被动的实体(静态实体),如存储在磁盘上包含一组指令的文件(常被称为可执行文件),而进程是活动实体,它包含一个指向下一条要执行的指令的程序计数器和相关资源集合。当一个可执行文件被装入内存时,一个程序才能成为进程。装载可执行文件通常有两种方法,即双击可执行文件的图标或在命令行中输入该文件的文件名(如prog.exe或a.out)。
虽然两个进程可以与同一程序相关,但是它们被当成两个独立的执行序列。例如,多个用户可运行电子邮件的不同副本,或者同一用户能调用多个Web浏览器程序的副本。这些都是独立的进程,虽然数据段、堆、栈段却不同。一个进程在执行时产生许多进程是很常见的。
二、进程状态
一个进程在执行时它的状态会改变。进程的状态在某种程度上是由当前状态定义的。一个进程可能处于下列状态之一:
a、创建(new):进程正在被创建
b、运行(running):指令被执行
c、等待(waiting):进程正在等待某些事件的发生(如I/O完成或接收到一个信号)
d、就绪(ready):进程等待分配给处理器
e、终止(terminated):进程已经完成执行
这些状态的名字是随意的,且随着不同操作系统而变化,但是这些状态可以出现在所有的系统上。有些操作系统更加详细地描述进程状态。必须认识到一次只有一个进程可以在处理器上运行,但是多个进程可以处于就绪或等待状态。与这些状态相对应的状态图如下图所示:
图:进程状态图
三、进程控制块
每个进程在操作系统内用进程控制块(process control block,PCB)来表示。下图给出了一个PCB的例子,它包含许多与一个特定进程相关的信息:
图:进程控制块
a、进程状态:状态可包括创建、就绪、运行、等待、停止等。
b、程序计数器:计数器表示进程要执行的下一个指令的地址。
c、CPU寄存器:根据计算机体系结构的不同,寄存器的类型和数目也不同。他们包括累加器、变址寄存器、堆栈寄存器和通用寄存器和其他条件代码信息 寄存器。与程序计数器一起,这些状态信息在出现中断时也需要保存,以便进程以后能正确地继续执行(如下图所示)。
d、CPU调度信息:这类信息包括进程优先级、调度队列的指针和其他调度参数
e、内存管理信息:这些信息包括基址和界限寄存器的值、页表和段表(取决于操作系统使用的内存系统)
f、统计信息:这些信息包括CPU时间、实际使用时间、时间界限、统计数据、作业或进程数量等。
g、I/O状态信息:这些信息包括分配给进程的I/O设备表,打开的文件列表等等。
简而言之,PCB简单地作为这些信息的仓库,这些信息在进程与进程之间是不同的。
图:CPU在进程间切换
四、线程
迄今为止所讨论的进程模型暗示:一个进程是一个只能执行单个执行线程的程序。例如,如果一个进程运行一个字处理器程序,那么只能执行单个线程指令。这种单一控制线程使得进程一次只能执行一个任务。例如,用户不能在同一进程内,同时输入自负和进行拼写检查。许多现代操作系统扩展了进程概念以支持一次能执行多个线程。