上海门户网站论坛/aso推广方案
阻塞和非阻塞I/O是设备访问的两种不同模式, 驱动程序可以灵活地支持这两种用户空间对设备的访问方式。
阻塞操作是指在执行设备操作时, 若不能获得资源, 则挂起进程直到满足可操作的条件后再进行操作。 被挂起的进程进入睡眠状态, 被从调度器的运行队列移走, 直到等待的条件被满足。 而非阻塞操作的进程在不能进行设备操作时, 并不挂起, 它要么放弃, 要么不停地查询, 直至可以进行操作为止。
驱动程序通常需要提供这样的能力: 当应用程序进行read() 、 write() 等系统调用时, 若设备的资源不能获取, 而用户又希望以阻塞的方式访问设备, 驱动程序应在设备驱动的xxx_read() 、xxx_write() 等操作中将进程阻塞直到资源可以获取, 此后, 应用程序的read() 、 write() 等调用才返回, 整个过程仍然进行了正确的设备访问, 用户并没有感知到;
在阻塞访问时, 不能获取资源的进程将进入休眠, 它将CPU资源“礼让”给其他进程。因为阻塞的进程会进入休眠状态, 所以必须确保有一个地方能够唤醒休眠的进程, 否则, 进程就真的“寿终正寝”了。 唤醒进程的地方最大可能发生在中断里面, 因为在硬件资源获得的同时往往伴随着一个中断。 而非阻塞的进程则不断尝试, 直到可以进行I/O。