qt多线程服务器_常见网络服务器并发模型

点击蓝字 关注我们

近些年,随着互联网的大发展,高并发服务器技术也快速进步,从简单的循环服务器模型处理少量网络并发请求,演进到解决C10K,C10M问题的高并发服务器模型。本文主要以TCP为例,总结了几种常见的网络服务器模型的实现方式,优缺点,以及应用实例。

单线程循环

397621eb95a907aa3b1f00ad31a0e0cd.png
单线程循环

优点:

  简单、易于实现

没有同步、加锁这些麻烦事,也没有这些开销

缺点:

1、阻塞模型,网络请求串行处理

2、没有利用多核cpu的优势,网络请求串行处理

总之,没有充分利用CPU资源。

适用场景:「测试、演示」

典型应用:thrift TSimpleServer

多线程/多进程

6db280b3ab8df633b6840711597e4fc7.png
多线程/多进程

解析:

主要特点是每个网络请求由一个进程/线程处理,线程内部使用阻塞式系统调用,在实际场景中使用预先分配的进程池/线程池,以减少频繁创建销毁线程的开销,往往可以得到更好的性能。

在线程的职能划分上,可以由一个单独的线程处理accept连接,其余线程处理具体的网络请求(收包,处理,发包);还可以多个进程单独listen、accept网络连接(在linux2.6内核之前会产生惊群,多个进程被唤醒accept建立连接)

优点:

  1、实现相对简单

2、利用到CPU多核资源

缺点:

线程内部还是阻塞的,举个极端的例子,如果一个线程在handle的业务逻辑中sleep了,这个线程也就挂住了。

单线程IO复用

f6b9ac0d8611fc7237c1f00b6c309ba9.png
单线程IO复用

解析:linux高并发服务器中常用epoll作为IO复用机制,select和poll等其他机制不展开讨论,区别和特点可以自行搜索。线程将需要处理的socket读写事件都注册到epoll中,当有网络IO发生时,epoll_wait返回,线程检查并处理到来socket上的请求。

优点:

    实现简单

减少锁开销

减少线程切换开销

缺点:只能使用单核cpu,handle时间过长会导致整个服务挂死。

适用场景:高IO、低计算,handle处理时间短

典型应用:「redis」

多线程/多进程IO复用

a6e5f4369f46b0e7cdae321c7e73ddb4.png
多线程/多进程IO复用

解析:每个子进程都监听服务,并且都使用epoll机制来处理进程的网络请求,子进程 accept() 后将创建已连接描述符,然后通过已连接描述符来与客户端通信。

优点:支撑较高并发

缺点:异步编程不直观、容易出错

适用场景:支撑高并发

典型应用:「Nginx」

多线程划分IO角色

d70ea57f23d1410c0966edc9ea0ca3b6.png
多线程划分IO角色

解析:

    一个accept thread处理新连接建立

一个IO thread pool处理网络IO

一个handle thread pool处理业务逻辑

优点:

按不同功能划分线程,各线程处理固定功能,效率更高

可以根据业务特点配置线程数量来性能调优

缺点:

    1、线程间通信需要引入锁开销

2、逻辑较复杂,实现难度大

电销应用: thrift TThreadedSelectorServer

AIO

41a824391ee61cbbd182d19990a8cf8e.png
AIO

linux AIO机制尚不成熟,没有广泛应用,不展开,感兴趣同学可以参考:

http://man7.org/linux/man-pages/man7/aio.7.html

协程

438dbeebd6a684d94aff53ae21c063c6.png
协程

解析:就是在应用层用户态模拟线程,在用户态管理协程的调度与切换。

优点:

    1、减少上下文切换开销

2、编程友好,同步的方式写出异步代码

缺点:多个协程运行在一个线程上,一个协程阻塞将导致整个线程阻塞

参考:

https://morsmachine.dk/go-scheduler

小结:上面介绍了常见的网络服务器模型,现实中可能存在其他的组合和变形,重要的是理解每种场景中所面临的问题和每种模型的特点,设计出符合应用场景的方案才是好方案。

-- End --


推荐好文  点击蓝色字体即可跳转☞【收藏】大作业学生信息管理系统也太好看了叭4b900b465cc47d22ac4481b8d8692cc8.gif☞【收藏】软件安装管家4b900b465cc47d22ac4481b8d8692cc8.gif4b900b465cc47d22ac4481b8d8692cc8.gif☞【典藏】看了这十道C语言题,你敢说你精通C语言?☞【唠嗑】为什么大公司不开发Linux桌面应用?☞【干货】200行到1000行适合编程进阶的项目☞【干货】Qt简易聊天室设计☞【干货】Qt Live2D桌面动态壁纸c83a38962625a22703b833238d3dd426.png

公众号ID:LearnBase

作者:梦凡


梦想在,终不凡~

喜欢本篇内容请给我们点个在看

f5b9900bf1077cf957c5a279379a566f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在vb.net中取得两时间的毫秒差_科技品牌软文营销如何写出一篇爆文?

随着互联网的发展,尤其是移动互联网的发展,让营销方式从传统的线下电视报纸广告逐渐转移到线上的软文营销。软文营销因为其快捷,方便,性价比高的特点受到了很多品牌的追捧。文章是软文营销的前提,如何写好一篇好的文章…

Java开发领域的大牛有哪些

Java开发领域的大牛有哪些 1、James Gosling 在他12岁的时候,他已能设计电子游戏机,帮忙邻居修理收割机。大学时期在天文系担任程式开发工读生,1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学…

共阴极数码管编码表_数码管循环点亮的PLC控制——基本逻辑指令的应用

