文章目录

  • task_struct 结构体
    • prio 调度优先级
    • normal_prio 正常优先级
    • static_prio 静态优先级
    • rt_priority 实时优先级
  • 应用编程修改调度策略
    • SCHED_NORMAL CFS调度策略
    • SCHED_FIFO 和 SCHED_RR 实时调度策略
  • 相关的系统调用
    • 获取优先级范围
      • sched_get_priority_min(int policy) 获取优先级最小值
      • sched_get_priority_max(int policy) 获取优先级最大值
      • policy传参
    • 修改线程的调度策略
      • int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy)
      • int pthread_attr_getschedpolicy(pthread_attr_t *attr,int* policy)
    • 设置和获取线程的优先级
      • int pthread_attr_setschedparam(pthread_attr_t* attr_t,const)
      • int pthread_attr_getschedparam(pthread_attr_t* attr_t,const)

task_struct 结构体

   task_struct 结构体定义了4个关于优先级(prio)的参数,这是由于Linux内核里不止一种调度器导致的。

参数 实时调度器进程 CFS调度器进程
prio 正常情况下,prio等于normal_prio 正常情况下,prio等于normal_prio
normal_prio 99-rt_priority static_prio
static_prio 无意义 120+nice值
rt_priority 1~99 无意义

prio 调度优先级

   进程的动态优先级,是调度器使用的优先级

normal_prio 正常优先级

   normal_prio值是根据调度器类型计算出来的
      对于实时进程:normal_prio = 99 - rt_priority
      对于非实时进程: normal_prio = static_prio
   代码实现如下:

#define MAX_RT_PRIO      100static inline int __normal_prio(struct task_struct *p)
{return p->static_prio;
}static inline int normal_prio(struct task_struct *p)
{int prio;if (task_has_dl_policy(p))prio = MAX_DL_PRIO-1;else if (task_has_rt_policy(p))prio = MAX_RT_PRIO-1 - p->rt_priority;elseprio = __normal_prio(p);return prio;
}

static_prio 静态优先级

   静态优先级,在进程启动时分配,在被CFS调度的进程中才有意义,用户可以通过修改nice值来修改静态优先级,内核不存储nice值,只会通过NICE_TO_PRIO宏将nice值转换为static_prio。

#define DEFAULT_PRIO 120
#define NICE_TO_PRIO(nice)  ((nice) + DEFAULT_PRIO)

rt_priority 实时优先级

   实时优先级,在被实时调度器调度的进程中才会有意义

应用编程修改调度策略

  SCHED_NORMAL( 老版本也称SCHED_OTHER): CFS调度:分时调度 不支持优先级

  SCHED_FIFO: 实时调度策略 先入先调度 优先级 1~99

  SCHED_RR: 实时调度策略 时间片轮转 优先级 1~99

SCHED_NORMAL CFS调度策略

   采用SCHED_NORMAL调度策略调度的进程是交给内核的CFS完全公平调度器调度的,对于应用程序开发者来说,被CFS调度器调度的进程是没有优先级之说的,只能靠修改nice值改变权重来增加或减少被调度的时间。

对于SCHED_NORMAL调度策略的进程,调度器采用其静态优先级作为调度依据,进程在创建时,nice值默认为0,也就是说用户创建一个SCHED_NORMAL调度策略的进程,其调度的动态优先级prio值为120,其值高于实时优先级0~100的范围,所以只要就绪队列里存在一个实时调度进程,都会将其抢占。

SCHED_FIFO 和 SCHED_RR 实时调度策略

   采用SCHED_FIFO 和 SCHED_RR调度策略的进程是交给实时调度器调度的,应用开发者是可以调整其优先级的,范围为1~99,值越大,表示优先级越高。
   但是对于内核调度区来说,进程的优先级是数值越低优先级越高,这就是在上一章节所讲的,此时动态优先级prio = 99 - rt_priority,用户不能直接修改prio参数,只能设置的优先级是rt_priority参数。

相关的系统调用

获取优先级范围

sched_get_priority_min(int policy) 获取优先级最小值

sched_get_priority_max(int policy) 获取优先级最大值

policy传参

  获取优先级最大值和最小值后,在设置线程的优先级时,我们就不会设置超出范围的优先级值。

  直接写代码验证一下

#include<stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>static void show_thread_priority(int policy)
{int prioritymin = sched_get_priority_min(policy);int prioritymax = sched_get_priority_max(policy);assert(prioritymin != -1);assert(prioritymax != -1); printf("priority %d ~ %d\n",prioritymin,prioritymax);
}int main(int argc,char* argv[])
{printf("------- SCHED_FIFO priority-------\n");show_thread_priority(SCHED_FIFO);printf("------- SCHED_RR priority-------\n");show_thread_priority(SCHED_RR);printf("------- SCHED_OTHER priority-------\n"); show_thread_priority(SCHED_OTHER);  return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDgytHEH-1632535885317)(en-resource://database/16884:1)]
  从以上代码的运行结果,可以看出SCHED_FIFO和SCHED_RR调度策略可以使用的优先级范围为199,而SCHED_OTHER调度策略的优先级范围为00,也就是不支持优先级使用。

修改线程的调度策略

int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy)

