Linux内核(六)阻塞&非阻塞

Linux内核(六)阻塞&非阻塞,第1张

阻塞和非阻塞IO是访问设备的两种模式,驱动程序可以灵活的支持者两种用户空间对设备的访问方式。

如下图所示,在阻塞访问时,不能获取资源的进程将进入休眠,它将会让出CPU,因为阻塞的进程会进入休眠状态,所以必须要有一个动作能唤醒该进程,唤醒进程的地方最大的可能发生在中断里面,因为在硬件资源获得的同时往往伴随着一个中断。而非阻塞的进程则不断的尝试,直到可以进行IO。

在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞队列的唤醒。等待队列以队列为基础数据结构,与进程调度机制紧密结合,可以用来同步对系统资源的访问,

阻塞 *** 作是指在执行设备 *** 作时,若不能获得资源,则挂起进程直到满足可 *** 作的条件后再进行 *** 作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞 *** 作的进程在不能进行设备 *** 作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行 *** 作为止。

驱动程序通常需要提供这样的能力:当应用程序进行read()、write()等系统调用时,若设备的资源不能获取,而用户又希望以阻塞的方式访问设备,驱动程序应在设备驱动的xxx_read()、xxx_write()等 *** 作中将进程阻塞直到资源可以获取,此后,应用程序的read()、write()等调用才返回,整个过程仍然进行了正确的设备访问,用户并没有感知到;若用户以非阻塞的方式访问设备文件,则当设备资源不可获取时,设备驱动的xxx_read()、xxx_write()等 *** 作应立即返回,read()、write()等系统调用也随即被返回,应用程序收到-EAGAIN返回值。

在阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源“礼让”给其他进程。因为阻塞的进程会进入休眠状态,所以必须确保有一个地方能够唤醒休眠的进程,否则,进程就真的“寿终正寝”了。唤醒进程的地方最大可能发生在中断里面,因为在硬件资源获得的同时往往伴随着一个中

断。而非阻塞的进程则不断尝试,直到可以进行I/O。

在Linux下,当机器处于睡眠或待机状态时,想通过网络进行唤醒(WOL,wake on lan)时,可以通过如下相关命令来实现:

在A机(嵌入式设备)上,让其睡眠,可以使用如下命令:

ethtool -s eth0 wol g

echo standby>/sys/power/state 或echo mem>/sys/power/state

对于echo到state里面的内容,可以cat下state,就知道可以设置什么值了,而eth0可以根据实际需要通过哪个网口来唤醒设置。

在B机上(嵌入式设备或PC),唤醒A时需先知道A的MAC地址,才可以通过局域网进行唤醒,唤醒时使用如下命令:

ether-wake -i eth0 XX:XX:XX:XX:XX:XX

对于eth0可以根据实际设置,必须是跟A机连接到同一网段的网卡接口,而XX:XX:XX:XX:XX:XX则是A机的MAC地址。

对于上面用到的所有命令,要根据实际看有没有,没有则需要安装或交叉编译移植下,还有要注意电源管理部分内容,看能不能提供相关 *** 作。

关于WOL,可以参考如下网址了解:

http://hi.baidu.com/jzinfo/blog/item/158203e978d58a3fb90e2d03.html

关于睡眠、待机等概念,可以参考如下网址了解:

http://hi.baidu.com/buypro/blog/item/4e6d706737c8ef29aa184c1a.html

http://www.cublog.cn/u3/90973/showart_2281851.html#sec-5.1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7247844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存