数码管循环点亮的PLC控制,我们运用日本三菱FX2N-48MR-001(FX2N-48MR-001是日本三菱公司的可编程控制器(PLC),继电器输出及输入24点,输出24点.FX2N是FX系列中功能最强、速度最高的微型PLC,内置用户存储器8Kb,可扩展到16K步,最大可扩…

高效Java第六条消除过期的对象引用无意识的对象保持

问题的引出 这段程序有一个“内存泄露”,随着GC活动的增加,或者由于内存占用的不断增加,程序性能降低会逐渐表现出来。在极端的情况下,这种内存泄露会导致磁盘交换,甚至导致程序失败(OutOfMemoryError),但是…

gentos 执行sh文件_linux定时自动清理日志文件

现有一个应用系统,应用日志记录的内容很多,经常造成存储空间不够,需要手工去删除早期的日志文件来释放空间。应用的日志文件命名如下,固定前后缀加上日期和小时:为了避免手工删除日志,考虑通过写shell脚本来…

java编程思想泛型对混入的详细探讨

混入的概念 把多个类的能力混合在一起产生一个能代表所有混入类的类型的类。 the fundamental concept is that of mixing in capabilities from multiple classes in order to produce a resulting class that represents all the types of the mixins. 混入就是把存在的多…

linux rm 命令删除文件恢复_linux文件处理命令之rm常用方法介绍

命令名称:rm命令英文原意:remove命令所在路径:/bin/rm执行权限:所有用户语法:rm -r [文件或目录] -r 删除目录功能描述:删除文件mv是删除文件的命令,使用时可以指定文件(包括觉得路径/相对路径)的存放位置1…

python中math模块函数_Python常用的一些内建函数和math模块函数

一:Python内建函数 1 #abs取绝对值 2 num -10 3 print(abs(num))4 5 #max 求最大值 6 print(max(6, 9, 2, 12, 8))7 8 #min求最小值 9 print(min(-1, 2, 5, 0, 7))10 11 print(min([1, 3, 7, 0, 2]))12 13 #round 计算一个数值的四舍五入的 14 15 pi 3.14 16 prin…

大家对Java的一些误解

1. System.exit(0)会跳过finally块的执行 System.setSecurityManager(new SecurityManager() { Override public void checkExit(int status) { throw new ThreadDeath(); } }); try { System.exit(0); } finally { System.out.println("In the finally block"); } 这…

python用turtle画皮卡丘_用Python的turtle作画(2)——皮卡丘

from turtle import * # 绘制皮卡丘头部 # 画脸 def face(x, y): begin_fill() penup() # 将海龟移动到指定的坐标 goto(x, y) pendown() # 设置海龟的方向 setheading(40) circle(-150, 69) fillcolor("#FBD624") # 将海龟移动到指定的坐标 penup() goto(53.14, 113…

Java 即将迎来转折点?

嵌入式 Java 我并没有看到这个领域有什么变化。Oracle 完全放弃了在该领域的开发,已经不再提供支持非常流行的 ARM 架构的嵌入式应用程序的二进制文件了。 但是,我预测今年嵌入式应用程序中的 Java 应用将会增长。主要原因有三个: Java ME…

html调用接口_Spring 自调用事务失效,你是怎么解决的?

前言" 相信大家都遇到一种事务失效场景,那就是 Spring 自调用,就是在 Service 方法内,调用另一个加 Transactional 注解的方法,发现事务失效,这时候你是怎么解决的呢? "1 事情回顾那是一个我忘了…

Java中AJAX工作原理是什么

AJAX 指异步JavaScript 及XML(Asynchronous JavaScript And XML)。 传统的Web应用允许用户填写表单(form),当提交表单时就向Web服务器发送一个请求。服务器接收并处理传来的表单,然后返回一个新的网页。这个做法浪费了许多带宽,因为在前后两个…

unity vscode没有智能提示_GAMES101课程环境搭建(Win10+VSCode)

最近B站上看到一个不错的图形学教程,复习下图形学知识挺好的。教程地址:GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili课程主页:GAMES101: 现代计算机图形学入门作业地址:往期作业汇总帖 - 计算机图…

Java中的变量、数据类型和运算符

1. java语言是一种强类型的语言,对各种数据类型都有明确的区分,而计算机使用内存来记忆大量运算时需要使用的数据,而当声明一个变量时,即在内存中划分一块空间存储数据,而变量类型决定划分内存空间的大小。 2.基本数…

python列表逐行写入excel_python表格数据到excel-想问下python3怎么将列表数据逐行写入excel表格呢?...

如何用python将数据写入excel表格 简介绍一下这两个库,先说xlrd,这个Excel比较,各种方法使用起来方便: bk xlrd.open_workbook(your.xls) sh bk.sheets()[-1] 上面两句就可以打开Excel表格中的一个sheet,sheets得到的…

10大最高效的Java库盘点

1. Java 标准库 不用怀疑,我说的就是Java标准库,很多人都低估了或者没有完全了解Java标准库,并且不知道如何在编程的时候使用它,有些人甚至都不用它,下面说一些Java标准库的简要说明 ● java.lang:总是默…

js 加入debug后可以进入controller_写给前端的 Nest.js 教程——10分钟上手后端接口开发

前言沉默了很久,一直都没发文章,有些惭愧。最近实习结束之后回了学校,提前开始做毕业设计了。对,就是毕业设计。近两个月把 React Native、Vue 3.0 和 Nest.js 都摸了一下,大概都摸懂了。鉴于掘金已经很多优秀的 Vue 3…

java new一个对象的过程中发生了什么

java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可…

2019年GitHub上最热门的Java开源项目

1JavaGuide https://github.com/Snailclimb/JavaGuide Star 22668 【Java学习面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 2advanced-java https://github.com/doocs/advanced-java Star 7752 本系列知识出自中华石杉,可以作为互联网 Java 工程…