Linux的五种I/O模型

一、同步、异步、阻塞、非阻塞的概念

在了解这几种I/O之前,徐要先明确同步异步,阻塞非阻塞的概念。

同步与异步

同步和异步关注的是消息通信机制。
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。如果一旦返回,就是得到返回值了。比如,调用readfrom系统调用时,必须等到IO操作完成才返回,此即为同步调用。

所谓异步,就是在调用发出后,这个调用直接返回。换句话说,当一个异步调用发生后,调用者不会立刻得到结果。而是在调用发出后,在条件满足时,再由被调者通过信号或回调通知调用者处理该结果。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。

举个通俗的例子:
你打电话问书店老板有没有《UNIX环境高级编程》这本书,如果是同步通信机制,老板会说,你稍等,“我查一下”,然后他就开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话告诉你,然后直接挂了电话(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

阻塞与非阻塞

阻塞和非阻塞,关注的是程序在等待调用结果(消息,返回值)时的状态。
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用,指在不能立刻得到结果之前,该调用不会阻塞当前线程。

还是上面的例子:
你打电话给书店老板问有没有《UNIX环境高级编程》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这边书有没有的结果;如果是非阻塞调用,你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

你可能感兴趣的:(Linux内核,I/O,Linux内核)