Linux内核线程优先级的三种调度策略

2023-05-16

Linux内核三种调度策略:      

 (1).SCHED_OTHER 分时调度策略

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

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

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);

1). 第一个参数,用来保存创建好后线程uid

2). 第二个参数,即线程属性,通常传NULL,表示默认属性,这个属性在创建前可以设置,包括调度策略,栈大小,优先级等等

3). 第三个参数,即线程入口函数

4). 第四个参数,传给线程的参数

所以在创建线程前,对 第二个参数 pthred_attr_t 结构体进pthread_attr_t 进行赋值

1). pthread_attr_init(pthread_attr_t *attr);//使用默认值填充初始化

2). //获取设置栈大小 //这个属性只能在线程创建前设置,后面不能动态修改了

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

3). //设置获取调度策略

SCHED_FIFO, SCHED_RR, and

SCHED_OTHER //policy支持这三种值,

1). SCHED_OTHER 分时调度策略,

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

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

    SCHED_OTHER(分时调度)是不支持优先级使用的,其他两个实时调度可以

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

4). //设置调度参数,目前这个参数里面就一个量,优先级 //用户程序设置实时任务这个优先级,值越大,优先级越高

struct sched_param {

int sched_priority; /* Scheduling priority */

};

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

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

5).//是否分离属性

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

上面这些都是静态,在创建线程之前的设置。

创建之前设置属性和创建好后修改属性,注意  sched_setscheduler 的第一个参数是 pid_t ,非pthread_t。

      pthread_t 和pid_t, 是两个不同的标识符,分别可以通过 pthread_self()  和getpid()来获取当前运行线程的相应标识符。所以上面所说线程运行起来后再动态修改优先级,这个修改放在线程体里面调用即可,通过getpid()来获取pid_t. (还没有深入了解关于具体的 pthread_t 和pid_t的区别,看到一种说法是 pthraed_t用来区分表示同一个进程之间的线程,而pid_t才是系统中认为的线程唯一标识符,没有找到关于这两个是否可以相互转换的说法,估计涉及到具体的操作系统)。

Ex1:

创建之前就设置好优先级

//创建线程之前就定好调度优先级 
//需要相关函数头文件 #include<errno.h> #include <sched.h>
pthread_t pliveThread;
 
  pthread_attr_t  pthread_pro;
  pthread_attr_init(&pthread_pro);
 
  pthread_attr_setschedpolicy(&pthread_pro, SCHED_FIFO);
  struct sched_param s_parm;
  s_parm.sched_priority = sched_get_priority_max(SCHED_FIFO);
  pthread_attr_setschedparam(&pthread_pro, &s_parm);
 
  int ret = 0;
  if(0 != (ret = pthread_create(&pliveThread,&pthread_pro,live555_main,url))){
       printf("craete thread erro: %s",strerror( ret));
        return -1;
  }

Ex2:

创建之后设置优先级:

//在待提升优先级的线程体中运行
    int ret =0;
    pid_t pid =getpid();
    int curschdu = sched_getscheduler(pid);
    if(curschdu <0 )
    {
        printf( "getschedu err %s\n",strerror( errno));
    }
    printf("schedu befor %d\n",curschdu);
    struct sched_param s_parm;
    s_parm.sched_priority = sched_get_priority_max(SCHED_FIFO);
    printf("schedu max %d min %d\n",sched_get_priority_max(SCHED_FIFO),sched_get_priority_min(SCHED_FIFO));
    
    ret = sched_setscheduler(pid, SCHED_FIFO, &s_parm);
    if(ret <0)
    {
       printf( "setschedu err %s\n",strerror( errno));
    }
    curschdu = sched_getscheduler(pid);
    printf("schedu after %d\n",curschdu);

 

 

 

 

 

 

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

