linux线程调度方式测试总结

2023-05-16

总结:对三种线程调度方式进行测试。

1.SCHED_OTHER:分时调度策略,为默认方式,凡是采用本模式的线程,线程优先级会强制为0,通俗点将,工作在本模式下的线程,都在同一优先级下。所谓的“分时调度策略”,可以理解为线程执行一次后主动放弃CPU,线程调度一次,执行下一个线程。测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>

void *Thread1(void* pp)
{
  sleep(1);
  int i,j;
  int policy;
  struct sched_param param;
  pthread_getschedparam(pthread_self(),&policy,&param);
  if(policy == SCHED_OTHER) printf("SCHED_OTHER 1\n");
  if(policy == SCHED_RR)  printf("SCHED_RR 1 \n");
  if(policy==SCHED_FIFO)  printf("SCHED_FIFO 1\n");

  //for(i=1;i<1000;i++)  
  while(1)
  {
  i++;
    for(j=1;j<5000000;j++)
    {
    }
    //printf("t1-%d", i);
    printf("1");
    if(i%100 == 0) printf("\n");
  }
  printf("Pthread 1 exit\n");
}

void *Thread2(void* pp)
{
  sleep(1);
  int i,j,m;
  int policy;
  struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,&param);
 if(policy == SCHED_OTHER) printf("SCHED_OTHER 2\n");
  if(policy == SCHED_RR)  printf("SCHED_RR 2\n");
  if(policy==SCHED_FIFO)  printf("SCHED_FIFO 2\n");

  //for(i=1;i<1000;i++)
  while(1)
  {
  i++;
    for(j=1;j<5000000;j++)
    {
      
    }
    //printf("t2-%d", i);
    printf("2");
    if(i%100 == 0) printf("\n");
  }
  printf("Pthread 2 exit\n");
}

void *Thread3(void* pp)
{
  sleep(1);
  int i,j;
  int policy;
  struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,&param);
 if(policy == SCHED_OTHER) printf("SCHED_OTHER 3\n");
  if(policy == SCHED_RR) printf("SCHED_RR 3\n");
  if(policy==SCHED_FIFO) printf("SCHED_FIFO 3\n");

  //for(i=1;i<1000;i++)
  while(1)
  {
    i++;
    for(j=1;j<5000000;j++)
    {
    }
    //printf("t3-%d", i);
    printf("3");
    if(i%100 == 0) printf("\n");
  }
  printf("Pthread 3 exit\n");
}

int main()
{
    int i;
    i = getuid();
    if(i==0)
        printf("The current user is root\n");
    else
        printf("The current user is not root\n");

    pthread_t ppid1,ppid2,ppid3;
    struct sched_param param;

    pthread_attr_t attr1,attr2,attr3;

    pthread_attr_init(&attr1);
    pthread_attr_init(&attr2);
    pthread_attr_init(&attr3);
    
#if 0        
    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr1,SCHED_RR);
    pthread_attr_setschedparam(&attr1,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_RR);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_RR);
    pthread_attr_setschedparam(&attr3,&param);
    pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话
#endif

    pthread_create(&ppid1,&attr1,Thread1,NULL);
    pthread_create(&ppid2,&attr2,Thread2,NULL);
    pthread_create(&ppid3,&attr3,Thread3,NULL);

    pthread_join(ppid1,NULL);
    pthread_join(ppid2,NULL);
    pthread_join(ppid3,NULL);    
    while(1) {           
        sleep(100);
        printf("main loop\n");
    }
    
    pthread_attr_destroy(&attr1);
    pthread_attr_destroy(&attr2);
    pthread_attr_destroy(&attr3);
    return 0;
}

测试结果如下,每个线程执行一次就进行一次线程调度。

2.SCHED_FIFO:实时调度策略,先到先服务(优先级和启动顺序,优先级高的先到,同一优先级下,先创建的线程先到)。

   线程优先级不同:优先级高的线程永远占据CPU,不进行调度。除非主动放弃CPU(线程挂起、休眠等);

   线程优先级相同:最先启动的线程永远占据CPU,不进行调度。除非主动放弃CPU(线程挂起、休眠等);

