sched_setscheduler()函数用以修改线程的调度策略以及调度参数。

一 函数原型

#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);

二 参数说明
  pid:表示要修改/设置调度参数的目标线程,如果传入的参数pid为0则目标线程是调用该函数的线程;

policy: 表示目标线程的调度策略。目前linux对于sched_setscheduler()函数支持如下调度策略:

1) SCHED_OTHER   标准的CFS调度策略;
    2) SCHED_BATCH   针对"batch" 类型的任务,切换没有SCHED_OTHER频繁;
    3) SCHED_IDLE    适用于以低优先级运行的后台任务。

上面三个任务都属于普通调度策略(非real-time调度策略),且采用上面三个policy其中一种时,第三个参数param->sched_priority必须设置为0,否则运行时会调用失败。

4) SCHED_FIFO    FIFO方式的实时调度策略;

5) SCHED_RR      轮转方式的实时调度策略。

对于响应或者延迟有要求的任务可以通过SCHED_FIFO和SCHED_RR设置为实时调度策略。

sched_param 的结构体如下:

#include <sched.h>struct sched_param
{ int32_t  sched_priority; int32_t  sched_curpriority; union { int32_t  reserved[8]; struct {    int32_t  __ss_low_priority;  int32_t  __ss_max_repl;  struct timespec     __ss_repl_period;   struct timespec     __ss_init_budget;   }           __ss;   }           __ss_un;
}#define sched_ss_low_priority   __ss_un.__ss.__ss_low_priority
#define sched_ss_max_repl       __ss_un.__ss.__ss_max_repl
#define sched_ss_repl_period    __ss_un.__ss.__ss_repl_period
#define sched_ss_init_budget    __ss_un.__ss.__ss_init_budget

Param->sched_priority用以指定目标线程的优先级,这也是sched_setscheduler()函数对于param比较普遍的用法。

返回值:

函数调用成功时返回0;而失败或者出错时返回-1,并设置errno值。下面是失败时,设置不同errno的情况:

EINVAL: 无效参数。Pid小于0或者param 为 NULL;
  EINVAL: 参数policy 不是上面提到的几种,无法识别;
  EINVAL: 参数param(或者param结构中的值)对于指定的policy无意义;
  EPERM : 函数调用者没有权限;
  ESRCH : 传入的pid不存在。

三 线程的调度有三种策略

线程的调度有三种策略:SCHED_OTHER、SCHED_RR和SCHED_FIFO。下面我们简单的说明一下这三种调度策略。

SCHED_OTHER
它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的。简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。

SCHED_FIFO

它是一种实时的先进先出调用策略,且只能在超级用户下运行。这种调用策略仅仅被使用于优先级大于0的线程。它意味着,使用SCHED_FIFO的可运行线程将一直抢占使用SCHED_OTHER的运行线程J。此外SCHED_FIFO是一个非分时的简单调度策略,当一个线程变成可运行状态,它将被追加到对应优先级队列的尾部((POSIX 1003.1)。当所有高优先级的线程终止或者阻塞时,它将被运行。对于相同优先级别的线程,按照简单的先进先运行的规则运行。我们考虑一种很坏的情况,如果有若干相同优先级的线程等待执行,然而最早执行的线程无终止或者阻塞动作,那么其他线程是无法执行的,除非当前线程调用如pthread_yield之类的函数,所以在使用SCHED_FIFO的时候要小心处理相同级别线程的动作。

SCHED_RR

鉴于SCHED_FIFO调度策略的一些缺点,SCHED_RR对SCHED_FIFO做出了一些增强功能。从实质上看,它还是SCHED_FIFO调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。

sched_setscheduler()相关推荐

  1. sched_setscheduler分析

    之前在chinaunix上看到有人问了下面这个问题: #define _GNU_SOURCE #include <sched.h> int main() {       int prio ...

  2. sched_setscheduler

    #include <sched.h> int sched_setscheduler(pid_t pid, int policy, const struct sched_param *par ...

  3. sched_setscheduler()函数

    sched_setscheduler()函数用以修改线程的调度策略以及调度参数. 一 函数原型 #include <sched.h> int sched_setscheduler(pid_ ...

  4. 嵌入式linux内存使用和性能优化

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

  5. linux内核SMP负载均衡浅析

    需求       在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态( ...

  6. linux什么是实时调度,Linux中的实时调度

    svenfx.. 17 在实时调度中,FIFO和RR与非实时调度具有完全相同的含义.始终以FIFO方式选择过程,然而,与SCHED_RR的时间量不同,SCHED_FIFO的时间量不受限制. SCHED ...

  7. linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...

    原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...

  8. linux进程调度浅析

    linux进程调度浅析 操作系统要实现多进程,进程调度必不可少. 有人说,进程调度是操作系统中最为重要的一个部分.我觉得这种说法说得太绝对了一点,就像很多人动辄就说"某某函数比某某函数效率高 ...

  9. Python学习之路 (一)开发环境搭建

    前言 python3应该是Python的趋势所在,当然目前争议也比较大,这篇随笔的主要目的是记录在centos6.7下搭建python3环境的过程 以及碰到的问题和解决过程. 另外,如果本机安装了py ...

最新文章

  1. 什么是JSON?我为什么要使用它?
  2. Ajax Control Toolkit 32个服务器端控件
  3. zabbix添加对web页面url的状态监控
  4. React Router 黑笔记?
  5. 图片压缩大小java_压缩图片大小(Java源码)
  6. 在虚拟机装一个linux系统
  7. Linux clear指令
  8. 10、使用ws调用Rest api
  9. c语言float转换为int_C语言的隐式类型转换和显示类型转换
  10. iOS UIPageControl
  11. MySQL四种事务隔离级的说明
  12. php报错集合,centos7安装php5.6报错集合
  13. Fliqlo时钟屏保Windows版本
  14. VS code 使用技巧-设置鼠标滚轮翻页速度(Mac版本)
  15. VO的实际应用;后端接收前端传入的值;实体类转化VO;PO,VO,DTO,BO,DAO,POJO区别
  16. C语言 实现十进制转二十六进制
  17. 海思开发板实用技巧集
  18. Linux系统开启服务器BBR加速教程
  19. 机器人的「语料」,如何获取?
  20. Docker网络配置

热门文章

  1. ideavim 使用分享
  2. 防火墙 Hillstone Networks SA-2003
  3. 上海腾科教育达梦数据库培训干货分享linux平台下数据文件被误删后,如何及时得知并进行恢复
  4. opencv-python人脸识别
  5. JAVA中序列化的作用以及好处
  6. GDAL中通过GDALDriver类的Create函数实现图像的保存
  7. uniapp转小程序分享到朋友圈
  8. P6352 [COCI2007-2008#3] CETIRI
  9. Accessibility辅助功能--一念天堂,一念地狱
  10. 什么叫大数据人物画像_大数据时代用户画像有什么作用