常见网络服务器并发模型

这篇具有很好参考价值的文章主要介绍了常见网络服务器并发模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

单线程循环

常见网络服务器并发模型

单线程循环

优点:

  简单、易于实现

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

缺点:

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

2、没有利用多核cpu的优势,网络请求串行处理
  
总之,没有充分利用CPU资源。

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

典型应用:thrift TSimpleServer

多线程/多进程

常见网络服务器并发模型

多线程/多进程

解析:

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

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

优点:

  1、实现相对简单

  2、利用到CPU多核资源

缺点:

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

单线程IO复用

常见网络服务器并发模型

单线程IO复用

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

优点:

    实现简单

    减少锁开销

    减少线程切换开销

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

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

典型应用:「redis」

多线程/多进程IO复用

常见网络服务器并发模型

多线程/多进程IO复用

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

优点:支撑较高并发

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

适用场景:支撑高并发

典型应用:「Nginx」

多线程划分IO角色

常见网络服务器并发模型

多线程划分IO角色

解析:

    一个accept thread处理新连接建立

    一个IO thread pool处理网络IO

    一个handle thread pool处理业务逻辑

优点:

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

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

缺点:

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

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

电销应用: thrift TThreadedSelectorServer

AIO

常见网络服务器并发模型

AIO

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

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

协程

常见网络服务器并发模型

协程

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

优点:

    1、减少上下文切换开销

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

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

参考:

https://morsmachine.dk/go-scheduler

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

-- End --文章来源地址https://www.toymoban.com/news/detail-478854.html

到了这里,关于常见网络服务器并发模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用select实现TCP并发服务器模型

    本期主要分享的是对于select的使用,使用select实现TCP并发服务器模型,由于之前所用到的技术知识只能够支撑我们进行单个访问,但是有了select之后呢,我们就能够实现多用户进行访问;这也是非常符合客观需求的; 这次呢我们重点来使用一下select; 用到的头文件如下: 我

    2024年02月08日
    浏览(47)
  • 高并发服务器 poll模型 非阻塞 代码已跑

    经过十几次修改终于发现了问题! 现在代码完全可以运行了! 排除BUG太麻烦了 之前错误现象 开了N个客户端,排查netstat -a | grep 8888 全部establilsed了,网络连接正常! 但是仅仅有一个客户端正常反应,别的客户端仿佛被堵住了!只有那个正常的客户端发一句,好像才能把被堵

    2024年01月25日
    浏览(51)
  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(75)
  • 【网络编程】高性能并发服务器源码剖析

      hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中, 你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇文章能

    2024年04月15日
    浏览(56)
  • Linux学习之网络编程3(高并发服务器)

    Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 问题: 根据上一个笔记,我们可以写出一个简单的服务端和客户端通信,但是我们发现一个问题——服务器只能连接一个

    2024年02月01日
    浏览(50)
  • Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

    文章目录: 一:线程池模块分析 threadpool.c 二:UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三:套接字  1.本地套接字 2.本地套 和 网络套对比 server.c client.c threadpool.c   server.c client.c server.c client.c

    2024年02月11日
    浏览(66)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(56)
  • 计算机网络编程 | 并发服务器代码实现(多进程/多线程)

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 当涉及到构建高性能的服务

    2024年02月08日
    浏览(80)
  • Linux中 socket编程中多进程/多线程TCP并发服务器模型

    一次只能处理一个客户端的请求,等这个客户端退出后,才能处理下一个客户端。 缺点:循环服务器所处理的客户端不能有耗时操作。 模型 源码 可以同时处理多个客户端请求 父进程 / 主线程专门用于负责连接,创建子进程 / 分支线程用来与客户端交互。 模型 源码 模型 源

    2024年02月12日
    浏览(42)
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装

    前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h 🌈ThreadPool.cpp 🌈ChildTask.h  🌈ChildTask.cpp 🌈BaseTask.h 🌈BaseTask.cpp 三、测试效果 四、总结 📌创建线程池的好处 本文主要学习 Linux内核编程 ,结合

    2024年01月16日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包