task_struct结构体的优先级参数详解:prio、static_prio、normal_prio、rt_priority
文章目录
- 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相关推荐
- C语言中的结构体(struct)详解
C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型).本文主要介绍关于结构体以下几部分. 1.概念 为什么要有结构体? 因为在实际问题中,一组数据往往有很多种不同的数据类型. ...
- C语言结构体指针(指向结构体的指针)详解
当一个指针变量指向结构体时,我们就称它为结构体指针.C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ cha ...
- [转]C++结构体|类 内存对齐详解
内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...
- 3.c语言结构体成员内存对齐详解
一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 1 #include <stdlib.h> 2 #include <stdio.h> ...
- python 结构体指针_C语言结构体指针(指向结构体的指针)详解
当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...
- 【C语言进阶】结构体 位段 枚举 联合体详解
目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...
- 【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 内核 中 ...
- Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)
转自:http://blog.csdn.net/gatieme/article/details/51383272 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...
- Linux进程管理之task_struct结构体详解
进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...
最新文章
- POJ1018贪心(多路归并的想法)
- DevIL真是好用得想哭
- 计算机考试用英语怎么说,“全国大学生计算机等级考试一级”英语怎么说?
- Brief C Programs of the Bombs
- React入门教程第三课--gulp编译优化
- CSS 元素的绝对定位 position: absolute 和 position: fixed
- 【英语学习】【Daily English】U01 Greetings / L04 Hello, this is Peter Jones speaking
- el-table 懒加载不触发合计_Angular-懒加载第三方
- 利用全加器实现7段数码管_单片机入门,8个led数码管精选电路方案合辑
- excel 将两列数据合并,以逗号分隔
- 理解以太坊 Serenity - 第二部分: Casper
- canvas教程11-渐变
- 对京东全球购的一次投诉
- 电脑画流程图用什么软件好?这3款软件很好用
- jbpm创建流程图_jbpm - 工作流的基本操作
- Download下载DRM
- 领悟《信号与系统》之 采样定理
- 阿龙的学习笔记---Effective C++---第一章:习惯C++
- 综述:无创脑刺激技术改善阅读障碍患者的阅读困难
- 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
热门文章
- 全国大学生网球锦标赛
- 5G多址技术何去何从?
- uniapp 自定义多框输入验证码/支付密码
- Nginx(十九)nginx配置php
- Kotlin传递可变长参数给Java可变参数方法
- x86/IA-32/AMD64/x86_64/IA-64等的区别和联系
- PHP中cal_days_in_month函数和calendar扩展详解
- 云HIS管理系统源码,SaaS模式
- 爬虫基础:爬取百度贴吧-猫吧标题,详情页url,详情页图片url,下载图片
- 掌上医院HTML模板,易就医(掌上医院服务)app