当前位置: 首页 > news >正文

五种网络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版 程序运行时产生的数据都属于临时数据&#xff0c;程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…...

Git【版本控制命令】

02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器&#xff0c;以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下&#xff1a; 1&#xff0e;从远程…...

打字侠是一款PWA网站,如何下载到电脑桌面?

嘿&#xff0c;亲爱的键盘侠们&#xff01; 你是否还在为寻找一款好用的打字练习工具而烦恼&#xff1f;别担心&#xff0c;今天我要给大家介绍一位超级英雄——打字侠&#xff01;它不仅是一个超级酷的打字练习网站&#xff0c;还是一款PWA&#xff08;渐进式网页应用&#x…...

Scikit-learn使用步骤?使用场景?

Scikit-learn&#xff08;简称sklearn&#xff09;是Python中一个非常流行的机器学习库&#xff0c;它提供了广泛的机器学习算法和工具&#xff0c;用于数据分析、特征工程、模型训练、模型评估等任务。以下是一个关于sklearn的基础教程&#xff0c;内容将按照几个主要部分进行…...

MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程

记录MySQL 5.7 的下载安装教程&#xff0c;并提供了Mysql 安装包 &#xff0c;以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载&#xff1a; 下载MySQL 5.7安装包&#xff0c;网盘下载地址&#xff1a;点击此处直接下载 官网下载&#xff1a; 进入官网&#xff0c…...

电阻十大品牌供应商

选型时选择热门的电阻品牌&#xff0c;主要是产品丰富&#xff0c;需求基本都能满足。 所所有的电路中&#xff0c;基本没有不用电阻的&#xff0c;电阻的选型需要参考阻值、精度、封装、温度范围&#xff0c;贴片/插件等参数&#xff0c;优秀的供应商如下&#xff1a; 十大电…...

深度学习复盘与论文复现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…...

海洋日特别活动—深海来客——可燃冰

深海中有一种神奇的物质&#xff0c;似冰又不是冰。 别看它其貌不扬&#xff0c;但本领不小&#xff0c;遇火即燃&#xff0c;能量巨大&#xff0c;可谓是能源家族的新宠。它就是被国务院正式批准列为我国第173个矿种的“可燃冰”&#xff01; 可燃冰到底是个啥&#xff1f;它…...

Web前端放图片位置:深入探索与最佳实践

Web前端放图片位置&#xff1a;深入探索与最佳实践 在Web前端开发中&#xff0c;图片作为重要的视觉元素&#xff0c;其放置位置往往影响着网页的整体布局和用户体验。然而&#xff0c;如何合理地放置图片&#xff0c;以最大化其视觉效果并提升用户体验&#xff0c;却是一个颇…...

leetcode-02-[977]有序数组的平方[209]长度最小的子数组[59]螺旋矩阵II

一、[977]有序数组的平方 重点&#xff1a; 新引入一个数组&#xff0c;不要原数组操作 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…...

Spring Cloud Gateway CORS 跨域方案

通过配置文件&#xff0c;以下配置就是其中一种方案。 gateway: #跨域配置globalcors: cors-configurations: [/**]: allowedMethods: "*"allowedHeaders: "*"allowedOriginPatterns: "*"allowCredentials: truedefault-filters: - DedupeRespo…...

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…...

Python使用Flask构建简单的web应用

构建一个简单的 Flask Web 应用程序是学习 Python Web 开发的良好起点。Flask 是一个轻量级的 WSGI Web 应用框架&#xff0c;它的主要目标是让开发者更容易构建 Web 应用&#xff0c;同时保持简单性和灵活性。下面我们将详细介绍如何使用 Flask 构建一个简单的 Web 应用&#…...

看似不同的事情,却是相同的坑

目录 一、背景二、过程1.遭遇战-微盘股的下杀2.不失为一件好事3.一切向后看吧&#xff0c;最近的学习感受4.该有的心境 三、总结 一、背景 也在一点点改变&#xff0c;期间势必要经历流血的过程&#xff1b;所谓无疯狂不成长&#xff0c;积极的心态去应对&#xff0c;去总结总…...

在 Linux 系统上安装 Android NDK

