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

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

: 进程响应时间尽可能快 后台作业的吞吐量尽可能高 尽可能避免进程的饥饿现象 低优先级和高优先级进程的需要尽可能调和等等 调度策略(scheduling policy)的任务就是决定什么时候以怎么样的方式选择一个新进程占用...), 也可能是CPU受限的(比如图形绘制程序) 2.2 实时进程与普通进程linux, 调度算法可以明确的确认所有实时进程的身份, 但是没办法区分交互式程序和批处理程序(统称为普通进程), linux2.6...每个进程刚好属于某一调度类, 各个调度类负责管理所属的进程. 通用调度器自身不涉及进程管理, 其工作都委托给调度器类....而我们知道实时进程和普通进程是共存的,调度器是怎么协调它们之间的调度的呢,其实很简单,每次调度时,会先在实时进程运行队列查看是否有可运行的实时进程,如果没有,再去普通进程运行队列找下一个可运行的普通进程...调用switch_mm(), 把虚拟内存从一个进程映射切换到新进程 switch_mm更换通过task_struct->mm描述的内存管理上下文, 该工作的细节取决于处理器, 主要包括加载页表, 刷出地址转换后备缓冲器

3.5K20

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

每个进程刚好属于某一调度类, 各个调度类负责管理所属的进程. 通用调度器自身不涉及进程管理, 其工作都委托给调度器类....暂时没弄明白 3 进程调度的数据结构 调度器使用一系列数据结构来排序和管理系统进程....参照CFS调度的总结 - (单rq vs 多rq) 就绪队列是全局调度器许多操作的起点, 但是进程并不是由就绪队列直接管理的, 调度管理是各个调度器的职责, 因此在各个就绪队列嵌入了特定调度类的子就绪队列...调度调度的不是进程A就是进程组B,而如果调度进程组B,进程组B自己选择一个程序交给CPU运行就可以了,而进程组B怎么选择一个程序给CPU,就是通过自己的CFS运行队列的红黑树选择,如果进程组B还有个子进程组...参照 linux调度器源码分析 - 概述(一) 通过的调度策略对象–调度linux下每个进程都由自身所属的调度类进行管理, sched_class结构体表示调度类, 调度类提供了通用调度器和各个调度器之间的关联

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

Linux 进程管理调度进程切换

