Linux线程调度

2023-05-16

      对于一个嵌入式多任务、多线程操作系统,所启动的应用进程至少拥有一个线程或多个线程,线程在进程中执行代码。一个进程能够“同时”运行多个线程,“同时”加上引号,因为实际上,在单处理CPU平台上,任何时刻,只有一个线程在执行。操作系统通过任务调度算法快速切换线程来模拟多线程并行,交替地停止一个线程,然后切换到另外一个上运行。支持任务优先级,高优先级线程比低优先级线程更先执行,也就是说低优先线程必须等到高优先级线程被阻塞挂起后才可能被调度。对于优先级别相等的线程使用轮换算法来调度。

 

       无论是WinCE还是Linux操作系统,应用线程的运行总是涉及到两个基本的参数:一个是系统分配给线程的时间片,一个是系统调度的时间间隔。Linux和WinCE下这两个参数有所不同,如下表所示:

 

 

WinCE

嵌入式Linux

 线程的运行时间片

100ms

10ms

 系统调度间隔

1ms

10ms

 

       这里需要注意的是,线程不一定需要将时间片完全用完,事实上,在嵌入式系统中,线程的运行处理时间通常都远小于所分的时间片,这时线程应当调用相关系统函数将自己挂起,系统将立即进行线程重调度。这时的重调度实际是加快了各个线程的轮片,提高了多线程并行运行的程度,客观上保证了嵌入式设备的实时响应能力。

 

       如果线程运行处理的时间超过了系统分配的时间片,在到达时间片后系统将强制挂起该线程,进行任务调度,以保证其他线程的运行。所以在多任务的程序设计中,特别忌讳线程中出现长时间查询代码,如:


while( bFlag == FALSE ) 

        //Polling Flag… 
}


       这种代码总是占完了时间片,大大地浪费CPU资源,使得整个进程的线程调度变得很慢,比如对于WinCE来说,就会出现100ms才调度一次,如果有10个这样的线程,意味着每个线程需要1s才能轮询一次,在嵌入式应用中,就很容易出现数据丢失等错误,从而无法实现正常的功能。对于Linux也是存在同样的问题。

 

       在实际应用中,常用的挂起线程的方法是调用延时函数。对于WinCE,调用Sleep( ms )函数;对Linux,可以调用select()函数来挂起当前线程。由于系统的调度间隔不一样,对相同的挂起时间,系统会有不同的处理。比如,设置挂起时间为2ms,在WinCE中,将在挂起2ms之后的1ms后,被系统重新调度;在Linux中,由于调度间隔大于挂起的时间,所以系统将在线程挂起10ms之后才被重新调度,也就是说在Linux下,无论程序中设置的挂起时间2ms还是9ms,该线程实际被挂起的时间总是10ms。


 

线程的调度策略分为3个:SCHED_OTHER,SCHED_FIFO,SCHED_RR。


SCHED_OTHER是非实时分时调度策略,线程优先级为0;


试验结果(linux2.6 Montavista5.0):每个线程都不能强占其它线程,但是线程都受到时间片的限制,并不是线程不主动退出(包括被阻塞),就会一直占用。


但是在sun公司的 《多线程编程手册》中,其说这种情况线程会一直占用。


SCHED_FIFO是实时先进先出调度策略,即一当占用CPU,除非自己阻塞或结束或有更高优先级线程,否则会一直运行,线程优先级为1-99;


线程会按不同的优先级来分为不同的队列,同优先级的线程是按FIFO来调度的。


SCHED_RR是实时分时调度策略,其不会一直占用CPU,运行一个时间片后会让出CPU给自己同优先级的线程;其实SCHED_RR与SCHED_FIFO基本是相似的,只是前者会受到时间片的限制,相同优先级的线程,用时间片来调度。而FIFO的话,正在运行的线程,是不会被其他同优先级线程强占的,除非自己主动退出或被阻塞。所以在采用FIFO策略时,千万别使用一直占用的线程(不主动退出,也没有挂起的条件),否则其他同优先级线程永远不会运行了。这种情况最好使用RR策略。


指出:SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。实时调度策略会抢占非实时调度策略,即只要有SCHED_FIFO或SCHED_RR这两个实时调度策略的线程,像SCHED_OTHER的非实时调度策略的线程就不会得到运行,除非所有的实时调度策略的线程阻塞或结束。


 

