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

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客

字节开源的netPoll多路复用器源码解析-CSDN博客

一、几种常见的IO模型

1. 阻塞I/O

(1) 解释:

    用户调用如accept、read等系统调用,向内核发起I/O请求后,应用程序会从用户态陷入内核态。

    内核会检查文件描述符fd是否就绪,如果没有数据准备就绪,内核就会挂起(阻塞)当前的线程

    当fd中数据就绪后,操作系统内核会将数据从内核空间拷贝到进程空间,并交回控制权。

(2) 缺点:

    一个goroutine同一时刻只能处理一个流,无法解决多个IO请求问题

2. 非阻塞I/O

(1) 解释:

    执行read和write 等I/O操作会立刻返回,然后应用程序不停轮询。读取时如果没有数据,会返回

EAGAIN或EWOULDBLOCK错误码。

(2) 缺点:

    占用cpu资源,不停做无用的轮询操作

3.  I/O多路复用模型

(1) 解释:

    一个进程/线程处理多个I/O,内核同时监视多个文件描述符,一旦某个描述符就绪,通知程序进行相应的读写操作;如果没有文件句柄就绪,就阻塞应用程序,交出CPU。

(2) 缺点:无,基本符合需求。

4. 三种IO模型对比

目前epoll是linux大规模并发网络应用程序的首选。

大部分高性能的网络服务器使用的I/O复用模型均是epoll,比如nginx、redis、memcached等。

二、几种常见的IO模型 使用方法 

     以下模型的 IO 操作都是 使用阻塞的机制。

1、多线程

(1) 解释:

    每accept到一个客户端后,都启动一个新的线程。存在多个线程。

(2) 优点: 简单。

(3) 缺点:

a. 占用内存资源,每个线程需要2M的栈空间;需要的线程很多,且频繁切换。

b. 长连接需要保持连接状态(心跳/健康检查),进一步占用资源。

2、单线程 + 多路IO复用

(1) 解释:

    一个线程 ,处理多个客户端。采用多路I/O复用机制(epoll) 监控多个fd的IO请求

    多个请求是依次执行的,fd1的请求完成了,才去处理fd2的请求。

(2) 优点: 只需要一个线程,节省资源。

(3) 缺点:同一时间只能处理一个客户端操作,会有排队延迟

3、单线程 + 多路IO复用 + 多线程处理业务

(1) 解释:

    把逻辑任务分离到另外的线程池。

    创建专门用于处理逻辑业务的线程池。

    当有客户端消息到达,主线程完成io读操作后,将后续逻辑业务放入线程池的一个线程中执行,主线程继续监控IO请求。当线程执行完逻辑业务之后,将结果消息返回主线程,主线再发送给客户端。

(2) 优点: 将业务放到线程处理,减轻排队延迟。

(3) 缺点:IO 读写数据时的并发能力依然是1

4、单线程(只监听) + 多路IO复用 + 多线程处理业务和IO读写

(1) 解释:

     在3的基础上,让线程池把 IO读写 和 业务 都处理了。

     主线程只负责用来创建fd,每个线程负责监听多个客户端读写操作,以及后续逻辑业务。

     使用例子: GO语言的 原生net 和 netpoll 采用的是这个模式。

(2) 优点: 

a. 可以监听更多的fd,提升io读写的并发能力

b. 充分利用多核CPU

(3) 缺点:同一个线程内的多个客户端,依然是排队的

三、Netpoll与原生GoNet对比

1. 触发方式

Go Net:使用 边缘触发。只有一个Epoll事件循环,高并发时压力大。但消息包很大时,需要内存少。

NetPoll:使用 水平触发。支持多个事件,高并发效果更好。但消息包很大时,需要更多的内存。

2. Goroutine数目

Go Net:一个Goroutine下只有一个连接。

NetPoll:一个Goroutine下有多个连接。

3. 是否支持共用buff池,少拷贝一次数据。

Go Net:不支持。

NetPoll:支持。管理一个Buffer池直接交给用户,少拷贝一次。

四、边缘触发和水平触发的区别

1. 水平触发(LT): 若就绪的事件一次没有处理完,就会将没有处理完的事件继续放回到就绪队列之中,下一次可继续触发事件。

    必须使用非阻塞模式。因为水平触发模式会将文件描述符一直读到返回 errno或EAGAIN,非阻塞模式下才会返回这个。 而阻塞模式下不会返回这个,所以会一直阻塞卡死。

2. 边缘触发(ET):就绪的事件只能处理一次,需要一次过把数据读完。

  若没有处理完,会在下次的其它事件就绪时再进行处理。

  而若以后再也没有就绪的事件,剩余的那部分数据也会丢失。

相关文章:

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释: 用户调用如accept、read等系统调用,向内核发起I/O请求后,应用程序…...

大米cms安装支付逻辑漏洞

1.安装 下载来源:https://www.cnblogs.com/xfbk/p/17910054.html 链接:https://pan.baidu.com/s/1b-Z6RaFBZ6CsSIErY46Pyg?pwdq8qq 提取码:q8qq 注意一下配置就可以了:php5.5apachemysql5.0,主要就是数据库版本要注…...

使用 zxing 生成二维码以及条形码

