网络IO模型

news2024/11/16 19:27:01

1 介绍

一提到网络IO,甚至一些网络框架,就无法避免遇到阻塞、非阻塞、同步、异步的概念,要理解这些概念,先要清楚网络IO是什么,以及网络IO如何工作。

  • 网络IO本质上也是IO的一种,就是数据的输入输出,可以理解为文件fd,这里也可以指socket fd。

  • 网络IO的处理流程,涉及到操作系统的用户空间与内核空间,在这两个阶段中发生的不同情况,从而衍生出多种网络IO模型。

  • 阻塞/非阻塞 从内核处理系统调用是否挂起用户线程的角度划分。

  • 同步/异步 内核数据就绪后是否需要用户线程亲自调用 read 来搬运数据(将数据从内核空间拷贝到用户空间) 的角度划分。

2 阻塞 IO(blocking IO)

在linux 中,默认情况下所有的socket 都是blocking,如下是一个read操作

当用户线程调用read 这个系统调用后,kernel 就开始了IO 的第一个阶段:准备数据。对于网络 IO 来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的数据包),这个时候kernel 就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel 一直等到数据准备好了,它就会将数据从kernel 中拷贝到用户内存,然后kernel 返回结果,用户进程才解除block 的状态,重新运行起来。 所以,blocking IO 的特点就是在IO 执行的两个阶段(等待数据和拷贝数据两个阶段)都被block 了。

3 非阻塞 IO(non-blocking IO)

当用户线程发出read 操作时,如果kernel 中的数据还没有准备好,它并不会block 用户进程,而是立刻返回一个error。从用户进程角度讲,它发起一个read 操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error 时,它就知道数据还没有准备好,于是它可以再次发送read 操作。一旦kernel 中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存并返回,所以,在非阻塞式IO 中,用户进程其实是需要不断的主动询问kernel 数据准备好了没有。

上述模型需要循环调用read 将大幅度推高CPU 占用率,所以实际应用场景中没有这种用法,而read在这里更多是起到检测“操作是否完成”的作用,对于检测就绪的操作,系统有提供更为高效的系统函数(select/poll/epoll)

4 多路复用IO (IO multiplexing)

IO多路复用使用select/epoll 不断的轮询所负责的所有socket,当某个socket 有数据到达了,就通知用户进程,从图可以看出IO多路复用每次操作需要两次系统调用(select 和read),而blocking IO 只调用了一个系统调用(read),在处理少量客户端连接的性能还不如阻塞IO+多线程,IO多路复用最大的优势是用户可以在一个线程内同时处理多个socket 的IO 请求,主要应对高并发、大量客户端连接的场景。

5 异步 IO(Asynchronous I/O)

介绍到这里,上述的几种IO其实都属于同步IO的范畴,及应用程序系统调用,内核处理消息就绪后应用程序需要同步处理数据。而在Linux 内核从 2.6 开始引入异步IO操作,如 aio_read, aio_write。

用户进程发起read 操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel 的角度,当它受到一个asynchronous read 之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel 会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel 会给用户进程发送一个signal,告诉它read 操作完成了。

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

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

相关文章

护网行动(防守方)linux服务器通用安全加固指南(1)

实验所属系列:Linux服务器搭建/Linux服务安全 Linux 是一个开放式系统,可以在网络上找到许多现成的程序和工具,这既方便了用户,也方便了黑客,因为他们也能很容易地找到程序和工具来潜入 Linux 系统,或者盗…

CnOpenData中国观鸟记录数据

一、数据简介 观鸟,是指在自然环境中利用望远镜等观测记录设备在不影响野生鸟类正常生活的前提下观察鸟类的一种科学性质的户外活动。 鸟类,是生物多样性中最具指示性的类群。由全国各地观鸟爱好者们共同记录的观鸟信息,能够展示中国各地区的…

cesium +vue3 +vite 实现点线面功能

第一步:搭建vue3项目 1、npm在相应文件夹下创建 npm create vitelatest2、选择项目名称 3、选择vue 4、选择是否使用typescript 或者JavaScript 5、记得在终端npm install一下就可以启动项目了 第二步:引入cesiumJS 1、npm引入 npm i cesium vite…

海康Visionmaster-VM2D,VM3D,VM深度学习对电脑配置要求