int pthread_attr_getschedpolicy(pthread_attr_t attr,int policy)

#include<stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>//获取线程的调度策略
static int get_thread_policy(pthread_attr_t *attr)
{int plicy;int rs=pthread_attr_getschedpolicy(attr,&plicy);assert(rs==0); switch(plicy){case SCHED_FIFO:printf("policy=SCHED_FIFO.\n");break;case SCHED_RR:printf("policy=SCHED_RR.\n");break;case SCHED_OTHER:printf("policy=SCHED_OTHER.\n");break;default:printf("policy=UNKNOWN.\n");break;}return plicy;
}//改变线程的调度策略
static void set_thread_policy(pthread_attr_t *attr,int policy)
{int ret = pthread_attr_setschedpolicy(attr,policy);assert(ret == 0);}int main(int argc,char* argv[])
{pthread_attr_t attr;int rs=pthread_attr_init(&attr);assert(0==rs);printf("------- Set Policy to SCHED_FIFO -------\n");set_thread_policy(&attr,SCHED_FIFO);get_thread_policy(&attr);printf("------- Set Policy to SCHED_RR -------\n");set_thread_policy(&attr,SCHED_RR);get_thread_policy(&attr);printf("------- Set Policy to SCHED_OTHER -------\n");set_thread_policy(&attr,SCHED_OTHER); get_thread_policy(&attr);return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IAFL0u77-1632535886012)(en-resource://database/16886:1)]

设置和获取线程的优先级

int pthread_attr_setschedparam(pthread_attr_t* attr_t,const)

int pthread_attr_getschedparam(pthread_attr_t* attr_t,const)

task_struct结构体的优先级参数详解:prio、static_prio、normal_prio、rt_priority相关推荐

  1. C语言中的结构体(struct)详解

    C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型).本文主要介绍关于结构体以下几部分. 1.概念 为什么要有结构体? 因为在实际问题中,一组数据往往有很多种不同的数据类型. ...

  2. C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为结构体指针.C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ cha ...

  3. [转]C++结构体|类 内存对齐详解

    内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...

  4. 3.c语言结构体成员内存对齐详解

    一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 1 #include <stdlib.h> 2 #include <stdio.h> ...

  5. python 结构体指针_C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...

  6. 【C语言进阶】结构体 位段 枚举 联合体详解

    目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...

  7. 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )

    文章目录 一.task_struct 结构体字段分析 1.comm 字段 2.进程优先级字段 3.cpus_ptr 字段 4.mm.active_mm 字段 5. fs 字段 在 Linux 内核 中 ...

  8. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

    转自:http://blog.csdn.net/gatieme/article/details/51383272 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  9. Linux进程管理之task_struct结构体详解

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...

最新文章

  1. POJ1018贪心(多路归并的想法)
  2. DevIL真是好用得想哭
  3. 计算机考试用英语怎么说,“全国大学生计算机等级考试一级”英语怎么说?
  4. Brief C Programs of the Bombs
  5. React入门教程第三课--gulp编译优化
  6. CSS 元素的绝对定位 position: absolute 和 position: fixed
  7. 【英语学习】【Daily English】U01 Greetings / L04 Hello, this is Peter Jones speaking
  8. el-table 懒加载不触发合计_Angular-懒加载第三方
  9. 利用全加器实现7段数码管_单片机入门,8个led数码管精选电路方案合辑
  10. excel 将两列数据合并,以逗号分隔
  11. 理解以太坊 Serenity - 第二部分: Casper
  12. canvas教程11-渐变
  13. 对京东全球购的一次投诉
  14. 电脑画流程图用什么软件好?这3款软件很好用
  15. jbpm创建流程图_jbpm - 工作流的基本操作
  16. Download下载DRM
  17. 领悟《信号与系统》之 采样定理
  18. 阿龙的学习笔记---Effective C++---第一章:习惯C++
  19. 综述:无创脑刺激技术改善阅读障碍患者的阅读困难
  20. 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」

热门文章

  1. 全国大学生网球锦标赛
  2. 5G多址技术何去何从?
  3. uniapp 自定义多框输入验证码/支付密码
  4. Nginx(十九)nginx配置php
  5. Kotlin传递可变长参数给Java可变参数方法
  6. x86/IA-32/AMD64/x86_64/IA-64等的区别和联系
  7. PHP中cal_days_in_month函数和calendar扩展详解
  8. 云HIS管理系统源码,SaaS模式
  9. 爬虫基础:爬取百度贴吧-猫吧标题,详情页url,详情页图片url,下载图片
  10. 掌上医院HTML模板,易就医(掌上医院服务)app