Linux内核线程优先级的三种调度策略 的相关文章

  • Python 3.6解决报错:'NoneType' object has no attribute 'decode'的办法

    for repo dict in repo dicts names append repo dict 39 name 39 plot dict 61 39 value 39 repo dict 39 stargazers count 39
  • 手把手教你实现ROS依赖任意第三方库+lpsolve求解整数线性规划问题为例

    How to link dynamic libraries use third party libraries in ROS lpsolve solver as examples 喜欢的话请关注 xff0c 欢迎github 给个小星星 g
  • UCOS-III

    一 UCOSIII 简介 UCOSIII 是一个可裁剪 可固化 可剥夺 的多任务系统 xff0c 没有任务数目的限制 xff0c 是 UCOS 的第三代内核 xff0c UCOSIII 有以下几个重要的特性 xff1a 可剥夺多任务管理 x
  • 【Python】词频统计(written in python and Mapreduce)

    一 利用Python进行词频统计 xff08 一 xff09 计算机等级考试中常用的方法 首先是一个比较标准的考试中使用的方法 xff0c 针对英文文本 xff1a span class token keyword def span spa
  • 数据处理技巧(5):MATLAB 读取txt中的数据

    全是数字的类型 txt 的数据是有数字的 xff0c 如下图 xff1a 读取结点坐标 xff0c 保存在 NodeCoor 数组当中 xff0c 共1331行3列 filename span class token operator 61
  • 基于51单片机的模拟自动感应门 系统protues仿真

    硬件设计 xff08 末尾附文件 xff09 代码设计 include lt reg51 h gt 调用头文件 define uchar unsigned char 宏定义 define uint unsigned int 宏定义 端口定义
  • linux测试程序

    stresslinux super pi prime mprime nbench cpuburn gamut mersenne prime stress cpu burn in memtester memtest86 memtest86 4
  • mysql 删除多余0的问题

    0 43 CAST 字段 AS CHAR 别名 可加可不加
  • 三维点沿指定向量方向到平面的距离计算方法及C++代码实现

    设平面外一点为P p1 p2 p3 xff0c 指定的方向向量为d 61 d1 d2 d3 xff0c 平面Q方程为Ax 43 By 43 Cz 61 D xff0c 设系数ABC已经归一化 xff0c 则其法向量为n 61 A B C 则
  • ubuntu使用proxychains给终端设置代理

    有时 xff0c 我们需要下载一些国外网站上的东西 xff0c 如果用国内网络直接下载的话 xff0c 往往是连接不上的 或者有时下载一个东西速度很慢 xff0c 这都是因为国内网络限制的问题 xff0c 大大影响了我们的工作效率 解决方法
  • int为什么占4个字节?一个字节为什么是8位?

    不知道大家有没有思考过这样的问题 xff0c 一个字节为什么是8位呀 xff0c 也许还有小伙伴不知道我说的这些是什么 xff0c 没关系往下看 第一个解释 xff08 历史 xff09 是IBM为System 360设计了一套8位EBCD
  • K8S之kubectl命令详解及示例

    目录 1 查看类命令 2 操作类命令 3 进阶命令操作 4 kubectl replace 重启pod的四种方法 5 kubectl语法 1 查看类命令 获取节点和服务版本信息 kubectl get nodes 获取节点和服务版本信息 x
  • ROS运动规划学习五---global_planner

    文章目录 前言一 global planner功能包结构二 planner core1 执行过程2 calculatePotentials 3 getPlanFromPotential 总结 前言 本节将学习ROS中的全局规划期global
  • ROS自定义消息---发布数组和整型数据

    ROS自定义消息 数组和整型数据 前言一 ROS中的消息数据格式二 自定义话题消息1 新建msg文件2 编写发布者和接收者程序 总结 前言 ROS自带的消息格式已经包含一维数组 xff0c 有时候我们需要定义多维数组 xff0c 以及混合数
  • Markdown中的公式、字母表示汇总

    Markdown中的公式 字母表示汇总 1 常用希腊字母表2 数学公式 最近几个月打了很多Markdown公式 xff0c 隔一段时间就会忘一些表示方式 xff0c 还不如在这里慢慢汇总记录 xff0c 以后要用的时候来查就行了 xff01
  • CMake项目中神器:CMakeLists.txt

    首次接触 CMake xff0c 见识了 CMakeLists txt 的强大后 xff0c 赶紧整理出来分享一下 参考资料 xff1a Cmake 3 6 W3Cschool参考手册 本文讲述了一个 CMake 项目 xff0c 在从单文
  • TCP详解之拥塞控制

    概述 TCP模块还有一个重要任务 xff0c 就是提高网络利用率 xff0c 降低丢包率 xff0c 并保证网络资源对每条数据流的公平性 xff0c 这就是所谓的拥塞控制 拥塞控制的四个部分 xff1a 慢启动 拥塞避免 快速重传 快速恢复
  • frps搭建自己的内网穿透服务器

    frps搭建自己的内网穿透服务器 开发过程中 xff0c 很多时候我们需要用到内网穿透 xff0c 将自己的服务器映射到外网 xff0c 下面说一下怎么用frps搭建自己的内网穿透服务器 frps Github地址 里面有中文文档 xff0
  • 更换backbone心得

    1 对于目标检测 xff0c backbone相当于连接中间环节 xff0c 连接着图片输入和后面的检测头 xff0c 所以在更换网络时候只要注意输入backbone的数据形式以及后面一个环节要求输入的形式 xff0c 把backbone的
  • from torch._C import *ImportError: DLL load failed while importing _C: 找不到指定的模块。

    更新torch的版本 xff0c 原先是1 4 0出现这个问题 xff0c 更新到1 11 0后解决 pip install torch 61 61 1 11 0 43 cpu torchvision 61 61 0 12 0 43 cpu

随机推荐