IO面试题整理

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

不一样。

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

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

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

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

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

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

数据准备阶段和数据读取读取阶段是谁发起的?通过什么指令发起的?

都是由用户线程发起的。数据准备由询问指令发起,数据读取由read指令发起。

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

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

介绍思路:

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

常见的几种io模型的关系到底是怎么样?

阻塞同步io模型:这个模型的特点就是每个socket连接都会有一个线程负责监听,高并发的场景非常消耗线程资源。基本不会使用。

非阻塞同步io模型:这里的模型特点是,在socket数据准备阶段,如果数据没有准备好,会返回给用户线程一个error。线程需要不断轮训去监听socket的状态。当然在每次轮训期间,线程可以做其他的事情。这个模型里面io线程也是没有被复用的。

io复用模型:特点一个线程,可以监听多个socket连接。有select机制和epoll机制。

select 基于轮询机制,随着连接数的增加处理效率会下降。(poll也是轮训的机制,但是没有监听连接数数量的限制)

epoll模型基于事件通知,可以理解成是会对socket的连接进行组册(注册回调函数),当socket数据准备好后,再通过回调机制,告知用户进程。优点,连接数增加,性能也没什么变化,可以处理的连接数无限制(数据准备阶段也是需要等待内核回复是否ready的消息,只是说不用一直等待数据准备好)

信号I/O:还不完全是非阻塞,在数据准备阶段是非阻塞,在数据复制阶段是阻塞

通过信号驱动的方式,使用的sigaction系统调用,向socket中组册信号回调。但是tcp协议中不会用,是一种 Unix 信号,信号没有附加信息,如果一个信号源有多种产生信号的原因,信号接收者就无法确定究竟发生了什么。而 TCP socket 生产的信号事件有七种之多,这样应用程序收到 SIGIO,根本无从区分处理。(无法区分是socket数据已经准备好了,还是说发生了什么异常)

参考:https://www.cnblogs.com/chenssy/p/15382938.html

非阻塞异步:数据准备和数据读取都是非阻塞的,且内核是异步处理

可以理解用户进程发起read指令后,操作系统内核立即返回结果,然后操作系统自动完成数据准备和数据复制两个阶段的工作。完成后,再通过信号通知用户进程。

Linux内核2.6确实提供了内核级的AIO支持,只是还不完善。所以java也是用不来异步非阻塞io的。

基于上面的5中基础的io模型?又有哪些可以知道设计开发的更高级的模型?

reactor模型:

单reactor单线程:依赖io多路复用技术

单reactor多线程:依赖io多路复用技术

主从Reactor多线程:

依赖的也是io多路复用模型

图中acceptor的作用,接受新的请求,监听未ready的scoket链接,将ready的连接分发到下游处理。

Proactor模型

Proactor 基于基础的异步io模型,定义了每个步骤需要的组件,以及每个组件的功能。

比如说因为操作系统自己完成数据复制的过程,那么数据复制到哪里去呢,这个是需要用户告知的。所以在用户进程发起read指令时,就应该携带这个相关的数据。

哪基于reactor模型,哪又有哪些可以使用的组件呢?

netty就是基于reactor开发的。这三种Reactor模型netty中都是支持的,但是我们常用的是主从Reactor多线程模型。下面是主从Reactor多线程模型。

所以其实netty使用就是io多路复用模型。

上面是5中常见的io模型。java中使用的又是那种io模型呢?

在java中,如果使用的是tomcat容器,可以支持3种模式,那他们分别使用的是什么模型。

APR模式:非阻塞同步模型;

BIO模式:阻塞同步的模型,一个socket连接需要一个线程处理(完成监听,数据读取,业务支持,响应等)。

NIO模式:基于io多路复用模型,用java.nio编写的TCP模块。具体的设计如下。

除来tomact模型,还是有jetty,undertown,netty可以使用。

tomcat:成熟稳定。但性能比undertown要差。

underTown的性能好与tomcat,jetty。相对于Tomcat和Jetty,社区和生态系统相对较小。

netty:高性能

jetty:轻量级、快速启动和低资源消耗。性能与tomcat差不多。扩展性好。更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的WebServer

1.1 不同模型的不同阶段是阻塞还是非阻塞,是同步还是异步

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模型,它在数据准备和数据复制阶段都是异步的,这个两个步骤都是操作系统完成,完成后回通过消息告知应用可以进行业务处理了。使用的是主从Reactor多线程

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

