linux内核的三种主要调度策略

news/2024/7/4 10:12:27 标签: 嵌入式

linux内核的三种主要调度策略:

1SCHED_OTHER 分时调度策略, 

2SCHED_FIFO实时调度策略,先到先服务 

3SCHED_RR实时调度策略,时间片轮转

  

实时进程将得到优先调用,实时进程根据实时优先级决定调度权值。分时进程则通过nicecounter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。

 

SHCED_RRSCHED_FIFO的不同:

     当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。     

    SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。

    如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

  

相同点:

    RRFIFO都只用于实时任务。

    创建时优先级大于0(1-99)

    按照可抢占优先级调度算法进行。

    就绪态的实时任务立即抢占非实时任务。

 

所有任务都采用linux分时调度策略时:

1创建任务指定采用分时调度策略,并指定优先级nice(-20~19)

2,将根据每个任务的nice值确定在cpu上的执行时间(counter)

3,如果没有等待资源,则将该任务加入到就绪队列中。

4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算权值(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。

5,此时调度程序重复上面计算过程,转到第4步。

6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。

 

所有任务都采用FIFO时:

1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)

4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。

5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。

 

所有任务都采用RR调度策略时:

1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice(nice值将会转换为该任务的时间片的长度)

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu

4,如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3

5,当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3

 

系统中既有分时调度,又有时间片轮转调度和先进先出调度: 

1RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。

2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。

3RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RRFIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

 

Ingo Molnar-实时补丁

为了能并入主流内核,Ingo Molnar的实时补丁也采用了非常灵活的策略,它支持四种抢占模式:
1.No Forced Preemption (Server),这种模式等同于没有使能抢占选项的标准内核,主要适用于科学计算等服务器环境。
2.Voluntary Kernel Preemption (Desktop),这种模式使能了自愿抢占,但仍然失效抢占内核选项,它通过增加抢占点缩减了抢占延迟,因此适用于一些需要较好的响应性的环境,如桌面环境,当然这种好的响应性是以牺牲一些吞吐率为代价的。
3.Preemptible Kernel (Low-Latency Desktop),这种模式既包含了自愿抢占,又使能了可抢占内核选项,因此有很好的响应延迟,实际上在一定程度上已经达到了软实时性。它主要适用于桌面和一些嵌入式系统,但是吞吐率比模式2更低。
4.Complete Preemption (Real-Time),这种模式使能了所有实时功能,因此完全能够满足软实时需求,它适用于延迟要求为100微秒或稍低的实时系统。
 
实现实时是以牺牲系统的吞吐率为代价的,因此实时性越好,系统吞吐率就越低。
 

http://www.niftyadmin.cn/n/1748432.html

相关文章

imx6 android5.1 编译

imx6 android5.1 编译 记录一下编译imx6dl android的命令。 Android build cd ~/myandroid source build/envsetup.sh lunch sabresd_6dq-user make 2>&1 | tee build-log.txt Building U-Boot images cd ~/myandroid/bootable/bootloader/uboot-imx export ARCHarm exp…

PostgreSQL GIN 单列聚集索引 应用

标签 PostgreSQL , gin , 聚集索引 , 单列 背景 聚集存储比较好理解,数据按照聚集KEY存储在一个或相邻的数据块中,对聚集KEY的轨迹、行为数据检索可以大幅减少IO。 那么聚集索引呢?我们知道通常BTREE索引中存储的是KEY以及对应数据的堆表行号…

JSON 中JsonConfig的使用(转)

我们通常对一个Json串和Java对象进行互转时,经常会有选择性的过滤掉一些属性值,而json-lib包中的JsonConfig为我们提供了这种 功能,具体实现方法有以下几种。(1)建立JsonConfig实例,并配置属性排除列表,(2)用属性过滤器,(3)写一个…

cookie控制登陆时间

使用cookie实现永久登陆 1,在cookie里面保存账号密码然后和数据库核对(由于我没有使用数据库,就不用了 2,在cookie里面保存时间戳和账号使用加密解密(我也没有使用时间戳 思路,request.getParameter("…

arm linux 从入口到start_kernel 代码分析——head.S分析——6

arm linux 从入口到start_kernel 代码分析 - 6 (2008-07-30 16:07:15) 转载标签: it 分类:kernel 5. 开启mmu 开启mmu是又函数 __enable_mmu 实现的. 在进入 __enable_mmu 的时候, r0中已经存放了控制寄存器c1的一些配置(在上一步中…

BZOJ 2683: 简单题 [CDQ分治]

同上题 那你为什么又发一个&#xff1f; 因为我用另一种写法又写了一遍... 不用排序&#xff0c;$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typed…

CMFCShellList和自定义ShellList结合使用,达到“直接浏览缩略图,双击打开图片”...

在GOPaint的设计研究过程中&#xff0c;我一直希望能够实现这样的结果&#xff08;A B C 3个步骤)在我之前的博客里面&#xff0c;曾经有过缩略图显示的现就(http://www.cnblogs.com/jsxyhelu/p/5493329.html ),也应用到了实际的项目中。但是现在过了一段时间后回头再看&…

利用mybatis-generator自动生成代码

2019独角兽企业重金招聘Python工程师标准>>> 1、准备生成代码需要的文件和jar包&#xff08;下载地址&#xff09; 2、配置generatorConfig.xml文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC …