五种网络IO模型
目录
前言
文件描述符
为什么要多种io模型
同步IO
1.阻塞IO
2.非阻塞IO
3.多路复用IO(事件驱动IO)
select:
poll:
epoll:
4.信号驱动IO
异步IO
区别
前言
文件描述符
首先我们了解一下文件描述符是什么:在linux下一切皆文件,进程是通过文件描述符(file descriptors)来访问文件的,。默认有三个文件描述符:0(标准输入),1(标准输出),2(标准错误)。再打开一个新的文件的话,它的文件描述符就++。
为什么要多种io模型
网络IO,会涉及到两个系统对象,一个是用户空间调用IO的进程或线程,另一个是内核空间的内核系统,比如发生IO操作read时,它会经历两个阶段。
1.等待数据准备就绪2.将数据从内核拷贝到进程或线程中
因为在以上两个阶段上各有不同的情况,所以出现了多种网络 IO 模型。
同步IO
1.阻塞IO
在linux下,所有socket默认都是阻塞的,我要向一个文件描述符做read操作,此时内核里没有数据就绪,那么这个时候用户进程就会阻塞,直到内核数据就绪了,会将数据从内核拷贝到用户内存,然后返回结果,此时用户进程解除阻塞状态。
优点:开发简单,在阻塞期间用户线程挂起,挂起不会占用CPU资源。
缺点:不适合大并发,开销会非常大。
但是如果有多个client阻塞IO就不适用了,所以引用了多线程,但是如果数据规模太大了,会很占用系统资源,而且线程和进程容易进入假死状态。如果用线程池的话,数据规模非常非常大,线程池可能缓解部分压力,但是不能解决所有问题,所以我们要引入其它io模型。
2.非阻塞IO
设置socket为非阻塞,如果内核还未将数据准备好,系统调用仍然会直接返回。我要向一个文件描述符做read操作,如果有数据,则成功读取返回,如果没有数据,也返回,但带上错误码。使用这种方式的话,我们做读取,就必须每隔一段时间去看看,叫非阻塞轮询检测。
但是轮询提高CPU占用率,并且系统也提供了select()多路复用模式,可以一次检测多个连接是否活跃,所以非阻塞IO一般在特定场景使用。
优点:每次发起 IO 调用,在内核等待数据的过程中可以立即返回,用户线程不会阻塞,实时性好
缺点:多个线程不断轮询内核是否有数据,占用大量 CPU 资源,效率低。
3.多路复用IO(事件驱动IO)
单个进程/线程就可以同时处理多个IO请求,一个进程/线程可以监视多个文件句柄。
而多路复用IO利用了操作系统提供的一些机制,如select、poll、epoll,来同时监视多个I/O事件的状态。
select:
底层是数组,采用轮询,当用户进程调用了 select(每次调用select()方法,都需要把 fd 集合从用户态拷贝到内核态,并进行遍历。),那么整个进程会被阻塞,一旦某个文件句柄就绪,select 就会返回。这个时候用户进程再调用 read 操作,将数据从内核拷贝到用户进程。
poll:
poll用链表方式存fd,没有最大数量fd限制,其余和select一样。
epoll:
只会返回就绪的文件描述符,而不是遍历整个文件描述符集合。
红黑树方式存fd,没有最大数量fd限制,可保存所有待检测的socket,所以只需要拷贝一次,减少了内核和用户空间大量的数据拷贝和内存分配,回调方式不是轮询,不会因为fd增多性能下降。缺点:只能在Linux下工作。
这里补充一个知识点:
Reactor(反应堆),三部分组成,多路复用器(同时阻塞io socket),事件派发,事件处理(回调处理)。
4.信号驱动IO
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。
异步IO
用户进程发起操作之后,就可以开始去做其它的事。而另一方面,当内核收到read后首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后内核会等待数据准备完成,然后将数据拷贝到用户内存,然后会给用户进程发送一个信号,告诉它操作完成了。
区别
阻塞IO,非阻塞IO,多路复用IO,信号驱动IO这四种的主要区别在第一阶段,他们在第二阶段是一样的:数据从内核缓冲区复制到调用者缓冲区期间都被阻塞住。异步 IO 都是非阻塞。
同步和异步,看是谁把内核缓冲区数据拷贝到用户缓冲区的,如果不是自己写代码实现的,那就是异步。
相关文章:
五种网络IO模型
目录 前言 文件描述符 为什么要多种io模型 同步IO 1.阻塞IO 2.非阻塞IO 3.多路复用IO(事件驱动IO) select: poll: epoll: 4.信号驱动IO 异步IO 区别 前言 文件描述符 首先我们了解一下文件描述符是什么:…...
VSCode超过390万下载的请求插件
Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…...
前端 JS 经典:下载的流式传输
触发下载在浏览器中有两种方式:1. 客户端的方式 2. 服务器的方式 1. 服务器的方式 通过 a 元素链接到一个服务器的地址,然后需要后端人员配置,当用户点击按钮请求这个地址时,服务端给他加上一个响应头。Content-Disposition 设置…...
k8s面试题大全,保姆级的攻略哦(三)
目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…...
从年金理论到杠杆效应,再到财务报表与投资评估指标
一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…...
K8S - 用kubectl远程访问内网的k8s集群
在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…...
STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】
STM32F103C8移植uC/OSIII并以不同周期点亮两个LED灯(HAL库方式)【uC/OS】【STM32开发板】【STM32CubeMX】 实验说明 将嵌入式操作系统uC/OSIII移植到STM32F103C8上,构建两个任务,两个任务分别以1s和3s周期对LED进行点亮—熄灭的…...
【c语言】qsort函数及泛型冒泡排序的模拟实现
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 一、qsort函数 1.回调函数 2.qsort函数 3.void* 指针 二、泛型冒泡排序的模拟实现 1.比较函数的编写 2.交换函数的编写 3.冒泡排序的编写 4…...
MySQL之多表查询—表子查询
一、引言 上一篇博客学习了行子查询。(看弹幕:同一张表用or,不同张表用union) 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列,这种子查询称为表子查询。 2、常用的操作符 IN 3、…...
Java 18风暴来袭:解锁编程新纪元
一、引言 Java 18的发布标志着Java语言在性能、安全性和开发效率方面的又一次飞跃。本次更新不仅带来了新的语言特性,还包括了一些实验性功能和工具的改进。这些新特性旨在帮助开发者编写更高效、更安全的代码,并提升开发体验。 二、新特性概述 1. 默…...
文件操作(Python和C++版)
一、C版 程序运行时产生的数据都属于临时数据,程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…...
Git【版本控制命令】
02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器,以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下: 1.从远程…...
打字侠是一款PWA网站,如何下载到电脑桌面?
嘿,亲爱的键盘侠们! 你是否还在为寻找一款好用的打字练习工具而烦恼?别担心,今天我要给大家介绍一位超级英雄——打字侠!它不仅是一个超级酷的打字练习网站,还是一款PWA(渐进式网页应用&#x…...
Scikit-learn使用步骤?使用场景?
Scikit-learn(简称sklearn)是Python中一个非常流行的机器学习库,它提供了广泛的机器学习算法和工具,用于数据分析、特征工程、模型训练、模型评估等任务。以下是一个关于sklearn的基础教程,内容将按照几个主要部分进行…...
MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程
记录MySQL 5.7 的下载安装教程,并提供了Mysql 安装包 ,以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载: 下载MySQL 5.7安装包,网盘下载地址:点击此处直接下载 官网下载: 进入官网,…...
电阻十大品牌供应商
选型时选择热门的电阻品牌,主要是产品丰富,需求基本都能满足。 所所有的电路中,基本没有不用电阻的,电阻的选型需要参考阻值、精度、封装、温度范围,贴片/插件等参数,优秀的供应商如下: 十大电…...
深度学习复盘与论文复现C
文章目录 4、Distributed training4.1 GPU architecture 5、Recurrent neural network5.1 The basic structure of RNN5.2 Neural networks without hidden states5.3 Recurrent neural networks with hidden states5.4 summary 6、Language Model Dataset (lyrics from Jay Ch…...
海洋日特别活动—深海来客——可燃冰
深海中有一种神奇的物质,似冰又不是冰。 别看它其貌不扬,但本领不小,遇火即燃,能量巨大,可谓是能源家族的新宠。它就是被国务院正式批准列为我国第173个矿种的“可燃冰”! 可燃冰到底是个啥?它…...
Web前端放图片位置:深入探索与最佳实践
Web前端放图片位置:深入探索与最佳实践 在Web前端开发中,图片作为重要的视觉元素,其放置位置往往影响着网页的整体布局和用户体验。然而,如何合理地放置图片,以最大化其视觉效果并提升用户体验,却是一个颇…...
leetcode-02-[977]有序数组的平方[209]长度最小的子数组[59]螺旋矩阵II
一、[977]有序数组的平方 重点: 新引入一个数组,不要原数组操作 class Solution {public int[] sortedSquares(int[] nums) {int left0,right nums.length-1;int[] resultnew int[nums.length];int index nums.length-1;while(left<right){if(nums…...
5大核心价值重构云游戏体验:Sunshine让你的游戏突破硬件与空间限制
5大核心价值重构云游戏体验:Sunshine让你的游戏突破硬件与空间限制 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在数字娱乐日益碎片化的今天,玩家们面临…...
COMSOL 6.2有限元仿真模型:“1-3压电复合材料厚度共振模态、阻抗相位曲线、表面位移仿...
COMSOL有限元仿真模型_1-3压电复合材料的厚度共振模态、阻抗相位曲线、表面位移仿真。 材料的几何参数可任意改变 版本为COMSOL6.2,低于此版本会打不开文件 ps:支持超声、光声、压电等相关内容仿真代做搞压电复合材料仿真最头疼的就是参数调麻了——厚度…...
CVPR 2025新作SAGE实战:用SAM语义先验+知识蒸馏,搞定红外与可见光图像融合
SAGE实战指南:如何将CVPR 2025前沿成果落地红外与可见光图像融合项目 在计算机视觉领域,多模态图像融合技术正经历着从传统方法到深度学习驱动的范式转变。2025年CVPR会议提出的SAGE(Semantic-Aware Guided Enhancement)方法&…...
亿级并发下的抢票系统架构:从DDD到微服务的实战解析
1. 抢票系统的业务挑战与技术痛点 每年春运期间,12306系统都要面对全球最严苛的高并发考验。2019年春运最高峰日点击量达到1495亿次,相当于每个中国人当天点击了100多次。这种量级的并发请求,如果直接打到数据库上,就算是把阿里云…...
告别torch.save!用safetensors安全存储PyTorch模型,手把手教你处理metadata(附完整代码)
告别torch.save!用safetensors安全存储PyTorch模型,手把手教你处理metadata(附完整代码) 在深度学习项目的实际开发中,模型参数的保存和加载是每个开发者都必须掌握的基础技能。PyTorch框架默认提供的torch.save和torc…...
4步完成Axure本地化设置:让新手轻松上手的中文界面方案
4步完成Axure本地化设置:让新手轻松上手的中文界面方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn …...
硬件基础常识【2】--BJT深度饱和区的参数设计与工程实践
1. BJT深度饱和区的核心参数设计 三极管作为电子设计中最基础的元器件之一,其开关特性在实际工程中应用极为广泛。要让BJT稳定工作在深度饱和区,关键是要掌握几个核心参数的相互关系。我当年在设计第一个开关电路时,就因为没吃透这些参数关系…...
新手入门:基于快马平台复现pencil设计工具基础功能学前端
最近在学前端开发,想找个能动手实践的项目练练手。朋友推荐了pencil官网的设计工具,但直接看源码有点复杂。后来发现用InsCode(快马)平台可以快速复现基础功能,特别适合新手理解画布操作和事件处理。下面分享我的学习过程: 画布搭…...
告别繁琐输入:基于SmartConfig与微信的ESP8266/ESP32一键配网实战
1. 为什么我们需要一键配网技术? 每次拿到新的智能设备,最头疼的就是怎么把它连上家里的Wi-Fi。传统的配网方式通常需要你在手机App里手动输入Wi-Fi名称和密码,这个过程不仅繁琐,还容易出错。想象一下,你要给10个智能灯…...
从v4l2-ctl命令到media拓扑:手把手教你调试RK3568上的OV8858摄像头图像
RK3568平台OV8858摄像头深度调试实战:从硬件链路到图像优化的全流程解析 当你在RK3568平台上调试OV8858摄像头时,是否遇到过这样的场景:设备树配置看似正确,但摄像头输出的图像却出现花屏、颜色异常或干脆没有信号?作为…...
