聊聊阻塞与⾮阻塞 I/O 、 同步与异步 I/O?

  • 阻塞I/O

在阻塞I/O中,当用户程序执行read操作时,线程会被阻塞,一直等待直到内核数据准备好,并将数据从内核缓冲区复制到应用程序的缓冲区中。只有当复制过程完成后,read操作才会返回。

需要注意的是,阻塞等待的过程包括等待内核数据准备好数据从内核态复制到用户态这两个阶段。

  • 非阻塞I/O

在非阻塞I/O中,非阻塞的read请求会立即返回,即使数据还未准备好。应用程序可以继续执行,但需要不断轮询内核,直到数据准备好,内核将数据复制到应用程序的缓冲区中,read调用才能获取结果。

  • 基于非阻塞的I/O多路复用

非阻塞I/O存在一个问题,即应用程序需要不断轮询,无法做其他事情。因此,引入了I/O多路复用技术。

当内核数据准备好时,通过事件通知告知应用程序进行操作。

需要注意的是,无论是阻塞I/O、非阻塞I/O还是基于非阻塞的I/O多路复用,它们都是同步调用。因为在read调用期间,内核需要将数据从内核空间复制到应用程序空间,这个过程是需要等待的,也就是说这个过程是同步的。如果内核的复制效率较低,read调用将在这个同步过程中等待较长的时间。

  • 异步I/O

真正的异步I/O是指内核数据准备好数据从内核态复制到用户态这两个过程都无需等待。

在发起aio_read之后,它会立即返回,内核会自动将数据从内核空间复制到应用程序空间,这个复制过程同样是异步的,由内核自动完成。与前面的同步操作不同,应用程序不需要主动发起复制操作。

标签: java, Java面试题, 操作系统, Java问题合集, Java编程, Java问题精选, Java常见问题, 操作系统面试题