网络socket服务器开发几种并发模型详解

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

目录

一、socket创建流程。

二、I/O多路复用

三、服务器开发常见的并发模型

1、模型一:单线程——无IO复用

1.1 模型分析

2、模型二:单线程accept + 多线程读写业务(无IO复用)

模型分析

3、模型三:单线程多路IO复用

模型分析

 4、模型四:单线程多路IO复用 + 多线程业务工作池

模型分析

优点

区别

5、模型五:单线程多路IO复用 + 多线程多路IO复用(线程池)(实际中最常用)

模型分析

优点

缺点

6、模型六:(多进程版)单线程多路IO复用 + 多进程多路IO复用(进程池)

模型分析


一、socket创建流程。

        socket 是内核向应用层提供的一套网络编程接口,用户基于 socket 接口可开发自己的网络相关应用程序。套接字(socket)是 Linux 下的一种进程间通信机制,socket IPC 通常使用客户端服务器这种模式完成通信,多个客户端可以同时连接到服 务器中,与服务器之间完成数据交互。

        socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口。socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议隐藏在 socket 接口后面,对用户来说,一组简单的 接口就是全部,让 socket 去组织数据,以符合指定的协议。所以,我们无需深入的去理解 tcp/udp 等各种复 杂的 TCP/IP 协议,socket 已经为我们封装好了,我们只需要遵循 socket 的规定去编程,写出的程序自然遵 循 tcp/udp 标准的。

编写服务器应用程序的流程如下:

        ①、调用 socket()函数打开套接字,得到套接字描述符;

        ②、调用 bind()函数将套接字与 IP 地址、端口号进行绑定;

        ③、调用 listen()函数让服务器进程进入监听状态;

        ④、调用 accept()函数获取客户端的连接请求并建立连接;

        ⑤、调用 read/recv、write/send 与客户端进行通信;

        ⑥、调用 close()关闭套接字。

服务器程序通常需要处理三类事件:I/O 事件、信号及定时事件。


二、I/O多路复用

1、阻塞式 I/O和非阻塞式 I/O

        阻塞式 I/O 的优点在于能够提升 CPU 的处理效率,当自身条件不满足时,进入阻塞状态,交出 CPU 资源,将 CPU 资源让给别人使用;而非阻塞式则是抓紧利用 CPU 资源,譬如不断地去轮训,这样就会导致 该程序占用了非常高的 CPU 使用率。(阻塞式 I/O无法实现并发读取)

        I/O 多路复用一般用于并发式的非阻塞 I/O,也就是多路非阻塞 I/O。

2、select:最大限制(select默认1024)、轮询查看、效率较低

      poll:最大限制默认与内存有关、轮询查看、效率较低

      对于 select()或 poll()函数来说,内部实现原理其实是通过轮训的方式来检查多个文件描述符是否可执 行 I/O 操作,所以,当需要检查的文件描述符数量较多时,随之也将会消耗大量的 CPU 资源来实现轮训检查操作。

       epoll:最大限制默认与内存有关,内核会主动发送信号通知。当需要检查大量文件描述符时,可以使用 epoll 解决 select()或 poll()性能低的问题。


三、服务器开发常见的并发模型

1、模型一:单线程——无IO复用

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

1.1 模型分析
  • ①主线程执行阻塞accept,每次客户端connect请求连接过来,主线程中的accept响应并建立连接

  • ②创建连接成功之后,得到新的套接字文件描述符cfd(用于与客户端通信),然后在主线程串行处理套接字读写,并处理业务。

  • ③在②的处理业务时,如果有新的客户端发送请求连接,会被阻塞,服务器无响应,直到当前的cfd全部业务处理完毕,重新回到accept阻塞监听状态时,才会从请求队列中选取第一个lfd进行连接。

2、模型二:单线程accept + 多线程读写业务(无IO复用)

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

模型分析
  • ①主线程执行accept阻塞监听,每当有客户端connect连接请求过来,主线程中的accept响应并且与客户端建立连接

  • ②创建连接成功后得到新的cfd,然后再thread_create一个新的线程用来处理客户端的读写业务,并且主线程马上回到accept阻塞监听继续等待新客户端的连接请求

  • ③这个新的线程通过套接字cfd与客户端进行通信读写

  • ④服务器在②处理业务中,如果有新客户端发送申请连接过来,主线程accept依然会响应并且简历连接,重复②过程。

3、模型三:单线程多路IO复用

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

模型分析
  • ①主线程main thread 创建 lfd之后,采用多路IO复用机制(如select、poll和epoll)进行IO状态阻塞监听。有client1客户端 connect 请求, IO复用机制检测到lfd触发事件读写,则进行accept建立连接,并将新生成的cfd1加入到监听IO集合中。

  • ②client1 再次进行正常读写业务请求,主线程的多路IO复用机制阻塞返回,主线程与client1进行读写通信业务。等到读写业务结束后,会再次返回多路IO复用的地方进行阻塞监听。

  • ③如果client1正在进行读写业务时,server依然在主线程执行流程中继续执行,此时如果有新的客户端申请连接请求,server将没有办法及时响应(因为是单线程,server正在读写),将会把这些还没来得及响应的请求加入阻塞队列中。

  • ④等到server处理完一个客户端连接的读写操作时,继续回到多路IO复用机制处阻塞,其他的连接如果再发送连接请求过来的话,会继续重复②③流程。

 4、模型四:单线程多路IO复用 + 多线程业务工作池

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

模型分析

