linux内核分析之调度算法

linux内核分析之调度算法

ID:10756067

大小:205.00 KB

页数:15页

时间:2018-07-08

linux内核分析之调度算法_第1页
linux内核分析之调度算法_第2页
linux内核分析之调度算法_第3页
linux内核分析之调度算法_第4页
linux内核分析之调度算法_第5页
资源描述:

《linux内核分析之调度算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、linux内核分析之调度算法linux调度算法在2.6.32中采用调度类实现模块式的调度方式。这样,能够很好的加入新的调度算法。linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类,他允许多种不同哦可动态添加的调度算法并存,调度属于自己范畴的进程。每个调度器都有一个优先级,调度代码会按照优先级遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那个程序。linux上主要有两大类调度算法,CFS(完全公平调度算法)和实时调度算法。宏SCHED_N

2、OMAL主要用于CFS调度,而SCHED_FIFO和SCHED_RR主要用于实时调度。如下面的宏定义:1./* 2. * Scheduling policies 3. */  4. /*支援Real-Time Task的排程,包括有SCHED_FIFO與SCHED_RR.  5. */  6.   7. /*(也稱為SCHED_OTHER): 主要用以排程 8. 一般目的的Task.*/  9.#define SCHED_NORMAL        0  10.#define SCHED_FIFO      1  11./*task預設的

3、 Time Slice長度為100 msecs*/  12.#define SCHED_RR        2  13./*主要用以讓Task可以延長執行的時間 14.(Time Slice),減少被中斷發生Task Context-Switch 15.的次數.藉此可以提高 Cache的利用率  16.(每次Context-Switch都會導致Cache-Flush). 比 17.較適合用在固定週期執行的Batch Jobs任 18.務主機上,而不適合用在需要使用者互 19.動的產品 (會由於Task切換的延遲,而 20.感覺到系統效能不

4、佳或是反應太慢).*/  21.#define SCHED_BATCH     3  22./* SCHED_ISO: reserved but not implemented yet */  1./*為系統中的Idle Task排程.*/  2.#define SCHED_IDLE      5  linux调度算法实现的高层数据结构主要有运行实体、调度类、运行队列,下面我们主要看看这几个数据结构的字段和意义。运行实体,rq结构体每个cpu有一个,主要存储一些基本的用于调度的信息,包括实时调度的和CFS调度的1. /*每个处理器都会配置

5、一个rq*/  2.struct rq {  3.    /* runqueue lock: */  4.    spinlock_t lock;  5.  6.    /* 7.     * nr_running and cpu_load should be in the same cacheline because 8.     * remote CPUs use both these fields when doing load calculation. 9.     */  10.     /*用以记录目前处理器rq中执行task

6、的数量*/  11.    unsigned long nr_running;  12.    #define CPU_LOAD_IDX_MAX 5  13.    /*用以表示处理器的负载,在每个处理器的rq中 14.    都会有对应到该处理器的cpu_load参数配置,在每次 15.    处理器触发scheduler tick时,都会呼叫函数 16.    update_cpu_load_active,进行cpu_load的更新。在系统初始化的时候 17.    会呼叫函数sched_init把rq的cpu_load array初

7、始化为0. 18.    了解他的更新方式最好的方式是通过函数update_cpu_load,公式如下澹? 19.    cpu_load[0]会直接等待rq中load.weight的值。 20.    cpu_load[1]=(cpu_load[1]*(2-1)+cpu_load[0])/2 21.    cpu_load[2]=(cpu_load[2]*(4-1)+cpu_load[0])/4 22.    cpu_load[3]=(cpu_load[3]*(8-1)+cpu_load[0])/8 1.    cpu_load[4]=

8、(cpu_load[4]*(16-1)+cpu_load[0]/16 2.    呼叫函数this_cpu_load时,所返回的cpu load值是cpu_load[0] 3.    而在进行

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。