struct sched_dl_entity dl; 采用EDF算法调度的实时调度实体 分配给CPU的task,作为调度实体加入到运行队列 runqueue 运行队列 struct rq { ....cfs; CFS调度队列 struct rt_rq rt; RT调度队列 struct dl_rq dl; DL调度队列 每个CPU都有一个运行队列,每个运行队列中有三个调度队列,task作为调度实体加入到各自的调度队列...进程的地址空间切换 ? 将下一个进程的pgd虚拟地址转化为物理地址存放在ttbr0_el1(这是用户空间的页表基址寄存器),当访问用户空间地址的时候mmu会通过这个寄存器来做遍历页表获得物理地址。...其中x19-x28是arm64 架构规定需要调用保存的寄存器,可以看到处理器状态切换的时候将前一个进程(prev)的x19-x28,fp,sp,pc保存到了进程描述符的cpu_contex,然后将即将执行的进程...(next)描述符的cpu_contex的x19-x28,fp,sp,pc恢复到相应寄存器,而且将next进程进程描述符task_struct地址存放在sp_el0,用于通过current找到当前进程

1.8K20

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

Linux调度器使用了环形队列用于可运行的任务管理, 使用循环调度策略. 此调度器添加和删除进程效率很高(具有保护结构的锁)。简而言之,该调度器并不复杂但是简单快捷....2.2 Linux2.4的调度器 2.2.1 概述 在Linux2.4.18(linux-2.5)之前的内核, 当很多任务都处于活动状态时, 调度器有很明显的限制....(Runqueue是Linux 内核中保存所有就绪进程的队列). pick next用来指从所有候选进程挑选下一个要被调度进程的过程。...红黑树是平衡树,调度器每次总最左边读出一个叶子节点,该读取操作的时间复杂度是O(LogN) 4.3.4 调度管理器 为了支持实时进程,CFS提供了调度器模块管理器。...各种不同的调度器算法都可以作为一个模块注册到该管理。不同的进程可以选择使用不同的调度器模块。2.6.23,CFS实现了两个调度算法,CFS算法模块和实时调度模块。

2.1K20

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

调度器 在内核的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_NEDD_RESCHED...函数, 去查找最优的那个进程, 当然因为大多数情况下, 系统全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 其执行流程如下 如果当前cpu上所有的进程都是cfs调度的普通非实时进程..., 也就是说多数情形下, 我们的linux进程全是cfs调度的 而likely这个宏业表明了这点, 这也是gcc内建的一个编译选项, 它其实就是告诉编译器表达式很大的情况下为真, 编译器可以对此做出优化...设置指定进程的need_resched标志 include/linux/sched.h, L2920 clear_tsk_need_resched 清除指定进程的need_resched标志 include...内核进程被堵塞的时候 2 总结 2.1 schedule调度流程 schedule就是主调度器的函数, 在内核的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数

3.5K31

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

Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...一、普通进程Linux 普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...,称之为 调度器类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度器根据调度器类的优先顺序,依次去进行调度器类的进程进行调度,挑选了调度器类,再在这个调度器内,使用这个调度器类的算法...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。

20.5K10

linux进程调度

调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型的进程肯定有不同的调度策略,task_struct的policy就用来表示调度策略。...,还为每个进程的task_struct配有优先级,需要注意的是优先级数越小优先级越高,实时进程的优先级处于099之间,普通进程的优先级处于100139。...对于这些调度策略的执行逻辑都封装到task_struct的sched_class const struct sched_class *sched_class; seched_class的几个实现:...fair_sched_class:普通进程调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度。...红黑树看做是一个队列,每次从中取进程。 完整调度 每颗cpu都有一个运行队列rq,这个队列又存在多个子队列例如rt_rq(实时运行队列),cfs_rq。

8K20

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

,本篇文章只关注该数据结构如何来组织和管理进程ID的。...进程ID概述 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型: 内核中进程ID的类型用pid_type来描述,它被定义在include/linux/pid.h: enum...是 Linux 在其命名空间中唯一标识进程而分配给它的一个号码,称做进程ID号,简称PID。...在fork函数对其进行赋值的 tgid 指该进程的线程描述符。在linux内核对线程并没有做特殊的处理,还是由task_struct来管理。所以从内核的角度看, 用户态的线程本质上还是一个进程。...内核是如何设计task_struct中进程ID相关数据结构的 Linux 内核在设计管理ID的数据结构时,要充分考虑以下因素: 如何快速地根据进程的 task_struct、ID类型、命名空间找到局部ID

5.7K10

linux进程调度

进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...总而言之,对于实时进程,高优先级的进程先执行,它执行到没法执行了,才轮到低优先级的进程执行。 2.非实时进程调度 Linux对普通的进程,根据动态优先级进行调度。...Linux下,静态优先级是用户不可见的,隐藏在内核。...因为,不仅要考虑静态优先级,也要考虑进程的属性。例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。Linux2.6 在这方面有了较大的提高。...Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程

3.2K140

Linux内核设计与实现(进程管理进程调度、系统调用)

1、虚拟处理器、虚拟内存:让进程感觉自己拥有所有 image.png 2、进程上限,cat /proc/sys/kernel/pid_max 3、进程的五种状态 image.png set_task_state...(task,state); 4、每个进程都有一个父进程 image.png 5、进程的创建:fork() exec() image.png 6、写时拷贝COW image.png 7、线程和进程的区别不大...image.png 8、孤儿进程,父进程先关掉,再设置一个父进程,如果没有,设置init image.png 9、2.6内核后进程调度算法CFS:完全公平调度算法 10、进程分为IO消耗型和处理器消耗型...image.png image.png 13、与调度相关的系统调用 image.png 14、系统调用在用户空间进程和硬件设备之间添加了一个中间层 image.png 15、中断 image.png...18、加锁 image.png 19、定时器与时间管理 20、slab?? 21、虚拟文件系统:VFS 22、IO调度 23、页高速缓存和页回写

1.4K10

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

Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度器,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度器,称为算法(完全公平调度算法)。...Linux的抢占时机取决于新的可运行进程消耗了多少处理器使用比, 如果消耗的使用比当前进程小,则立刻投入运行,否则将推迟其运行。...Linux调度算法 调度器类 Linux调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...睡眠和唤醒 睡眠和唤醒的流程在linux是这样的: 睡眠:进程将自己标记成休眠状态,然后从可执行红黑树移除,放入等待队列,然后调用选择和执行一个其他进程。...在Linux,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,这个安全是指,只要没有持有锁,就可以进行抢占。

14.8K113

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

函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列添加删除进程 选择最优进程(主调度器) pick_next_task_fair 主调度器会按照如下顺序调度..., 当然因为大多数情况下, 系统全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...周期性调度器通过调用curr进程所属调度器类sched_class的task_tick函数完成周期性调度的工作 而entity_tick则通过check_preempt_tick函数检查是否需要抢占当前进程...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...小于子进程se的虚拟运行时间, 即在红黑树进程curr更靠左(前), 这就意味着父进程将在子进程之前被调度.

2.5K31

Linux进程调度(三)

一、抢占式调度和主动调度: 前面我们说过,进程的切换总是通过 shedule 函数发生的,而 schedule 函数可以是在系统调用返回、中断返回等时机被调用,也可以进程在驱动程序主动调用 我们把在系统调用返回等时机调用...把进程在驱动程序主动调用 schedule 函数来发生进程切换的这种情况称为主动调度 本文将讨论主动调度,抢占式调度将在下一篇文章中讲解: 二、主动调度的发生的情况: 主动调度一般在应用程序读取某个设备时...,切换到其它进程运行,当前进程进入睡眠 这就是进程主动调度的一般情况,接下来我们看一看 schedule 函数做了什么,具体是怎么实现进程切换的....prev 和 next 在进程被切换前就保存在进程的内核栈,所以进程再被唤醒的时候很自然通过局部变量就可以得到它们 而 last 对于被唤醒的进程,又不存在于它的内核栈,那么 last 对于进程来说是怎么获取的呢...第一件事是将通过调度类从运行队列挑选下一个运行的进程,第二件事是进行进程切换 进程切换会切换进程地址空间,重新加载页表,还有切换内核栈 进程切换涉及三个进程,新进程需要对上一个进程做一些清理工作 文章参考

2.4K10

Linux进程调度分析

linux实现公平调度基本上是两种思路: 1、给处于可执行状态的进程分配时间片(按照优先级),用完时间片的进程被放到“过期队列”。...有兴趣的朋友可以参考下面的链接: 《Linux 调度器发展简述》 《鼠眼看Linux调度器》 《鼠眼再看Linux调度器[1]》 《鼠眼再看Linux调度器[2]》 调度程序的效率 “优先级”明确了哪个进程应该被调度执行...调度程序跟内核的很多过程一样会频繁被执行,如果效率不济就会浪费很多CPU时间,导致系统性能下降。 在linux 2.4时,可执行状态的进程被挂在一个链表。...这样就大大提高了调度程序的效率,复杂度为O(1); 在linux 2.6近期的版本,可执行状态的进程按照优先级顺序被挂在一个红黑树(可以想象成平衡二叉树)。...每次调度调度程序需要从树找出优先级最高的进程。复杂度为O(logN)。 那么,为什么从linux 2.6早期到近期linux 2.6版本,调度程序选择进程时的复杂度反而增加了呢?

2.3K31

Linux内核】进程调度

Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...有效管理时间片能使调度程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资源。 相反,在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行。...优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。在包括Linux在内的某些系统,优先级高的进程使用的时间片也较长。...从上面的争论可以看出,任何长时间片都将导致系统交互表现欠佳。很多操作系统中都特别重视这一点,所以默认的时间片很短如20毫秒。 注意,进程并不是一定非要一次就用完它所有的时间片。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

2.8K20

Linux进程调度学习!

Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...普通进程:在 Linux 普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...Linux 调度算法: Linux 中有一个总的调度结构,称之为 调度器类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度器根据调度器类的优先顺序,依次去进行调度器类的进程进行调度...Linux 调度时机: 1、进程切换: 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...一个进程离开CPU、另一个进程占据CPU的过程,称为进程切换(process switch)。进程切换是在内核通过调用schedule()完成的。

1.8K30

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

Linux进程的退出 linux进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系..._exit是linux系统调用,关闭所有文件描述符,然后退出进程。...(tpid)是相同的, 都等于组长(领头进程)的pid 在linux内核对线程并没有做特殊的处理,还是由task_struct来管理。...这个信息我们已经讨论过很多次了 参见 Linux进程ID号–Linux进程管理调度(三) Linux进程描述符task_struct结构体详解–Linux进程管理调度(一)..., 进程已经无法被再次调度, 因为对应用程序或者用户空间来说此进程已经死了, 但是尽管进程已经不能再被调度,但系统还是保留了它的进程描述符,这样做是为了让系统有办法在进程终止后仍能获得它的信息。

5.7K30

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

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

2.3K20

Linux CFS调度器之队列操作--Linux进程管理调度(二十七)

CFS进程入队和出队 完全公平调度器CFS中有两个函数可用来增删队列的成员:enqueue_task_fair和dequeue_task_fair分别用来向CFS就绪队列添加或者删除进程 2 enqueue_task_fair...sched_entity *se = &p->se; for_each_sched_entity(se) { /* ...... */ } } linux对组调度的支持可以通过...这样刚唤醒的进程在当前执行进程时间耗尽时就会被调度上处理器执行。...但是,Linux内核需要根据新加入的进程的权重决策一下应该何时调度进程,而不能任意进程都来抢占当前队列靠左的进程,因为必须保证就绪队列的所有进程尽量得到他们应得的时间响应, sched_vslice...如果se->vruntime比先前的差值更大, 则将其作为进程的vruntime, 这会导致高进程在红黑树处于靠左的位置, 而具有较小vruntime值得进程可以更早调度执行. 2.6 __enqueue_entity

2.8K31
领券