Linux-进程调度相关的系统调用简介

2023-11-03

前言

内核版本:2.6.26。

Linux提供了一个系统调用族,用于管理与调度程序相关的参数。这些系统调用可以用来操作和处理进程优先级、调度策略及处理器绑定。并且这些系统调用都包涵在C库中,也可用man手册查看。

与调度策略相关的系统调用

系统调用 描述
sched_getscheduler 获取进程的调度策略
sched_setscheduler 设置进程的调度策略和实时优先级

其函数原型如下:

#include <sched.h>

int sched_setscheduler(pid_t pid, int policy,
                              const struct sched_param *param);

int sched_getscheduler(pid_t pid);

参数说明:

参数 描述
pid 表示要修改/设置调度参数的目标线程,如果传入的参数pid为0则目标线程是调用该函数的线程;
policy 表示目标线程的调度策略。
param 它是一个结构指针类型。

补充:
目前linux对于sched_setscheduler()函数支持如下调度策略:

//include/linux/sched.h
/*
 * Scheduling policies
 */
#define SCHED_NORMAL	0   //标准的CFS调度策略;
#define SCHED_FIFO		1	//FIFO方式的实时调度策略
#define SCHED_RR		2	//轮转方式的实时调度策略
#define SCHED_BATCH		3	//针对"batch" 类型的任务,切换没有SCHED_OTHER频繁
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE		5	//适用于以低优先级运行的后台任务

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

对于响应或者延迟有要求的任务可以通过SCHED_FIFO和SCHED_RR设置为实时调度策略。
param:是一个如下的结构指针类型:

struct sched_param {
               ...
               int sched_priority;
               ...
    }

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_setparam() 设置进程的实时优先级
sched_getparam() 获取进程的实时优先级
sched_get_priority_max() 获取实时进程的优先级的最大值
sched_get_priority_min() 获取实时进程的优先级的最小值

函数原型如下:

#include <sched.h>

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);
int sched_setparam(pid_t pid, const struct sched_param *param);

int sched_getparam(pid_t pid, struct sched_param *param);

struct sched_param {
    ...
     int sched_priority;
    ...
};

#define MAX_USER_RT_PRIO	100
参数 描述
pid 表示要修改/设置调度参数的目标线程,如果传入的参数pid为0则目标线程是调用该函数的线程;
policy 表示目标线程的调度策略。
param 它是一个结构指针类型。

sched_setparam()与sched_getparam()这两个系统调用分别用于设置和获取进程的实时优先级。这两个系统调用获取封装在sched_param中的sched_priority。
sched_get_priority_max()与sched_get_priority_min()分别用于返回给定调度策略的最大和最小优先级。实时调度策略的最大优先级是MAX_USER_RT_PRIO - 1 (99),最小优先级等于1。

实例

#include <stdlib.h>             /* exit */
#include <stdio.h>              /* printf */
#include <sched.h>              /* sched_**** */
#include <sys/types.h>
#include <unistd.h>
 
