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

linux内核调度算法(3)–多核系统的负载均衡

多核CPU现在很常见,那么问题来了,一个程序在运行时,只在一个CPU核上运行?还是交替在多个CPU核上运行呢?Linux内核是如何在多核调度进程的呢?...实际上,如果你没有对你的进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,这是内核的负载均衡。...当然,多核CPU也有许多种,例如INTEL的超线程技术,而LINUX内核对一个INTEL超线程CPU会看成多个不同的CPU处理器。...上面说过,如果你没有对你的进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,但是,有时我们如果希望我们的进程一直运行在某个CPU处理器上,可以做到吗?

3.9K30

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

抢占式多任务(Linux) 这种情况下,由调度程序来决定什么时候停止一个进程的运行,这个强制的挂起动作即为**“抢占”**。...Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度器,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度器,称为算法(完全公平调度算法)。...为了保证交互式应用和桌面系统的性能,一般Linux更倾向于优先调度I/O消耗型进程。 进程优先级 Linux采用了两种不同的优先级范围。 使用nice值:越大的nice值意味着更低的优先级。...Linux调度算法 调度器类 Linux调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...Linux调度的实现 下面我们来看看CFS是如何实现的,一般我们把它分为4个主要的部分来分析。

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

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

    Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...一、普通进程 在 Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...也可以用 pidstat -w 命令查看进程切换的每秒统计值: pidstat -w 1 Linux 3.10.0-229.14.1.el7.x86_64 (bj71s060) 02/01/2018

    20.7K10

    linux进程调度

    前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...2.非实时进程的调度 Linux对普通的进程,根据动态优先级进行调度。而动态优先级是由静态优先级(static_prio)调整而来。Linux下,静态优先级是用户不可见的,隐藏在内核中。...系统调度时,还会考虑其他因素,因而会计算出一个叫进程动态优先级的东西,根据此来实施调度。因为,不仅要考虑静态优先级,也要考虑进程的属性。...Linux2.6 在这方面有了较大的提高。Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程。...则系统调度时,会给该进程更多的奖励(bonus),以便该进程有更多的机会能够执行。奖励(bonus)从0到10不等。

    3.2K140

    linux进程调度

    调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型的进程肯定有不同的调度策略,task_struct中的policy就用来表示调度策略。...fair_sched_class:普通进程的调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度。...vruntime = 实际运行时间 * NICE_0_LOAD / 权重 使用调度算法首先得有包含vruntime的调度实体,task_struct中有如下调度实体的成员变量: struct sched_entity...se; //完全调度实体 struct sched_rt_entity rt; // 实时调度实体 struct sched_dl_entity dl; // deadline调度实体 CFS算法中将...当cpu需要一个任务执行时,其会先按照优先级选择不同的调度类,不同的调度类操作不同的队列,例如rt_sched_class先被调用,其会在rt_rq中找下一个任务,只有找不到时才轮到fair_sched_class

    8.1K20

    Linux线程调度

    Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元...Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。...下面介绍几种常见的调度策略: SCHED_OTHER:该策略是是默认的Linux分时调度(time-sharing scheduling)策略,它是Linux线程默认的调度策略。...我们可以下面命令来查看多核cpu的负载: cat /proc/cpuinfo 查看所有cpu的信息; top命令,然后再输入1,则显示多个cpu的使用信息; top命令,然后按下f,进入top Current...那么在Linux中,在什么情况下要执行这个调度程序呢?我们把这种情况叫作调度时机。

    4.1K20

    调度器简介,以及Linux调度策略

    调度器是CPU时间的管理员。Linux调度器需要负责做两件事:一件事是选择某些就绪的进程来执行;另一件事是打断某些执行中的进程,让它们变回就绪状态。不过,并不是所有的调度器都有第二个功能。...O(n)和O(1)调度器 下面介绍Linux调度策略。最原始的调度策略是按照优先级排列好进程,等到一个进程运行完了再运行优先级较低的一个,但这种策略完全无法发挥多任务系统的优势。...当计算机中有大量进程在运行时,这个调度器的性能将会被大大降低。也就是说,O(n)调度器没有很好的可拓展性。O(n)调度器是Linux 2.6之前使用的进程调度器。...完全公平调度器 从2007年发布的Linux 2.6.23版本起,完全公平调度器(CFS,Completely Fair Scheduler)取代了O(1)调度器。...以上就是调度器的基本原理,以及Linux用过的几种调度策略。调度器可以更加合理地把CPU时间分配给进程。现代计算机都是多任务系统,调度器在多任务系统中起着顶梁柱的作用。

    2.1K21

    Linux 进程调度之schdule主调度

    至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行 一、调度单位简介 1.1 task_struct 结构体简介 对于Linux内核来说,调度的基本单位是任务,...用 struct task_struct 表示,定义在include/linux/sched.h文件中,这个结构体包含一个任务的所有信息,结构体成员很多,在这里我只列出与本章内容有关的成员: struct...Linux采用的是每个CPU都有自己的运行队列,这样做的好处: (1)每个CPU在自己的运行队列上选择任务降低了竞争 (2)某个任务位于一个CPU的运行队列上,经过多次调度后,内核趋于选择相同的CPU...在这里我只讨论普通任务的调度,因为linux大部分情况下都是在运行普通任务,普通任务选择的调度器是CFS完全调度。 在调度时,调度器去 CFS 运行队列找是否有任务需要运行。...具体请参考:Linux 进程调度通知机制 struct preempt_ops { void (*sched_in)(struct preempt_notifier *notifier, int cpu

    1.8K20

    Linux进程调度之 - O(1)调度算法

    Linux是一个支持多任务的操作系统,而多个任务之间的切换是通过 调度器 来完成,调度器 使用不同的调度算法会有不同的效果。...Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度与可运行任务队列的长度成正比。...而Linux2.6开始替换成名为 O(1)调度算法,顾名思义,其时间复杂度为O(1)。...虽然在后面的版本开始使用 CFS调度算法(完全公平调度算法),但了解 O(1)调度算法 对学习Linux调度器还是有很大帮助的,所以本文主要介绍 O(1)调度算法 的原理与实现。...runqueue 结构 另外,为了减少多核CPU之间的竞争,所以每个CPU都需要维护一份本地的优先队列。因为如果使用全局的优先队列,那么多核CPU就需要对全局优先队列进行上锁,从而导致性能下降。

    4.8K81

    图解|Linux调度

    为了解决这个问题,Linux 实现了 组调度 这个功能。那么什么是 组调度 呢? 组调度 的实质是:调度时候不再以进程作为调度实体,而是以 进程组 作为调度实体。...在分析之前,为了对 完全公平调度算法 有个大体了解,建议先看看这篇文章:《Linux完全公平调度算法 》。 1. 进程组 在 Linux 内核中,使用 task_group 结构表示一个进程组。...完全公平调度算法 在调度时是通过 cfs_rq 结构完成的,cfs_rq 结构使用一棵红黑树将需要调度的进程或者进程组组织起来,然后选择最左端的节点作为要运行的进程或进程组,详情可以参考文章:《Linux...Linux 调度的时候,就是从上而下(从根进程组开始)地筛选出最优的进程进行运行。 2....调度过程 当 Linux 需要进行进程调度时,会调用 schedule() 函数来完成,其实现如下(经精简后): void __sched schedule(void) { struct task_struct

    3.4K10

    Linux进程调度(三)

    一、抢占式调度和主动调度: 前面我们说过,进程的切换总是通过 shedule 函数发生的,而 schedule 函数可以是在系统调用返回、中断返回等时机被调用,也可以进程在驱动程序中主动调用 我们把在系统调用返回等时机调用...schedule 函数的这种非进程自愿情况称为抢占式调度。...把进程在驱动程序中主动调用 schedule 函数来发生进程切换的这种情况称为主动调度 本文将讨论主动调度,抢占式调度将在下一篇文章中讲解: 二、主动调度的发生的情况: 主动调度一般在应用程序读取某个设备时...,设备此时数据还没有准备好,进程就进入睡眠,发生进程调度切换到其它进程运行 例如应用想从网卡读取数据,但是此时网卡没有数据,那么驱动程序就会让进程睡眠,然后发生进程调度。...四、总结: 进程发生切换总是调用 schedule 函数进行的,进程调度分抢占式调度和主动调度,主动调度表示的是进程主动调用 schedule 函数发生进程切换 schedule 函数主要做了两件事,

    2.5K10

    linux线程调度策略

    目录 linux线程调度策略 linux线程调度策略 这是一篇非常好的关于线程调度的资料,翻译自shed 从Linux 2.6.23开始,默认的调度器为CFS,即"完全公平调度器"(Completely...在Linux内核源码中,SCHED_OTHER被称为SCHED_NORMAL。 The nice value nice值用于影响CPU调度器对进程的调度偏好。...2.6.23版本的Linux内核中引入了CFS调度,并采用了一种能根据nice的差值产生更显著影响的算法。...CFS的思想就是让每个调度实体的vruntime互相追赶,而每个调度实体的vruntime增加速度不同,权重越大的增加的越慢,这样就能获得更多的cpu执行时间) Linux系统可以使用RLIMIT_NICE...CFS在各个cgroup中进行调度,更多细节参见understanding-linux-container-scheduling

    4.8K30

    Linux进程调度分析

    而进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见《linux进程状态浅析》)。...在linux下,用户程序可以通过sched_setscheduler系统调用来设置进程的调度策略以及相关调度参数;sched_setparam系统调用则只用于设置调度参数。...普通进程具体的调度算法非常复杂,并且随linux内核版本的演变也在不断更替(不仅仅是简单的调整),所以本文就不继续深入了。...有兴趣的朋友可以参考下面的链接: 《Linux 调度器发展简述》 《鼠眼看Linux调度器》 《鼠眼再看Linux调度器[1]》 《鼠眼再看Linux调度器[2]》 调度程序的效率 “优先级”明确了哪个进程应该被调度执行...每次调度调度程序需要从树中找出优先级最高的进程。复杂度为O(logN)。 那么,为什么从linux 2.6早期到近期linux 2.6版本,调度程序选择进程时的复杂度反而增加了呢?

    2.4K31

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

    引言 通过此前的两篇文章,我们系统介绍了 linux 操作系统中的调度算法与其演进: linux 操作系统的进程调度(上) -- 进程调度的基本概念 linux 操作系统的进程调度(中) -- 进程调度算法的演进...本文,我们就来介绍 Linux 操作系统实际使用的进程调度器以及它们的演进。...O(n) 调度器 在早期的 linux 操作系统中,2.4 版本到 2.6 版本之间,linux 采用了实现起来十分简单的 O(n) 调度器。...O(1) 调度器 在 linux 内核采用 O(n) 调度器的 4 年后,Linux2.6.0 采纳了 Rad Hat 公司设计的 O(1) 调度算法,这是一个基于上一篇文章中介绍的多级反馈队列算法的调度器实现...CFS 调度器 由于 O(1) 调度器的上述问题,很快在 Linux 2.6.23 版本,就有一款新的调度器 -- CFS 被内核采用,它是由匈牙利程序员 Ingo Molnar 在澳大利亚外科医生 Con

    2.2K20

    Linux进程调度-组调度及带宽控制

    概述 组调度(task_group)是使用Linux cgroup(control group)的cpu子系统来实现的,可以将进程进行分组,按组来分配CPU资源等。...由于组调度和带宽控制紧密联系,因此本文将探讨这两个主题,本文的讨论都基于CFS调度器,开始吧。...2. task_group 组调度,在内核中是通过struct task_group来组织的,task_group本身支持cfs组调度和rt组调度,本文主要分析cfs组调度。...CFS调度器管理的是sched_entity调度实体,task_struct(代表进程)和task_group(代表进程组)中分别包含sched_entity,进而来参与调度; 关于组调度的相关数据结构...调度实体参与调度时,都会挂入到红黑树中,task_struct和task_group都属于被调度对象; task_group会为每个CPU再维护一个cfs_rq,这个cfs_rq用于组织挂在这个任务组上的任务以及子任务组

    1.9K30

    Linux调度浅析

    cgroup 与组调度 linux内核实现了control group功能(cgroup,since linux 2.6.24),可以支持将进程分组,然后按组来划分各种资源。...cgroup支持很多种资源的划分,CPU资源就是其中之一,这就引出了组调度linux内核中,传统的调度程序是基于进程来调度的(参阅《Linux 进程调度浅析》)。...在linux内核中,使用task_group结构来管理组调度的组。所有存在的task_group组成一个树型结构(与cgroup的目录结构相对应)。...(参见《linux内核SMP负载均衡浅析》。近期会推送给大家) 组的调度策略 组调度的主要数据结构已经理清了,这里还有一个很重要的问题。...实时进程的组调度 从《Linux 进程调度浅析》一文可以看到,实时进程是对CPU有着实时性要求的进程,它的优先级是跟具体任务相关的,完全由用户来定义的。调度器总是会选择优先级最高的实时进程来运行。

    3.5K52

    Linux内核】进程调度

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

    2.9K20

    Linux进程调度学习!

    Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...普通进程:在 Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...Linux 调度算法: Linux 中有一个总的调度结构,称之为 调度器类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度器根据调度器类的优先顺序,依次去进行调度器类的中的进程进行调度...Linux 调度时机: 1、进程切换: 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...也可以用 pidstat -w 命令查看进程切换的每秒统计值: pidstat -w 1 Linux 3.10.0-229.14.1.el7.x86_64 (bj71s060) 02/01/2018

    1.9K30

    Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )

    文章目录 一、调度器 0、调度器概念 1、调度器目的 2、调度器主要工作 3、调度器位置 4、进程优先级 5、抢占式调度器 二、Linux 内核进程状态 API 简介 三、Linux 进程状态 一、调度器...---- 0、调度器概念 Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块 称为 " 调度器 " , 英文名称是 Scheduler ; 1、调度器目的..." 进行 进程调度 ; 进程优先级 参考 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 |..." 抢占式调度器 " 概念 : 如果 " 调度器 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度器称为 " 抢占式调度器 " ; 二、Linux 内核进程状态 API...内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 ) 博客 ;

    5.6K20
    领券