首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux CFS调度器之虚拟时钟vruntime调度延迟--Linux进程管理调度(二十六)

为了实现完全公平调度,内核引入了虚拟时钟(virtual clock)概念,实际上我觉得这个虚拟时钟为什叫虚拟,是因为这个时钟具体时钟晶振没有关系,他只不过是为了公平分配CPU时间而提出一种时间量度.../*当前执行进程调度实体*/ ... }; 3 update_curr函数计算进程虚拟时间 所有虚拟时钟有关计算都在update_curr中执行, 该函数在系统中各个不同地方调用..., 包括周期性调度器在内. update_curr流程如下 首先计算进程当前时间上次启动时间差值 通过负荷权重和当前时间模拟出进程虚拟运行时钟 重新设置cfsmin_vruntime保持其单调性...每一个进程拥有一个vruntime, 每次需要调度时候就选运行队列中拥有最小vruntime那个进程来运行, vruntime在时钟中断里面被维护, 每次时钟中断都要更新当前进程vruntime,...在时钟中断里面被维护,每次时钟中断都要更新当前进程vruntime,即vruntime以如下公式逐渐增长: 条件 公式 curr.nice!

3.2K63

Linux进程调度设计--Linux进程管理调度(十七)

当然批处理进程相比, 调度程序有偏爱交互式进程倾向 1.3 不同进程采用不同调度策略 根据进程不同分类Linux采用不同调度策略...., 不考虑优先级和调度类 load 提供了就绪队列当前负荷度量, 队列符合本质上队列上当前活动进程数目成正比, 其中各个进程又有优先级作为权重....每个就绪队列虚拟时钟速度等于该信息 cpu_load 用于跟踪此前负荷状态 cfs,rt 和dl 嵌入子就绪队列, 分别用于完全公平调度器, 实时调度器和deadline调度器 curr 当前运行进程...* 其会不停增长,增长速度load权重成反比,load越高,增长速度越慢,就越可能处于红黑树最左边被调度 * 每次时钟中断都会修改其值 * 具体见calc_delta_fair...注意其值为单调递增,在每个调度时钟中断时当前进程虚拟运行时间都会累加。

