By: Ailson Jack

Date: 2016-04-04

个人博客: http://www.only2fire.com/

最近在学习Linux的编程,这里在博客中记录一下学习的过程。

对于线程的优先级设定,在网上也看了不少的文章,大多数都只介绍了一个线程,关键是介绍的例程,设置的线程优先级都不起作用。由于之前接触的Linux编程知识比较少,这个问题困扰了我一晚上。于是接着在网上看资料,终于能够使线程的优先级设置有效。

1、相关知识介绍

首先总结一下,线程优先级设置的条件:

a、线程的调度策略必须为:SCHED_RR或SCHED_FIFO;

b、线程的继承策略必须为:PTHREAD_EXPLICIT_SCHED

对于继承策略,这里举个简单的例子:

如果线程A创建了线程B,则线程B的调度策略与线程A的调度策略和线程B的继承策略有关的:

如果线程B继承策略为PTHREAD_INHERIT_SCHED,则线程B的调度策略与线程A相同,线程B的优先级也与线程A相同,但是线程B不能够自己修改调度策略与优先级(个人理解,不对请指教);

如果线程B继承策略为PTHREAD_EXPLICIT_SCHED,则线程B的调度策略由线程属性attr决定,可以自行设置调度策略与优先级。
其中继承策略必须为PTHREAD_EXPLICIT_SCHED,否则设置线程的优先级会被忽略。

2、程序示例

下面是一个简单的设置优先级的程序示例,通过修改任务1与任务2的优先级高低,可以观察到打印信息中,先打印的是优先级高的任务的信息:

/*

********************************************************************************

*描述:设置线程优先级

*Use:gcc prio.c -lpthread

*By:Ailson Jack

*Date:2016.03.25

*Blog:www.only2fire.com

********************************************************************************

*/

#include        <stdio.h>

#include        <stdlib.h>

#include        <unistd.h>

#include        <pthread.h>

#include        <string.h>

#include        <time.h>

//在用户层或者应用层,1表示优先级最低,99表示优先级最高

#define Task1_Prio      6

#define Task2_Prio      7

pthread_barrier_t barrier;

void *Task1(void *arg);

void *Task2(void *arg);

int main(void)

{

int policy,inher;

pthread_t tid;

pthread_attr_t attr;

struct sched_param param;

pthread_barrier_init(&barrier,NULL,2+1);

//初始化线程属性

pthread_attr_init(&attr);

//获取继承的调度策略

pthread_attr_getinheritsched(&attr,&inher);

if(inher == PTHREAD_EXPLICIT_SCHED)

printf("PTHREAD_EXPLICIT_SCHED\r\n");

else if(inher == PTHREAD_INHERIT_SCHED)

{

printf("PTHREAD_INHERIT_SCHED\r\n");

//必需设置inher的属性为 PTHREAD_EXPLICIT_SCHED,否则设置线程的优先级会被忽略

inher = PTHREAD_EXPLICIT_SCHED;

}

//设置继承的调度策略

//具有root权限的用户才能执行pthread_attr_setinheritsched操作,

//否则创建线程会失败

pthread_attr_setinheritsched(&attr,inher);

//设置线程调度策略

policy = SCHED_FIFO;

pthread_attr_setschedpolicy(&attr,policy);

//设置调度参数

param.sched_priority = Task1_Prio;

pthread_attr_setschedparam(&attr,&param);

//创建线程

pthread_create(&tid, &attr,Task1,NULL);

//设置调度参数

param.sched_priority = Task2_Prio;

pthread_attr_setschedparam(&attr,&param);

//创建线程

pthread_create(&tid, &attr,Task2,NULL);

sleep(1);

pthread_barrier_wait(&barrier);

pthread_join(tid, NULL);

}

void *Task1(void *arg)

{

pthread_barrier_wait(&barrier);

while(1)

{

printf("Task1 is running.\r\n");

sleep(3);//延时3s

}

pthread_exit(NULL);

}

void *Task2(void *arg)

{

pthread_barrier_wait(&barrier);

while(1)

{

printf("Task2 is running.\r\n");

sleep(3);//延时3s

}

pthread_exit(NULL);

}

编译运行程序,由于任务2的优先级比任务1的优先级高,因此打印信息,先打印的是任务2,截图如下:

接着将任务1的优先级设置为最高的,然后编译,试试看是否符合自己的预期。

