Linux进程调度

调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间。

什么时候调度进程



调度的过程

调度的主战场:就绪队列(也可能是cfs的红黑树)

从中选出一个最值得运行的任务。

核心是调度算法

实质性当作是进程切换

时间中断是驱动力

调整优先级

进程状态改变

CFS

调度分配算法的理想目标

在一个处理器上并行运行n个程序,每个程序都认为自己占有处理器的性能的1/n。

虚拟运行时间:用于度量一个进程已经占用 CPU 时间的加权量

  • 初始值: 当一个进程开始运行时,其虚拟运行时间被初始化为零。
  • 更新过程: 当进程运行时,它的虚拟运行时间会不断地增加,代表它在 CPU 上度过的时间。更新的方式是根据进程的负载权重(load weight)来调整虚拟运行时间的增长速度。负载权重较高的进程增加虚拟运行时间的速度相对较慢,以保持相对公平。
  • 调度决策: 在选择下一个要运行的进程时,CFS会查找具有最小虚拟运行时间的进程。这样,相对于已经消耗了较多 CPU 时间的进程,虚拟运行时间较少的进程更有可能被选中。

进程选择:挑最小虚拟运行时间的进程

用红黑树来组织,并迅速找到最小虚拟运行时间,进程阻塞或者结束会在树中删除。

调度类

在进程调度中,操作系统通常使用多种调度策略(调度类)来满足不同的需求。每个调度策略都可以被看作是一个调度器类,它负责根据特定的规则和算法选择下一个要执行的进程。
调度器会根据进程的优先级,以及实时调度策略(如果有的话),将进程分配到相应的调度类。

调度器:根据调度类的优先级选出一个调度类执行其提供的进程

在Linux内核的调度框架中,调度器会根据进程的静态优先级(static priority)来确定使用哪个调度类。Linux内核中有多个调度策略,例如 Completely Fair Scheduler (CFS)、Round Robin (时间片轮转)、Real-Time (实时)等。每个进程都有一个静态优先级,用于表示其相对于其他进程的调度优先级。

休眠和唤醒

休眠原因:io等待等
休眠过程:进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。
唤醒过程:进程被标记为可执行状态,从等待队列移动到可执行红黑树。

等待队列

进程把自己设置为不可执行状态然后放入等待队列,等等待事件发生时,队列上的进程会被唤醒。

抢占和上下文

在thread_info中存在need_resched标志位,如果值为真,从系统调用或者中断处理程序返回后(或者一个一个进程执行完它划分的时间后,需要被抢占了)会检查,如果为真,则会调用schedule()进行进程调度。

用户抢占

发生时间:
从系统调用返回用户空间时。
从中断处理程序返回用户空间时。

内核抢占

在2.6前的linux版本内核代码需要一直执行直到结束,而2.6之后在安全的情况下可以抢占。

实时调度

实时调度是指在计算机系统中为实时任务(real-time tasks)分配CPU时间的过程。
实时调度在一些对时间敏感的应用领域非常重要,例如航空航天、医疗设备
有两种方法:

  • FIFO队列
  • 时间片轮询

你可能感兴趣的:(Linux,linux,服务器,运维)