需求背景 前期在做项目的时候,有一个需求是说要生成一张条形码,并且呢将条形码插入到 excel 中去,但是之前一直没有搞过找个条形码或者是二维码,最后是做出来了,这里呢就先看看怎么生成,后面再抽时间来写写…...

发布 jar 包到 maven 中央仓库

目前开发基本都是以maven或者gradle的方式,直接引入依赖包即可,那么该咋那么发布我们自己的jar包到maven仓库,让别人使用呢?本文适用于2024.3之后的步骤 文章目录 账号准备第一步,注册账号第二步,新建命名空间第三步,验证命名空间第四步,创建 push 的账号和密码点击右…...

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读: 《AI—工程篇》 AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署 AI智能体研发之路-工程篇(三&am…...

英语口语中though的用法(even though、as though)

文章目录 英语口语中 "though" 的用法详解1. "Though" 作为转折连词的用法1.1 基本用法示例句子: 1.2 位置灵活性示例句子: 2. "Though" 作为副词的用法2.1 表示对比或转折示例句子: 2.2 强调前述观点示例句子…...

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…...

前端 JS 经典:判断数组的准确方法

前言:判断数组的方法有很多,但是最完美的只有一个。 1. Object.prototype.toString.call 通过 toString.call 方法来判断是否数组。 function isArray(obj) {return Object.prototype.toString.call(obj) "[object Array]"; } 缺点&#…...

【仓库设置问题】

问题: 某公司在高速公路一些服务站内开设了百货超市,为了能及时给这些百货超市提供足够的商品,他们需要在一些百货超市旁修建仓库。一个仓库可以同时为多家百货超市提供服务,以满足各个超市对商品的需求。现已知这些百货超市在高…...

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络(BP网络) 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN(计算机视觉) 自然语言处理NLP Wo…...

Qt for Android

文章 USB Qt for android 获取USB设备列表(一)Java方式 获取 Qt for android 获取USB设备列表(二)JNI方式 获取 Qt for android 串口库使用 Qt for android : libusb在android中使用 Qt for Android : 使用libusb做CH340x串口传…...

HTTP 的三次握手

​​​​​ HTTP 的三次握手是指在建立 TCP 连接时,客户端和服务器之间进行的三步握手过程。这个过程确保了双方都能够互相通信,并且同步了彼此的序列号和确认号。 概念: 第一次握手:客户端发送一个 SYN(同步…...

【Text2SQL 论文】T5-SR:使用 T5 生成中间表示来得到 SQL

论文:T5-SR: A Unified Seq-to-Seq Decoding Strategy for Semantic Parsing ⭐⭐⭐ 北大 & 中科大,arXiv:2306.08368 文章目录 一、论文速读二、中间表示:SSQL三、Score Re-estimator四、总结 一、论文速读 本文设计了一个 NL 和 SQL 的…...

【HarmonyOS】应用屏蔽截屏和录屏

【HarmonyOS】应用屏蔽截屏和录屏 一、问题背景: 金融类或者高密性质的应用APP,对于截屏和录屏场景,某些业务下是禁止不允许。 目前这种场景的需求也是非常有必要的,很多电诈都是通过远程录屏软件,获取到账户密码或者…...

[BUG历险记] ERROR: [SIM 211-100] CSim failed with errors

问题重现 在开发HLS过程中,我碰到一个奇怪的现象,同样的工程,在我重装完系统后,不能进行C仿真了,但是综合实现都是可以正常运作的。 vitis的报错也非常奇怪,单单一行: ERROR: [SIM 211-100] C…...

Redis中大Key与热Key的解决方案

原文地址:https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库,但是在实际的使用过程中,我们常常会遇到两个常见的问题,也就是文章标题所说的大 key与热 key。 一、定义 1.1…...

MySQL 视图(2)

上一篇:MySQL视图(1) 基于其他视图 案例对 WITH [CASCADED | LOCAL] CHECK OPTION 进行释义 创建视图时,可以基于表 / 多个表,也可以使用 其他视图表 / 其他视图 其他视图 的方式进行组合。 总结 更新视图&#x…...

Leecode---技巧---颜色分类、下一个排列、寻找重复数

思路&#xff1a; 遍历一遍记录0,1,2的个数&#xff0c;然后再遍历一次&#xff0c;按照0,1,2的个数修改nums即可。 class Solution { public:void sortColors(vector<int>& nums){int n0 0, n1 0, n2 0;for(int x: nums){if(x0) n0;else if(x1) n1;else n2;}for…...

ERC-7401:嵌套 NFT 标准的全新篇章

在数字资产和区块链技术迅速发展的今天&#xff0c;非同质化代币&#xff08;NFT&#xff09;已经成为了一种重要的资产形式&#xff0c;广泛应用于艺术、游戏、收藏品等多个领域。随着市场需求的多样化&#xff0c;传统的 NFT 标准如 ERC-721 和 ERC-1155 已经不能完全满足用户…...

代码随想录算法训练营Day6| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词 知识点补充&#xff1a; 1.遍历HashMap中的值&#xff1a; HashMap<Integer,Integer> map new HashMap<Integer,Integer>(); for(Integer num:map.values()){ } 2.遍历HashMap的键&#xff1a; HashMap<Integer,Integer> map new Ha…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...