电话: 邮箱:
博 学 而 笃 志   切 问 而 近 思 SEEK BROAD KNOWLEDGE · ASK EARNESTLY

ued体育

UED体育

UED体育中国官方网站入口 镶嵌式Linux--Linux梗阻与非梗阻I/O实验详解

发布日期:2026-05-13 00:45 来源:未知 作者:admin 浏览次数:

UED体育中国官方网站入口 镶嵌式Linux--Linux梗阻与非梗阻I/O实验详解

本实验聚焦Linux驱动开辟中至关弥留的梗阻与非梗阻I/O情势,中枢指标是治理早期轮询读取竖立(如按键)导致的CPU资源过度占用问题——此前轮询读取神志下,运用CPU占用率高达99.6%,而通过梗阻和非梗阻机制,可将CPU占用降至接近0%,大幅扶助系统遵循。

九游体育中国官网入口

一、中枢基础主见

1. 梗阻与非梗阻I/O内容

- 梗阻I/O:运用打听树就地,若竖立资源不行用,进度会插足睡眠情状让出CPU,直至竖立可用时被叫醒,才实施数据读取。这是竖立文献的默许打听情势,代码苟简,能幸免CPU空转挥霍。

- 非梗阻I/O:竖立不行用时,运用不会睡眠,而是复返非常码,由运用自主聘请握续轮询或解除。非梗阻打听需显式在open时添加`O_NONBLOCK`璀璨,适合需要主动查询、多竖立监控的场景。

2. 要津支握机制:恭候队伍

恭候队伍是达成梗阻I/O的中枢,崇敬经管睡眠与叫醒经由,中枢因素包括:

- 恭候队伍头:用`wait_queue_head_t`默示,需通过`init_waitqueue_head`开动化或用`DECLARE_WAIT_QUEUE_HEAD`径直界说开动化,是经管恭候进度的进口。

- 恭候队伍项:用`wait_queue_t`默示,对应具体恭候的进度,可通过`DECLARE_WAITQUEUE(name, tsk)`快速创建,tsk时常设为`current`(现时进度)。

- 中枢操作:

- 进度睡眠:通过`add_wait_queue`将进度对应的队伍项加入恭候队伍头,再将进度设为可中断睡眠态(`TASK_INTERRUPTIBLE`),调用`schedule`切换进度,达成睡眠。

- 叫醒进度:常用`wake_up_interruptible`,仅叫醒可中断睡眠的进度,幸免叫醒不行中断进度导致资源挥霍,该操作时常在中断处理函数中实施。

- 恭候事件:可用`wait_event_interruptible`等函数,让进度恭候特定条目欢娱(如按键灵验),条目不欢娱则梗阻,欢娱时自动叫醒。

3. 轮询机制与驱动协作

非梗阻打听依赖`select`、`poll`、`epoll`达成轮询,三者均通过调用驱动的`poll`函数完成竖立情状检测:

- select:受文献描绘符数目截止(默许1024),需遍历系数描绘符搜检情状,适合描绘符较少的场景。

- poll:无描绘符数目截止,通过`pollfd`结构体明确监视的事件,遵循优于select,是中小范围场景的常用聘请。

- epoll:适合大范围并发,继承事件驱动机制,遵循极高,常用于网络编程,本实验以select和poll为主。

当运用调用select或poll时,驱动需提供对应的`poll`函数,中枢操作是调用`poll_wait`将恭候队伍添加到轮询表中,并向运用复返竖立情状(如是否可读)。

二、梗阻I/O实验

1. 实验中枢诉求

第12章的中断实验中,运用通过while轮回+read不休读取按键,导致CPU占用率高达99.6%。梗阻I/O的中枢治梦想路是:无按键事件时让运用睡眠,有事件时叫醒,透彻开释CPU资源。

2. 驱动要津纠正

- 数据结构补充:在竖立结构体中新增`wait_queue_head_t r_wait`,用于经管恭候的进度队伍。

