[Linux Kernel Architeture]进程管理和调度 -- 基本概念

时间:2021-01-16 14:52:19

进程:进程是一个抽象的概念,其代表着一个正在执行的任务,是一个程序的活动的实体。从每个进程的角度来看,它会认为自己是系统中唯一的进程,独占所有的资源,包括CPU、内存、IO等。事实上,系统中同时真正正在运行的进程数目最多不超过CPU的数目。内核会在一个很短的时间间隔中在不同的进程之间切换(称之为调度),使得系统看起来在并发执行多个任务。

 

进程的生命周期:如一个生命实体,会经历从出生到成长再到死亡的过程。进程可能的几个状态:运行、等待、睡眠、终止。进程会在其运行期间在各种状态间转换。如进程被创建后,能够运行,却没有得到许可,因此需要等待;在被系统赋与使用CPU的权力后进程处于运行状态;在运行过程中需要做延迟较高的操作,如读取文件,接收数据包等,此时其会放弃使用CPU,进程进入睡眠状态。

特殊地,进程有一个所谓的“僵尸”(Zombie)状态。顾名思义,这样的进程已经死亡,却仍然以某种方式活着。说这些进程已经死亡了,是因为其资源(内存、文件等)已经释放,因此它们决不可能再次运行。说它们仍然活着,是因为进程表中仍然有对应的表项。

僵尸产生的原因:

在两种事件发生时,程序将终止运行:

  1. 程序由别一个进程或一个用户杀死,如发送一个SIGTERM或SIGKILL信号
  2. 进程的父进程在子进程终止时必须调用wait4(读作wait for)系统调用,这相当于向内核证实父进程已经确认子进程的终结,使用内核可以释放为子进程保留的资源。

只有在第一个条件发生而第二个条件不成立的情况下,才会出现僵尸状态。在进程终止后,其数据尚未从进程表删除之前,进程总是暂时处于僵尸状态。有时候,如父进程没有调用wait4,僵尸进程可能寄生于进程表中,直至下次系统重启。

进程的优先级:并非所有的进程都具有相同的重要性。进程有不同的关键度类别,以满足不同的需求。

  1. 硬实时进程。其有严格的时间限制,必须在指定的时间内完成。如飞机的飞行控制指令,必须在非常短的时间内得到执行。普通Linux不支持硬实时处理。
  2. 软实时进程,是硬实时进程的一种弱化形式,尽管需要快速得到执行,但稍微晚一点不会造成世界末日。如CD刻录时的数据流写入。
  3. 普通进程,没有特定的时间约束,但仍然可以根据重要性程度来分配优先级。

抢占式多任务处理:内核的抢占调度模型建立了一个层次结构,用于判断那些进程状态可以由其他进程状态抢占。

  1. 普通进程总是可能被抢占,甚至被其它进程抢占,
  2. 如果系统处于核心态并正在处理系统调用,那么系统中的其他进程是无法夺取其CPU时间的。调度器必须等待其执行结束,才能选择另一个进程执行。(在系统调用返回时调用schedule)
  3. 中断可以暂停处于用户态和核心态的进程,其需要尽快处理,具有最高的优先级。

在内核2.5开发期间,引入一个内核抢占(kernel preemption)的技术,其使得当前处于核心态执行的进程有可能被抢占。(在释放锁或从中断返回时调用schedule)

线程:线程也称为轻量级进程,本质上一个进程可能由若干线程组成,这些线程共享同样的数据和资源,但可能执行程序中不同的代码路径。Linux用clone方法创建线程。而实际上,Linux内核中,并不严格区分进程与线程,这从两者都用 struct task_struct来描述可以看出。