当前位置:首页 > > 嵌入式微处理器
[导读]“我的人品有这么差吗!半个小时Linux都没调度我的线程!”。


1. 前言

“我的人品有这么差吗!半个小时Linux都没调度我的线程!”。

前些日子同事抱怨,“linux是多线程系统,每个线程都有一个时间片,为什么我的程序似乎一直没被调度”,随即给我演示执行过程。大致归纳成下面的代码逻辑。

程序启动后仅仅输出一行“run”,然后就没有然后了,喝着咖啡、嗑着瓜子、带薪摸鱼,屏幕上干干净净。理想状态下每10秒执行任务完毕后输出“do”。

分析代码逻辑可知 “推断” 代码是否被运行的依据是屏幕上输出 “do” ,”而这真的科学吗?答案是否定的,linux有着雨露均沾的调度系统,很难做到半小时没被调度。问题就出在linux的 “行缓冲”机制 。

void main(){ printf("run\n"); while(1) { sleep(10); do_thing(); printf("do"); }}
2. 行缓冲


上文的printf输出目标设备由STDOUT指定,STDOUT可能指向115200波特率的串口设备,也可能指向本地图形设备,相对于CPU而言他们的速度要慢上几个数量级。都是为了提高机器或者程序的性能、提高CPU利用率。协调高速设备和低速设备之间速度的不匹配,操作系统默认在标准I/O上采用行缓冲机制,printf的内容首先存储在内存,当缓冲填满或检测到换行符’’时则输出到目标设备。

Linux上这个行缓冲默认是1024Byte,每10s输出do占用2Byte,为了等待缓冲填满需要等待81min。

知道原理后解决方法就简单了。

方法1:fflush强制刷新标准输出stdout

#include void main(){ printf("run\n"); while(1) { sleep(10); do_thing(); fflush(stdout); printf("do"); }} 

方法2:输出“换行符”

#include void main(){ printf("run\n"); while(1) { sleep(10); do_thing(); printf("do\n"); }}


END

来源:写个解,作者:吴解君

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

嵌入式ARM

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在工业质检、安防巡检等边缘场景中,智能相机需要同时完成图像采集、实时处理和AI推理。传统方案要么用高性能CPU(功耗高),要么用NPU(灵活性差)。FPGA+Linux的异构架构正好取长补短:FPGA负责像素级流水线处理...

关键字: FPGA Linux 智能相机

在现代操作系统的运行逻辑中,内存资源的分配与调度直接决定了整个系统的运行效率和稳定性,而Linux的虚拟内存空间管理体系,正是支撑多进程并发运行、保障内存资源高效复用的核心机制。很多开发者在日常开发中只关注malloc这...

关键字: Linux 虚拟内存

在之前的系列底层技术文章中,我们先后探讨过CPU Cache伪共享、内存模型、堆与栈内存差异、高效内存池等系统级核心主题,而挂载作为Linux文件系统体系中最基础也最容易被误解的核心机制,是所有存储设备能够被用户正常访问...

关键字: Linux 挂载

在我的上一篇项目文章中,我介绍了使用 AMD 新的 Yocto 工作流结合 EDF(嵌入式开发框架)为 Kria SoM 构建嵌入式 Linux 镜像的基本步骤。该项目详细说明了克隆 AMD Yocto 项目的流程,包括...

关键字: 嵌入式 Linux FPGA

在Linux系统中,我们在终端输入一条命令按下回车,几毫秒后程序就开始运行。很多开发者每天都在执行各类可执行文件,却很少深究背后的细节:磁盘上一个静态的ELF二进制文件,是如何一步步变成内存中活跃的进程?为什么物理内存明...

关键字: Linux 虚拟内存

在嵌入式Linux开发中,同时支持多款ARMv8-A硬件平台是一个常见但不易做好的需求。每款开发板都有自己独特的Bootloader、内核配置、设备树和用户态驱动,若为每款板卡独立维护一套构建配置,维护成本会随硬件种类线...

关键字: Linux Yocto

嵌入式Linux系统的构建是一场与资源的持久博弈。当项目只需要网络通信与GPIO控制时,承载完整桌面环境的发行版无异于用卡车运信封。Buildroot作为一套基于Makefile和Kconfig的自动化构建工具,以&qu...

关键字: Buildroot Linux

IBM Z和LinuxONE 5强大的单机柜和机架式产品,以及全新的AI与自动化软件升级,助力企业更灵活地部署工作负载。 北京2026年7月8日 /美通社/ -- ...

关键字: IBM Linux 数据中心 BSP

本项目的目标是使用 Buildroot 为树莓派 Zero W 开发一个定制的嵌入式 Linux 发行版。系统设计仅包含应用程序所需的基本组件,例如 Wi-Fi 连接、SSH 和 SCP 访问、I2C 支持以及 Pyth...

关键字: Linux 树莓派 显示屏 SSD1306

官方Arduino UNO Q是一款性能强大的开发板。与传统微控制器不同,它采用“双脑”架构:搭载高通® Dragonwing™ MPU,运行Linux Debian系统,用于处理复杂的AI和计算任务;同时配备STM32...

关键字: 仪表板 STM32微控制器 Linux
关闭