进程调度与管理

来源:互联网 发布:苏尚卿 知乎 编辑:程序博客网 时间:2024/05/16 15:11

一、进程

1、进程可以理解为正在运行的程序,它是正在执行的程序代码的实时结果。一个进程可以包含若干个线程,而在Linux中,进程和线程并不特别区分,线程只是一种特殊的进程而已。在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。在同一个进程的线程之间可以共享虚拟内存,但是都拥有各自的虚拟处理器。

2、进程描述符

进程描述符task_struct包含了一个进程的所有信息,比如:它打开的文件,进程地址空间,挂起的信号,进程的状态等。为了管理的方便,内核把当前系统中所有的进程描述符保存在一个叫任务队列的双向循环列表中,列表中的每一项都是一个task_struct结构。而对于进程本身,会有一个thread_info结构,该结构保存在内核栈中,该结构中有一个task的指针指向任务队列中该进程的task_struct结构,即每个进程可以通过thread_info结构快速的获得自己的进程描述符。

3、进程的创建

Linux中进程的创建分为两个步骤:fork()exec()。首先通过调用fork()创建一个子进程,子进程与父进程的区别仅仅在于PIDPPID和某些资源和统计量。fork()一般采用写时复制的机制来减小创建进程的开销。然后调用exec()执行新程序,完成进程的创建。Linux中线程的实现是把它作为一种特殊的进程来对待的,即创建线程时,传递一些参数,让新创建的进程和原来的进程共享某些资源来达到线程的目的。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。

二、进程调度

进程调度没有太复杂的原理。最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程在运行。但是只要系统中可运行的进程数比处理器的数目多,就注定某一给定时刻会有一些进程不能运行。这些进程在等待运行。在一组处于可运行状态的进程中选择一个来运行,是调度程序所需完成的基本工作。

1、进程优先级:

进程的nice值不是进程的优先级,它只是一个可以影响进程优先级的数字,nice值越大,对应的优先级越低,它可以通过一定的关系运算得到进程的静态优先级。而进程的动态优先级是通过对静态优先级进行调整(增加静态优先级奖励I/O消耗型进程,减少静态优先级惩罚CPU消耗型进程等)后得到的优先级数,范围在0~139之间,数值越大,进程的优先级越小,我们通常说的优先级指的是进程的动态优先级。动态优先级分两部分:0~99表示实时优先级,100~139表示普通进程的动态优先级,实时进程的优先级高于普通进程的动态优先级。

2Linux调度算(也称调度器)法:

Linux调度器是以模块的方式提供的,这样做允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。每个调度器都有一个优先级,每次选择拥有一个可执行进程的最高优先级的调度器,去调度该可执行进程。常见的调度器策略有:SCHED_NORMAL(默认,CFS属于该策略)针对普通进程、SCHED_FIFO针对实时进程的先到先出的调度,SCHE_RR针对实时进程的时间片轮转调度等。

2.1O(1)调度器:

O(1)调度器充分实现了O(1)调度,它不管有多少进程,算法都能在恒定的时间内完成。对于O(1)调度,每一个CPU都维护一个自己的运行队列,每个运行队列包含两个优先级数组:活跃优先级数组active和过期优先级数组expired,分别指向时间片没有用完的进程和时间片已经用完的进程。每个优先级数组包含了MAX_PRIO(140)个优先级队列,每一种进程优先级对应一个优先级队列,前100个是实时进程,后40个是普通进程。

O(1)使用一个位图来表示active中的每一个队列,每次进行进程调度时,查找位图来找到哪一个队列上有可运行的队列,然后进行调度,查找的时间只依赖于优先级的数组,因此是恒定的。当活跃数组中的一个进程用光自己的时间片后,就被移动到expired数组。当active中所有进策划那个都耗尽了自己的时间片,activeexpired进行指针交换,原来expired数组变成active数组。

O(1)调度器还实现了SMP的负载均衡。内核引入调度域的概念,将全体CPU一层一层的划分为不同的区域:最上层的调度域(通常包括系统中的所有CPU)包括多个子调度域,每个子调度域都是一个CPU子集,每个调度域中的CPU又分成若干个组,且任一CPU只存在于一个组中。将每一个组当作一个整体进行组与组之间的调度域的平衡操作,只有当某个组的所有CPU的负载总和远远低于同一调度域的另一个组时,才把进程从一个CPU迁移到另一个CPU,进行组与组之间调度域的平衡。O(1)调度器虽然对于拥有数十个多处理器的环境下尚能表现的很好,但是O(1)调度器对于那写响应时间敏感的交互型程序却表现的不佳。

2.2CFS调度器:

完全公平调度器80%的工作可以用一句话概括:CFS在真实的硬件上模拟了完全理想的多任务处理器。在完全公平的多任务处理器下,每个进程都能同时获得CPU的执行时间,当系统中有两个进程时,CPU的计算时间被分成两份,每个进程占50%,而且两个进程是同时运行的。然而在实际的硬件上,当一个进程占用CPU时,其他进程必须等待,这就产生了不公平,因此CFS引入虚拟运行时间来尽量接近公平。

CFS每次选择虚拟运行时间最小的进程调度运行,而虚拟运行时间和两个因素有关:和实际运行时间成正比,和权重成反比。随着实际运行时间的增加,虚拟运行时间不断增加,调度的机会不断减少。而若进程的nice值越小,则进程的权重越大,则进程的虚拟运行时间随实际运行时间的增加而增加的就越慢,调度的机会就越大。

CFS不使用时间片的概念,而是通过权重比来计算进程每个周期的运行时间。假设有ABC三个可运行进程,权重分别是123.假设运行周期是12的话,则ABC分别占246个单位.

原创粉丝点击