Linux线程优先级设置

  首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:

 

int sched_get_priority_max(int policy); 
int sched_get_priority_min(int policy);

 

  SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。

  设置和获取优先级通过以下两个函数:

 

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

 

  例如以下代码创建了一个优先级为10的线程:

 

struct sched_param 

     int __sched_priority; //所要设定的线程优先级 
};

 

  例:创建优先级为10的线程

 

pthread_attr_t 
attr; 
struct sched_param param; 
pthread_attr_init(&attr); 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
param.sched_priority 10; 
pthread_attr_setschedparam(&attr, ¶m); 
pthread_create(xxx &attr xxx xxx); 
pthread_attr_destroy(&attr);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux线程调度 的相关文章

  • 2023年团体程序设计天梯赛(含部分题解)

    目录 个人总结 L1 1 最好的文档 xff08 模拟 xff09 AC代码 xff1a L1 2 什么是机器学习 xff08 模拟 xff09 AC代码 xff1a L1 3 程序员买包子 xff08 模拟 xff09 AC代码 xff1
  • ProtoBuf 与 gRPC 你需要知道的知识

    ProtoBuf 是一套接口描述语言 xff08 IDL xff09 和相关工具集 xff08 主要是 protoc xff0c 基于 C 43 43 实现 xff09 xff0c 类似 Apache 的 Thrift xff09 用户写好
  • Hyperledger Fabric 1.0 安装和使用

    注意 xff1a 代码路径已更新 xff0c 可以直接参考 https github com yeasy docker compose files tree master hyperledger fabric Hyperledger Fab
  • go 依赖管理利器 -- govendor

    长期以来 xff0c golang 对外部依赖都没有很好的管理方式 xff0c 只能从 GOPATH 下查找依赖 这就造成不同用户在安装同一个项目适合可能从外部获取到不同的依赖库版本 xff0c 同时当无法联网时 xff0c 无法编译依赖缺
  • 1、ROS服务PID调试;

    首先查看代码内容 ub 64 ub span class token operator span span class token operator span span class token operator span omniWheel
  • 嵌入式之总线协议:1、UART

    嵌入式之总线协议 xff1a 1 UART 目录 第一章 UART 帧格式讲解 第二章 UART 寄存器讲解 第三章 UART 编程 第四章 输出重定向 第五章 RS232 RS485协议原理与应用 第一章 UART 嵌入式之总线协议 xf
  • Ubuntu18.04分辨率只有1024*768的多种解决办法

    文章目录 前言一 检查驱动1 1 检查驱动1 2 解决办法 二 其他解决办法2 1 修改Grub文件的方法2 2 通过xrandr指令操作 前言 关机 xff0c 再开机以后 xff0c 进入系统界面自动变成了1024x768的分辨率 xf
  • 梦想机器人实验室:第一节嵌入式学习指导

    参考资料 xff1a 实验室集训回放 嵌入式入门与进阶之旅 哔哩哔哩 bilibili 2条消息 单片机 嵌入式 最完整学习路线 单片机学习 嵌入式修行者的博客 CSDN博客 1 联合培训资料 大纲 电路设计训练营 xff08 四期 xff
  • java代码编写菜鸟心得(一)

    1 代码艺术之一 xff1a High Cohesion Low Coupling 函数功能要明确 xff0c 若此函数内部内容太多 xff0c 称其为大函数 xff0c 则可以从中抽取一些小函数 小函数的要求 xff1a 完成独立的功能
  • 在linux下真机调试android程序

    在linux里面 xff0c 模拟器可以直接识别 xff0c 使用adb也没有限制 xff0c 但是手机插上usb之后 xff0c adb并不识别 xff0c 显示的是问号 xff0c 在eclipse里面也是这样 解决方法如下 xff1a
  • 【号外】拳王阿里去世 头部一生遭受29000次重击

    74岁的一代拳王穆罕默德 阿里因病辞世 职业拳击生涯中 xff0c 阿里头部受到的29000多次的重击 新浪娱乐讯 6月4日消息 xff0c 据外国媒体报道 xff0c 74岁的一代拳王穆罕默德 阿里与美国菲尼克斯当地时间本周五 3日 去世
  • maven报错: ‘parent.relativePath‘ of POM xxx

    错误信息 xff1a 39 parent relativePath 39 of POM io renren renren fast 3 0 0 D renren fast pom xml points at com gwh gulimall
  • 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历

    今天给大家转载一篇朋友的文章 xff0c 朋友是一位非常优秀的公众号作者 xff0c 也是一名在校生 文章讲述了他的春招面试经历 xff0c 很多东西值得大家学习 废话不多说 xff0c 下面开始正文 xff08 互联网侦察做了一些注释 x
  • 记一次Linux被入侵,服务器变“矿机”全过程

    周一早上刚到办公室 xff0c 就听到同事说有一台服务器登陆不上了 xff0c 我也没放在心上 xff0c 继续边吃早点 xff0c 边看币价是不是又跌了 不一会运维的同事也到了 xff0c 气喘吁吁的说 xff1a 我们有台服务器被阿里云
  • 二分搜索只能用来查找元素吗?

    预计阅读时间 xff1a 6 分钟 二分查找到底能运用在哪里 xff1f 最常见的就是教科书上的例子 xff0c 在有序数组中搜索给定的某个目标值的索引 再推广一点 xff0c 如果目标值存在重复 xff0c 修改版的二分查找可以返回目标值
  • 2020员工数将超阿里腾讯!字节创始人张一鸣说:当下更需专注,未来值得期待...

    刚刚 xff0c 有一家互联网公司宣布2020年员工人数要超过阿里 腾讯 xff0c 这就是字节跳动 xff01 张一鸣近日发了一封全员信 xff1a 字节跳动8周年 xff1a 往事可以回首 xff0c 当下更需专注 xff0c 未来值得
  • 字节跳动 前端面经(4轮技术面+hr面)

    作者 xff1a 甘先森 https juejin im post 5e6a14b1f265da572978a1d3 笔者读大三 xff0c 前端小白一枚 xff0c 正在准备春招 xff0c 人生第一次面试 xff0c 投了头条前端 xf
  • 就是你把所有代码全写在一个类里的?

    来源 https urlify cn 6jQRN3 最近 xff0c 在对已有项目进行扩展的时候 xff0c 发现要改动的一个类它长900行 xff0c 开放了近40个public接口 xff0c 我流着泪把它给改完了 为了防止这样的惨剧再
  • 如何实现一个高性能可渲染大数据的Tree组件

    作者 xff1a jayzou https segmentfault com a 1190000021228976 背景 项目中需要渲染一个5000 43 节点的树组件 xff0c 但是在引入element Tree组件之后发现性能非常差
  • 白剽,2020年最牛AI技术,各个都有代码

    来源 xff1a Reddit 编辑 xff1a 科雨 2020年 xff0c 想必各国的人民都被新冠病毒支配得瑟瑟发抖 不过 xff0c 这并不影响科研工作者的工作态度和产出质量 疫情之下 xff0c 通过各种方式 xff0c 全球的研究

