【大厂求职必看】太强了!Tomcat线程模型全网最清晰讲解!(上)

简介: 【大厂求职必看】太强了!Tomcat线程模型全网最清晰讲解!

UNIX系统的I/O模型

同步阻塞I/O、同步非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。


什么是 I/O

就是计算机内存与外部设备之间拷贝数据的过程。


为什么需要 I/O

CPU访问内存的速度远远高于外部设备,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。

当你的程序通过CPU向外部设备发出一个读指令,数据从外部设备拷贝到内存需要一段时间,这时CPU没事干,你的程序是:


  • 主动把CPU让给别人
  • 还是让CPU不停查:数据到了吗?数据到了吗?…


这就是I/O模型要解决的问题。

Java I/O模型



对于一个网络I/O通信过程,比如网络数据读取,会涉及两个对象:

  • 调用这个I/O操作的用户线程
  • 操作系统内核    



一个进程的地址空间分为用户空间和内核空间,用户线程不能直接访问内核空间。

当用户线程发起I/O操作后(Selector发出的select调用就是一个I/O操作),网络数据读取操作会经历两个步骤:

  1. 用户线程等待内核将数据从网卡拷贝到内核空间
  2. 内核将数据从内核空间拷贝到用户空间


有人会好奇,内核数据从内核空间拷贝到用户空间,这样会不会有点浪费?

毕竟实际上只有一块内存,能否直接把内存地址指向用户空间可以读取?

Linux中有个叫mmap的系统调用,可以将磁盘文件映射到内存,省去了内核和用户空间的拷贝,但不支持网络通信场景!


各种I/O模型的区别就是这两个步骤的方式不一样。



同步阻塞I/O

用户线程发起read调用后就阻塞了,让出CPU。内核等待网卡数据到来,把数据从网卡拷贝到内核空间,接着把数据拷贝到用户空间,再把用户线程叫醒。


image.png



同步非阻塞I/O

用户进程主动发起read调用,这是个系统调用,CPU由用户态切换到内核态,执行内核代码。

内核发现该socket上的数据已到内核空间,将用户线程挂起,然后把数据从内核空间拷贝到用户空间,再唤醒用户线程,read调用返回。


用户线程不断发起read调用,数据没到内核空间时,每次都返回失败,直到数据到了内核空间,这次read调用后,在等待数据从内核空间拷贝到用户空间这段时间里,线程还是阻塞的,等数据到了用户空间再把线程叫醒。


image.png



I/O多路复用

用户线程的读取操作分成两步:



  • 线程先发起select调用,问内核:数据准备好了吗?
  • 等内核把数据准备好了,用户线程再发起read调用
    在等待数据从内核空间拷贝到用户空间这段时间里,线程还是阻塞的


为什么叫I/O多路复用?

因为一次select调用可以向内核查多个数据通道(Channel)的状态。


image.png



NIO API可以不用Selector,就是同步非阻塞。使用了Selector就是IO多路复用。



异步I/O

用户线程发起read调用的同时注册一个回调函数,read立即返回,等内核将数据准备好后,再调用指定的回调函数完成处理。在这个过程中,用户线程一直没有阻塞。


image.png


目录
相关文章
|
3天前
|
Java
网络 I/O:单 Selector 多线程(单线程模型)
网络 I/O:单 Selector 多线程(单线程模型)
|
3天前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
3天前
|
安全 API 数据库
【转】Android线程模型(AsyncTask的使用)
【转】Android线程模型(AsyncTask的使用)
13 1
|
3天前
|
消息中间件 存储 网络协议
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
Apache Kafka的单分区写入性能在某些严格保序场景中至关重要,但其现有线程模型限制了性能发挥。本文分析了Kafka的串行处理模型,包括SocketServer、KafkaChannel、RequestChannel等组件,指出其通过KafkaChannel状态机确保请求顺序处理,导致处理效率低下。AutoMQ提出流水线处理模型,简化KafkaChannel状态机,实现网络解析、校验定序和持久化的阶段间并行化,提高处理效率。测试结果显示,AutoMQ的极限吞吐是Kafka的2倍,P99延迟降低至11ms。
21 3
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
|
3天前
|
存储 NoSQL Redis
深入浅出Redis(二):Redis单线程模型与通信流程
深入浅出Redis(二):Redis单线程模型与通信流程
|
3天前
|
NoSQL Redis
Redis 线程模型
Redis 线程模型
|
3天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
3天前
|
Java Linux
【linux线程(三)】生产者消费者模型详解(多版本)
【linux线程(三)】生产者消费者模型详解(多版本)
|
3天前
|
消息中间件 安全 Java
多线程(初阶七:阻塞队列和生产者消费者模型)
多线程(初阶七:阻塞队列和生产者消费者模型)
32 0
|
3天前
|
缓存 NoSQL 安全
Redis 新特性篇:多线程模型解读
Redis 新特性篇:多线程模型解读
56 5