IO面试题整理

1.同步/异步,阻塞/非阻塞是一样的概念吗?

不一样。

阻塞/非阻塞说的是调用者。调用者需要等待就是阻塞,不需要等待就是非阻塞。

同步/异步说的是被调者通知调用者的方式。被调者执行完成后再恢复调用者是同步。被调者立即告诉调用者收到求请求。当处理完成后,再告诉调用者处理完成。这就是异步。

https://www.cnblogs.com/liaowenhui/p/14617891.html

什么是数据准备?什么是数据读取?

数据准备:是将数据从网络物理设备(网卡)读取到内核缓冲区。

数据读取(复制):将数据从内核缓冲区拷贝到用户程序空间的缓冲区。

整个io过程中到底有哪些步骤

以读取来自客户端的请求进行处理为例:

IO面试题整理_第1张图片

介绍思路:

从服务器处理来自客户端的请求出发-》 描述请求数据的数据流 -〉如何使用较少的线程资源处理好成千上万的请求 -》 介绍select模型 -〉信号驱动io模型 -》异步模型

2. 介绍一下io复用模型?

这里的io复用指的是,负责处理input/output工作的线程的服用。相比非复用的io模型每个fd文件描述符(网络请求),都会用一个线程进行监听,复用的io模型只需使用一个线程进行监听,当发现有数据准备好的文件描述符时,会将其通知给另一个负责数据读取的线程。当请求并发量高时,这样的模型,大大减少了线程的使用。

但是这个模型也有它的不足之处,比如监听fd文件描述符的线程,需要不断轮询。但大多数的轮训其实是无效的。这个问题,信号驱动的io模型可以解决。

使用io 复用模型的例子:select模型,poll模型,epoll模型。

是同步模型,因为操作系统内核处理用户线程的read指令是同步的。它是需要用户线程等待自己执行完的。并不是立即回复,执行完后,再另行通知(异步方式)。

常见的io多路复用模型

1. select模型:思想是,节约用户文件描述符监听的线程,只需使用一个线程进行文件描述符的监听即可。相比非复用的模型,大大减少了线程的使用。使用轮询的方式监听,效率低。

2.poll模型,本质和select模型没有什么区别。只是它使用链表来存放文件描述符,解决了select模型中文件描述符限制的问题。

3.epoll模型:显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。使用回调机制,让准备好的文件描述符加入一个ready队列。减少轮询的消耗。

io复用模型也是,阻塞同步模型。

3.介绍一下信号驱动io模型?

信号驱动io是在首次发起询问请求时,与文件描述符建立一个信号联系,当文件描述符状态变为ready后,会主动通知询问线程。相比socket模型,减少了很多无效的轮询。

4.介绍一下异步io模型?

io复用模型和信号驱动模型,都是需要先发送一个数据询问请求,再发起一个数据读取请求。

那是否可以一步到位。用户进程只需要发起一次询问请求。数据的准备和复制,都是由操作系统内核完成,并在完成后,只需通知用户线程已完成。然后用户线程再完成后续的业务操作。

5. 介绍一些netty模型

netty模型是异步的io模型,它在数据准备和数据复制阶段都是异步的,这个两个步骤都是操作系统完成,完成后回通过消息告知应用可以进行业务处理了。

下图是netty的处理流程图。其中acceptor和read的过程都是通过事件机制去通知应用线程数据准备和数据复制的工作完成,可以进行业务处理了。

参考文章:

100%弄明白5种IO模型 - 知乎

NIO之缓冲区【直接和非直接缓冲区】-腾讯云开发者社区-腾讯云45 张图深度解析 Netty 架构与原理-腾讯云开发者社区-腾讯云

netty到底是同步还是异步? - 知乎

你可能感兴趣的:(java,开发语言)