导图社区 Tomcat——服务器模型
四种基本的服务器IO模型剖析,包括优缺点,改进点,模型图,过程图。tomcat所采用的reactor设计模式
Java多线程编程基础知识总结与复盘。本思维导图从Java多线程技能、对象及变量的并发访问、线程间的通信、Lock对象的使用、定时器Timer五个部分进行归纳整理。推荐收藏备用。
tomcat服务器整体模型和组成的各个级别组件介绍和作用分析
tomcat服务器组件connector组件的模型图、职责和组成的介绍
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
Tomcat——服务器模型
单线程阻塞IO
特点
简单的服务器模型,整个运行过程都只有一个线程
服务器系统资源消耗较小
缺点
并发能力低,容错能力差。
多线程阻塞IO
核心
利用多线程机制为每个客户端分配一个线程
支持对多个客户端并发响应,处理能力得到大幅提高,有较大的并发量
服务器系统资源消耗量较大,而且多线程之间会产生线程切换成本,同时拥有较复杂的结构
单线程非阻塞IO
在调用读取或写入接口后立即返回,而不会进入阻塞状态
非阻塞情况下套接字事件的检测机制
应用程序遍历套接字的事件检测
说明
当多个客户端向服务器请求时,服务器端会保存一个套接字连接列表中,应用层线程对套接字列表轮询尝试读取或写入
优点
很好地利用了阻塞的时间,处理能力得到提升
需要在应用程序中遍历所有的套接字列表,同时需要处理数据的拼接,连接空闲时可能也会占用较多CPU资源,不适合实际使用
改进
使用事件驱动的非阻塞方式
内核遍历套接字的事件检测
将套接字的遍历工作交给了操作系统内核,把对套接字遍历的结果组织成一系列的事件列表并返回应用层处理。对于应用层,它们需要处理的对象就是这些事件,这就是其中一种事件驱动的非阻塞方式的实现
内核遍历所有套接字并生成对应的可读列表readList和可写列表writeList
将遍历工作下移到内核层,这种方式有助于提高检测效率
列表从内核复制到应用层也是不小的开销
内核与应用层之间存在很多无效的数据副本,因为它将活跃和不活跃的连接状态都复制到应用层中
不管是在应用层中遍历还是在内核中遍历。需要另外一种机制来优化遍历的方式,那就是回调函数。
内核基于回调的事件检测
内核中的套接字都对应一个回调函数,当客户端往套接字发送数据时,内核从网卡接收数据后就会调用回调函数,在回调函数中维护事件列表,应用层获取此事件列表即可得到所有感兴趣的事件
内核基于回调的事件检测方式
第一种方式
用可读列表readList和可写列表writeList标记读写事件,套接字的数量与readList和writeList两个列表的长度一样,readList第一个元素标为1则表示套接字1可读,同理,writeList第二个元素标为1则表示套接字2可写
这样就避免了遍历套接字的操作,但仍然有大量无用的数据(状态为0的元素)从内核复制到应用层中
第二种方式
首先,应用层告诉内核每个套接字感兴趣的事件。接着,当客户端发送数据过来时,对应会有一个回调函数,内核从网卡复制数据成功后即调回调函数将套接字1作为可读事件event1加入到事件列表。同样地。。。
最后,应用层向内核请求读、写事件列表,内核将包含了event1和event2的事件列表返回应用层,应用层通过遍历事件列表得知套接字1有数据待读取,于是进行读操作,而套接字2则可以写入数据
由操作系统内核维护客户端的所有连接并通过回调函数不断更新事件列表,而应用层线程只要遍历这些事件列表即可知道可读取或可写入的连接,进而对这些连接进行读写操作,极大提高了检测效率,自然处理能力也更强
多线程非阻塞IO
单线程非阻塞I/O模型已经大大提高了机器的效率,而在多核的机器上可以通过多线程继续提高机器效率。最朴实、最自然的做法就是将客户端连接按组分配给若干线程,每个线程负责处理对应组内的连接
Reactor模式
组成
接收连接的accept处理器
读数据的read处理器
写数据的write处理器
执行逻辑的process处理器
单线程模式
改进1——加入线程池
改进2——多个Reactor实例
二多线程非阻塞I/O模式让服务器端处理能力得到很大提高,它充分利用机器的CPU,适合用于处理高并发的场景,但它也让程序更复杂,更容易出现问题。