#if 1        
    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr1,SCHED_FIFO);
    pthread_attr_setschedparam(&attr1,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_FIFO);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_FIFO);
    pthread_attr_setschedparam(&attr3,&param);
    pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话
#endif

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

 线程优先级不同:优先级高的线程永远占据CPU,不进行调度。除非主动放弃CPU(线程挂起、休眠等);

 线程优先级相同:每个线程执行一段时间(时间片),时间到了之后。线程调度,执行一下个排队线程;

#if 1        
    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr1,SCHED_RR);
    pthread_attr_setschedparam(&attr1,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_RR);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_RR);
    pthread_attr_setschedparam(&attr3,&param);
    pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话
#endif

 

 

 

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

linux线程调度方式测试总结 的相关文章

  • ST-LINK 到 SWD接线图

    1 ST LINK的外形图如下图所示 xff1a 2 接口引脚顺序定义如下图所示 xff0c 注意缺口位置 3 具体引脚定义如下图所示 4 ST LINK 到 SWD接线 SWD接口一般4个引脚 xff0c 分别为 xff1a 电源正 TC
  • MSCKF-vio源码阅读

    作为一个菜狗来说 xff0c 一开始弄明白kf ekf等滤波方法实属不易 xff0c 但是一旦理解原理之后再发散到基于滤波的状态估计方法 xff0c 学习起来就会事半功倍 xff0c 就像导航包中的robot pose ekf xff0c
  • R3Live系列学习(二)FAST-LIO源码阅读

    在上一篇我们提到 xff0c livox雷达给业界内的3D激光领域提供了一大补充 xff0c 而loam livox在温柔的使用下表现也还不错 xff0c 但在比较颠簸激烈的环境下也难以维持高精度 xff0c 因此lidar与imu的结合使
  • mkdir -m 777 tt 创建777属性的文件

    mkdir m 777 tt 创建777属性的文件 转载于 https www cnblogs com todayORtomorrow p 10486514 html
  • 妄图用多线程控制ROS的消息回调函数的输出-_-!

    今天需要用一个标志位来决定回调函数是否执行 xff0c 那这边先写一个chatter的publish xff0c 10Hz外发 xff1b 这边准备额外多一个线程控制唤醒回调函数 首先在接收节点程序中 xff0c 写一个互斥锁和条件变量 x
  • 韦东山:机会总是留给有准备的人(转)

    最近电子发烧友 xff08 以下称 39 发烧友 39 xff09 采访了韦东山老师 xff0c 本文是采访原稿 xff0c 展示出来让大家更深入了解韦老师的同时也进一步学习嵌入式Linux经验 机会总是留给有准备的人 发烧友 为什么要学习
  • MYSQL:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    使用Qt5 11 0运行代码时 xff0c 在对表进行操作时出该错误 xff0c 报错为 xff1a Expression 2 of SELECT list is not in GROUP BY clause and contains no
  • Ubuntu 20.04 搜狗输入法安裝

    本文基于 解决Ubuntu 18 04中文输入法的问题 xff0c 安装搜狗拼音 修改 参考 ubuntu 20 04 安装好搜狗输入法无法输入中文 xff0c 只能输入英文的问题 xff0c 因为没有安装依赖 如果本篇还解决不了问题 xf
  • www服务

    www服务 1 概述 1 1 WWW服务简介 www服务全称为World Wide Web xff0c 常称为Web xff0c 中文译为 万维网 它是目前互联网上最受用户欢迎的信息服务形式 HTTP协议的WWW服务应用的默认端口为80 x
  • NUC11 PAHi5 拆机及清理灰尘

    这个NUC买了两年了 xff0c 现在正值春天 xff0c 温度还算适中 xff0c 20度左右 xff0c NUC就挂了两个下载任务 xff0c 开了网页 xff0c 风扇就狂转不停 xff0c 一查看cpu温度达到了70度 xff0c
  • 华为云服务器使用教程

    华为云服务器初始化 账户密码初始化远程登录的问题命令行界面登录文件传输图形界面win10的远程桌面登录centos6 账户 账户根据你选择的服务器的系统来定 xff0c 如果是Linux则是root xff0c 如果是windows则是ad
  • 一劳永逸解决Matplotlib中文和负号显示错误并给出RuntimeWarning的问题

    出错情况 xff1a 提示 xff1a RuntimeWarning Glyph XXXXX missing from current font font set text s 0 0 flags 61 flags 同时中文 负号以方框代替
  • 使用Python实现二分图的KM算法在出租车订单匹配上的应用

    1 需求 想要使用Python实现一个出租车仿真环境 xff0c 其中每个时间窗口内产生的request及其周围的taxi满足一个二分图的关系 原本计划request与taxi之间的匹配按照接客时间权值最小为目标进行匹配 xff0c 但是后
  • 人脸识别Haar算法总结

    参考https blog csdn net zhangbijun1230 article details 81676792
  • 【转帖】【详细】Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品...

    notepad 43 43 简介 Notepad 43 43 是旨在替代Windows默认的notepad而生 xff0c 比notepad的功能强大很多很多 Notepad 43 43 有两个版本 xff0c 一个是ANSI版本 xff0
  • stm32--工程结构的简单理解

    作为一个新手入门stm32的同学 xff0c 我也就做了一个比较简单的工程 xff0c 但是感觉自己并没有对这个stme32有一个比较好的理解 xff0c 因此 xff0c 由于工作原因 xff0c 需要帮别人调试程序 xff0c 在移植工
  • FreeRTOS移植STM32

    第一步 xff1a FreeRTOS官网 https www freertos org https www freertos org 第二步 xff1a OS移植文件 复制 FreeRTOSv202104 00 FreeRTOS Sourc
  • freeOS-----primask faultmask basepri中断屏蔽寄存器

    primask暂时屏蔽中断寄存器 在许多应用中 需要暂时屏蔽所有的中断一执行一些对时序要求严格的任务 这个时候就 可以使用 PRIMASK 寄存器 PRIMASK 用于禁止除 复位 NMI 不可屏蔽中断 和 HardFalut 硬故障寄存器
  • freeOS快速笔记-----任务4种状态

    运行态 当一个任务正在运行时 那么就说这个任务处于运行态 处于运行态的任务就是当前正在 使用处理器的任务 如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态 就绪态 处于就绪态的任务是那些已经准备就绪 这些任务没有被阻
  • freeOS笔记-----列表与列表项

    xff08 2 xff09 uxNumberOfItems 用来记录列表中列表项的数量 xff08 3 xff09 pxIndex 用来记录当前列表项索引号 用于遍历列表 xff08 4 xff09 列表中最后一个列表项 用来表示列表结束

