c++应用网络编程之四Linux常用的网络IO模型

一、网络IO模型的实际应用

在前面学习了基本的网络IO模型,那么这种抽象的网络IO模型如何在实际的编程中应用呢?这其实就是理论与实际如何产生联系的一个过程。在现实世界中,有了理论的指导,下一步就是要把相关的理论如何与具体的实践相结合。一个真正的学习者,恰恰是一个好的应用者。从抽象到实践其实是有一些规律可以遵循的。最基础的办法就是使用一些现有的实践模型,将其在场景中应用并不断的掌握其中的内在情况,不断的适应和修改二者的平衡点。即使最终没有成功的把某种模型与实际场景结合成功,那么也明白了这种场景与这种模型的不匹配的所存,这就是迈向实践过程的第一步。
在Linux的网络IO模型中,常用的也就几种,下面就其进行一下分析和说明。

二、Linux平台下的常用IO模型

这里的Linux其实指是常见的大多数的类Linux平台。在这些平台上,常用的IO网络模型其实主要有以下几个:
1、BIO,同步模型
这种模型,就是最原始的模型。即直接使用网络套接字,按照套接字的流程进行编程。这种编程方式,简单、方便。对于处理一些常见的基础的网络通信,特别是一对一的网络命令通信时,就相当有效。而它的基本应用场景就是,客户端和服务端是单映射,通信数据量较小,通信环境一般是自组网或局域网内。
这种模型非常简单,就不再深入分析了。

2、select IO多路复用模型
在Linux中提供了函数:

int select(int nfds, fd_set *r, fd_set *w, fd_set *e, struct timeval *timeout);

这种模型就是为了解决同步IO的问题,它解决了服务端1:N的问题。即每个服务端可以连接多个客户端而不需要单独的创建线程来控制。select模型的本质其实就是内核处理一个遍历文件描述符数组(fd,网络通信句柄)可读写(就绪)的过程。它适应的场景一般是并发不太高的情况下,而且由于是遍历,所以效率不高。通常select模型默认的扫描数量是1024(32位)或2048(64位)。当然,此数量可以在头文件中自行修改,不过不建议这么做。
其由POSIX定义,所以基本各个平台都会有支持。

3、poll IO多路复用模型

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

这个模型的本质和select模型没有本质区别,都是遍历文件描述数组的过程。只不过在这个模型中采用了链表方式保存文件描述符,故基本上可以理解为没有了select模型中的限制。它的适应场景和select基本一样,虽然从理论上可以用于更高的网络并发,但其实带来的编程复杂度,使其得不偿失。但在一些特定的场景下,如并发很多,但实际活动连接不多的情况下,它还是有用武之地的。
4、epoll IO多路复用模型
epoll比较复杂,它由一组函数epoll_create,epoll_wait,epoll_event 和epoll_ctl等相关操作组成。epoll分为两种触发方式,即LT,Level-Triggered(水平触发)和ET,Edge-Triggered(边缘触发)。LT一般来说适用比较广,常见的epoll编程基本以这种居多,最适合高并发场景,因为虽然叫高并发,但具体到某一个时刻,真正处于活动的则未必非常多。而ET一般适用于处理事件触发这个动作会引起的后果的场景,由于其只动作一次,所以能更好的提高通信效率。它更适合于大数据量的通信。
上面的详细应用细节,会在后面分章节逐一进行分析和应用说明。除此之外,还有其它一些平台比如Solaris的evport,Free BSD中的Kqueue(MacOS),但均不是常用的,这里都不再介绍,有兴趣的可以自己分析一下,其实原理都基本类似。
另外在前面单独分析过最新的IO模型IO_URING模型,这里就不再重复,有兴趣的可以翻看以前的文章“Linux新的IO模型io_uring”。
最后,需要说明的是,这三种IO模型本质上仍然是同步IO,特别是epoll很多人容易将其理解成异步IO,一定要记清楚,它也是同步IO。这也是大多数人都知道的Windows上的IOCP模型要比其效率更高的原因。

