进程调度

进程调度指在合适的时候以一定策略选择一个就绪进程的运行

  • 进程调度的目标
    1.响应速度尽可能快
    2.进程处理的时间尽可能短
    3.系统吞吐量尽可能大
    4.资源利用率尽可能高
    5.对所有进程要公平
    6.避免饥饿
    7.避免死锁
    上述部分原则之间存在自相矛盾,入1和2, 1和3,2和5,因此针对特定使用环境选择一些目标,忽略其他目标。

  • 可量化的目标:周转时间/平均周转时间、带权周转时间/平均带权周转时间
    周转时间,指进程提交给计算机到最终完成所花费的时间,说明进程在系统中停留时间的长短。
    单个进程的周转时间无法体现操作系统进程调度效率,而要使用平均值。平均周转时间越短,表明系统吞吐量越大,资源利用率也越高
    由于进程大小和周转时间相关,采用带权周转时间(周转时间与进程运行时间比值),表明进程在系统相对停留时间。同样,存在带权周转时间也存在平均值。

  • 典型调度算法

算法 策略 特点
先来先服务调度(First Come First Serve,FCFS) 按照作业进入系统的时间先后来挑选作业,先入系统的作业优先被运行 容易实现,效率不高,只考虑作业等候时间,而没考虑运行时间的长短,不利于短作业
短作业优先调度(Short Job First) 参考运行时间,选取运行时间最短的作业投入运行 易于实现,效率不高,忽略了作业等待时间,易出现饥饿现象
响应比高者优先调度 计算每个作业的响应比,选择响应比最高的作业优先投入运行 有利于短作业和等候长的作业,长作业可通过等待足够久的时候后获得CPU
优先数调度 根据进程优先数,把CPU分配给优先数最高的进程 兼顾多方效益
循环轮转调度(Round-Robin) 把所有就绪进程按先进先出的原则排成队列,新来进程加入队列末尾,以时间片为单位轮流使用CPU,构成环形队列 公平,每个就绪进程有平等机会获得CPU;交互,每个进程等待N-1个时间片就可重新获得CPU。
循环轮转调度
  • 响应比是作业响应时间与运行时间的比值,响应比=1+等待时间/运行时间。

  • 进程优先数=静态优先数+动态优先数
    静态优先数,在整个进程运行期间不再改变。进程创建时,根据所需资源,程序运行时间,进程类型等确定
    动态优先数,在进程运行期间根据CPU使用时长,I/O操作,进程等待时长等进行改变。

  • 循环轮转调度的时间片很大,交互性变差,算法可退化为FCFS;时间片太小,进程切换频繁,系统开销增加。可使用可变时间片,或组织多个就绪队列进行改善。

  • Linux进程调度
    普通进程,采用动态优先级来调度,调度程序周期性地修改优先级,避免饥饿
    实时进程,采用静态优先级来调度,由用户预先指定,以后不会改变,实时进程的子进程也是实时进程

  • task_struct
    包含policy(调度策略)、priority(进程静态优先级)、rt_priority(实时进程特有优先级)、counter(进程能连续运行时间)

  • policy指明进程调度策略,0号策略给普通分时进程,1和2号策略给实时进程。
    SCHED_OTHER(0号,动态优先级)
    成员counter表示动态优先级
    调用sched_setscheduler改变调度策略
    SCHED_FIFO(1号,先进先出)
    当前实时进程一直占有CPU直到退出或阻塞或被抢占
    阻塞再就绪时被添加到同优先级队列的末尾
    SCHED_RR(2号,时间片轮转)
    与其他实时进程以时间片轮转方式共同使用CPU
    确保同优先级的多个进程能共享CPU

  • counter
    进程能连续运行的时间,单位是时间滴答tick(10ms)
    较高优先级的counter较大
    counter可看作动态优先级
    初值为priority,运行一个tick时,counter减1,直到0被阻塞。
    子进程新建的counter只从父进程counter中继承一半,防止用户无限制地创建后代进程而长期占有CPU资源。

  • 调度时机
    1.中断处理过程中直接调用schedule,时间中断、I/O中断、系统调用和异常,内核被动调用的情形
    2.中断处理过程返回用户态时直接调用schedule,必须根据need_resched标记
    3.内核线程可直接调用schedule,内核主动调用的情形
    4.用户进程只能通过陷入内核后在中断处理过程中被动调度,必须根据need_resched标记

  • 进程切换
    内核挂起当前CPU上的进程并恢复之前挂起的某个进程
    任务切换和上下文切换,区别于和中断上下文切换(同个进程)
    包含用户地址空间,控制信息,硬件上下文等信息

  • 进程调度和切换流程
    采用schedule函数实现
    选择新进程next=pick_next_task(进程调度算法)
    调用宏context_switch(内部调用switch_to)切换进程上下文

你可能感兴趣的:(进程调度)