linux阻塞与非阻塞IO?

linux阻塞与非阻塞IO?,第1张

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

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

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

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

任何 *** 作系统,在中断服务函数中,都不能阻塞,另外中断服务函数还应该越短越好,主要原因是:

1、 中断服务函数的执行和一般进程执行某个函数时的上下文环境 (context) 是不一样的,是在一个特定的context中,这个环境不许阻塞,否则系统异常。

2、 中断服务函数过长甚至阻塞,会严重影响整个系统运行效率甚至挂死 (想想看,系统无时无刻不在产生各种各样中断, *** 作系统本身的运行也依靠某些精确发生的中断,比如定时器靠时钟中断等,如果某个中断处理函数执行了很长时间 【阻塞可以理解成导致函数执行了无限长的时间】,整个系统就无法正常工作了)


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存