社保减员要怎么做 国税局网站,放单网站,无锡seo报价,dw网页设计图片轮播切换对于操作系统来讲#xff0c;它面对的 CPU 的数量是有限的#xff0c;干活儿都是它们#xff0c;但是进程数目远远超过 CPU 的数目#xff0c;因而就需要进行进程的调度#xff0c;有效地分配 CPU 的时间#xff0c;既要保证进程的最快响应#xff0c;也要保证进程之间的…对于操作系统来讲它面对的 CPU 的数量是有限的干活儿都是它们但是进程数目远远超过 CPU 的数目因而就需要进行进程的调度有效地分配 CPU 的时间既要保证进程的最快响应也要保证进程之间的公平。这也是一个非常复杂的、需要平衡的事情。
在 Linux 里面进程大概可以分成两种。
一种称为实时进程也就是需要尽快执行返回结果的那种。这就好比我们是一家公司接到的客户项目需求就会有很多种。有些客户的项目需求比较急比如一定要在一两个月内完成的这种客户会加急加钱那这种客户的优先级就会比较高。
另一种是普通进程大部分的进程其实都是这种。这就好比大部分客户的项目都是普通的需求可以按照正常流程完成优先级就没实时进程这么高但是人家肯定也有确定的交付日期。
在 task_struct 中有一个成员变量我们叫调度策略。优先级其实就是一个数值对于实时进程优先级的范围是 099对于普通进程优先级的范围是 100139。数值越小优先级越高。从这里可以看出所有的实时进程都比普通进程优先级要高。
对于调度策略其中 SCHED_FIFO、SCHED_RR、SCHED_DEADLINE 是实时进程的调度策略。
对于普通进程的调度策略有SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE。
sched_class 有几种实现
stop_sched_class 优先级最高的任务会使用这种策略会中断所有其他线程且不会被其他任务打断dl_sched_class 就对应上面的 deadline 调度策略rt_sched_class 就对应 RR 算法或者 FIFO 算法的调度策略具体调度策略由进程的 task_struct-policy 指定fair_sched_class 就是普通进程的调度策略idle_sched_class 就是空闲进程的调度策略。
所有可运行的进程通过不断地插入操作最终都存储在以时间为顺序的红黑树中vruntime 最小的在树的左侧vruntime 最多的在树的右侧。 CFS 调度策略会选择红黑树最左边的叶子节点作为下一个将获得 CPU 的任务。
CPU 也是这样的每个 CPU 都有自己的 struct rq 结构其用于描述在此 CPU 上所运行的所有进程其包括一个实时进程队列 rt_rq 和一个 CFS 运行队列 cfs_rq在调度时调度器首先会先去实时进程队列找是否有实时进程需要运行如果没有才会去 CFS 运行队列找是否有进程需要运行。
当有一天某个 CPU 需要找下一个任务执行的时候会按照优先级依次调用调度类不同的调度类操作不同的队列。当然 rt_sched_class 先被调用它会在 rt_rq 上找下一个任务只有找不到的时候才轮到 fair_sched_class 被调用它会在 cfs_rq 上找下一个任务。这样保证了实时任务的优先级永远大于普通任务。 sched_class 定义的与调度有关的函数。
enqueue_task 向就绪队列中添加一个进程当某个进程进入可运行状态时调用这个函数dequeue_task 将一个进程从就绪队列中删除pick_next_task 选择接下来要运行的进程put_prev_task 用另一个进程代替当前运行的进程set_curr_task 用于修改调度策略task_tick 每次周期性时钟到的时候这个函数被调用可能触发调度。
调用路径如下pick_next_task_fair-pick_next_entity-__pick_first_entity。 此文章为10月Day26学习笔记内容来源于极客时间《趣谈Linux操作系统》推荐该课程。