原文链接:https://www.cnblogs.com/zhouhbing/p/3904827.html
Linux内核的三种调度策略
一 Linux内核的三种调度策略:

1,SCHED_OTHER 分时调度策略,

2,SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃

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

SCHED_OTHER 是不支持优先级使用的(但自己实验过程中发现:一组进程采用的调度策略都是SCHED_OTHER时,是优先数越小,越先调用),而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高(的确如此,优先数越大,越先被调度)。如果程序控制线程的优先级,一般是用pthread_attr_getschedpolicy来获取系统使用的调度策略,如果是 SCHED_OTHER的话,表明当前策略不支持线程优先级的使用,否则可以。

实时调度与非实时调度的主要区别是:
  (1)实时调度所调度的任务有完成时限,而非实时调度没有。从而,实时调度算法的正确与否不
  仅与算法的逻辑有关,也与调度算法调度的时限有关。
  (2)实时调度要求较快的进程或线程切换时间,而非实时调度的进程或线程的切换时间较长。
  (3)非实时调度强调资源利用率(批处理系统)或用户共享处理机(分时系统),实时调度则主要强
  调在规定时限范围内完成对相应设备的控制。
  (4)实时调度为抢先式调度,而非实时调度则很少采用抢先式调度
  
二 优先级范围的获得

所设定的优先级范围必须在最大和最小值之间。

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

三 设置和获取优先级通过以下两个函数

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);

int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);

param.sched_priority = 51; //设置优先级

四 更改系统优先级初始值

系统创建线程时,默认的线程是SCHED_OTHER。所以如果我们要改变线程的调度策略的话,

可以通过下面的这个函数实现。

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

上面的param使用了下面的这个数据结构:

struct sched_param {

int __sched_priority; //所要设定的线程优先级

};

例:创建优先级为10的线程
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
param.sched_priority = 10;
pthread_attr_setschedparam(&attr, &param);
pthread_create(xxx , &attr , xxx , xxx);
例:设置最高优先级

pthread_attr_t attr;

struct sched_param param;

pthread_t thread = pthread_self();//当前程序线程号

int rs = pthread_attr_init( &attr );

               assert( rs == 0 );

pthread_attr_setschedpolicy(&attr,SCHED_FIFO);//设置线程调度策略

param.sched_priority = sched_get_priority_max(SCHED_FIFO); //优先级设定

rs = pthread_attr_setschedparam( &attr, &param );//设置和获取schedparam属性pthread_attr_destroy(&attr);

五 编译

编译命令:

#g++ pthread_priority3.c -o pthread_priority3 -lpthread

否则,会有如下错误
/tmp/cc21HcoW.o(.text+0x4c): In function main': : undefined reference topthread_create’
collect2: ld returned 1 exit status
可以看出是在ld的时候系统无法找到pthread_create函数。也就是说编译器在link得时候找不到其中的一个使用库的函数。
如果差pthread_create的话可以发现其在pthread.so中,所以需要增加 -lpthread编译参数,告诉linker在link的时候使用pthread模块

其他的参考:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_32811489/article/details/70768264

linux内核的三种调度方法:

  1. SCHED_OTHER 分时调度策略,
  2. SCHED_FIFO实时调度策略,先到先服务
  3. SCHED_RR实时调度策略,时间片轮转

注意:

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

两个实时调度策略对比如下。

SHCED_RR和SCHED_FIFO的不同:

当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。将进程放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

SHCED_RR和SCHED_FIFO的相同点:

SHCED_RR和SHCED_FIFO都只用于实时任务
创建时优先级大于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。

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

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

linux进程调度算法:分时调度策略、FIFO调度策略、RR调度策略相关推荐

  1. linux进程调度之 FIFO 和 RR 调度策略

    转载 http://blog.chinaunix.net/uid-24774106-id-3379478.html  linux进程调度之 FIFO 和 RR 调度策略 2012-10-19 18:1 ...

  2. linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略

    严格地说,对于优先级对于实时进程和普通进程的意义是不一样的. 1.在一定程度上,实时进程优先级高,实时进程存在,就没有普通进程占用CPU的机会,(但是前一篇博文也讲过了,实时组调度出现在内核以后,允许 ...

  3. linux进程调度算法,关于嵌入式Linux系统实时进程调度算法系统详解

    1 嵌入式Linux系统分析 1.1 嵌入式系统 嵌入式系统(Embedded Systems)是以应用为中心,以计算机技术为基础,软件硬件可剪裁(可编程.可重构),适用于应用系统对功能.可靠性.成本 ...

  4. linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP

    http://blog.chinaunix.net/uid-24774106-id-3379478.html http://blog.chinaunix.net/uid-24774106-id-337 ...

  5. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

    前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...

  6. Linux进程调度策略分析

    Linux系统是抢占式多任务操作系统,是否要将一个进程立刻投入运行(也就是抢占当前进程),完全由该进程的优先级和是否有时间片来决定.但 CFS调度器:抢占时机取决于新的可执行程序消耗了多少处理器使用比 ...

  7. Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验

    关键词:rt_sched_class.SCHED_FIFO.SCHED_RR.sched_setscheduler().sched_setaffinity().RR_TIMESLICE. 本文主要关注 ...

  8. 操作系统:时间片轮转RR进程调度算法

    目的:陆续整理近一年的学习收获 时间片轮转RR进程调度算法 一:概念 时间片轮转RR进程调度算法:用于分时系统中的进程调度.每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好 ...

  9. Linux进程管理:进程调度之完全公平调度算法

    目录 完全公平调度算法基本原理 完全公平调度的两个时间 完全公平调度的两个对象 完全公平调度算法实现 调度时机 Linux 进程调度算法经历了以下几个版本的发展: 基于时间片轮询调度算法.(2.6之前 ...

最新文章

  1. 分析 | MEMS传感器市场报告
  2. phpStorm中的unescaped xml character问题
  3. Http请求报头设置(C#)
  4. QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹
  5. Python + OpenCV 环境配置
  6. linux镜像文件包括,关于镜像文件的详细介绍
  7. 尼康数码相机照片数据恢复怎么办
  8. Python 将文件夹内所有pdf转换为图片输出到指定文件夹中
  9. Linux操作系统管理-Resource temporarily unavailable
  10. 软件测试人员考核办法
  11. 关于win10防火墙“高级设置”变成灰色点不了,解决办法
  12. 数据库系统管理(选择 记录)
  13. 大学平均绩点计算器_【采访合集】大一必知“绩点”与“奥方面试”
  14. 50 行代码,实现中英文翻译 1
  15. 个人信息安全保障冷冽现实:内鬼的威胁要远大于黑客
  16. 计算机网络浅谈,浅谈计算机网络的重要性
  17. Spring Cloud(14)——Function
  18. 【每日一句】名人金句学英语(1130)
  19. 安装语言包(LANGUAGE PACKAGE)
  20. ABP zero 4.2 发布

热门文章

  1. Python的open函数文件读写线程不安全,logging模型文件读写线程安全!
  2. 高并发第八弹:J.U.C起航(java.util.concurrent)
  3. EXP1 PC平台逆向破解
  4. 基于Mybatis,处理多表联合获取
  5. 斯坦福-随机图模型-week1.0_
  6. 写代码如坐禅:你是哪一类程序员?
  7. hdu1337 水题
  8. hdu2594 简单KMP
  9. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )
  10. 【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件