但是如果这个进程有严重的I/O延迟,系统会自动的调另一个上去。或者这个进程用sched_yield函数把CPU隔一段时间分出去。或者它被高优先级的进程取代。...如果运用了这个策略,CPU会相应的照顾到这些进程。...使用FIFO的调度算法: [root@server19 ~]# chrt -f 10 top 从列出的信息可以看出来,top的优先级还是比较高的。...之后运行: [root@server19 ~]# chrt -r 1 sha1sum /dev/zero 发现top命令里,看不见sha1sum的进程被CPU调度。.../dev/zero 之后运行: [root@server19 ~]# chrt -r 1 sha1sum /dev/zero 可以发现3个进程一直被CPU调度着。
CPU调度,决定了CPU执行进程的策略,好的调度policy需要兼顾进程首次被调度的等待时间和进程结束执行的等待时间,因此在算法设计上极其精妙。本章完全Copy自OSTEP,介绍了基础的调度算法。...,按照剩余时间进行调度(可以看作把job分割) Metric II 首次被调度等待的时间 Round Robin 时间切片,每次切片都轮换所有进程。...更慢,因此CPU需要等待I/O完成,此时CPU处于闲置,因此可以Switch给其他进程。...intensive,可以高优先级处理,反正大部分时间都是空闲的) 问题: 1.starvation 大量I/O-intensive 挤占高优先级,导致CPU-intensive无法执行。...---- 疑惑 首次被调度等待的时间 Round Robin 时间切片,每次都轮换所有进程。
说起CPU的调度原理,很多人的第一反应是基于时间片的调度,也即每个进程都有占用CPU运行的时间片,时间片用完之后,就让出CPU给其他进程。...其实,基于时间片的调度只是众多CPU的调度算法的一类,本文将会从最基础的调度算法说起,逐个分析各种主流调度算法的原理,带大家一起探索CPU调度的奥秘。...CPU的上下文切换 在探索CPU调度原理之前,我们先了解一下CPU的上下文切换,它是CPU调度的基础。 如今的OS几乎都支持"同时"运行远大于CPU数量的任务,OS会将CPU轮流分配给它们使用。...准备工作已经做好,下面我们开始进入CPU调度算法的奇妙世界。...CFS:Linux的完全公平调度 本节我们将介绍一个平时打交道最多的调度算法,Linux系统下的CFS(Completely Fair Scheduler,完全公平调度)。
CPU调度 我们知道,程序需要获得CPU的资源才能被调度和执行,那么当一个进程由于某种原因放弃CPU然后进入阻塞状态,下一个获得CPU资源去被调度执行的进程会是谁呢?...下图中,进程1因为阻塞放弃CPU资源,此时,进程2刚IO操作结束,可以获得CPU资源去被调度,进程3的时间片轮转结束,也同样可以获得CPU资源去被调度,那么,此时的操作系统应该安排哪个进程去获得CPU资源呢...这就涉及到我们操作系统的CPU调度策略了。 ?...那么,CPU的调度策略如何做到合理呢? 首先得明白系统中有以下的几种矛盾。...等等这些问题到现在都在疯狂地探讨和研究当中,有兴趣向这方面进行深入了解的可以阅读相关文献,或者阅读以下linux的CPU调度算法源码。
内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有的进程仿佛同时在执行。...双核CPU,实际上最多只能有两个进程在同时运行,大家在top、vmstat命令里看到的正在运行的进程,并不是真的在占有着CPU哈。...所以,一些设计良好的高性能进程,比如nginx,都是实际上有几颗CPU,就配几个工作进程,道理就在这。...实际上,内核会对初始的nice值有一个-5到+5的动态调整。这个动态调整的依据是什么呢?很简单,如果CPU用得多的进程,就把nice值调高点,等价于优先级调低点。...CPU用得少的进程,认为它是交互性为主的进程,则会把nice值调低点,也就是优先级调高点。这样的好处很明显,因为1、一个进程的初始优先值的设定未必是准确的,内核根据该进程的实时表现来调整它的执行情况。
进程调度器的任务就是合理分配CPU时间给运行的进程,创造一种所有进程并行运行的错觉。这就对调度器提出了要求: 1、调度器分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。...Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...进行负载均衡的时候 在多CPU的系统上,进程调度器尽量使各个CPU之间的负载保持均衡,而负载均衡操作可能会需要触发抢占。
写在前面 考试整理,博文内容涉及: CPU 调度简单认知 不同进程优先级和不同调度策略认知 CPU调度内核调度可调参数介绍 理解不足小伙伴帮忙指正 人生不是书上的故事,喜怒哀乐,悲欢离合,都在书页间,可书页翻篇何其易...虽然Linux系统似乎通过多任务同时运行多个进程,但当多个进程在单个CPU上同时运行时,是通过交替执行这些进程实现的。...进程优先级认知 Linux 系统中调度器基于调度策略和调度优先级决定进程执行的顺序。...了解优先级之前先简单了解下调度策略,Linux 调度策略分为两组: 非实时策略(non-real-time policies)适用于大多数通用计算系统和应用程序。...非实时调度策略配置 在systemd中,CFS调度器是默认的调度器,它会根据任务的优先级和虚拟运行时间来进行动态调度,以提供公平的CPU时间分配给所有运行的进程。
然而,这样可能会有频率上提升的延时。对于 CPU 的负载,没有谁比调度器还清楚的了。所以 cpufreq governor 完全没必要自己去做负载采样,应该从内核调度器那里获取。...而基于调度器的 cpufreq governor 就是这样引出来的。...schedutil 内核调度器中的 CFS 调度类是通过 PELT(per entity load tracking) 来统计各个 Task 的负载(capacity),并映射到 0 ~ 1024(最大值可在编译时指定...而基于调度器的 cpufreq governor 的主要原理就是把各个 CPU 的 capacity 映射到 CPU 频率,来完成调频动作,capacity 越高,当前 CPU 负载越高,所以频率也调的很高...并且schedutil 支持快速freq 切换(fast path),当调度器有loading 变化时,就及时的callback schedutil ,schedutil计算下一个freq 并且把相关freq
我们可以把Linux下繁多的进程状态,归纳为三种基本状态。 就绪(Ready): 进程已经获得了CPU以外的所有必要资源,如进程空间、网络连接等。就绪状态下的进程等到CPU,便可立即执行。...调度器是CPU时间的管理员。Linux调度器需要负责做两件事:一件事是选择某些就绪的进程来执行;另一件事是打断某些执行中的进程,让它们变回就绪状态。不过,并不是所有的调度器都有第二个功能。...如果进程不经常跟用户交互,内核将会把进程的Bonus设置成小于5的数。 O(n)和O(1)调度器 下面介绍Linux的调度策略。...当计算机中有大量进程在运行时,这个调度器的性能将会被大大降低。也就是说,O(n)调度器没有很好的可拓展性。O(n)调度器是Linux 2.6之前使用的进程调度器。...以上就是调度器的基本原理,以及Linux用过的几种调度策略。调度器可以更加合理地把CPU时间分配给进程。现代计算机都是多任务系统,调度器在多任务系统中起着顶梁柱的作用。
但是普通进程的调度策略就比较麻烦了, 因为普通进程不能简单的只看优先级, 必须公平的占有CPU, 否则很容易出现进程饥饿, 这种情况下用户会感觉操作系统很卡, 响应总是很慢,因此在linux调度器的发展历程中经过了多次重大变动..., linux总是希望寻找一个最接近于完美的调度策略来公平快速的调度进程. 1.4 linux调度器的演变 一开始的调度器是复杂度为O(n)的始调度算法(实际上每次会遍历所有任务,所以复杂度为O(n))...CFS的算法和实现都相当简单,众多的测试表明其性能也非常优越 字段 版本 O(n)的始调度算法 linux-0.11~2.4 O(1)调度器 linux-2.5 CFS调度器 linux-2.6~至今...2 Linux的调度器组成 2.1 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要...早期的内核中就绪队列是全局的, 即即有全局唯一的rq, 但是 在Linux-2.6内核时代,为了更好的支持多核,Linux调度器普遍采用了per-cpu的run queue,从而克服了多CPU系统中,全局唯一的
Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度器,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度器,称为算法(完全公平调度算法)。...这样,进程所获得的实际CPU时间就和系统的负载密切相关。 Linux中的抢占时机取决于新的可运行进程消耗了多少处理器使用比, 如果消耗的使用比当前进程小,则立刻投入运行,否则将推迟其运行。...Linux调度算法 调度器类 Linux的调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...Linux调度的实现 下面我们来看看CFS是如何实现的,一般我们把它分为4个主要的部分来分析。...u64 prev_sum_exec_runtime; // 进程在切换CPU时的sum_exec_runtime,简单说就是上个调度周期中运行的总时间 u64 nr_migrations
操作系统CPU调度策略---07 多进程图像与CPU调度 CPU调度(进程调度)的直观想法 面对诸多场景,如何设计调度算法? 如何做到合理?...如果一直有前台任务… 还有很多问题… 一个实际的schedule函数 Linux 0.11的调度函数schedule() counter的作用: 时间片 counter的另一个作用: 优先级 counter...进程2刚read完,进入就绪状态,而进程3是因为时间片到期,而进入就绪态的 ---- CPU调度(进程调度)的直观想法 ---- 面对诸多场景,如何设计调度算法? ---- 如何做到合理?...这样可以实现IO约束型和CPU约束型任务,二者并行的局面 ---- 各种CPU调度算法 折中和综合让操作系统变得复杂, 但有效的系统又要求尽量简单… 因此,对于CPU调度算法而言,一定要尽可能的简单,执行尽可能的快...这是未来的信息… ---- 一个实际的schedule函数 Linux 0.11的调度函数schedule() kernel/sched.c schedule() 的目的是找到下一个任务 next,切换到下一个任务
有时用复杂的算法求出进程当前的优先级, 但最后的结果是相同的: 每个进程都与一个值(优先级)相关联, 这个值表示把进程如何适当地分配给CPU. 在linux中, 进程的优先级是动态的....2 linux进程的分类 2.1 进程的分类 当涉及有关调度的问题时, 传统上把进程分类为”I/O受限(I/O-dound)”或”CPU受限(CPU-bound)”....), 也可能是CPU受限的(比如图形绘制程序) 2.2 实时进程与普通进程 在linux中, 调度算法可以明确的确认所有实时进程的身份, 但是没办法区分交互式程序和批处理程序(统称为普通进程), linux2.6...因此进程调度也包含了线程调度的功能. linux进程的调度算法其实经过了很多次的演变, 但是其演变主要是针对与普通进程的, 因为前面我们提到过根据进程的不同分类Linux采用不同的调度策略.实时进程和普通进程采用了不同的调度策略...CFS调度器 linux-2.6~至今 4 Linux的调度器设计 4 Linux的调度器设计 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制
假设当前CPU运行的实时进程A的优先级为a,而此时有个优先级为b的实时进程B进入可运行状态,那么只要b<a,系统将中断A的执行,而优先执行B,直到B无法执行(无论A,B为何种实时进程)。 ...总而言之,对于实时进程,高优先级的进程先执行,它执行到没法执行了,才轮到低优先级的进程执行。 2.非实时进程的调度 Linux对普通的进程,根据动态优先级进行调度。...Linux下,静态优先级是用户不可见的,隐藏在内核中。...例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。Linux2.6 在这方面有了较大的提高。...Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程。
在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元...Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。...在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(static scheduling priority)来决定那个线程来运行。...下面介绍几种常见的调度策略: SCHED_OTHER:该策略是是默认的Linux分时调度(time-sharing scheduling)策略,它是Linux线程默认的调度策略。...在Linux中,调度程序是一个叫schedule()的函数,该函数调用的频率很高,由它来决定是否要执行进程的切换,如果要切换的话,切换到那个进程等。
调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型的进程肯定有不同的调度策略,task_struct中的policy就用来表示调度策略。...fair_sched_class:普通进程的调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度。...vruntime = 实际运行时间 * NICE_0_LOAD / 权重 使用调度算法首先得有包含vruntime的调度实体,task_struct中有如下调度实体的成员变量: struct sched_entity...完整调度 每颗cpu都有一个运行队列rq,这个队列中又存在多个子队列例如rt_rq(实时运行队列),cfs_rq。...当cpu需要一个任务执行时,其会先按照优先级选择不同的调度类,不同的调度类操作不同的队列,例如rt_sched_class先被调用,其会在rt_rq中找下一个任务,只有找不到时才轮到fair_sched_class
还在运行,因此程序A要中断运行直至程序B将数据返回给程序A,所以需要中断但是在操作系中,中断并不简单地用于程序之间的通信,它对于CPU对于资源的分配调度也有很大作用,如果一个程序不允许中断,那么它会一直独占...CPU,导致其他程序不能运行,这肯定不是我们希望看到的,因此CPU在执行程序之前会开启中断保证CPU能够定时调度,让每个程序都可以有运行的时间空间,比较典型的例子就是在内核态到程序态的转变,如果对这个不了解的可以看我这篇文章...CPU能够抢占任务资源进行程序调度,使得CPU有运行多程序多进程的能力中断产生的问题我们知道,中断能够使得程序之间异步处理,提高运行效率,但是这里出现了一个问题,好比我们使用控制台输入命令,此时硬件设备正在等待我们输入指令...,使得缓冲区能够继续写入:由此可见,操作系统在底层处理不同程序因为中断导致的异步调用是通过通信队列这种形式解决的,而这种方式也使得程序之间无需有严格顺序上的等待,让CPU能够在程序中断产生时充分调度CPU...资源,使得资源利用最大化好了,这就是有关于操作系统里中断的全部讲解了,虽然中断并不会引起人们注意,可是它对CPU整个资源的调度还是起关键作用的,希望对你有所帮助,祝好!!!
调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1.2 进程的分类 linux把进程区分为实时进程和非实时进程...2 O(n)的始调度算法 2.1 Linux2.4之前的内核调度器 早期的Linux进程调度器使用了最低的设计,它显然不关注具有很多处理器的大型架构,更不用说是超线程了。...2.2 Linux2.4的调度器 2.2.1 概述 在Linux2.4.18中(linux-2.5)之前的内核, 当很多任务都处于活动状态时, 调度器有很明显的限制....Linux2.4调度器是如何提高交互式进程的优先级的呢?...与之前的Linux调度器不同,CFS没有将任务维护在链表式的运行队列中,它抛弃了active/expire数组,而是对每个CPU维护一个以时间为顺序的红黑树。
主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_NEDD_RESCHED...内核从cpu的就绪队列中选择一个最合适的进程来抢占CPU next = pick_next_task(rq); 全局的pick_next_task函数会从按照优先级遍历所有调度器类的pick_next_task...函数, 去查找最优的那个进程, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 其执行流程如下 如果当前cpu上所有的进程都是cfs调度的普通非实时进程...prev是隶属于CFS的普通非实时进程 * 而当前cpu的全局就绪队列rq中的进程数与cfs_rq的进程数相等 * 则说明当前cpu上的所有进程都是由cfs调度的普通非实时进程...内核中的进程被堵塞的时候 2 总结 2.1 schedule调度流程 schedule就是主调度器的函数, 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数
Linux的CPU正是采用硬中断与软中断结合的方式来处理问题的。...定时产生的软中断。 •NET_RX。 网络接收产生的软中断。 •NET_TX。 网络发送产生的软中断。 •SCHED。 内核调度产生的软中断。 •RCU。 RCU产生的软中断。...图3 CPU节拍率 10)上下文切换 CPU依次处理上述任务的调度方法是切换。切换分为“进程切换”“线程切换”和“中断切换”。...#每隔 5 秒输出 1 组数据 #pidstat -w 5 Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU) 08:18:26 UID...#mpstat Linux 4.15.0-46-generic(ubuntu) 10/30/2019 _x86_64_(4 CPU) 02:59:04 AM CPU %usr %nice %sys
领取专属 10元无门槛券
手把手带您无忧上云