6. spring cloud gateway 使用的io模型是哪一种?

它使用的就是netty模型,在数据的ready和数据read阶段它都是异步的。

7. springboot项目,使用的tomcat容器,使用的是什么io模型,它的原理是什么?

tomcat有nio和bio这两种选择,那一般项目中使用的是nio这个模式。这个模式基于JDK的NIO实现的多路复用的IO模型,并且Tomcat的网络模型是主从Reactor多线程模型。

参考文章:

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

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

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

### 回答1: 面试题整理是为了帮助准备面试的候选人更好地了解面试的内容和要求。对于Java2021的面试题整理,可以从各个方面进行组织和分类,以便更好地帮助面试者准备。下面是我对Java2021面试题整理的一些建议。 1.基础知识:面试题可以包括Java语言的基本语法、关键字、数据类型、流程控制语句、异常处理等方面的问题。这些问题可以帮助面试者检验自己对Java语言基础知识的掌握程度。 2.面向对象:面试题可以涉及Java面向对象的概念、封装、继承、多态以及接口、抽象类等方面的问题。这些问题可以帮助面试者了解Java面向对象编程的特点和应用。 3.集合框架:面试题可以包括关于Java集合框架的知识,如ArrayList、LinkedList、HashSet、HashMap等的特性、用法和区别。这些问题可以帮助面试者检验自己对Java集合框架的理解和应用能力。 4.多线程:面试题可以涉及Java多线程编程的基本概念、线程的创建与启动、线程同步与互斥、线程池等方面的问题。这些问题可以帮助面试者了解多线程编程的原理和实践。 5.IO流:面试题可以包括关于Java IO流的知识,如输入输出流的分类、字符流和字节流的区别、文件读写操作等方面的问题。这些问题可以帮助面试者检验自己对IO流的理解和应用。 6.异常处理:面试题可以涉及Java异常处理的机制、try-catch语句的使用、自定义异常等方面的问题。这些问题可以帮助面试者了解异常处理的原理和常见应用。 7.Java虚拟机:面试题可以包括Java虚拟机(JVM)的基本概念、内存模型、垃圾回收算法等方面的问题。这些问题可以帮助面试者了解JVM的工作原理和性能优化。 8.框架和工具:面试题可以涉及Java常用的开发框架和工具,如Spring、Hibernate、MyBatis、Maven等方面的问题。这些问题可以帮助面试者了解开发框架的应用和工具的使用。 通过对这些方面的面试题整理,可以帮助面试者全面了解Java2021面试的内容和要求,并有针对性地准备和复习相关知识。面试者应该注重理论的学习,同时结合实践经验进行练习,以便在面试时能够更好地展示自己的能力和潜力。同时,面试者还应注意自己的沟通能力、问题分析能力和解决问题的能力,这些都是面试过程中重要的评估指标。 ### 回答2: Java2021面试题整理主要集中在以下几个方面: 1. 基础知识:Java中的基本数据类型、变量和常量、运算符、控制语句等内容是面试中常见的考点。面试官会通过这些问题判断候选人对Java基础知识的熟悉程度和掌握能力。 2. 面向对象编程:Java是一门面向对象的编程语言,所以面试中对面向对象的理解和应用也是重要的考点。常见的问题包括类和对象、继承和多态、封装和抽象等。 3. 异常处理:Java中的异常处理是编程中的重要内容,面试中会涉及到异常的概念、异常的分类、如何捕获和处理异常、自定义异常等。 4. 集合框架:Java集合框架是Java开发中常用的工具,常见的面试题会涉及到ArrayList、LinkedList、HashMap等集合的特点和应用场景,以及集合的遍历和使用方法。 5. 多线程:Java是一门支持多线程的语言,所以多线程的知识也是面试中的热点考点。常见的问题包括线程的生命周期、线程同步与互斥、线程间的通信、线程池等。 6. JVM相关知识:Java虚拟机(JVM)是Java运行的基础,所以对JVM的了解也是面试中的重要考点。常见问题包括JVM的结构、内存模型、垃圾回收机制等。 此外,面试中还可能涉及到数据库、网络编程、设计模式等其他相关知识。因此,面试前需要对Java相关知识有全面的掌握,并且要能够灵活运用这些知识进行问题的解答。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值