三、比较分析

理论上讲select和poll模型基本算是一个水平,它们需要在内核空间和用户空间进行文件描述符的复制,这意味着两种状态空间的切换,代价肯定是大的。所以其不适合于高并发的场景。同时,poll还是一种反复触发机制,即如果发现fd就绪后未处理,则会再次扫描时继续触发。而epoll则是共享内存空间不需要在两种状态空间间进行数据的拷贝交换。
select模型的有处理文件描述符的上限,一般不建议修改;poll虽然没有上限,但处理大量文件句柄时会带来效率的快速降低。而epoll则通过事件触发机制进行回调处理,所以对上限基本不敏感。但如果活跃连接过多导致事件触发频繁,仍然会可能导致性能和效率的问题。在一般情况下epoll可以轻松处理c100k的问题。如果机制的配置升高,则还可以进一步的提高。不过需要注意的是,网络的高并发和高并发处理是两个问题,这个经常被很多人忽视。举一个简单例子即可明白,一个服务端连接了十万个客户端,但只有极少的客户端是活跃的;另外一个服务端连接了十万个客户端但基本都是活跃的。
从开发者普遍的意识上来看,可能epoll的效率最高。但其实则未必,这要看应用场景,比如在连接少(十的量级),但活跃并发高(十个全部在通信且数据量相对较多)时,select和poll模型很有可能比epoll模型效率更高。
大家一定要记住,所以效率一定是相对的而不是绝对的,适合的才是最好的。

四、总结

