1. 什么是进程
进程是多程序系统出现以后,为了刻画系统内部出现的动态情况,描述系统内部各个程序的活动规律而引入的一个新概念。
从理论角度看,进程是对正在运行的程序活动规律的抽象;从实现角度看,则是一种数据结构。
直到目前为止,对进程的定义和名称均不统一,不同的系统采用不同术语名称,例如MIT称进程(process),IBM公司称任务(task)和Univac公司称活动(active)。
2. 进程的三种状态
运行态/执行态Running):当一个进程在处理机上运行时,则称该进程处于就绪状态。
就绪态(Ready):一个进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。
阻塞态(Blocked):又称挂起状态、等待状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。
3. 进程控制模块(PCB)
每一个进程有且仅有一个进程控制块PCB(Process Control Block),进程控制块是操作系统用于记录进程状态及有关信息的数据结构。
进程控制块一般包含以下三类信息:
标识信息: 用于唯一地标识一个进程,比如进程号(PID)、进程标识符、父进程的标识符、用 户进程名、用户组名等等。
现场信息: 用于保留一个进程在运行时存放在处理器现场中的各种信息,任何一个进程在让出处理器时都必须把此时的处理器现场信息保存到进程控制块中,当该进程重新恢复运行时也应恢复处理器现场。通常的现场信息包括:通用寄存器的内容、控制寄存器的内容、
用户堆栈指针、系统堆栈指针等。
控制信息: 用于管理和调度一个进程。常用的控制信息包括:1)进程调度相关信息,如进程状态、等待事件和等待原因、进程优先级、队列指引元等;2)进程间通信信息,如消息队列指针、信号量等互斥和同步机制;3)CPU资源的占用和使用信息,如时间片余量、
进程已占用CPU的时间、进程已执行的时间总合;4)资源清单,包括进程所需全部资源、已经分得的资源,如主存资源、I/O设备、打开文件表等。
4. 进程队列及其管理
并发系统中同时存在许多进程,有的处于就绪态,有的处于等待态,等待原因各不相同。为了便于管理和调度,常常把各个进程的PCB用某种方法组织起来。用得较多的是用队列来组织PCB。
一般来说,把处于同一状态(例如就绪态)的所有进程控制块组织在一起的数据结构称为进程队列。同一状态进程的PCB既可按先来先到的原则排成队列;也可按优先级或其它原则排成队列。对于等待的进程队列可以进一步细分,每一个进程按等待的原因进入相应的等待队列,例如,如果一个进程要求使用某个设备,而该设备已经被占用时,此进程就连接到与该设备相关的等待队列中区去。
在一个队列中,连接进程控制块的方法可以是多样的,常用的是单向连接和双向连接。单向连接的方法是在每个进程控制块内设置一个队列指引元,它指向队列中跟随它的下一个进程的进程控制块内队列指引元的位置。
当发生的某个事件使一个进程的状态发生变化时,这个进程就要退出所在的某个队列而排入到另一个队列中去。一个进程从一个所在的队列中退出的事件称为出队,相反,一个进程排入到一个指定的队列中的事件称为入队。处理器调度中负责入队和出队工作的功能模块称为队列管理模块。
5. 引入多线程技术的动机
在传统的操作系统中,进程是系统进行资源分配的基本单位,同时,进程也是处理器调度的基本单位,进程在任一时刻只有一个执行控制流,通常将这种结构的进程称为“单线程进程”。
例如,航空售票系统需要处理多个购票和查询请求,这些信息都与同一个数据库相关;而操作系统在同时处理许多用户进程的查询请求时,都要去访问数据库所在的同一个磁盘。对于上述这类基于同数据区的同时多请求应用,用单线程结构的进程难以达到这一目标,即使能解决问题代价也非常高,需要寻求新概念、提出新机制。
传统操作系统一般只支持单线程进程,传统的UNIX支持多用户进程,每个进程也是单线程的。在传统操作系统的单线程进程环境下,进程和线程的概念可以不加以区分
多进程并发技术不适合客户/服务器计算的要求,对于C/S架构来说,那些需要频繁输入输出并同时大量计算的服务器进程很难体现效率。但是呢,这一块儿和小编的工作关联性不大,所以也就没有必要深究线程技术相关的东西了。
附:
Linux为进程队列的调度定义了以下重要的全局变量:
current: 当前正在运行的进程的指针,在SMP 中则指向正被调度的CPU的当前进程
init_task: 0 号进程的PCB,即进程树的根
*task[NR_TASKS]: 进程PCB 数组,规定系统可同时运行的最大进程数
for-each-task(): 遍历所有进程的PCB
Linux下进程控制块(结构体task_struct)