高性能并发服务器模型设计思路(epoll+线程池)

文章探讨了在服务器设计中,使用单线程、多线程以及多进程配合epoll池处理socket连接的不同策略。V1版本强调了非阻塞IO避免资源竞争的重要性,V2介绍了单线程处理多个监听套接字的方法,而V3则涉及多线程和多epoll池的并行处理。每种设计都有其优缺点,如线程安全、资源管理和性能效率等。
摘要由CSDN通过智能技术生成

V1:单线程,单监听套接字

        socket创建完毕后,创建epoll池,并将监听套接字放到线程池中,开始死循环进入epoll_wait等待状态,每当池子有活动时,将非监听套接字的收到的消息读取后,加入到任务队列,由线程池里的线程对数据进行解析,解析完成后,将待发送的数据放到任务队列队列中,返回给send处理。(池子里的套接字都设置为非阻塞)

       这里为什么不将非监听套接字的fd直接扔到线程池?

                因为这里的套接字都是非阻塞的,收到一条数据,会交给一条线程处理,如果该数据未被处理完毕,又发送另外一条数据,服务器会把该套接字交给另一个线程处理,造成多个套接字被多个线程共享,产生资源竞争,会引发一些不可预料的错误,比如可能会导致数据的重复读取或者丢失等,也会造成非必要的上下文切换的开销。

                如果是阻塞io,可以直接将fd丢到线程池里。

V2:单线程,多监听套接字

        先创建一个epoll池,for循环创建多个socket,分别绑定不同的端口号,并将每个套接字,进入监听状态,再把每个套接字放到这一个epoll池里,然后while(1)进入epoll_wait等待状态,其他步骤同上

V3:多线程,多epoll池,多监听套接字

        开始创建多个线程,每个线程分别创建一个监听套接字,和一个epoll池,并分别将监听套接字放入到对应的epoll池里,每个线程里的处理同上。

实现方法很多,还有多线程,但监听套接字,单epoll池,需要考虑线程安全问题,多进程实现等等

                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值