注:上述的测试是在单核系统中进行的测试(虚拟机设置为单核),对于普通进程的调度,是CPU根据进程优先级算出时间片,这样并不能一定保证高优先级的进程一定先运行,只不过和优先级低的进程相比,通常优先级较高的进程获得的CPU时间片会更长而已。其实,如果要想保证一个线程运行完再运行另一个线程的话,还要使用多线程的同步技术,信号量,条件变量等方法。而不是绝对依靠优先级的高低,来保证。

热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!

注: 转载请注明出处,谢谢!^_^

linux 进程 线程 优先级,Linux编程-线程优先级的设定相关推荐

  1. linux服务器开发二(系统编程)--线程相关

    线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

  2. linux进程管理机制,linux进程管理,linux进程管理机制

    linux进程管理,linux进程管理机制 一.基本介绍 1.在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号 2.每一个进程,都会对应一个父进程,而这个父进程 ...

  3. 嵌入式 linux 进程锁,嵌入式  Linux线程锁详解pthread_mutexattr_t

    在Posix Thread中定义有一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALI ...

  4. Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转

    目录 Priority inheritance in the kernel 译文 Priority inheritance in the kernel https://lwn.net/Articles ...

  5. Linux进程实践(1) --Linux进程编程概述

    进程 VS. 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...

  6. linux 进程管理 ppt,Linux内核结构与进程管理.ppt

    Linux内核结构与进程管理.ppt Linux 内核结构与进程管理,Linux系统结构Linux kernel 开放源代码的linux操作系统内核,目前版本为2.6,Linux内核组成1. 进程调度 ...

  7. linux进程cpu时间片,Linux性能监控之CPU篇

    这篇文章中,主要介绍CPU的一些基础知识. 首先介绍一下Linux kernel中的调度器(scheduler),调度器负责调度系统中的两种资源,一是线程,二是中断.调度器给不同资源不同的优先级.从高 ...

  8. linux进程操作相关函数,Linux进程控制简介与要素及相关函数详解

    进程是操作系统中的一个重要概念,它是一个程序的一次执行过程,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中运行的. 进程4要素 要有一段程序供该进程运行 进程专用的系统堆栈空间 进程 ...

  9. Linux进程ID号--Linux进程的管理与调度(三)

    进程ID概述 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型: 内核中进程ID的类型用pid_type来描述,它被定义在include/linux/pid.h中 enum ...

  10. linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt

    <linux操作系统-进程管理和打印管理.ppt>由会员分享,可在线阅读,更多相关<linux操作系统-进程管理和打印管理.ppt(25页珍藏版)>请在装配图网上搜索. 1.进 ...

最新文章

  1. portainer图形化监控
  2. GitLab搭建详细过程
  3. [vue] 你知道style加scoped属性的用途和原理吗?
  4. Centos php5.3.3 升级 5.5.26 mysql5.1.73 升级 5.6.25
  5. shell waite php,linux shell wait命令详解
  6. 大一新生开学考计算机知识点,2018年大一新生入学考试科目及考试资料和内容解读...
  7. Centos 5.8 搭建ntp服务器
  8. 东芝笔记本linux系统安装驱动,最详实解决方案 笔记本安装驱动指南!
  9. WORD图、表标号——题注
  10. 酷比魔方iplay20_799元买国产“山寨板”是否值得?酷比魔方iPlay20 Pro评测
  11. ehvierwer登录与不登录_微信上不去了怎么办,峰哥教你微信登录不上去的办法
  12. 稀疏数组——优化五子棋游戏的小技巧
  13. DY(抖音)、KS(快手)、西瓜、知乎等批量去水印小程序版本可视化版本
  14. word将参考文献序号改为上标
  15. 学生管理系统(web版)
  16. Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)
  17. python改了代码没有生效,Python源代码更改不出现在程序执行中
  18. 【0】STM8——————STVD编译工具安装与程序下载
  19. python内存管理三大技术——内存池技术,引用计数器,垃圾回收
  20. Type-C转HDMI线究竟有何妙用?乐得瑞Type-c转HDMI方案讲述

热门文章

  1. Decision Tree决策树
  2. 2022年PYTHON应用行业,PYTHON就业方向
  3. “大数据杀熟”将被明令禁止:亚马逊才是大数据杀熟算法的鼻祖
  4. css直角线_CSS秘密花园:折角效果
  5. 贪心高性能神经网络与AI芯片~学习笔记总计1
  6. 从“老公”的称呼来历,看男人地位的变迁!
  7. 微信公众号迁移公证办理流程
  8. 网咖服务器cpu占用率高,CPU温度过高为什么会卡?
  9. overlay/static/register/atuo/extern/volatile/const 修饰符的用法
  10. 远程服务器 Linux 用cityscape训练DeepLabv3模型(Pytorch版)并用图像测试