当前位置:首页 > > 嵌入式微处理器
[导读]“我的人品有这么差吗!半个小时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 )。
换一批
延伸阅读

在Zynq MPSoC开发中,实现PS端Linux与PL端自定义IP核的AXI互联是构建高性能异构系统的关键环节。这种互联方式充分发挥了ARM处理器的软件优势与FPGA的硬件加速能力,为复杂应用提供了强大的计算平台。

关键字: Zynq MPSoC Linux

在物联网与智能设备飞速普及的当下,嵌入式系统的安全性与稳定性愈发关键。实时操作系统(RTOS)凭借其高确定性、低延迟的特性,成为工业控制、医疗设备、航空电子等安全敏感领域的核心支撑。而内存保护单元(MPU)作为硬件级安全...

关键字: Linux Windows

3月10日消息,2026年开年,一个名为OpenClaw的开源项目以闪电般的速度席卷了GitHub。它在短短一天内就斩获了9000颗星

关键字: OpenClaw Linux

3月6日消息,在摩根士丹利会议上,NVIDIA CEO黄仁勋分享了关于Agentic AI(代理式人工智能)转折点的见解,并将开源软件OpenClaw评价为“当代最重磅的软件发布”。

关键字: OpenClaw Linux

Linux内存管理是操作系统的核心机制之一,通过虚拟内存与物理内存的分离设计,实现了多进程内存隔离、高效资源利用和系统稳定性保障。

关键字: Linux 内存

在高并发服务器开发中,线程池(ThreadPool)已成为解决多任务调度的核心方案。其设计并非偶然,而是针对传统线程管理痛点的系统性优化。

关键字: 线程 操作系统

在Linux系统中,进程管理是内核的核心功能之一,其核心目标是通过高效的调度机制和进程切换技术,实现多任务并发执行。

关键字: Linux CPU

内核是操作系统的核心,它作为应用程序与硬件设备之间的"中间人",负责进程调度、内存管理、硬件通信和系统调用等关键功能。Linux和Windows作为全球使用最广泛的两大操作系统,其内核设计理念、架构和运行机制存在本质差异...

关键字: Linux Windows

在Linux系统中,当开发者使用mmap()系统调用将磁盘文件映射到进程的虚拟地址空间时,一个看似简单的指针操作背后,隐藏着操作系统内核与硬件协同工作的复杂机制。这种机制不仅突破了传统文件IO的效率瓶颈,更重新定义了内存...

关键字: Linux 文件IO 内存映射

在Linux驱动开发领域,持续集成与持续部署(CI/CD)流水线通过自动化流程将代码变更快速转化为可靠部署,而KernelCI与LTP测试套件的深度集成则成为保障驱动稳定性的关键技术组合。本文将从原理分析、应用场景及实现...

关键字: CICD流水线 Linux
关闭