随机推荐

  • 图解:卷积神经网络数学原理解析

    原标题 Gentle Dive into Math Behind Convolutional Neural Networks 作 者 Piotr Skalski 编 辑 Pita 翻 译 通夜 xff08 中山大学 xff09 had in
  • 【第二弹】这可能是进达摩院最好的机会了!

    很长时间没有更新公众号了 xff0c 最近在准备一些其他节目 xff0c 和小伙伴们说声抱歉了 但是 xff0c 虽然近期没有文章 xff0c 福利是不能少的 早在半年前 xff0c 我发过一篇文章 xff1a 这可能是进达摩院最好的机会了
  • Hadoop入门-WordCount示例

    WordCount的过程如图 xff0c 这里记录下入门的过程 xff0c 虽然有很多地方理解的只是皮毛 Hadoop的安装 安装比较简单 xff0c 安装完成后进行单机环境的配置 hadoop env sh 指定JAVA HOME spa
  • Phaser入门教程

    入门教程 xff0c 我可不会讲什么概念 xff0c 我只会讲一个入门例子 xff0c 通过这个例子 xff0c 你就知道 phaser有多么强大 xff0c 而照着这个例子做 xff0c 你就能知道怎么使用 phaser了 需要说明的是
  • IDEA插件activiti工具actiBPM

    最新的IDEA中Marketplace搜索不到actiBPM xff08 2020 2 xff09 离线安装 下载https plugins jetbrains com 选择版本 导入jar 重启IDEA 验证 右键新建 表明添加成功 使用
  • 【内推找我】阿里社招面试16轮,终于拿到offer(2020年2月更新)

    内推私信我 xff0c 标题党了 xff0c 其实是这么回事 一 背景及原因 个人背景 xff1a 17年普本毕业Java开发 想换工作原因 xff1a 19年7月公司裁员了一波 xff0c 内部较动荡 xff0c 想看看外面机会 xff1
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • 网络编程——Socket(套接字)

    网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯 网络编程中 有两个主要的问题 xff0c 一个是如何准确的定位网络上一台或多台主机 xff0c 另一个就是找到主机后 如何可靠高效的进行数据传输 在TCP IP协议
  • 【Linux 驱动】netfilter/iptables (三) 注册和注销Netfilter hook

    继前面介绍了 netfilter hook xff0c 这里我们开始进行简单的实例讲解 xff0c 主要是Netfilter hook的注册与注销 xff1a wqlkp c xff1a span class hljs preprocess
  • Uboot网络设备驱动(一)---两种连接架构

    本系列将针对NXP的s32v234芯片及s32v234evb开发板讲解Uboot中网络相关的设备驱动程序 本文前提是你有基本的计算机网络知识 xff08 TCP IP协议及OSI ISO七层网络协议 xff09 一般BSP工程师涉及的主要工
  • ESP8266物联网远距离控制实现

    ESP8266物联网远距离控制实现 转载请注明出处 xff01 重要的事情放在前面源码在GitHub上面欢迎issue xff0c 如果可以的话Star一下也是表示对作者的支持 有很多不足 xff0c 希望可以得到指教 https gith
  • JACK报错(Ensure Jack server is installed and started)&多用户编译

    目录 报错内容 报错原因 解决方法 备注 报错内容 20 4823 23656 Ensure Jack server is installed and started FAILED bin bash c 34 prebuilts sdk t
  • linux常用命令

    linux常用命令 pwd 查看当前工作目录的绝对路径 cat input txt 查看input txt文件的内容 cat v input txt 查看input txt文件的编码格式 sed
  • UML中类的关系:关联关系、聚合关系、依赖关系、泛化关系、实现关系

    一 关联关系 关联关系是一种结构化的关系 xff0c 指一种对象和另一种对象有联系 给定关联的两个类 xff0c 可以从其中的一个类的对象访问到另一个类的相关对象 在UML图中 xff0c 关联关系用一条实线表示 另外 xff0c 关联可以
  • 互补滤波

    互补滤波 加速度计对小车的加速度比较敏感 xff0c 取瞬时值计算倾角误差比较大 xff1b 而陀螺仪积分得到的角度不受小车加速度的影响 xff0c 但是随着时间的增加积分漂移和温度漂移带来的误差比较大 所以这两个传感器正好可以弥补相互的缺
  • Linux 网络通讯 : smbclient 命令详解

    smbclient命令属于samba套件 xff0c 它提供一种命令行使用交互式方式访问samba服务器的共享资源 语法 smbclient 选项 参数 选项 B lt ip地址 gt xff1a 传送广播数据包时所用的IP地址 xff1b
  • 云计算的三种部署模式:公有云、私有云、混合云

    随着云时代的到来 xff0c 慢慢的演化出了更有针对性的产品服务 xff0c 公有云 xff0c 私有云 xff0c 混合云 那么这三者之间有什么区别呢 xff1f 我们用打比方的方式来说明 例如我们来到一个城市需要睡觉 xff0c 就要去
  • 机器学习之随机森林(sklearn)

    文章目录 1 概述1 1 集成算法的概述1 2 sklearn中的集成算法 2 RandomForestClassfier2 1 重要参数2 1 1 控制基评估器的参数2 1 2 n estimators2 1 3 random state
  • AM5728 高性能计算(并行计算)OpenCL/OpenMP简介及测试

    一 OpenCL OpenMP简介 OpenCL Open Computing Language 是一个为异构平台编写程序的框架 xff0c 属于API xff0c 和OpenGL架构类似 xff0c 此异构平台可由CPU xff0c GP
  • Linux线程调度

    对于一个嵌入式多任务 多线程操作系统 xff0c 所启动的应用进程至少拥有一个线程或多个线程 xff0c 线程在进程中执行代码 一个进程能够 同时 运行多个线程 xff0c 同时 加上引号 xff0c 因为实际上 xff0c 在单处理CPU