(3)《基于Linux的C编程与内核导读》--Linux进程管理

时间:2022-08-15 15:45:35

第三章Linux进程管理

3.1 基础理论知识

Linux是一个多任务操作系统,也就是说在系统内部存在着多个并发执行的程序执行过程。操作系统要为多个程序执行过程合理的分配所需的内存储器、外部设备、处理机时间等资源,充分发挥各种资源的作用,并协调这些程序执行过程的正常进行。

我们人类的大脑思维逻辑是顺序的,很难直接理解一个并发活动的计算机世界。为了管理并发程序执行的这一活动,操作系统引入了进程的概念。下面我们就详细的学习有关进程的各种基础知识。

 

3.1.1 进程的概念

进程(process)这一术语是麻省理工学院的J.H.Saltzer1966年提出并在MULTICS操作系统上实现的。进程有许多定义,我们取其中最简短的定义:“进程是程序的执行”。

作为程序执行的过程,进程至少有三方面的性质,一是它的活动性,即进程是动态变化的,并且每个进程都有一个从创建到消亡的过程;二是进程可以并发执行;三是进程之间的关系是异步的。

进程和程序之间的最大差别是,进程是个动态的概念,程序是静态的文本,前者是后者的执行过程。一个进程可以涉及一个或几个程序的执行;反之,同一程序可以对应一个或多个进程。

 

3.1.2 进程的描述

为了管理系统内众多并发、异步的进程,操作系统使用进程控制块(PCB-Process Control Block)来记录进程的一切静态和动态特征。另外一方面进程毕竟是在程序上执行的,所以一个进程还必须要有程序和数据。因此进程是由程序、数据和PCB共同组成的实体,如图3-1所示。 

 

3-1 一个进程的实体

 

一个进程的PCB是必须存在的,而且只有一个。进程的程序可以与其它进程共享。可以共享的程序被成为纯过程(Pure procedure)、或称为可再入代码(reentrant code),它们的特点是,在其执行过程中不会改变自身。进程的数据一般是专有的,不能共享。进程实体的这三部分关系如图3-2所示。

 

3-2 两个进程共享程序

 

3.1.3 进程调度

进程在执行过程中要受到各种主客观条件的限制,所以它很少能一直运行下去直到结束。所以进程在其存在期间将会经历不同的状态,其最基本的状态有三种:运行(runing)态、就绪(ready)态和阻塞(blocked)态。它们之间的相互转换关系见图3-3。

 

进程各种状态之间的转换是由进程调度程序完成的。进程调度程序实际上是把CPU从一个进程转交给另一个进程,其主要流程如下:

1)把当前进程的现场信息存入它的PCB中。

2)根据某种调度算法,从就绪进程中选出一个进程。

3)恢复被选中进程的现场信息,即将它的PCB中的现场信息存入相应的寄存器。

可见进程调度程序中关键部分就是调度算法的选择,以期尽可能提高资源的利用率,减少处理机的空闲时间。常用的调度算法有:

1)先来先服务(FIFO)法。此方法按照进程就绪的先后顺序来调度进程,到达越早,其优先级越高。这种算法是非抢占式的,一个进程只要不被阻塞就可以一直运行到结束。

2)轮转法(Round Robin--RR),此方法是FIFO的一种扩展,对于每一个就绪队列中的进程分配一个时间片(time slice),当一个进程的时间片用完时便排到就绪队列的末尾,进程调度再取下一个就绪进程继续运行。

3)优先级(Priority)法,此法未每个进程分配一个优先数,这是一个整数,其数值反映了进程的优先程度,进程调度程序每次选出优先级最高的进程运行。

 

3.1.4 进程间通信

进程通信(Inter process Communication,IPC)是指进程之间的信息交换。系统中的进程和系统内核之间,以及各个进程之间需要相互通信,以便协调它们的运行。linux系统支持多种内部进程通信机制(IPC),其中最为常用的是信号(Signal)、管道(Pipe);另外linux也支持Unix系统System VIPC机制,包括信号量(Semaphore)、消息队列和共享内存。下面就对以上进程通信机制分别简要介绍一下。

 

1)信号(Signal

信号机制是Unix系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。信号可以由各种异步事件产生,例如键盘中断等。Shell 也可以使用信号将作业控制命令传递给它的子进程。

系统中有一组被详细定义的信号类型,其详细内容参见内核导读部分的signal( )函数章节。

进程可以屏蔽掉大多数的信号,除了SIGSTOPSIGKILLSIGSTOP用于暂停一个正在运行的进程,而SIGKILL使得正在运行的进程退出运行。进程可以选择系统的缺省方式处理信号,也可以选择自己的方式处理产生的信号。信号之间不存在相对的优先权,系统也无法处理同时产生的多个同种的信号,也就是说,进程不能分辨它收到的是1个或者是42SIGCONT信号。

 

2)管道(Pipe

管道是一个先进先出、大小固定的缓冲区,容量为1页(4KB),用于两个进程之间的单向数据传递。当管道有空间时,写进程把数据送入管道,否则将被阻塞;如果管道中没有数据或读进程需要的数据多于管道中的数据时,读进程将被阻塞,否则执行读进程的请求。

 

3)信号量Semaphore

信号量是用一个整数表示系统当前资源的使用情况,当信号量大于或等于0时,其值表示可用的资源数量;当它小于0时,其绝对值表示等待该资源的进程数。使用信号量可以实现进程的同步与互斥。

 

4)共享内存(Share Memory

    共享内存区是指被多个进程共享的虚拟内存中的一个数据块,进程利用它来实现进程间的通信。虚地址空间的页是通过共享进程的页表中的页表项来访问的。共享存储区不需要在所有进程的虚存中占有相同的虚地址。像所有的System V IPC对象一样,共享存储区的访问控制是通过密钥和访问权限检查来实现的。一旦某一内存区域被共享了,系统就无法检查进程如何使用这部分内存区域。因此系统必须使用System V信号量等其他的机制来同步对存储器的访问。

 

 原文地址 http://www.openlab.net.cn/blogs/zsb/archive/2005/08/27/442713.aspx