说到这里,就得说说同步I/O和异步I/O的区别了。在有些时候,同步和异步、阻塞和非阻塞很容易被混用,其实它们彻底不是一回事,并且它们修饰的对象也不一样。阻塞和非阻塞是指当进程访问的数据若是还没有就绪,进程是否须要等待,简单说这至关于函数内部的实现区别,即未就绪时是直接返回仍是等待就绪;而同步和异步是指访问数据的机制,同步通常指主动请求并等待I/O操做完毕的方式,当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后即可以继续处理其余任务,随后等待I/O操做完毕的通知,这可使进程在数据读写时也不发生阻塞。
POSIX1003.1标准为异步方式访问文件定义了一套库函数,这里的异步I/O(AIO)实际上就是指当用户态进程调用库函数访问文件时,进行必要的快速注册,好比进入读写操做队列,而后函数立刻返回,这时候真正的I/O传输尚未开始呢。
能够看出,这种机制是真正意义上的异步I/O,并且是非阻塞的,它可使进程在发起I/O操做后继续运行,让CPU处理和I/O操做达到更好的重叠。
POSIX的标准库中定义了AIO的一系列接口,它几乎屏蔽了一切网络通讯的细节,因此对使用者而言很是简单。AIO没有提供非阻塞的open()方法,因此进程仍然使用open()系统调用来打开文件,而后填充一些描述I/O请求的数据结构,接下来调用aio_read()或aio_write()来发起异步I/O操做,一旦请求进入操做队列后,函数便返回,进程能够在此后经过aio_error()来检查正在运行的I/O操做的状态。
然而对于AIO的实现,不一样的平台有不一样的方法,它甚至能够彻底由库函数来实现而不须要内核的支持,好比经过多线程来模拟非阻塞的aio_read()调用。可是这样一来,它的性能便大打折扣,变得毫无心义,因此实际上不少平台都没有实现它。
在Linux 2.6.16中,AIO的实现能够在/usr/include/libaio.h中看到,它采用了一套没有遵循POSIX AIO标准的接口,而且实现方式正是基于LinuxThreads内核级线程库,截至目前,这个功能还在实现中,目前的Linux AIO只能用于经过O_DIRECT标志打开的文件。网络