前两步跟模型三一致

  • ①主线程main thread 创建 lfd之后,采用多路IO复用机制(如select、poll和epoll)进行IO状态阻塞监听。有client1客户端 connect 请求, IO复用机制检测到lfd触发事件读写,则进行accept建立连接,并将新生成的cfd1加入到监听IO集合中。

  • ②当cfd1有可读消息,触发读事件,并且进行读写消息。

  • ③主线程按照固定的协议读取消息,并且交给worker pool工作线程池,工作线程池在server启动之前就已经开启固定数量的线程,里面的线程只处理消息业务,不进行套接字读写操作。

  • ④工作池处理完业务,触发cfd1写事件,将要回发客户端的数据消息通过主线程写回给客户端

优点
  • 相比于模型三而言,设计了一个worker pool业务线程池,将业务处理部分从主线程抽离出来,为主线程分担了业务处理的工作,减少了因为单线程的串行执行业务机制,多客户端对server的大量请求造成排队延迟的时间。就是说主线程读完数据之后马上就丢给了线程池去处理,然后马上回到多路IO复用的阻塞监听状态。缩短了其他客户端的等待连接时间。

  • 由于是单线程,实际上读写的业务并发还是为1,但是业务流程的并发数为worker pool线程池里的线程数量,加快了业务处理并行效率。

区别

        模型三是客户端向server发起请求时需要排队,模型四是业务处理完之后回写客户端需要排队。

        模型三跟模型四的总体并发效率差不多,因为还是一个线程进行读写。但是对于客户端的体验来说,会觉得响应速度变快,减少了在服务器的排队时间。如果客户端数量不多,并且各个客户端的逻辑业务有并行需求的话适合用该模型。

5、模型五:单线程多路IO复用 + 多线程多路IO复用(线程池)(实际中最常用)

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

模型分析
  • ①server在启动监听之前,需要创建固定数量N的线程,作为thread pool线程池。

  • ②主线程创建lfd之后,采用多路IO复用机制(如select、epoll)进行IO状态阻塞监听。有client1客户端 connect请求,IO复用机制检测到lfd触发读事件,则进行accept建立连接,并且将新创建的cfd1分发给thread pool线程池中的某个线程监听。

  • ③thread pool中的每个thread都启动多路IO复用机制,用来监听主线程建立成功并且分发下来的socket套接字(cfd)。

  • ④如图,thread1监听cfd1、cfd2,thread2监听cfd3,thread3监听cfd4。线程池里的每一个线程相当于它们所监听的客户端所对应的服务端。当对应的cfd有读写事件时,对应的线程池里的thread会处理相应的读写业务。

优点
  • 将主线程的单流程读写,分散到线程池完成,这样增加了同一时刻的读写并行通道,并行通道数量等于线程池的thread数量N;

  • server同时监听cfd套接字数量几乎成倍增大,之前的全部监控数量取决于主线程的多路IO复用机制的最大限制(select默认1024,epoll默认与内存有关,约3~6w不等)。所以该模型的理论单点server最高的响应并发数量为N*(3 ~ 6w)。(N为线程池thread的数量,建议与cpu核心数一致)

  • 如果良好的线程池数量和CPU核心数适配,那么可以尝试CPU核心与thread绑定,从而降低cpu的切换频率,提高了每个thread处理业务的效率。

缺点
  • 虽然监听的并发数量提升,但是最高读写并行通道依然为N,而且多个身处被同一个thread所监听的客户端也会出现延迟读写现象。实际上线程池里每个thread对应客户端的部分,相当于模型三。

6、模型六:(多进程版)单线程多路IO复用 + 多进程多路IO复用(进程池)

网络socket服务器开发几种并发模型详解,学习笔记,服务器,网络,并发模型,socket

模型分析

与线程池版没有太大的差异。需要在服务器启动之前先创建一些守护进程在后台运行。

存在的不同之处:

  • ①进程间资源不共享,而线程是共享资源的。进程和线程的内存布局不同导致主进程不再进行accept操作,而是将accept过程分散到每一个子进程中

  • ②进程的资源独立,所以主进程如果accept成功cfd,其他的进程是没有办法共享资源的,因此需要各子进程自行accpet创建连接

  • ③主进程只是监听listenFd状态,一旦触发读事件或者有新连接请求,通过IPC进程间通信(signal、mmap、fifo等方式)让所有的子进程们进行竞争,抢到lfd读事件资源的子进程会进行accpet操作,监听他们自己所创建出来的套接字cfd。(自己创建的cfd,由自己监听cfd的读写事件)文章来源地址https://www.toymoban.com/news/detail-681864.html

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

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

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

相关文章

  • TCP服务器的演变过程:使用epoll构建reactor网络模型实现百万级并发(详细代码)

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 本节,在上一章节介绍了如何使用epoll开发高效的服务器,本节将介绍使用epoll构建reactor网络模型,实

    2024年02月01日
    浏览(75)
  • 1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

    项目完整版在: Socket模块是对套接字操作封装的一个模块,主要实现的socket的各项操作。 对socket套接字的操作进行封装。 对socket套接字的操作进行封装。 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 接受数据 发送数据 关闭套接字 创建一个监听链接

    2024年02月07日
    浏览(47)
  • 使用select实现TCP并发服务器模型

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

    2024年02月08日
    浏览(47)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(65)
  • 【Linux后端服务器开发】socket套接字

    目录 一、socket 套接字概述 二、socket 函数接口 三、IP地址与端口号的网络格式 四、TCP协议的本地通信C语言示例 socket 是什么? socket 本质上是一个抽象的概念,它是一组用于 网络通信的 API , 提供了一种统一的接口 ,使得应用程序可以通过网络进行通信。在不同的操作系统

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

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

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

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

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

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

    2024年04月15日
    浏览(56)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(71)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包