3.6K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux进程调度器概述--Linux进程管理调度(十五)

    ), 也可能是CPU受限(比如图形绘制程序) 2.2 实时进程普通进程linux中, 调度算法可以明确的确认所有实时进程身份, 但是没办法区分交互式程序和批处理程序(统称为普通进程), linux2.6...当然批处理进程相比, 调度程序有偏爱交互式进程倾向 根据进程不同分类Linux采用不同调度策略. 对于实时进程,采用FIFO或者Round Robin调度策略....因此进程调度也包含了线程调度功能. linux进程调度算法其实经过了很多次演变, 但是其演变主要是针对普通进程, 因为前面我们提到过根据进程不同分类Linux采用不同调度策略.实时进程和普通进程采用了不同调度策略...调度定时器每隔一定时间执行一个中断,在中断会对当前运行进程运行时间进行更新,如果进程需要被调度,在调度定时器中断中会设置一个调度标志位,之后从定时器中断返回,因为上面已经提到从中断上下文返回时是有调度时机...scheduler_tick由内核时钟中断周期性触发, 周期性调度器以固定频率激活负责当前进程调度周期性调度方法, 以保证系统并发性, 周期性调度器通过调用进程所属调度器类task_tick

    3.6K20

    Linux进程调度_linux进程查看和调度

    Linux 系统为了提升响应速度,倾向于优先调度 I/O 消耗型。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程优先级越小 任何实时进程优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总调度结构...Linux 调度时机 ---- 一、进程切换 从进程角度看,CPU是共享资源,由所有的进程按特定策略轮番使用。...二、调度时机 自愿切换意味着进程需要等待某种资源,强制切换则抢占(Preemption)有关。...在以下时刻: 周期性时钟中断 时钟中断处理函数会调用scheduler_tick(),这是调度器核心层(scheduler core)函数,它通过调度类(scheduling class)task_tick

    20.7K10

    Linux进程调度策略发展和演变--Linux进程管理调度(十六)

    当然批处理进程相比, 调度程序有偏爱交互式进程倾向 1.3 不同进程采用不同调度策略 根据进程不同分类Linux采用不同调度策略....因此,这个算法缺乏可伸缩性 2.2.2 详情 每个进程被创建时都被赋予一个时间片。时钟中断递减当前运行进程时间片,当进程时间片被用完时,它必须等待重新赋予时间片才能有机会运行。...O(1)调度算法所花费时间为常数,当前系统中进程个数无关。 此外Linux 2.6内核支持内核态抢占,因此更好地支持了实时进程。...该值更新时机分布在很多内核函数内:时钟中断scheduler_tick();进程创建;进程从TASK_INTERRUPTIBLE状态唤醒;负载平衡等。...为了提高交互式进程响应时间,O(1)调度器不仅动态地提高该类进程优先级,还采用以下方法:每次时钟tick中断时,进程时间片(time_slice)被减一。

    2.2K20

    Linux进程调度切换

    前言:   在Linux操作系统中,进程调度切换是操作系统核心功能之一,它直接影响着系统性能和响应速度。那么话不多说,开启我们今天的话题!...进程调度 ✈️活动状态进程队列   我们上次说过,Linux实现进程调度算法,需要考虑 优先级,考虑进程饥饿,以及效率。那么CPU是如何实现进程调度呢?   ...我们来看一下Linux下CPU运行队列各项属性:   我们首先看蓝色框内内容,有一个叫做 queue[140] 数组,这里 queue数组表示活动状态进程进程队列。   ...这样,我们竞争饥饿,优先级,以及进程效率都解决了。 ✏️总结  进程切换最重要部分就是 进程上下文保护和恢复。  进程调度优先级问题由 活跃进程数组下标进程优先级形成一种映射关系 解决。  ...进程调度时间复杂度问题由 位图和两个结构体指针 解决,时间复杂度控制在了O(1)。  进程调度进程饥饿问题由 活跃队列和过期队列 解决。

    12610

    Linux进程核心调度器之主调度器schedule--Linux进程管理调度(十九)

    该信息使得内核在显示栈转储活类似信息时, 忽略所有调度相关调用. 由于调度哈书调用不是普通代码流程一部分, 因此在这种情况下是没有意义....* 被抢占有两种情况, 一种是时间片到点, 一种是时间片没到点 * 时间片到点后, 主要是置当前进程need_resched标志 * 接下来在时钟中断结束后, 会...prev是隶属于CFS普通非实时进程 * 而当前cpu全局就绪队列rq中进程cfs_rq进程数相等 * 则说明当前cpu上所有进程都是由cfs调度普通非实时进程...调度过程可能选择了一个新进程, 而清理工作则是针对此前活动进程, 请注意, 这不是发起上下文切换那个进程, 而是系统中随机某个其他进程, 内核必须想办法使得进程能够context_switch..., 我们调度会被中断, 而调度却还没有完成, 这样会丢失我们调度信息.

    3.8K31

    Linux进程ID号--Linux进程管理调度(三)【转】

    Linux 内核使用 task_struct 数据结构来关联所有进程有关数据和结构,Linux 内核所有涉及到进程和程序所有算法都是围绕该数据结构建立,是内核中最重要数据结构之一。...是 Linux 中在其命名空间中唯一标识进程而分配给它一个号码,称做进程ID号,简称PID。...处于相同线程组中所有进程都有相同TGID,但是由于他们是不同进程,因此其pid各不相同;线程组组长(也叫主线程)TGID与其PID相同;一个进程没有使用线程,则其TGIDPID也相同。...pid时候,只需要查找pidmap位图即可 那么最终,linux进程命名空间和进程关系结构如下: ?...至此,已经 Linux 内核中数据结构相差不多了。

    5.8K10

    linux进程调度

    不同普通进程,系统调度时,实时优先级高进程总是先于优先级低进程执行。知道实时优先级高实时进程无法执行。实时进程总是被认为处于活动状态。...假设当前CPU运行实时进程A优先级为a,而此时有个优先级为b实时进程B进入可运行状态,那么只要b<a,系统将中断A执行,而优先执行B,直到B无法执行(无论A,B为何种实时进程)。    ...总而言之,对于实时进程,高优先级进程先执行,它执行到没法执行了,才轮到低优先级进程执行。 2.非实时进程调度 Linux对普通进程,根据动态优先级进行调度。...Linux下,静态优先级是用户不可见,隐藏在内核中。...Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去睡眠时间越多,则越有可能属于交互式进程

    3.2K140

    linux进程调度

    调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型进程肯定有不同调度策略,task_struct中policy就用来表示调度策略。...SCHED_RR,时间片轮转调度,也是高优先级可以抢占低优先级,对于同优先级新来排到队尾,每个进程都执行一个时间片,然后换下一个进程。...普通调度策略有 SCHED_NORMAL, SCHED_BATCH,SCHED_IDLE SCHED_NORMAL:普通进程 SCHED_BATCH:后台进程 SCHED_IDLE:空闲时运行进程...stop_sched_class:优先级最高进程使用该策略,可以打断所有其他进程,并且该进程不会被抢占 rt_sched_class:RR算法或者FIFO算法调度策略,具体由该进程task_struct...fair_sched_class:普通进程调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度

    8.1K20

    Linux】详谈进程优先级&&进程调度切换

    1.2、优先级具体表示 进程优先级其实就是PCB中一个整形变量(int PRI)。Linux进程默认优先级是80,这个默认优先级是可以被修改Linux中优先级范围是[60,99]。...数字越小,进程优先级越高。Linux系统允许用户调整优先级,但是不能直接让你修改PRI值,而是修改nice值。nice值不是进程优先级,而是优先级修正数据。...二、进程调度切换  进程被加载到CPU上运行时候,并不是必须一口气把代码跑完,现代操作系统,都是基于时间片轮转执行。...2.2进程调度 CPU实现进程调度算法需要考虑优先级,饥饿问题以及效率问题。...这样,CPU在调度时候就可以根据进程优先级由高到低地调度进程了。

    40510

    Linux CFS调度器之唤醒抢占--Linux进程管理调度(三十)

    , 当然因为大多数情况下, 系统中全是CFS调度非实时进程, 因而linux内核也有一些优化策略 一般情况下选择红黑树中最左进程left作为最优进程完成调度, 如果选出进程正好是cfs_rq->...skip需要跳过调度那个进程, 则可能需要再检查红黑树次左进程second, 同时由于curr进程不在红黑树中, 它可能比较饥渴, 将选择出进程curr进程进行择优选取, 同样last进程和next...这个是调度器最初向进程欠下债务....关于place_entity函数, 我们之前在讲解CFS队列操作时候已经讲很详细了 参见linux进程管理调度之CFS入队出队操作 设想一下子如果休眠进程vruntime保持不变,...se->vruntime -= cfs_rq->min_vruntime; 我们前面讲解place_entity时候说到, 新创建进程和睡眠后苏醒进程为了保证他们vruntime系统中进程vruntime

    2.6K31

    Linux内核调度分析(进程调度

    本文是《Linux内核设计实现》第四章阅读笔记,代码则是摘自最新4.6版本linux源码(github),转载请注明出处。...Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为调度器,后在2.6版本中将公平调度概念引入了调度程序,代替之前调度器,称为算法(完全公平调度算法)。...Linux调度算法 调度器类 Linux调度器是以模块方式提供,这样使得不同类型进程按照自己需要来选择不同调度算法。...可以认为这是CFS为了能够实现理想多任务处理而不得不虚拟一个新时钟,具体地讲,一个进程vruntime会随着运行时间增加而增加,但这个增加速度由它所占权重来决定。...从中断返回内核空间时候,会检查和值,如果被标记,并且为0,就意味着有一个更需要调度进程需要被调度,而且当前情况是安全,可以进行抢占,那么此时调度程序就会被调用。

    14.9K113

    Linux进程调度(三)

    一、抢占式调度和主动调度: 前面我们说过,进程切换总是通过 shedule 函数发生,而 schedule 函数可以是在系统调用返回、中断返回等时机被调用,也可以进程在驱动程序中主动调用 我们把在系统调用返回等时机调用...schedule 函数这种非进程自愿情况称为抢占式调度。...把进程在驱动程序中主动调用 schedule 函数来发生进程切换这种情况称为主动调度 本文将讨论主动调度,抢占式调度将在下一篇文章中讲解: 二、主动调度发生情况: 主动调度一般在应用程序读取某个设备时...我们先想一下,进程切换主要做了什么 进程地址空间切换 进程进程之间地址是相互独立,所以需要切换进程地址空间 指令指针切换 进程切换后,要恢复进程原本执行地方 我们下面看看 context_switch...四、总结: 进程发生切换总是调用 schedule 函数进行进程调度分抢占式调度和主动调度,主动调度表示进程主动调用 schedule 函数发生进程切换 schedule 函数主要做了两件事,

    2.5K10

    Linux进程调度分析

    实时进程相比,普通进程调度要复杂得多。...随着进程在CPU上运行,其优先级被不断调低,以便其他优先级较低进程得到运行机会; 后一种方式有更小调度粒度,并且将“公平性”“动态调整优先级”两件事情合而为一,大大简化了内核调度程序代码。...如发送信号主动唤醒,或因为释放互斥对象(如释放锁)而被唤醒; 内核在响应时钟中断过程中,发现当前进程时间片用完; 内核在响应中断过程中,发现优先级更高进程所等待外部资源变为可用,从而将其唤醒...比如CPU收到网卡中断,内核处理该中断,发现某个socket可读,于是唤醒正在等待读这个socket进程;再比如内核在处理时钟中断过程中,触发了定时器,从而唤醒对应正在nanosleep 系统调用中睡眠进程...4、中断处理线程化 在linux下,中断处理程序运行于一个不可调度上下文中。从CPU响应硬件中断自动跳转到内核设定中断处理程序去执行,到中断处理程序退出,整个过程是不能被抢占

    2.4K31

    Linux进程退出详解(do_exit)--Linux进程管理调度(十四)

    Linux进程退出 linux进程退出方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit区别和联系...这个信息我们已经讨论过很多次了 参见 Linux进程ID号–Linux进程管理调度(三) Linux进程描述符task_struct结构体详解–Linux进程管理调度(一)...为了完成这个步骤,函数扫描current->tgid对应PIDTYPE_TGID类型散列表中每PID链表,向表中所有不同于current进程发送SIGKILL信号,结果,所有这样进程都将执行...list_empty(&plug->cb_list)); } OOPS消息 中断上下文不能执行do_exit函数, 也不能终止PID为0进程。..., 进程已经无法被再次调度, 因为对应用程序或者用户空间来说此进程已经死了, 但是尽管进程已经不能再被调度,但系统还是保留了它进程描述符,这样做是为了让系统有办法在进程终止后仍能获得它信息。

    6.1K30

    Linux内核】进程调度

    文章目录 前言 I/O消耗型处理器消耗性 进程优先级 时间片 进程抢占 前言 调度程序没有太复杂原理。最大限度地利用处理器时间原则是,只要有可以执行进程,那么就总会有进程正在执行。...Linux 提供了抢占式多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程运行以便其他进程能够得到执行机会。这个强制挂起动作就叫抢占(preemption)。...I/O消耗型处理器消耗性 进程可以被分为I/O消耗型和处理器消耗型。前者指进程大部分时间用来提交I/O请求或是等待I/O请求。...优先级高进程先运行,低后运行,相同优先级进程按轮转方式进行调度(一个接一个,重复进行)。在包括Linux在内某些系统中,优先级高进程使用时间片也较长。...进程抢占 像前面所说Linux 系统是抢占式。当-个进程进入TASK_RUNNING状态,内核会检查它优先级是否高于当前正在执行进程

    2.9K20

    Linux进程调度学习!

    Linux 调度算法: Linux 中有一个总调度结构,称之为 调度器类(scheduler class),它允许不同可动态添加调度算法并存,总调度器根据调度器类优先顺序,依次去进行调度器类进程进行调度...SCHED_RR : SCHED_FIFO 大致相同,只是 SCHED_RR 级进程在耗尽其时间后,不能再执行,需要接受 CPU 调度。...Linux 调度时机: 1、进程切换: 从进程角度看,CPU是共享资源,由所有的进程按特定策略轮番使用。...2、调度时机: 自愿切换意味着进程需要等待某种资源,强制切换则抢占(Preemption)有关。...在以下时刻: 周期性时钟中断时钟中断处理函数会调用scheduler_tick(),这是调度器核心层(scheduler core)函数,它通过调度类(scheduling class)task_tick

    1.9K30

    Linux下2号进程kthreadd--Linux进程管理调度(七)

    任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthreadd函数,该函数作用就是运行kthread_create_list全局链表中维护kthread, 当我们调用...kernel_thread创建内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接以kthreadd为父进程 2号进程创建 在rest_init函数中创建2号进程代码如下 pid =...在for循环中,如果发现kthread_create_list是一空链表,则调用schedule调度函数,因为此前已经将该进程状态设置为TASK_INTERRUPTIBLE,所以schedule调用将会使当前进程进入睡眠...kthread_create() 并且返回新创建线程任务描述符 新创建线程由于执行了 schedule() 调度,此时并没有执行....idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程调度和管理,它任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthreadd函数,该函数作用就是运行

    2.4K20

    Linux进程线程及调度

    本文为宋宝华《Linux进程、线程以及调度》学习笔记。 1 进程概念 1.1 进程线程定义 操作系统中经典定义: 进程:资源分配单位。 线程:调度单位。...4) wait() 父进程挂起,等待子进程结束。 5) 孤儿进程僵尸进程 孤儿进程:一个父进程退出,而它一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。...5) 消息队列 命令管道类似,但不必考虑打开/关闭管道复杂操作。消息队列独立于进程而存在。 6) 共享内存 需要通信进程间共享一块内存进行数据交换。...2 进程线程实现本质 Linux调度器实际是识别task_struct进行调度。...每个线程都有自己task_struct,因为每个线程可被CPU调度。多线程间又共享同一进程资源。这两点刚好满足线程定义。 Linux就是这样用进程实现了线程,所以线程又称为轻量级进程

    4.1K41
    领券