`
russelltao
  • 浏览: 152129 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

linux内核调度算法(1)--快速找到最高优先级进程

阅读更多

为什么要了解内核的调度策略呢?呵呵,因为它值得我们学习,不算是废话吧。内核调度程序很先进很强大,管理你的LINUX上跑的大量的乱七八糟的进程,同时还保持着对用户操作的高灵敏响应,如果可能,为什么不把这种思想放到自己的应用程序里呢?或者,有没有可能更好的实现自己的应用,使得操作系统能够以自己的意志来分配资源给自己的进程?



带着这两个问题来看看KERNEL。首先回顾上我们开发应用程序,基本上就两种类型,1、IO消耗型:比如hadoop上的trunk服务,很明显它的消耗主要在IO上,包括网络IO磁盘IO等等。2、CPU消耗型,比如mapreduce或者其他的需要对大量数据进行计算处理的组件,就象对高清视频压缩成适合手机观看分辨率的进程,他们的消耗主要在CPU上。当两类进程都在一台SERVER上运行时,操作系统会如何调度它们呢?现在的服务器都是SMP多核的,那么一个进程在多CPU时会来回切换吗?如果我有一个程序,既有IO消耗又有CPU消耗,怎么让多核更好的调度我的程序呢?


又多了几个问题。来看看内核调度程序吧,我们先从它的优先队列谈起吧。调度程序代码就在内核源码的kernel/sched.c的schedule函数中。
首先看下面的优先级队列,每一个runqueue都有。runqueue是什么?下面会详细说下,现在大家可以理解为,内核为每一颗CPU分配了一个runqueue,用于维护这颗CPU可以运行的进程。runqueue里,有几个成员是prio_array类型,这个东东就是优先队列,先看看它的定义:


看看BITMAP_SIZE是怎么算出来的:#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long))
那么,LINUX默认配置(如果你用默认选项编译内核的话)MAX_PRIO是140,就是说一共内核对进程一共定义了140种优先级。等待某个CPU来处理的进程中,可能包含许多种优先级的进程,但,LINUX是个抢占式调度算法的操作系统,就是说,需要调度时一定是找到最高优先级的进程执行。上面的BITMAP_SIZE值根据MAX_PRIO算出来为5,那么bitmap实际是32*5=160位,这样就包含了MAX_PRIO的140位。优先级队列是怎么使用的?看2649行代码:idx = sched_find_first_bit(array->bitmap);这个方法就用来快速的找到优先级最高的队列。看看它的实现可以方便我们理解这个优先级位的设计:

那么__ffs是干什么的?

sched_find_first_bit返回值就是最高优先级所在队列的序号,与queue是对应使用的哈,queue = array->queue + idx;这样就取到了要处理的进程队列。这个设计在查找优先级时是非常快的,非常值得我们学习。


好,优先级队列搞明白了,现在来看看runqueue,每个runqueue包含三个优先级队列。

LINUX是一个时间多路复用的系统,就是说,通过把CPU执行时间分成许多片,再分配给进程们使用,造成即使单CPU系统,也貌似允许多个任务在同时执行。那么,时间片大小假设为100ms,过短过长,过长了有些不灵敏,过短了,连切换进程时可能都要消耗几毫秒的时间。分给100个进程执行,在所有进程都用完自己的时间片后,需要重新给所有的进程重新分配时间片,怎么分配呢?for循环遍历所有的run状态进程,重设时间片?这个性能无法容忍!太慢了,跟当前系统进程数相关。那么2.6内核怎么做的呢?它用了上面提到的两个优先级队列active和expired,顾名思义,active是还有时间片的进程队列,而expired是时间片耗尽必须重新分配时间片的进程队列。


这么设计的好处就是不用再循环一遍所有进程重设时间片了,看看调度函数是怎么玩的:


当所有运行进程的时间片都用完时,就把active和expired队列互换指针,没有遍历哦,而时间片耗尽的进程在出acitve队列入expired队列时,已经单独的重新分配好新时间片了。


再看一下schedule(void)调度函数,当某个进程休眠或者被抢占时,系统就开始调试schedule(void)决定接下来运行哪个进程。上面说过的东东都在这个函数里有体现哈。

当然,在我们程序中,也可以通过执行以下系统调用来改变自己进程的优先级。nice系统调用可以改变某个进程的基本优先级,setpriority可以改变一组进程的优先级。




 






  


  
分享到:
评论

相关推荐

    进程的优先级与调度策略—Linux

    概述1.1 进程优先级1.2 普通进程的调度1.2.1 静态优先级和基本时间片1.2.2 动态优先级和平均睡眠1.3 实时进程的调度1.4 内核空间优先级2.调度策略2.1 进程的抢占2.2 调度算法2.3 O(1)调度2.4 调度模型——机制与策略...

    Linux2.6内核标准教程(共计8-- 第1个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    minix内核修改,增加实时进程和实时调度

    2 实现EDF(Earliest-Deadline-First)实时调度算法  EDF deadline越近的进程越先执行  实时调度 设置进程的优先级,保证进程的优先级高于其他用户进程,以保证它的实时性。但要考虑不会影响系统进程的执行。

    Linux内核解析案例详解

    系统调度:研究Linux内核的进程调度算法和策略,了解进程优先级、调度器运行队列、上下文切换等相关概念。 内存管理:深入了解Linux内核的内存管理机制,包括虚拟内存管理、页面置换算法、内存分配和释放等。 文件...

    linux操作系统内核技术-uestc课件

     3介绍支持SMP的O(1)调度,用户和内核抢占和进程上下文切换,了解优先级复算,睡眠和唤醒机制,SMP的负载均衡。(4小时)  4掌握在x86体系结构上系统调用的具体实现原理,接口参数传递,用户地址空间和核心地址...

    Linux2.6内核标准教程(共计8--第6个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    Linux2.6内核标准教程(共计8--第8个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    论文研究-实时操作系统任务调度算法的硬件实现.pdf

    对uC/OS-II的任务调度算法进行改进和硬化,在uC/OS-II内核基于优先级的抢占式调度算法的基础上扩展同优先级任务的调度算法,突破了原系统对任务数量的限制,去除了原系统对每个任务必须有不同优先级的要求,采用硬件...

    Linux2.6内核标准教程(共计8--第3个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    Linux2.6内核标准教程(共计8--第7个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    论文研究-一种实时性O(1)调度改进算法.pdf

    实时进程调度算法在任务调度过程中对于公平性体现不够。为了解决这个问题,在Linux 2.6.11内核的基础上作了改进,提出了一...最后,通过仿真实验的结果比较,证明了RMOSA算法相对于Linux 2.6.11O(1)调度算法的优越性。

    操作系统进程调度算法

    进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。本实验可加深对进程调度算法的理解。

    Linux2.6内核标准教程(共计8--第4个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    Linux2.6内核标准教程(共计8--第2个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    Linux2.6内核标准教程(共计8--第5个)

    4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7...

    嵌入式系统通用的应用软件结构研究

    任务调度算法原型: *关中断; *取优先级最高的就绪任务; *若不是当前任务,则进行任务切换; *开中断。 任务切换中两步完成:将被挂起的任务的微处理器寄存器堆入栈,然后,将较高优先级的任务的...

    进程调度基本框架

    进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度 2)按照实验题目要求独立正确地完成实验内容(编写、调试...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    版次:1-1 所属分类:计算机 > 操作系统 > Windows 内容简介回到顶部↑ 本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、...

    Professional Linux Kernel Architecture

    进程管理和调度:深入探讨Linux内核中的进程管理机制和调度算法,包括进程的创建、上下文切换、优先级调度等。 内存管理:解释Linux内核中的虚拟内存管理机制、页面置换算法和内存分配器,包括页面映射、内存回收、...

    处理机调度.xmind

    从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行 调度的层次 作业调度(高级调度) 长程调度 每个作业只调入一次、调出一次 执行频率低 外存 --> 内存(面向作业) ...

Global site tag (gtag.js) - Google Analytics