阻塞IO服务器模型之多线程服务器模型
针对单线程服务器模型的特点,我们可以对其进行改进,使之能对多个客户端同时进行响应。最简单的改进即是使用多线程(或多进程)服务器模型,在应用层级别,我们一般采用多线程模式。多线程能让多个客户端同时请求,并能几乎同时对这些请求进行响应,而不用排队一个一个处理,能同时为多个客户端提供一问一答的服务。
图2-6-1-2 多线程阻塞服务器模型
多线程服务器模型核心就是利用多线程机制,为每个客户端分配一个线程。如图2-6-1-2,服务器初始化一个Serversocket实例,绑定某个端口号,并使之监听客户端的访问。两个客户端几乎同时过来请求,服务器在接收到客户端请求后,创建两条线程进行处理,直到响应完成。在这过程中,服务器只是简单的负责接收消息,然后交给处理者线程来处理,服务器能在短时间内接收多个客户端的请求。
这种模型也是阻塞式的,因为每个线程向客户端写入消息并不是马上返回的,图2-6-1-2中黑块这段时间片就是阻塞时间。但这种模式比单线程处理性能明显高了,不用等到第一个请求处理完才处理第二个。对于多线程,如果线程数大于CPU数量,那么操作系统将会在多个线程之间调度,从而使其他线程能使用CPU,每调度一次导致一次上下文切换,大多通用的处理器中,每次调度大概需要5000-10000个时钟周期,大概几微妙。
用这种多线程服务器模型就能真正地完美解决问题了吗?其实不然,随着客户端的数量越来越多,当达到成百上千路连接请求时,多线程操作会严重消耗系统cpu资源,并且多线程更容易进入假死状态。对此提出了“线程池”的概念,线程池在启动时先把一定数量的线程先创建好放到内存中,并且使用完不真正销毁线程,而是放回池里,以供新任务使用。这种缓存池机制能有效减少线程创建与销毁的频率,大大降低系统开销。这种机制在Tomcat中也是有所体现,如图2-6-1-3,当一个请求过来时尝试从池里获取一个线程,如果有空闲线程则返回一个线程供使用,而如果没有空闲线程了则直接关闭socket连接拒绝服务,保证服务器在处理能力范围内运行
图2-6-1-3 多线程阻塞服务器模型-线程池
多线程服务器模型的特点:能支持对多个客户端同时进行响应,处理能力得到大大的提高,有较大的并发量,但服务器系统资源消耗较大,同时拥有较复杂的结构,实现的代码也相对比较复杂。这种模型适用于访问并发量较大,请求是短期的、无状态的,业务逻辑比较复杂,对响应时间要求较高的场合。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
阻塞IO服务器模型之多线程服务器模型的更多相关文章
- 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...
- 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...
- 阻塞IO、非阻塞IO的区别
1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现. 3)继承 ...
- 从操作系统内核看Java非阻塞IO事件检测
非阻塞服务器模型最重要的一个特点是,在调用读取或写入接口后立即返回,而不会进入阻塞状态.在探讨单线程非阻塞IO模型前必须要先了解非阻塞情况下Socket事件的检测机制,因为对于非阻塞模式最重要的事情是 ...
- 异步IO比同步阻塞IO性能更好吗?为什么?
最近在看node.js, 介绍中提到node是异步io的方式实现, 性能比同步阻塞io的更好. 对于一个request而言, 如果我们依赖io的结果, 异步io和同步阻塞io都是要等到io完成才能继续 ...
- Java-NIO(七):阻塞IO与非阻塞IO
阻塞IO 传统的 IO 流都是阻塞式的. 也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因此,在完成网络通信 ...
- 同步IO,异步IO,阻塞IO,非阻塞IO
同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, 其实 ...
- Python_阻塞IO、非阻塞IO、IO多路复用
0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
随机推荐
- spring源码阅读(2)核心类介绍
(1).BeanFactory作为一个主接口不继承任何接口,暂且称为一级接口. (2).有3个子接口继承了它,进行功能上的增强.这3个子接口称为二级接口. (3).ConfigurableBeanFa ...
- 生成和配置https证书
最近在做小程序,调用后台接口需要https协议请求,小程序之所以这么要求,也是因为http协议是明文传播文件数据的,出于数据安全考虑,必须使用https协议. http想实现为https 就需要为配置 ...
- tmux 终端复用详解
tmux是什么 我们在linux服务器上的工作一般都是通过一个远程的终端连接软件连接到远端系统进行操作,例如使用xshell或者SecureCRT工具通过ssh进行远程连接.在使用过程中,如果要做比较 ...
- HDU2303(数论)大整数求余+素数筛选
Sample Input 143 10 143 20 667 20 667 30 2573 30 2573 40 0 0 Sample Output GOOD BAD 11 GOOD BAD 23 ...
- java 实现WebService
1.xml 2. wsdl: webservice description language web服务描述语言 通过xml格式说明调用的地址方法如何调用,可以看错webse ...
- 美团java后台实习三面
美团一面(50分钟) 1.spring的理解. 1.项目相关 2.Redis缓存的应用 3.http解析的全过程 4.Java中的锁 5.Hashmap和concurrenthashMap源码 6.死 ...
- 学习sharding-jdbc 分库分表扩展框架
先丢代码地址 https://gitee.com/a247292980/sharding-jdbc 再丢pom.xml的dependency <properties> <projec ...
- JVM内部原理
这篇文章详细描述了Java虚拟机的内在结构.下面这张图来自<The Java Virtual Machine Specification Java SE 7 Edition>,它展示了一个 ...
- 补充Mysql5.7用法
下面简单介绍一下安装: [root@MySQL soft]# tar xf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz -C /data/service/ [r ...
- thinkphp零碎小知识
在使用thinkphp搭建后台的时候,有很多的参数需要去配置,有的记不住还要去查找,这里把一些基本的参数整理一下,还有些零碎的知识点,与大家共勉,希望能方便大家. 友情提示:这些配置是 thinkph ...