实事求是,与时俱进,理论联系实际,实践是检验真理的唯一标准…,这些理论每个人可能都会脱口而出。但真正的应用环节呢?可能绝大多数人会有意无意的找各种借口,陈陈相因,因循守旧,更别提创新意识了。只有在实践中深入分析掌握了现有技术的优劣,才可能知晓应用场景下的各种技术不足,才可能产生创新意识。网络编程中这种例子特别多(如io_uring,dpdk),毕竟实际应用的在不断提高对网络技术的要求。而更可怕的是,这种要求不但没有降低还在不断的提高。
网络编程技术是一个计算机编程技术的集大成的方向,是一个软件开发者攀登的高峰。愿与诸君共勉,一同登峰赏景!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中,HTTP(HyperText Transfer Protocol&…

C#中的栈和队列

什么是栈 栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到眼制。栈的操作只能在表的一端进行,队列的插入操作在表…

安卓篇-unidbg初步测试

前言:目前app的进度是c层的md5魔改 已经做好,又套了一层java层的加密。刚好可以再熟悉一下unidbg 最新版的app ,作为demo测试一下。 分析先看下app 的反编译的结果,很明显,源码很清晰 ,之前的混淆方式一点用没有。 然后跳过去 /* loaded from: classes4.dex */ public c…

HALCON数据结构

一、HALCON数据结构简介 1、HALCON中有两类参数:图形参数和控制参数。 2、HALCON算子参数中,图形输入参数、图形输出参数、控制输入参数和控制输出参数。 3、图形参数有:图像(image)、区域(region)和轮廓(XLD) 4、控制参数有:…

FPGA实验5:4位加法计数器

实验目的及要求 掌握时钟信号、进程和BUFFER端口的运用;了解计数器的设计、仿真和硬件测试,进一步熟悉VHDL语句、语法及应用等。 实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计4位加法计数器,进行波形仿真和分析、引脚分配…

人工智能与机器学习原理精解【2】

文章目录 机器学习基础一般化流程回归线性回归julia实现最小二乘法原理最小二乘法的原理线性回归中的最小二乘法最小二乘法的优点与局限性最小二乘法算法过程一、线性回归模型二、目标函数三、求解算法四、算法步骤四、计算公式五、注意事项 回归理论概述回归的基本概念回归模型…

4 Java的基本程序设计结构(基本语法3)- 字符串、面向对象(进阶)

文章目录 前言一、java中的 究竟比较的是什么?二、字符串1 String(1)String的两种构造方式(2)字符数组转字符串、字节数组转字符串(3)字符串的 拼接(4)字符串的内存结构…

2024睿抗机器人开发者大赛CAIP编程赛题解(c++)

题目地址(补题) PTA | 程序设计类实验辅助教学平台 RC-u1 热҈热҈热҈ 简单模拟题&#xff0c;没什么好说的 : #include<bits/stdc.h> using namespace std ; const int N 55 ;int a[N] ;int main(){int n , w ; cin >> n >> w ;for(int i1;i<n;i)…

【Android面试八股文】荣耀面试算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵

文章目录 1. 算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵1.1 题目描述1.2 算法实现1.2.1 步骤说明:1.2.2 算法实现1.2.3 代码实现:1.2.4 程序说明:1.2.5 示例详细讲解如何将一个矩阵顺时针旋转90度1. 算法题:输入一个N阶方…

Spring -- 三层架构

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

Oracle小白菜鸟从入门到精通教程

前言 Oracle公司&#xff08;甲骨文&#xff09;是全球最大的信息管理软件及服务供应商&#xff0c;成立于1977年&#xff0c;总部位于美国加州Redwood shore&#xff0c;面向全球开放oracle认证。Oracle开发的关系数据库产品因性能卓越而闻名&#xff0c;Oracle数据库产品为财…

Hi6274 反激式20瓦电源芯片

HI6274为高性能多模式 PWM 反激式20瓦电源芯片。HI6274较少的外围元器件、较低的系统成本可设计出高性能的"无Y"开关电源。HI6274提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、过载保护、软启动、芯片过温保护、可编程输出过压保护功能…

云原生项目纪事系列 - 项目管理的鲜活事例

大规模云原生系统的新颖性、建设性和挑战性&#xff0c;吸引着许多有数学思想、哲学意识和美学观念的系统架构师&#xff0c;老模也是其中一员。 老模即是文史家庭出身&#xff0c;又有理工学业背景&#xff0c;他基于平时记录的翔实细节&#xff0c;秉持客观原则&#xff0c;使…

【Langchain大语言模型开发教程】记忆

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Langchain的历史记忆 ConversationBufferMemory 2、基于窗口限制的临时记忆 ConversationBufferWindowMemory 3、基于Token数量的临时记忆 ConversationTokenBufferMemory 4、基于历史…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

【Webpack】提高打包速度

升级 webpack 版本&#xff1a;Webpack 不断更新优化打包速度&#xff0c;升级到最新版本可以获得更好的性能。 减少模块解析范围&#xff1a;通过设置resolve.modules、resolve.extensions、resolve.alias等选项&#xff0c;可以让Webpack减少查找和解析模块的范围&#xff0…

《从C/C++到Java入门指南》- 17.命令行参数

命令行参数 一直写代码的童鞋可能留意到了&#xff0c;main函数中会传入一个String args[]的字符串数组。 这个数组由JVM接收用户输入并传给main函数。 import java.util.*; public class Main {public static void main(String[] args) {for (String arg : args) {System.out…

FLINK-运行架构

为什么要学习Flink运行架构&#xff1f; 虽然现在大厂的开发工具都非常高效、只需要进行参数配置、Flink-sql写业务逻辑&#xff0c;但是在资源配置逻辑优化上不可避免需要了解底层的组件配置。面试时可能也会被问到FLINK是如何进行资源分配、作业运行的等。 以下是在学习时记录…

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…

Python学习—open函数,json与pickle知识点,Os模块详解

目录 1. Open函数 2.json与pickle模块 json模块 1. json.dumps() 2. json.dump() 3. json.loads() 4. json.load() pickle 模块 1. pickle.dumps() 2. pickle.dump() 3. pickle.loads() 4. pickle.load() 3.Os模块 1. Open函数 在Python中&#xff0c;open() 函数…