I/O 阻塞&非阻塞&同步&异步

来源:互联网 发布:网络作家排名及代表作 编辑:程序博客网 时间:2024/04/29 15:56

阻塞(blocking)&非阻塞(non-blocking)I/O

阻塞/非阻塞的关注点在与调用者是否等待被调用者返回。

在实际应用中,大多数I/O请求是阻塞的,这意味着在I/O完成之前,控制权不会回到调用者手中。这种延迟在某些情况下会非常长,比如说执行read()或者write()操作。

而非阻塞I/O 会在发出IO请求后控制权立即转移到调用者手中,即使数据包没有准备好,也会返回一个错误标识,使得操作进程不会阻塞在那里。

下面的图很好的解释了阻塞I/O和非阻塞I/O

这里写图片描述

图(a)中,用户线程发出请求后一直等待直到结果返回;图(b)中,用户线程发出请求后立刻得到了响应,即使I/O操作并没有完成。随后用户线程可以进行其他的操作,内核线程执行完成I/O操作后会把结果存放在某个变量中或者是通知用户线程操作完成

同步(synchronous)&异步(asynchronous) I/O

同步/异步的关注点在于调用者以什么样的形式拿到结果。

如果采用阻塞I/O,由于调用者拿到结果前一直处于等待状态,因而此时一定是同步的。所以只有在采用非阻塞I/O时才能更好的区分 I/O的同步/异步。

上面“非阻塞”时已经讲过内核进程执行完成I/O操作后会把结果存放在某个变量中或者是通知用户进程操作完成。如果是存储在变量中,需要用户进程使用poll的方式去轮询拿到结果,此时是同步的;如果内核线程发出触发信号将结果给用户线程或者用户线程以回调的形式拿到结果此时是异步的。

使用图解的话就是下面的情况:
这里写图片描述

图(a)中,用户线程一直在轮询结果;图(b)中,内核线程将结果给用户线程。

总结

综上:
(1)阻塞=同步; 同步!=阻塞;
(2)阻塞/非阻塞指的是线程是否一直在等待结果,不能做其他的事情,如果等待是阻塞,否则是非阻塞;
(3)异步=非阻塞;非阻塞 !=异步;
(4)同/异步指的是I/O执行结果是否由调用者去监控并获取,如果是则是同步,否则是异步。

0 0