概述
- 进程是可执行程序的一个运行实例,主要包括当前的程序计数器,寄存器和变量等,从概念上讲,每个进程都有自己的虚拟CPU,但实际上,CPU在各个进程上快速切换。
- 对于进程,内核必须解决的几个问题:
- 应用程序彼此不能互相干扰,除非有明确要求要这么做
- CPU时间要在各个应用程序之间尽可能公平的共享
其中第二个问题是进程管理与调度要解决的问题,内核必须决定为各个进程分配多长时间,何时切换到下一个进程,另外进程在执行切换的时候,要保证各个进程的执行环境被正常的备份和恢复
进程相关的基本概念
-
进程的优先级
- 并非所有的进程都具有同样的重要性,首先进行比较粗糙的划分,进程可以分为实时进程和非实时进程
- 硬件实时进程有严格的时间限制,必须在可保证的时间范围内得到处理,否则会有很严重的后果,请注意,这并不意味着所要求的时间范围特别短,Linux主流版本不支持硬实时处理
- 软实时进程是硬实时进程的一种弱化形式,尽管仍然需要快速得到结果,但是稍微晚一点关系也不是很大,比如对CD机的写入
- 普通进程:没有特别的时间约束,但仍然可以根据重要性来分配优先级
-
通过进程的优先级别给进程分配不同的时间片,是在各个进程调度的一种简单实现方式,能够使重要的进程比次要进程得到更多的CPU处理时间,这种方案称为抢占式多任务处理。各个进程都分配到一定的时间段可以执行,时间段到期后,内核从进程回收控制权。
-
Linux进程调度在2.6.23版本引入了CFS调度器,替换了之前的O(1)调度器,它试图尽可能模仿理想状况下的公平调度。
-
进程的生命周期
- 进程的几种可能状态
- 运行:此刻进程正在执行
- 等待 : 进程可以运行,但是没有得到许可,因为CPU分配给另外一个进程,调度器可以在未来的某次切换时选择改进程
- 睡眠 : 进程正在睡眠,因为它正在等待一个外部事件
- 终止 : 程序执行完成
- 僵尸 : 进行已经中止,但是其数据未从进程表删除,附进程调用wait等系统调用后退出该状态
- 抢占式多任务处理
- 进程执行状态:用户态和核心态,进程通常处于用户态,只能访问自身的数据,如果要访问系统的功能和数据,则必须切换到核心态,主要的切换方式是系统调用,是程序主动要求的,还有另外一种方式是中断,这个时候是自动触发的,程序无法控制。
- 内核的抢占调度模型建立了一个层次结构,用于判断能否进行抢占:
a) 普通进程总是可以被抢占的,甚至是被其他进程抢占,这有助于实现良好的交互和低系统延迟.
b) 如果系统处于核心态正在处理系统调用,那么系统的其他进程不能夺取其CPU时间,调度器等待系统调用执行结束才能选择另外一个进程执行,但是中断可以中止系统调用
c) 中断可以暂停用户态和核心态的进程,因为中断发生后要尽快处理 - 在内核2.5开发期间,加入了内核抢占的支持,在系统调用执行时也可以切换到另外的紧急进程。