网络编程:使用poll单线程处理所有I/O事件
事件驱动模型
事件驱动的好处:占用资源少,效率高,可扩展性强,是支持高性能高并发的不二之选。
事件驱动模型也叫作反应堆模型(reactor),或者是Event loop模型,该模型的核心有两点:
- 1、它存在一个无限循环的事件分发线程,或者叫做reactor线程、Event loop线程。这个事件分发线程的背后,就是poll、epoll等I/O分发技术的使用。
- 所有的I/O操作都可以抽象成事件,每个事件必须有回调函数来处理。acceptor上有连接建立成功、已连接套接字上发送缓冲区空出可以写、通信管道pipe上有数据可以读,这些都是一个个事件,通过事件分发,这些事件都可以一一被检测,并调用对应的回调函数加以处理。
几种I/O模型和线程模型设计
任何一个网络程序,所有的事情可以总结成以下几种:
- read:从套接字收取数据
- decode:对收到的数据进行解析
- compute:根据解析后的内容进行计算和处理
- encode:将处理之后的结果,按照约定的格式进行编码
- send:最后,通过套接字将结果发送出去
fork
使用fork创建子进程,为每个到达的客户连接服务,如下图,随着客户数的增多,fork的子进程也越来越多,即使客户和服务器之间的交互比较少,这样的子进程也不能被销毁,一直需要存在。虽fork的处理方式简单,但处理效率不高,fork子进程的开销太大。

pthread
使用了 pthread_create 创建子线程,因为线程是比进程更轻量级的执行单位,所以它的效率相比 fork 的方式,有一定的提高。但是,每次创建一个线程的开销仍然是不小的,因此,引入了线程池的概念,预先创建出一个线程池,在每次新连接达到时,从线程池挑选出一个线程为之服务,很好地解决了线程创建的开销。但是,这个模式还是没有解决空闲连接占用资源的问题,如果一个连接在一定时间内没有数据交互,这个连接还是要占用一定的线程资源,直到这个连接消亡为止。

single reactor thread
一个reactor线程上同时负责分发acceptor的实践、已连接套接字的I/O事件。

single reactor thread + worker thread
上述的设计模式有个问题,和I/O事件处理相比,应用程序的业务逻辑处理是比较耗时的,比如XML文本的解析、数据库记录的查找、文件资料的读取和传输、计算型工作的处理等,这些工作相对比较独立,它们会拖慢整个反应堆模式的执行效率。
因此,可将decode、compute、encode型工作放置到另外的线程池中,和反应堆线程解耦,是一个比较明智的选择。
反应堆线程只负责处理I/O相关的工作,业务逻辑相关的工作都被裁剪成一个一个的小任务,放到线程池里由空闲的线程来执行。当结果完成后,再交给反应堆线程,由反应堆线程通过套接字将结果发送出去。

网络编程:使用poll单线程处理所有I/O事件的更多相关文章
- python网络编程-Select\Poll\Epoll异步IO
首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select ...
- NIO网络编程中重复触发读(写)事件
一.前言 公司最近要基于Netty构建一个TCP通讯框架, 因Netty是基于NIO的,为了更好的学习和使用Netty,特意去翻了之前记录的NIO的资料,以及重新实现了一遍NIO的网络通讯,不试不知道 ...
- Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)
这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战. 第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是 ...
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...
- UNIX网络编程——I/O复用:select和poll函数
我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死.服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然 ...
- 网络编程中select模型和poll模型学习(linux)
一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...
- 网络编程 -- RPC实现原理 -- NIO单线程
网络编程 -- RPC实现原理 -- 目录 啦啦啦 Class : Service package lime.pri.limeNio.optimize.socket; import java.io.B ...
- UNIX网络编程 第6章 I/O复用:select和poll函数
UNIX网络编程 第6章 I/O复用:select和poll函数
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
随机推荐
- DXF文件导入PADS板框问题
在使用PADS时,经常会从CAD文件中导出板框形状到PADS中. 也经常碰到一个问题:就是单位不匹配,CAD中明明设置成毫米了,可导入到PADS时却是mil. 发现单位不匹配的情况跟AUTOCAD里面 ...
- SpringSecurity - [01] 概述
Spring Security 是一个灵活且强大的工具,可以帮助你构建安全可靠的Spring应用程序.它不仅简化了认证和授权的过程,而且还提供了丰富的特性和扩展点,使得开发者可以根据项目的独特需求定制 ...
- 机器学习 | 强化学习(4) | 无模型控制(Model-Free Control)
无模型控制(Model-Free Control) 无模型预测概论 上一节课: 无模型预测 用于估计一个未知马尔科夫决策过程的价值函数 这节课 无模型控制 最优化一个未知马尔科夫决策过程的价值函数 一 ...
- Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录
Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10 ...
- FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀
title: FastAPI 表单参数与文件上传完全指南:从基础到高级实战 date: 2025/3/8 updated: 2025/3/8 author: cmdragon excerpt: 本教程 ...
- 如何学习 ROS+PX4
博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1vx4y1Y7Tu?spm_id_from=33 ...
- 栈的应用(后进先出 LIFO)--括号匹配问题
博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Stack: def __init__(self): self ...
- linux下的nginx重启命令常见以下3种:
systemctl restart nginx service nginx restart /usr/sbin/nginx -s reload
- Delphi 判断字符是否是汉字
function IsHZ(ch: WideChar): boolean; var i: Integer; begin i := Ord(ch); if (i < 19968) or (i &g ...
- Shell语言编程(炼气)
1. Shell脚本执行方式 执行方式 应用及场景 通过sh或bash 书写脚本后,最常用的方式,在其他非红帽系统中,建议使用bash运行脚本 通过.点或source 加载/生效配置文件(环境变量,别 ...