为确保VM算法平台能正常安装及运行,对PC配置有所要求。 第一:推荐配置: 操作系统:Windows7/10(64位中文操作系统) CPU:Intel Core i7-6700 3.4GHz 或以上(如需使用CPU相关深度学习…

32岁面试字节软件测试岗,想不到居然这么简单......

前段时间有个在小公司干了七八年的朋友离职了,想要拼一拼大厂,于是他选择了字节跳动。面试总共花费了 20 天左右,包含了 4 轮电话面试、1 轮笔试、1 轮主管视频面试、1 轮hr视频面试。 据他了解到的信息,其实去字节面试的人很多&…

爬虫(一)爬虫基本概念

爬虫概念网络爬虫 (网页蜘蛛, 网络机器人)爬虫就是模拟客户端发送网络请求, 接受请求对应的响应, 一种按照一定的规则,自动地抓取互联网信息的程序。理论上来说, 只要是用户通过客户端(浏览器)能够做到事情, 爬虫都能够去做。爬虫: 模拟客户端访问, 抓取数据。反爬: 保护重要数…

3、边界值分析

如何选定边界值 很难提供一份如何进行边界值分析的“详细说明”,因为这种方法需要一定程度的创造性,以及对问题采取一定程度的特殊处理办法。 但是可以提供一些通用指南: 如果输入条件规定了一个输入值范围,那么应针对范围的边…

WY49 数对

【答案解析】: 暴力破解:将 x 和 y 分别遍历 [1, n] ,进行判断当 x % y > k 时统计计数 count 即可,但是这样的话当 n 的值非常大 的时候循环次数将非常恐怖,需要循环 n^2 次。 更优解法: 假设输入 n10 , k3 &#…

QT/C++——对话框

一、标准对话框 #include "widget.h" #include <QVBoxLayout> #include <QHBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent) {btcolor new QPushButton("setcolor");bterrm new QPushButton("errmsg");btfile new …

检索业务:构建结果数据与分析

明确返回的结果对象数据 结果对象 Data public class SearchResult {/*** 查到的所商品信息*/private List<SkuEsModel> products;private Integer pageNum;//当前页面private Long total;//总记录数private Integer totalPages;//总页码private List<CatalogVo&g…

linux安装python3.10.9

Linux系统安装python3.10.9Linux系统安装python3.10.9查看系统自带python信息python官网下载安装包解压安装包上传安装包到服务器解压安装包进入解压后的目录安装python使用的依赖安装python使用的依赖完成编译安装python设置软连接设置python软连接设置pip软连接配置环境变量使…

【Linux】线程概念 | 同步

除了线程互斥&#xff0c;我们还有线程同步&#xff0c;来康康吧 文章目录1.为什么需要同步2.生产消费模型2.1 生产者和消费者的关系2.2 以简单代码为例2.3 并发3.条件变量接口3.1 init/destroy3.2 pthread_cond_wait3.3 pthrea_cond_signal/broadcast3.4 代码示例3.4.1 小bug3…

Python数据可视化(三)绘制统计图形大全

3.1 柱状图以 Python 代码的形式讲解柱状图的绘制原理&#xff0c;这里重点讲解 bar()函数的使用方法。代码&#xff1a;import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams["font.sans-serif"]["SimHei"] mpl.rcParams["axes.u…

JavaScript Hashmap散列算法

文章目录前言一、什么是散列表二、为何使用散列算法三、实现散列算法1.字典结构2.散列函数3.put 设置/更新4. 获取值四、使用HashMap处理冲突1.分离链接2.线性探查总结前言 一、什么是散列表 散列表是字典(Dictionary)的一种实现. 集合以[值, 值]形式存储, 字典则以[键, 值]对…

不让袁树雄上春晚,导演于蕾是真英明

自从央视兔年春晚结束后&#xff0c;互联网上面就出现各种吐槽声音&#xff0c;尤其是关于热歌《早安隆回》的话题。说起歌曲《早安隆回》&#xff0c;这是2022年最火的歌曲之一&#xff0c;民间的呼声也一直很高&#xff0c;都希望能够登上央视春晚舞台。 不过随着央视春晚的结…

在甲骨文云容器实例(Container Instances)上部署Alist

在甲骨文云容器实例上部署Oracle Linux 8 Desktop加强版创建容器实例查看容器实例的公共 IP 地址查看密码使用Alist甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。今天我们尝试一下通过容器实例部…

数据结构与算法(一)(Python版)

python基础知识整理二 文章目录算法分析运行时间检测大O表示法“变位词”判断问题解法一: O(logn)解法二&#xff1a;暴力法 O(n!)解法三 O(n)Python数据类型的性能示例判断是否是素数求素数个数基本结构——线性结构栈抽象数据类型以及Python实现用Python实现抽象数据结构栈栈…

HQChart实战教程58-K线主图仿tradingview

HQChart实战教程58-K线主图仿tradingview 需求效果图实现思路步骤1. 写透明成交量柱子指标2. 调整成交量柱子和K线图显示区域HQChart插件源码地址完整的demo例子需求 主图K线图和成交量柱子图在一个同窗口显示,柱子图高度为主图窗口高度的1/4,并且成交量柱子图使用透明色 效…

【论文翻译】Deep High-Resolution Representation Learningfor Visual Recognition

目录 摘要 介绍 2.相关工作 3 HIGH-RESOLUTION NETWORKS 3.1 并行多分辨率卷积 3.2 重复的多分辨率融合融合模块 3.3 表示头 3.4实例化 3.5分析 4 人体姿态估计 5语义分割 8.总结 摘要 高分辨率表示对于位置敏感的视觉问题是必不可少的&#xff0c;例如人体姿势估计…

垃圾收集器必问系列—G1

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 人生下来不是为了拖着锁链&#xff0c;而是为了展开双翼。——雨果 文章目录基于Region的堆内存布局可预测的停顿时间模型跨Region引用对象对象引用关系改变运作过程CMS VS G1相关参数Garbage First&#xff…