int main(int argc, char *argv[])
{
    struct sched_param param;
    struct timespec tp;
    int maxFIFO,minFIFO,FIFO;
    int maxRR,minRR,RR;
    int Policy,ret;
    pid_t pid;

    printf("SCHED_NORMAL/SCHED_OTHER:\n");
    sleep(5);
    pid = getpid();
    Policy = sched_getscheduler(pid);
    printf ("调度策略为 : %d\n", Policy);
    if(Policy == 0){
        printf("当前进程调度策略为标准的CFS调度策略(SCHED_NORMAL/SCHED_OTHER)\n");
    }

    
    //SCHED_FIFO
    printf("\n");
    printf("SCHED_FIFO:\n");
    maxFIFO = sched_get_priority_max(SCHED_FIFO);
    minFIFO = sched_get_priority_min(SCHED_FIFO);
	printf("FIFO max priority is : %d\n", maxFIFO);
    printf("FIFO min priority is : %d\n", minFIFO);
    if(maxFIFO == -1 || minFIFO == -1){
        perror("sched_get_priority_max/min() error!\n");
        exit(1);
    }
    param.sched_priority = maxFIFO;
    if(sched_setscheduler(pid, SCHED_FIFO, &param) == -1){
        perror("sched_setscheduler() error!\n");
        exit(1);
    }
    Policy = sched_getscheduler(pid);
    printf ("调度策略为 : %d\n", Policy);
    sleep(5);
    FIFO = sched_getparam(pid , &param);
    if(FIFO == 0){
        printf ("进程的实时优先级为 : %d\n",param.sched_priority);
    }
    param.sched_priority = 80;
    ret = sched_setparam(pid , &param);
    FIFO = sched_getparam(pid , &param);
    if(FIFO == 0){
        printf ("修改后进程的实时优先级为 : %d\n",param.sched_priority);
    }
    
    
    //SCHED_RR
    printf("\n");
    printf("SCHED_RR:\n");
    maxRR = sched_get_priority_max(SCHED_RR);
    minRR = sched_get_priority_min(SCHED_RR);
	printf("RR max priority is : %d\n", maxRR);
    printf("RR min priority is : %d\n", minRR);
    if(maxRR == -1 || minRR == -1){
        perror("sched_get_priority_max/min() error!\n");
        exit(1);
    }

    param.sched_priority = minRR;
    if(sched_setscheduler(pid, SCHED_RR, &param) == -1){
        perror("sched_setscheduler() error!\n");
        exit(1);
    }
    ret = sched_rr_get_interval(pid,&tp);
    if(ret == 0){
        printf("当前进程的时间片为:%lds  %ldns\n",tp.tv_sec,tp.tv_nsec);
    }
    Policy = sched_getscheduler(pid);
    printf ("调度策略为 : %d\n", Policy);
    sleep(5);
    RR = sched_getparam(pid , &param);
    if(RR == 0){
        printf ("进程的实时优先级为 : %d\n",param.sched_priority);
    }

    return 0;
}


运行结果如下:
请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux-进程调度相关的系统调用简介 的相关文章

  • Web 应用程序的带宽和流量模拟器?

    您能否建议如何创建一个测试环境来模拟 Web 应用程序中的各种类型的带宽和流量 或者也许是一个针对本地主机执行此操作的开源程序 我认为在编写网络应用程序时这是一个非常重要的主题 但这不是一个常见的主题 我能想象创建这种环境的唯一方法是在本地
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 使用c在linux上分块读写

    我有一个 ASCII 文件 其中每一行都包含一个可变长度的记录 例如 Record 1 15 characters Record 2 200 characters Record 3 500 characters Record n X cha
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判

