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

linux 进程调度器() -- 调度器演进

引言 通过此前的两篇文章,我们系统介绍了 linux 操作系统中的调度算法与其演进: linux 操作系统的进程调度(上) -- 进程调度的基本概念 linux 操作系统的进程调度(中) -- 进程调度算法的演进...本文,我们就来介绍 Linux 操作系统实际使用的进程调度器以及它们的演进。...O(n) 调度器 在早期的 linux 操作系统中,2.4 版本到 2.6 版本之间,linux 采用了实现起来十分简单的 O(n) 调度器。...2.1 实时进程调度 对于实时进程来说,进程必须以高于实时进程的优先级被调用,并且用户不能用 nice 值对这一优先级进行修改。...O(logN) 量级的,而红黑树则在最坏情况只需要进行三次旋转,而增加节点时,红黑树则只需要至多进行两次旋转。

2.2K20

Linux进程调度与切换

前言:   在Linux操作系统中,进程调度与切换是操作系统核心功能之一,它直接影响着系统的性能和响应速度。那么话不多说,开启我们今天的话题!...当进程进行第二次及第N次调度进程的时候,进程被放到CPU上开始运行,将曾经保存的硬件上下文进行恢复。   所以进程切换最重要的就是 进程上下文的保存和恢复。   ...进程调度 ✈️活动状态进程队列   我们上次说过,Linux实现进程调度的算法,需要考虑 优先级,考虑进程饥饿,以及效率。那么CPU是如何实现进程调度的呢?   ...我们来看一LinuxCPU的运行队列的各项属性:   我们首先看蓝色框内的内容,有一个叫做 queue[140] 的数组,这里的 queue数组表示活动状态进程进程队列。   ...nr_active 的值可以告诉内核有多少进程正在等待执行,从而帮助内核进行进程调度和资源分配。

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

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

    进程调度含义 ---- 进程调度决定了将哪个进程进行执行,以及执行的时间。操作系统进行合理的进程调度,使得资源得到最大化的利用。 在单片机上,常常使用的方式是:系统初始化—->while(1){}。...宏观上看上去是多个任务并行执行,事实的本质是 CPU 在不断的调度每一个进程,使得每个进程都得以响应,与此同时,还要兼顾不同场景的响应效率(进程的执行时间)。...一、普通进程Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...如何挑选哪一个进程进入运行状态?

    20.7K10

    linux进程调度

    进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...总而言之,对于实时进程,高优先级的进程先执行,它执行到没法执行了,才轮到低优先级的进程执行。 2.非实时进程调度 Linux对普通的进程,根据动态优先级进行调度。...Linux,静态优先级是用户不可见的,隐藏在内核中。...因为,不仅要考虑静态优先级,也要考虑进程的属性。例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。Linux2.6 在这方面有了较大的提高。...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内核调度分析(进程调度

    抢占式多任务(Linux) 这种情况,由调度程序来决定什么时候停止一个进程的运行,这个强制的挂起动作即为**“抢占”**。...Linux调度算法 调度器类 Linux调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...后者获得的时间片是前者的1/3,最终结果也是15ms和5ms 关于上面这个推论,可能有些难以理解,所以我们深入一,看看在底层nice差值究竟是如何影响到处理区占比的。...Linux调度的实现 下面我们来看看CFS是如何实现的,一般我们把它分为4个主要的部分来分析。...在Linux中,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,这个安全是指,只要没有持有锁,就可以进行抢占。

    14.9K113

    Linux进程调度(三)

    又或者应用想读取按键,但是按键还没有被按,此时驱动程序也会让进程睡眠,然后发生进程调度 在驱动程序中,对应的实现如下: /* 网卡的驱动程序 */ tap_do_read(...) { ......最后通过 context_switch 来实现进程切换 所以 schedule 函数可以总结成两件事,第一件事就是从运行队列中挑选下一个运行的进程,第二件事就是实现进程切换 挑选下一个运行的进程 首先我们来看如何通过...对上一个进程进行清理 */ return finish_task_switch(prev); } 首先是通过 switch_mm_irqs_off 来进行进程地址空间的切换,其中的 mm...四、总结: 进程发生切换总是调用 schedule 函数进行的,进程调度分抢占式调度和主动调度,主动调度表示的是进程主动调用 schedule 函数发生进程切换 schedule 函数主要做了两件事,...第一件事是将通过调度类从运行队列中挑选下一个运行的进程,第二件事是进行进程切换 进程切换会切换进程地址空间,重新加载页表,还有切换内核栈 进程切换涉及三个进程,新进程需要对上一个进程做一些清理工作 文章参考

    2.5K10

    Linux进程调度分析

    进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见《linux进程状态浅析》)。...尽管我们平常接触的很多计算机(如桌面系统、网络服务器、等)负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载进程调度做精心的设计。...那么,进程的优先级该如何确定呢?有两种方式:由用户程序指定、由内核的调度程序动态调整。(下面会说到) linux内核将进程分成两个级别:普通进程和实时进程。...在linux,用户程序可以通过sched_setscheduler系统调用来设置进程调度策略以及相关调度参数;sched_setparam系统调用则只用于设置调度参数。...有兴趣的朋友可以参考下面的链接: 《Linux 调度器发展简述》 《鼠眼看Linux调度器》 《鼠眼再看Linux调度器[1]》 《鼠眼再看Linux调度器[2]》 调度程序的效率 “优先级”明确了哪个进程应该被调度执行

    2.4K31

    Linux内核】进程调度

    Linux 提供了抢占式的多任务模式。在此模式,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...有效管理时间片能使调度程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资源。 相反,在非抢占式多任务模式,除非进程自己主动停止运行,否则它会一直执行。...进程优先级 调度算法中最基本的类就是基于优先级的调度。 这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。...优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

    2.9K20

    Linux进程调度学习!

    进程调度含义: 进程调度决定了将哪个进程进行执行,以及执行的时间。操作系统进行合理的进程调度,使得资源得到最大化的利用。 在单片机上,常常使用的方式是:系统初始化---->while(1){}。...宏观上看上去是多个任务并行执行,事实的本质是 CPU 在不断的调度每一个进程,使得每个进程都得以响应,与此同时,还要兼顾不同场景的响应效率(进程的执行时间)。...普通进程:在 Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...Linux 调度算法: Linux 中有一个总的调度结构,称之为 调度器类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度器根据调度器类的优先顺序,依次去进行调度器类的中的进程进行调度...1、Fair 调度使用的是 CFS 的调度算法,即完全公平调度器: 对于一个普通进程,CFS 调度调度它执行(SCHED_NORMAL),需要考虑两个方面维度: 如何挑选哪一个进程进入运行状态?

    1.9K30

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

    有时用复杂的算法求出进程当前的优先级, 但最后的结果是相同的: 每个进程都与一个值(优先级)相关联, 这个值表示把进程如何适当地分配给CPU. 在linux中, 进程的优先级是动态的....调度程序跟踪进程正在做什么, 并周期性的调整他们的优先级. 在这种方式, 在较长的时间间隔内没有任何使用CPU的进程, 通过动态地增加他们的优先级来提升他们....此外如何进程中如果存在实时进程, 则实时进程总是在普通进程之前被调度 3 linux调度器的演变 一开始的调度器是复杂度为O(n)的始调度算法(实际上每次会遍历所有任务,所以复杂度为O(n)), 这个算法的缺点是当内核中有很多任务时...)) 并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类 6种调度策略 linux内核目前实现了6种调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能...,就是处于TASK_RUNNING状态的进程,而其他状态进程都不会进入调度进行调度

    3.6K20

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

    但是普通进程调度策略就比较麻烦了, 因为普通进程不能简单的只看优先级, 必须公平的占有CPU, 否则很容易出现进程饥饿, 这种情况用户会感觉操作系统很卡, 响应总是很慢,因此在linux调度器的发展历程中经过了多次重大变动...:调度框架(其实质就是两个函数框架)及调度器类 2.2 6种调度策略 linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能 比如SCHED_NORMAL...(比如, 所有进程按照所有者分组)之间分配, 接下来分配的时间再在组内进行二次分配. linux中针对当前可调度的实时和非实时进程, 定义了类型为seched_entity的3个调度实体 调度实体 名称...参照 linux调度器源码分析 - 概述(一) 通过的调度策略对象–调度linux每个进程都由自身所属的调度进行管理, sched_class结构体表示调度类, 调度类提供了通用调度器和各个调度器之间的关联...–进程或者进程linux调度的不只是进程, 还可以是进程组.

    3.6K41

    Linux2号进程的kthreadd--Linux进程的管理与调度(七)

    2号进程 内核初始化rest_init函数中,由进程 0 (swapper 进程)创建了两个process init 进程 (pid = 1, ppid = 0) kthreadd (pid = 2,...0) 所有其它的内核线程的ppid 都是 2,也就是说它们都是由kthreadd thread创建的 所有的内核线程在大部分时间里都处于阻塞状态(TASK_INTERRUPTIBLE)只有在系统满足进程需要的某种资源的情况才会运行...在for循环中,如果发现kthread_create_list是一空链表,则调用schedule调度函数,因为此前已经将该进程的状态设置为TASK_INTERRUPTIBLE,所以schedule的调用将会使当前进程进入睡眠...kthread_create() 并且返回新创建线程的任务描述符 新创建的线程由于执行了 schedule() 调度,此时并没有执行....idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理,它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthreadd的函数,该函数的作用就是运行

    2.4K20

    图解Linux进程调度(一)

    本篇文章讲解Linux如何管理进程进程调度是怎么转起来的,为了实现进程调度维护了哪些数据结构,实现了哪些算法 至于一个进程如何实现抢占,进程调度的时机等细节将放到后面的文章讲解 二、进程调度整体框架...: 在设计到内核具体的代码之前,我先来给你讲解一进程调度的大体框架,让你明白进程调度是怎么转起来的,在你明白每一个部分的含义之后,再深入讲解内核的实现 操作系统管理非常多的进程,这些进程当前可能处于可运行状态或者睡眠状态...很明显,这一部分需要具体的调度算法来实现,Linux调度算法的实现抽象成调度类 在滴答定时器的中断处理中,通过调度类去实现相应的计算,然后判断current进程是否需要被抢占,如果需要被抢占,那么就在...current进程设置需要重新调度的标志,如下图所示: 实时上,Linux内核的调度类不仅仅只有一个,因为内核同时实现了多种调度算法,但是我们这里强调总体框架,暂不讨论这里细节问题 到此,进程切换的第一步设置...,实现了哪些数据结构,下面适当地总结一 首先进程调度处理的对象是可运行的进程,所以准备了一个运行队列来管理当前可运行的进程,如果是多CPU处理器,那么每一个CPU都有它对应的一个运行队列 CPU当前正在运行的进程成为

    1.4K20

    图解Linux进程调度(二)

    优先级与调度策略: 在内核中,肯定不能对所有的进程一视同仁,有的进程需要优先运行,有的进程需要运行更长的时间 为了更好地实现进程调度,每个进程都有自己的优先级和调度策略 所谓优先级,就是表示这个进程的重要性...想一想,进程调度其实是一个非常复杂的问题,想使用一种算法来实现良好的进程调度是不可能的,Linux内核实现了好几种调度算法。...1 #define SCHED_RR 2 #define SCHED_BATCH 3 #define SCHED_IDLE 5 #define SCHED_DEADLINE 6 Linux...表示普通进程调度策略,内核大多数进程都属于普通进程,普通进程使用完全公平调度算法实现调度 SCHED_BATCH:是用于非交互,CPU使用密集的批处理进程,它和普通进程都是使用完全公平调度算法来实现。...rt_priority 怎么得来之后,我们来看看 normal_prio 和 prio 这两个变量是怎么计算的 内核中通过下面的代码来设置: p->prio = effective_prio(p); 看一

    1.7K10

    详解Linux进程调度策略

    本文通过Linux进程调度的5类方式详细分析了策略以及实现过程中的详细讲解。...1、Linux 进程分为5种类别,分别是停止类、截止类、实时类、公平类、空闲类, 每种类别都有一个运行队列,每次调度时,就是先按照类别优先级排序,再按照每个类别内的最高优先级任务调度运行。 ?...文件:core.c (linux-4.6\kernel\sched) ? 解读:先看下面的for循环,可以看到实现思路是,遍历每种类别,选择下一个可运行的任务。...由于大部分任务都属于公平队列,所以,绝大部分情况,都在公平队列中进行选择,所以,内核开发者在上面的代码中加了likely()提高性能。 ? ? ? ? ? ?...2、调度程序schedule()的调用次序。

    2.1K21

    Linux进程及其调度策略

    不过,进程的生命都得到了操作系统内核的关照。就好像疲于照顾几个孩子的母亲内核必须做出决定,如何进程间分配有限的计算资源,最终让用户获得最佳的使用体验。...一个Linux进程从被创建到死亡,可能会经过很多种状态,比如执行、暂停、可中断睡眠、不可中断睡眠、退出等。我们可以把Linux繁多的进程状态,归纳为三种基本状态。 ?...因此,随着时间推移,操作系统的调度器也多次进化。 先来看Linux 2.4内核推出的O(n)调度器。O(n)这个名字,来源于算法复杂度的大O表示法。大O符号代表这个算法在最坏情况的复杂度。...O(n)调度器是Linux 2.6之前使用的进程调度器。 为了解决O(n)调度器的性能问题,O(1)调度器被发明了出来,并从Linux 2.6内核开始使用。...CFS调度器不对进程进行任何形式的估计和猜测。这一点和O(1)区分互动和非互动进程的做法完全不同。 CFS调度器增加了一个虚拟运行时(virtual runtime)的概念。

    2.5K20

    Linux进程类别(内核线程、轻量级进程和用户进程)--Linux进程的管理与调度(四)

    本文中出现的,内核线程,轻量级进程,用户进程,用户线程等概念,如果不太熟悉, 可以参见 内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程Linux进程类别 虽然我们在区分Linux...进程类别, 但是我还是想说Linux只有一种类型的进程,那就是task_struct,当然我也想说linux其实也没有线程的概念, 只是将那些与其他进程共享资源的进程称之为线程。...用户进程运行在用户空间上, 而一些通过共享资源实现的一组进程我们称之为线程组, Linux内核其实本质上没有线程的概念, Linux下线程其实上是与其他进程共享某些资源的进程而已。...调度:由在用户空间实现的线程库,在所属进程进行调度 LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。..., Linux内核其实本质上没有线程的概念, Linux下线程其实上是与其他进程共享某些资源的进程而已。

    6.4K30

    Linux 进程调度之schdule主调度

    至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行 一、调度单位简介 1.1 task_struct 结构体简介 对于Linux内核来说,调度的基本单位是任务,...,调度器只会选择在该状态的任务进行调度。...在这里我只讨论普通任务的调度,因为linux大部分情况都是在运行普通任务,普通任务选择的调度器是CFS完全调度。 在调度时,调度器去 CFS 运行队列找是否有任务需要运行。...后面context_switch 还会专门一篇进行描述,这里限于篇幅,只是简单描述一。...具体请参考:Linux 进程调度通知机制 struct preempt_ops { void (*sched_in)(struct preempt_notifier *notifier, int cpu

    1.8K20
    领券