随机推荐

  • FreeRTOS快速笔记————队列

    队列 xff08 任务之间 全局变量 xff09 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行 消息传递一般使用全局变量的
  • FreeRTOS快速笔记——信号量

    信号量的阻塞时间 单位是系统的节拍周期configTICK RATE HZ 为100 xff0c 则系统节拍时钟周期为10ms xff0c 设置0就是不等待 xff0c 设置1 无限就是按时钟节拍算时间 xff0c 设置portMAX DE
  • Python获取Excel中超链接并下载至本地

    在这一任务的处理中 xff0c 我是用的是 xlrd模块 xff0c 它是用来读取Excel表格数据的模块 特别注意 xff1a 高版本的xlrd目前去除了对xlsx格式的支持 xff0c 仅支持 xls格式 xlrd biffh XLRD
  • MATLAB:梯度下降法求解一元和多元函数极小值和极大值

    梯度下降法 xff0c 顾名思义即通过梯度下降的方法 对于一个函数而言 xff0c 梯度是一个向量 xff0c 方向是表示函数值增长最快的方向 xff0c 而大小则表示该方向的导数 下面展示了用梯度下降法求解一元函数的MATLAB代码 xf
  • 根据Qfont中的family 得到字体文件的路径和文件名称

    转载 xff1a https www zhihu com question 25834024 根据Qfont中的family 得到字体文件的路径和文件名称 xff1b 源码 xff1a 头文件 include include include
  • 如何修改DirectUIHWND类里控件的数据

    有成功修改SysTlistView32 SysTreeVier32 ListVier32 Static类的方法 但对VISTA系统的DirectUIHWND类 没有好的办法 恳请高人指教
  • Jeston-TX2和小觅智能魔方安装tensorflow和keras

    1 下载TensorFlow离线文件 根据自己的JetPack版本在下面链接中选择对应的tensorflow 链接为tensorflow下载链接 如图所示 2 使用pip安装TensorFlow xff0c 如果是Python2用pip2
  • 2023python自动化抢单茅台

    2023python自动化下单抢茅台 xff08 小白篇 xff09 提前声明 本人实测一周 xff0c 均以失败告终 网络超时 当前人数过多等等原因 人格担保程序没有问题 xff0c 毕竟天底下那有这么好的事 最终结果不是重要的 xff0
  • [React] 核心属性refs—— 需要注意的问题

    官网链接 xff1a Refs and the DOM React 1 避免使用字符串的ref 什么是字符串的ref lt button ref 61 34 test 34 gt lt button gt ref所赋予的值是一个字符串 官方
  • AIDL-JNI-HIDL

    Android项目开发经常会遇到各种概念性的技术 AIDL xff08 Android Interface definition language xff09 Android中的一种IPC xff08 Inter Process Commu
  • Android Verified Boot

    Android Verified Boot 验证程序用来保护用户使用软件在设备上运行的完整性 它通常从设备固件的只读部分开始 xff0c 该部分加载代码并仅在密码验证代码是真实的且没有任何已知的安全缺陷之后执行 AVB是经过验证的引导的一种
  • Android快速编译镜像

    make bootimage 编译bootimagemake vendorimage编译 vendorimagemake dtboimagedtbo ninja快速编译系统 xff08 前提是编译部分的Android mk没有改变 xff0
  • nuttx-概述

    早期基于MSP430系列 STM32系列 EFM32系列 AT91SAM9X imx6ul系列做各种物联网产品 xff0c 近几年国芯片慢慢崛起 xff0c 加上ST芯片价格暴涨 xff0c 更是让国产芯片赢得了难得的发展机会 xff0c
  • nuttx-环境搭建

    尽管nuttx主要遵循Posix 和 ANSI 标准 xff0c 但是毕竟向下支持到了STM32F1系列的芯片 xff08 不带MMU xff09 xff0c 所以这个操作系统本质上还是一个微操作系统 下面从helloworld开始 官网
  • nuttx-第一个app demo

    应用开发 xff0c 与ucos freeRTOS等完全不一样 xff0c 看起来更像是linux的方式 xff0c os与app独立开发 xff0c 但是从单片机不具备MMU这一点就能判断出来 xff0c 假的就是假的 xff0c 即便是
  • nuttx-app的编译和执行原理

    首先阅读apps readme md Built In Applications NuttX also supports applications that can be started using a name string In thi
  • 如何远程登录ubuntu图形界面

    Server u need XDM service client u need exceed xwin32 Here is an instruction I found long time ago when I played with it
  • 网络操作系统 第十三章 邮件服务器及其安装与配置

    1 简述电子邮件的工作原理 用户编辑的E mail被转换成一个标准的邮件格式 xff0c 包括各种样式的文件 xff0c 如图像 声音 可执行程序等 邮件的内 容以各种编码方式转换成ASCII码的形式 xff0c 邮件的接收人地址由 用户名
  • nuttx-OS启动前的准备工作

    程序的基本编译过程为 xff1a 预处理 编译成汇编语言 汇编成机器指令 链接成可执行文件 xff0c 链接依赖于链接脚本 xff0c 使用链接脚本来进行更复杂的地址设置 xff0c 包括了代码段 xff0c 数据段 xff0c bss段等
  • linux线程调度方式测试总结

    总结 xff1a 对三种线程调度方式进行测试 1 SCHED OTHER 分时调度策略 xff0c 为默认方式 xff0c 凡是采用本模式的线程 xff0c 线程优先级会强制为0 xff0c 通俗点将 xff0c 工作在本模式下的线程 xf