- 恭候队伍开动化:在驱动开动化函数中,调用`init_waitqueue_head`开动化恭候队伍头,为后续睡眠叫醒作念准备。

- read函数纠正:继承`wait_event_interruptible`让进度恭候按键灵验事件,若按键无效则插足可中断睡眠,幸免轮回轮询;若按键灵验,延续实施读取操作。同期支握另一种手动经管队伍的神志:通过`DECLARE_WAITQUEUE`创建队伍项,`add_wait_queue`加入队伍,`schedule`切换进度,叫醒后用`remove_wait_queue`移除队伍项,适配更复杂的场景。

- 中断叫醒逻辑:按键中断行状函数或定时器消抖函数中,检测到灵验按键事件后,ued官方网站调用`wake_up_interruptible`叫醒恭候队伍中的进度,让睡眠的运用延续实施读取操作。

3. 运用与测试

- 测试次第:径直复用第12章的运用,无需修改,因为默许open便是梗阻情势,运用会自动在无按键时睡眠。

- 运造孽果:加载驱动后运行测试次第,按下按键时平方打印键值,检察CPU占用率,从99.6%降至0.0%,仅在按键触发一会儿占用小数CPU,大幅扶助系统遵循。

三、非梗阻I/O实验

1. 驱动中枢适配

- 读取逻辑补充:在read函数中增多非梗阻判断,若open时添加了`O_NONBLOCK`璀璨,检测到无按键事件时,径直复返`-EAGAIN`非常码,不梗阻进度,让运用自主决定后续操作。

- poll函数达成:新增驱动的`poll`回调函数,中枢职责是调用`poll_wait`将恭候队伍加入轮询表,同期检测按键是否灵验,灵验时向运用复返`POLLIN`,见告稀有据可读,不然复返0,让运用解析竖立不行用。

- 操作集注册:在竖立文献操作结构体中,添加`poll`成员变量,指向达成的`poll`函数,确保运用调用select或poll时能触发驱动的对应逻辑。

2. 测试运用达成

测试运用提供两种非梗阻读取神志,适配不同轮询需求:

- poll神志:界说`pollfd`结构体,指定监视可读事件,通过`poll`函数轮询,超时树立为500ms。若复返值大于0,诠释竖立可读,调用read读取键值;若超时,实施自界说超时处理,达成带超时的轮询,幸免永劫辰空等。

- select神志:界说`fd_set`聚拢存放待监视的描绘符,树立500ms超时,调用`select`函数轮询。说明复返值判断:超时则自界说处理,出错则自界说处理,稀有据可读时用`read`读取键值,逻辑明晰,兼容老版块Linux系统。

3. 运造孽果

加载驱动并运行测试运用,按下按键时平方打印键值,检察CPU占用率,通常降至0.0%。由于继承了带超时的轮询,幸免了死轮回空转,仅在轮询和按键触发时滥用小数CPU,兼顾及时性与资源遵循。

四、实验回来与实践提出

1. 中枢对比

- 梗阻I/O:代码概况,CPU占用极低,开辟难度低,适合单任务、无需主动查询的苟简场景,是大大齐传感器、按键竖立的优先聘请。

- 非梗阻I/O:需协作select或poll使用,运用代码复杂度略高,但支握多竖立和洽监控,适合需要同期经管多个竖立、事件驱动的场景,比如同期监控按键、网络和串口的次第。

2. 避坑重心

- 系数不容在运用层用while轮回+read径直轮询,这是CPU高占用的根源,系数轮询必须通过梗阻或select/poll达成。

- 梗阻I/O需严格配对睡眠与叫醒操作,幸免只睡眠不叫醒导致进度持久梗阻,叫醒操作必须放在中断等确保竖立可用的时机实施。

- 非梗阻I/O的poll函数需合理复返竖立情状UED体育中国官方网站入口,幸免情状判断非常导致运用轮询逻辑失效,超时时代需说明执行场景合理树立,均衡反映速率和资源滥用。