随机推荐

  • hal层修改屏幕亮度

    平台 rk3568 系统 Android11 我的板子有两块屏幕 而且背光用的不是同一个PWM来控制 所以要修改上层添加对另外一个屏幕亮度的调节 好了话不多少先找到在hardware rockchip light aidl Lights c
  • 导入keras包时,彻底解决Using TensorFlow backend问题(2022最新解决方案)

    说明 19 20 21年份搜到的方法都试了 都没用 改导包语句 降版本 重安装 直接跳过 下载vs插件 等等 结果依然如下图 解决方案 1 担心在原环境中装包卸载包容易搞混原环境 可以重新单独建立个tensorflow环境 2 安装最新版的
  • caffe中batch_norm层代码详细注解

    caffe中batch norm层代码注解 一 BN的解释 在训练深层神经网络的过程中 由于输入层的参数在不停的变化 因此 导致了当前层的分布在不停的变化 这就导致了在训练的过程中 要求 learning rate 要设置的非常小 另外 对
  • 目标检测——概述

    学习视觉与深度学习有一年了 想把以前看到的文章和资料整理一下 不知道从哪些开始 这个暑假 趁着刚刚开完题 稍微闲一些 把目标检测相关的经典论文逐一记录一下 有时间跑一下作者的原码 水平有限 如涉及的内容有误 恳请大家指出 前言 计算机视觉领
  • 软件测试知识点总结(五)——动态测试

    一 白盒测试 白盒 测试又称为结构测试或逻辑驱动测试是一种按照程序内部逻辑结构和编码结构设计测试数据并完成测试的一种测试方法 一般分为静态测试和动态测试 测试方法 l 语句覆盖 要求每一条语句至少执行一次 l 判定覆盖 要求每一条分支都要至
  • How To Create Token and Initial Coin Offering Contracts Using Truffle + Zeppelin Solidity

    Token contracts are hot Token crowd sales aka Initial Coin Offers ICO are hotter There have been a lot going in terms of
  • Linux内存回收入口

    概述 内存回收主要是有kswapd异步回收和direct reclaim同步回收两种入口 其中逻辑非常复杂 本文主要只概要描述不同回收场景下内核设计的主要思想 源码细节不同版本有不少区别 具体的分析后续会有专门的文章分析 页面回收常识 页面
  • 汇编复习

    http www ruanyifeng com blog 2018 01 assembly language primer html https www jianshu com p f7434bb2ce09
  • centos7.5 navicat连接mysql的报错:2003-Can't connect to MySQL server on 'x.x.x.x' (10038)解决方法的总结

    我在网上查询了N多Blog总结解决方法如下 1 可能是mysql数据库给远程连接mysql的账号 比如root 没有权限 那么先执行如下命令 GRANT ALL PRIVILEGES ON TO root IDENTIFIED BY T2w
  • (原创)开发使用Android studio所遇到的一些问题总结

    1 Android studio下载链接地址 无需翻墙 包含先行版和正式版 推荐使用正式版bug少 http www androiddevtools cn 2 第一次安装避免成功先不要急着打开应用 先取消打开 到安装目录下 bin idea
  • Java - Apache Mina 简单示例

    一 关于 Apache MINA 是一个网络应用程序框架 它对Java中的socket和NIO进行了有效和清晰的封装 方便开发人员开发TCP UDP程序 从而抛开在使用原始的socket时需要考虑的各种繁杂而又烦人问题 线程 性能 会话等
  • 计算机竞赛 深度学习 机器视觉 车位识别车道线检测 - python opencv

    0 前言 优质竞赛项目系列 今天要分享的是 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 学长这里给一个题目综合评分 每项满分5分 难度系数 3分 工作量 3分 创新点 4分 更多资料 项目分享
  • 很多人问中国网络安全行业怎么样?这篇文看完让你彻底了解中国网络安全行业的全景

    一 前言 经过近3个月的调研收集 安全牛2020年中国网络安全行业全景图 基于2019年度申报数据 正式发布 本次发布的全景图 共分为16类一级安全领域 实际收录产品15类 100类二级细分领域 实际收录88类 共涉及313家国产网络安全企
  • kafka生产端TCP连接管理

    目录 前言 Kafka生产者程序 Kafka生产者客户端如何创建TCP连接 Kafka生产者客户端如何关闭TCP连接 总结 参考资料 前言 在网络层协议中 TCP作用在第四层传输层 Http协议作用在第七层最上层应用层 一个完整的网络传输
  • 一看就懂的JMeter操作流程

    JMeter的使 流程 简介 JMeter是 款在国外 常流 和受欢迎的开源性能测试 具 像LoadRunner 样 它也提供了 个利 本地Proxy Server 代理服务器 来录制 成测试脚本的功能 但是这个功能并不好 安装 设置语 O
  • Windows10更新22H2安装卡在61%的解决办法

    Windows10更新22H2安装卡在61 的解决办法 Windows10经常收到构建和修补程序 但与此同时 用户在尝试安装它们时会遇到一些奇怪的问题 有时 该过程以错误代码结束 但是在此 更新被卡在某个百分比上 无论您尝试继续更新过程有多
  • 上海版“新基建”方案发布 首批重大项目投资额约2700亿

    大数据产业创新服务媒体 聚焦数据 改变商业 数据猿报道 在5月7日举行的上海市政府新闻发布会上 上海市推进新型基础设施建设行动方案 2020 2022年 正式发布 行动方案 立足数字产业化 产业数字化 跨界融合化 品牌高端化 提出了指导思想
  • Vue中v-model和v-bind:value的区别

    以input为例 一 Vue中v model和v bind value的区别 1 v model HTML div div
  • STM32开发实例 基于STM32单片机的计步器

    一 系统设计 由 STM32F103C8T6单片机最小系统 ADXL345 L CD1602 显示屏 通过ADXL345检测震动和移动并完成计数 累加的步数会传输到LCD1602上进行显示 可以直观的观察自己的步数 二 硬件设计 系统内的主
  • Linux-进程调度相关的系统调用简介

    前言 内核版本 2 6 26 Linux提供了一个系统调用族 用于管理与调度程序相关的参数 这些系统调用可以用来操作和处理进程优先级 调度策略及处理器绑定 并且这些系统调用都包涵在C库中 也可用man手册查看 与调度策略相关的系统调用 系统