zoukankan      html  css  js  c++  java
  • 很好的设计-服务端网络请求处理模型

    几个月前学习了公司内部的网络编程框架,以为记住了,时间久了却忘了,所以在此记录下。

    架构的主体是生产-消费模式,生产者负责接收请求建立连接,消费者(也即工作线程)负责处理请求做出响应。

    POOL-1


    连接队列-保存已建立连接还未有数据到来的sockfd;待处理队列-保存有数据到来的sockfd。

    监听线程:

    监听listen sockfd并accept新建立的连接,如连接队列已满,则关闭新连接并报错。正常则放入连接队列,并向epoll fd注册监听事件。

    利用epoll监听所有已建立连接,有EPOLLIN事件(表示某sockfd有数据过来)时,将该sockfd挪到待处理队列,如果待处理队列満了,则关闭该sockfd;收到EPOLLHUP(sockfd被挂断)和EPOLLERR(sockfd发生错误)时,将sockfd关闭,并从epollfd、连接队列中剔除。

    定期检查连接队列中的sockfd,空闲时间超过阈值,关闭sockfd,从epollfd、连接队列中剔除。

    工作线程:

    不停的从待处理队列中获取sockfd,处理成功后,设置是长连接则将此sockfd放入连接队列并注册到epoll fd;如果是短连接直接关闭sockfd。

    POOL-2


    监听线程:监听listen sockfd并accept新连接,将新连接注册到监控sockfd最少的网络IO线程中。

    网络IO线程:将EPOLLIN的sockfd放入对应的待处理队列。

    工作线程:获取sockfd,处理请求、响应请求。

    POOL-2支持多个epoll fd,可以更好的利用多CPU;多个(epollfd,连接队列,待处理队列)组降低了锁的粒度,提高并发性。

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/whuqin/p/4981983.html
Copyright © 2011-2022 走看看