前言
在介绍多线程时,首先分析进程、以及多道程序设计模型。进程是操作系统中最重要的抽象概念之一,使得在即使只有一个CPU的机器上,也支持(伪)并发,即将一个单独的CPU变成多个虚拟的CPU。
多道程序设计
在进程执行过程中常常会因为资源请求或者IO被阻塞或中断(有的请求或者中断需要处理很长时间),此时CPU便空闲出来,众所周知,CPU是计算机中非常宝贵的资源,为提高其利用率,操作系统需通过进程切换,将CPU交给就绪队列的某个进程使用;等上次被阻塞或者中端的进程再次满足执行条件(一般是请求的资源得到满足或者IO完成等)后,操作系统便通过调度算法将CPU再次交给该进程执行任务,其中操作系统的进程调度算法有多种(例如在交互式系统(windows)中的进程调度算法有时间片轮转调度、优先级调度、多级队列调度等,这些相信大家都很熟悉了,此处不再进一步阐述),具体选择依赖操作系统。这时从用户的角度感觉是多个进程在同时执行,这的易于操作系统通过进程调度将一个cpu变成多个虚拟的CPU,实现多个进程的伪并发。在《现在操作系统》中将这种进程间的切换称之为“多道程序设计”。
进程切换:由于每个进程的处理任务异样性,其进程的输入、输出、处理过程、处理状态的都不同,那在进程切换的过程中是否也应该考虑这些参数呢?答案是肯定的。一个正在执行的进程包括程序计数器、寄存器、变量的当前值等,而这些数据都是保存在CPU的寄存器中的,且这些寄存器只能是正在使用CPU的进程才能享用,所以在进程切换时,首先得保存上一个进程的这些数据(便于下次获得CPU的使用权时从上次的中断处开始继续顺序执行,而不是返回到进程开始,否则每次进程重新获得CPU时所处理的任务都是上一次的重复,可能永远也到不了进程的结束出,因为一个进程几乎不可能执行完所有任务后才释放CPU),然后将本次获得CPU的进程的这些数据装入CPU的寄存器从上次断点处继续执行剩下的任务。操作系统为了便于管理系统内部进程,为每个进程创建了一张进程表项,如表1所示。
进程管理 |
存储管理 |
文件管理 |
寄存器 |
正文段指针 |
根目录 |
程序计数器 |
数据段指针 |
工作目录 |
程序状态字 |
堆栈指针 |
文件描述符 |
堆栈指针 |
|
用户ID |
进程状态 |
|