文件IO:阻塞IO/非阻塞IO
阻塞IO:当用户程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到用户缓冲区。当拷贝过程完成,read才会返回。
非阻塞IO:read请求在数据没有准备好的情况下立刻返回,可以继续往下执行,但是这时候用户程序一直在轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read调用之后才可以获取结果。
多路IO复用:应用程序每次都轮询内核的IO是否准备好,有点傻,因为在轮询的过程中,应用程序只能循环,啥也做不了。
为了解决这种傻乎乎轮询问题,多路IO复用技术出现了,如select/poll。通过IO事件分发,当内核准备好数据,再以事件的形式,通知应用程序进行操作。
同步IO:阻塞IO、非阻塞IO、多路IO复用。因为他们在read的过程中,内核将数据从内核区拷贝到用户空间的这个过程都需要等待,也就是这个过程是同步的。
异步IO:当发起aio_read之后,就立即返回,内核自动将数据从内核空间拷贝到用户空间,这个拷贝过程是异步的,内核自动完成,和前面的同步不同,异步的应用程序并不需要主动发起拷贝动作。
IO分为两个过程:(1)数据准备过程(2)数据从内核空间拷贝到用户进程缓冲区过程。
阻塞IO会阻塞在过程1和过程2。非阻塞IO和多路复用IO只会阻塞在过程2。这三者都是同步IO。
异步IO则不同,过程1和过程2都不会阻塞。