AG游戏(中国)官方IOS|Android手机app下载 镶嵌式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`移除部队项,适配更复杂的场景。
- 中断叫醒逻辑:按键中断处事函数或定时器消抖函数中,检测到有用按键事件后,AG游戏AG Game调用`wake_up_interruptible`叫醒恭候部队中的程度,让就寝的行使赓续推论读取操作。
3. 行使与测试
- 测试标准:径直复用第12章的行使,无需修改,因为默许open便是禁闭模式,行使会自动在无按键时就寝。
- 运行成果:加载驱动后运行测试标准,按下按键时平常打印键值,稽察CPU占用率,从99.6%降至0.0%,仅在按键触发陡然占用极少CPU,大幅普及系统遵守。
三、非禁闭I/O实验
开云体育(kaiyun)官方网站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函数需合理复返建造景色,幸免景色判断无理导致行使轮询逻辑失效,超往往间需凭据试验场景合理成就AG游戏(中国)官方IOS|Android手机app下载,均衡反映速率和资源豪侈。