在 Linux 系统上安装 Android NDK 1. Android NDK2. NDK Downloads2.1. Latest LTS Version (r26d)2.2. Old Unsupported Versions 3. 安装 NDK4. Get started with the NDK (NDK 使用入门)References 1. Android NDK https://developer.android.com/ndk The Android NDK is …...

SpringBoot的学习要点

目录 SpringBoot 创建项目 配置文件 注解 命名规范 SpringBoot整合第三方技术 …… 中文文档&#xff1a;Spring Boot 中文文档 SpringBoot Spring Boot 是基于 Spring 框架的一种快速构建微服务应用的方式它主要提供了自动配置、简化配置、运行时应用监控等功能它…...

vue3引入cesium和olcs

首先引入包 pnpm i olcs; pnpm i -D vite-plugin-cesium pnpm i -S cesium在vite.config.js中配置&#xff0c;参考这位大佬的笔记 添加链接描述 import { defineConfig } from vite import vue from vitejs/plugin-vue import cesium from vite-plugin-cesium; // https://…...

代码随想录算法训练营第25天|回溯

回溯part02 216. 组合总和 III /*** param {number} k* param {number} n* return {number[][]}*/ var combinationSum3 function(k, n) {// k个数字相加为n// 只能使用1-9// 每个数字只能使用一次// 不能重复 如 1 2 4 、 4 1 2 不可以let res [];backtracking(k, n, [], …...

Ajax 快速入门

Ajax 概念&#xff1a;Ajax是一种Web开发技术&#xff0c;允许在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新网页的部分内容。 作用&#xff1a; 数据交换&#xff1a;Ajax允许通过JavaScript向服务器发送请求&#xff0c;并能够接收服务器响应的数据。 异…...

面试官:前端实现图片懒加载怎么做?这不是撞我怀里了嘛!

前端懒加载&#xff08;也称为延迟加载或按需加载&#xff09;是一种网页性能优化的技术&#xff0c;主要用于在网页中延迟加载某些资源&#xff0c;如图片、视频或其他媒体文件&#xff0c;直到它们实际需要被用户查看或交互时才进行加载。这种技术特别适用于长页面或包含大量…...

wordpress标志/全面的seo网站优化排名

6、到这里我们就可以打开Win7本地连接属性了&#xff0c;在里边即可更高本地连接IP地址了&#xff0c;如下图所示&#xff0c;我们切换到网络一栏&#xff0c;然后选中“ Internet 协议版本4 ”&#xff0c;然后点击下边的属性&#xff0c;如下图所示1、2、3步骤&#xff1a;7…...

企通互联的网站建设失败/合肥网站快速优化排名

古人云 “读万卷书&#xff0c;行万里路。” 书籍是人类进步的阶梯、培养阅读习惯&#xff0c;当一个人爱上读书的时候&#xff0c;眼睛都是发光的。 在小编看来&#xff0c;学习理念是【先广度后深度】&#xff0c;先把Java知识体系的东西都了解到&#xff0c;工作上先会用&…...

方维o2o 2.9蓝色团购网站程序源码模板/天眼查询个人

1. reduce 函数原型&#xff1a;void cv::reduce(InputArray _src, OutputArray _dst, int dim, int rtype, int dtype-1) src :输入矩阵 dst :输出的通过处理输入矩阵的所有行/列而得到的单行/列向量 dim :矩阵被简化后的维数索引. 0-意味着矩阵被处理成一行, 1-意味着矩…...

建设优化网站/百度浏览器手机版

添加依赖 implementation "com.github.MZCretin:AutoUpdateProject:2.0.5"进行初始化 //更新库配置val updateConfig: UpdateConfig = UpdateConfig().setDebug(true) //是否是Debug模式.setBaseUrl(BaseUrl.getBaseUrl()) //当dataSourceType为DATA_SOURCE_TYPE_U…...

macbook做网站开发/广东省新闻

在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器 基础选择器是由单个选择器组成的基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器 复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形成的。 …...

wps哪个工具做网站/seo免费优化公司推荐

其实&#xff0c;要搭建一个Hadoop 生态圈并不难&#xff0c;在我理解难在根据实际需求去做出配置调整 传统的数据仓库&#xff0c;存在的意义就是为了更好的规范数据关系&#xff0c;为数据分析、数据挖掘提供服务 那么搭建一个空的Hadoop生态圈没有太多的意义&#xff0c;因为…...