Linux之IO多路复用

文章目录

  • 前言
  • 原理
  • 使用

前言

在linux系统中,一切皆文件,那么关于文件的读写IO更是重中之重,在初学者练习网络编程中常常会遇到一种情况,服务端每次建立一个连接,就要开启一个线程处理它,那么一旦连接数量起来,我们就需要创建大量的线程,这些线程无疑会占用系统大量资源,拖慢系统性能,那么怎么解决这个问题,这就引出了我们今天的主角IO多路复用

原理

IO多路复用使原本多个主动轮询文件的线程,转化成让系统内核监听这些文件,当接受的到文件数据时在通知给我们的应用进程,这种方式无疑可以避免我们开启大量线程去处理文件

使用

  1. select:通过select系统调用来监视文件描述符集合的状态变化,一旦其中一个文件描述符就绪,就通知应用程序进行相应的I/O操作

缺点:
select监听的文件描述符的数量不能超过1024个
select会把这些文件描述符拷贝到内核
select只会告诉我们,这这些文件描述符中有的可以读了,但是内核没有告诉我们到底是哪个,需要我们去遍历查找

#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

nfds是监测的文件描述符的最大值加1
readfds是可读的文件描述符集合
writefds是可写的文件描述符集合
exceptfds是异常事件的文件描述符集合
timeout是等待时间

  1. poll:类似于select,但使用数据结构更为简单。使用struct pollfd结构体来表示需要监测的文件描述符和事件,并通过poll系统调用进行轮询检查。

缺点:
select会把这些文件描述符拷贝到内核
select只会告诉我们,这这些文件描述符中有的可以读了,但是内核没有告诉我们到底是哪个,需要我们去遍历查找

#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);

fds是一个指向struct pollfd结构体数组的指针
nfds是数组中元素的数量
timeout是等待时间

  1. epoll:是Linux特有的高效的I/O多路复用机制。它通过创建一个epoll实例并使用epoll_ctl函数将需要监测的文件描述符添加到实例中,然后使用epoll_wait函数等待事件的发生。

epoll使用了共享内存,解决数据拷贝的问题
并且当文件的可以去读了,内核主动的去唤醒进程,并告知进程哪些文件是可以读的

#include <sys/epoll.h>int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epfd是epoll实例的文件描述符
op可以是EPOLL_CTL_ADD、EPOLL_CTL_MOD或EPOLL_CTL_DEL
fd是要添加、修改或删除的文件描述符
event是一个指向struct epoll_event的指针
events是用来保存事件的数组
maxevents是数组中元素的数量
timeout是等待时间

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

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

相关文章

aarch64 rpmbuild openstack wallaby neutron 打包rpm笔记

基本信息 源码地址&#xff1a; openstack-neutron: Neutron is an OpenStack project to provide "network connectivity as a service" between interface devices (e.g., vNICs) managed by other OpenStack services - Gitee.com git clone -b Multi-Version_O…

【JS的设计模式一】

本文参考书籍 《JavaScript设计模式与开发实践》 在 JavaScript 编程中&#xff0c;this 关键字总是让人感到迷惑&#xff0c;Function.prototype.call 和 Function.prototype.apply 这两个方法也有着广泛的运用。我们有必要在学习设计模式之前先理解 这几个概念。 this Java…

Windows 95 的辉煌诞生历史

1992 年 2 月&#xff0c;Windows 3.1 的研发即将结束&#xff0c;而 Windows 团队正忙得不亦乐乎地计划他们的下一盘大棋。到了 3 月 5 日&#xff0c;他们终于悠哉悠哉地敲定了战略大计&#xff1a;横扫桌面、笔记本、移动设备以及时髦的触控笔设备。至于那些高大上的服务器和…

测吧(北京)科技有限公司项目总监王雪冬一行访问计算机学院探讨合作

3月15日&#xff0c;测吧&#xff08;北京&#xff09;科技有限公司&#xff08;以下简称测吧&#xff09;项目总监王雪冬来到计算机学院对校企合作、学生就业、学生竞赛等一系列工作进行了深入研讨&#xff0c;并向计算机学院颁发了优秀组织单位和优秀指导老师奖。会议由黄曼绮…

当年很流行,现在已经淘汰的前端技术有哪些?

近几年&#xff0c;前端技术真可谓是飞速发展&#xff0c;不断有新的技术涌现&#xff0c;爆火的前端框架 Astro&#xff0c;前端运行时 Bun&#xff0c;构建工具 Vite 等都给前端提供了强大动力。当然&#xff0c;也有很多前端技术随着技术的发展不再需要使用&#xff0c;有了…

【产品运营】产品需求应该如何管理

产品项目在进行时经常会有一些需求需要实现&#xff0c;需求是产品更新迭代的动力&#xff0c;需求也是从用户诉求转化而来&#xff1b;在做需求管理时&#xff0c;我们需要判断一个需求的优先级等方面&#xff0c;对产品进行优化&#xff1b; 目录&#xff1a; 一、 为什么要…

把JS中的map方法玩出花来

一 map是什么 map(callbackFn) map(callbackFn, thisArg)map() 方法是一个迭代方法。它为数组中的每个元素调用一次提供的 callbackFn 函数&#xff0c;并用结果构建一个新数组。 参数 callbackFn 数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。该…

FFT64点傅里叶变换verilog蝶形运算,代码和视频

名称&#xff1a;FFT64点verilog傅里叶变换 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 使用verilog代码实现64点FFT变换&#xff0c;使用蝶形运算实现傅里叶变换 演示视频&#xff1a;http://www.hdlcode.com/index.php?mhome&cView&…

【计算机网络】应用层协议--HTTP协议及HTTP报文格式

目录 1、HTTP是什么 2、HTTP请求与响应 3、HTTP请求的两种方法(get和post)及区别 (面试题) 4、几种常见的错误的说法 5、HTTP协议的特点 6、应用场景 7、HTTP报文格式 8、面试题&#xff1a;HTTP常见的状态码都有哪些&#xff1f; 1、HTTP是什么 HTTP协议是在Web上进行…

剑指Offer || 056.两数之和 IV - 输入二叉搜索树

题目 给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。 示例 1&#xff1a; 输入: root [8,6,10,5,7,9,11], k 12 输出: true 解释: 节点 5 和节点 7 之和等于 12示例 2&…

C# 关于托管调试助手 “FatalExecutionEngineError“:“运行时遇到了错误。解决方案

托管调试助手 “FatalExecutionEngineError”:“运行时遇到了错误。此错误的地址为 0x740161f8&#xff0c;在线程 0x1174 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug&#xff0c;或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 …

微信native-v3版支付对接流程及demo

1.将p12证书转为pem证书&#xff0c;得到商户私钥 openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes 密码是&#xff1a;商户id 2.将获取到的apiclient_cert.pem证书&#xff0c;复制出这一块内容&#xff0c;其他的不要 3.下载这个工具包 https://gi…

macOS Sonoma 桌面小工具活学活用!

macOS Sonoma 虽然不算是很大型的改版&#xff0c;但当中触目的新功能是「桌面小工具」&#xff08;Widget&#xff09;。如果我们的萤幕够大&#xff0c;将能够放更多不同的Widget&#xff0c;令用户无须开App 就能显示资讯&#xff0c;实在相当方便。 所有iPhone Widget 也能…

Hive insert插入数据与with子查询

1. insert into 与 insert overwrite区别 insert into 与 insert overwrite 都可以向hive表中插入数据&#xff0c;但是insert into直接追加到表中数据的尾部&#xff0c;而insert overwrite会重写数据&#xff0c;既先进行删除&#xff0c;再写入 注意&#xff1a;如果存在分…

openCV的CUDA GPU 版本安装 (Ubuntu windows 通用)

需要做template match, 比较注重时间&#xff0c;因此opencv 的普通版本不适用。需要用GPU 的。 下载 git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git确保准备好以下内容 1&#xff1a; visual studio &#xff0…

岛屿的周长

463. 岛屿的周长 class Solution:def islandPerimeter(self, grid: List[List[int]]) -> int:res 0m, n len(grid), len(grid[0])# 遍历grid&#xff0c;就是所有的封闭岛屿for i in range(m):for j in range(n):if grid[i][j] 1:res self.dfs_matrix(grid, i, j)retur…

硬件信息查看工具 EtreCheckpro mac中文版功能介绍

etrecheckpro mac中文版是一款专业的硬件信息查看工具&#xff0c;它能够快速的检测Mac电脑的软硬件信息&#xff0c;加强用户对自己计算机的了解&#xff0c;EtreCheckPro for Mac下载首先会对电脑的软硬件信息进行扫描收集&#xff0c;之后才会显示出来。EtreCheck Mac版报告…

顶级玩家:一招搞定 App 自动化老大难问题

很多人在学习 App 自动化或者在项目中落地实践 App 自动化时&#xff0c;会发现编写的自动化脚本无缘无故的执行失败、不稳定。 而导致其问题很大原因是因为应用的各种弹窗&#xff08;升级弹窗、使用过程提示弹窗、评价弹窗等等&#xff09;&#xff0c;比如这样的&#xff1a…

Go编写Web服务与操作数据库基本语句

Go 和 Gin Web 框架编写 RESTful Web 服务 API 的基础知识. package mainimport ("net/http""github.com/gin-gonic/gin" )// album 表示有关专辑的数据. type album struct {ID string json:"id"Title string json:"title"Ar…

汽车屏类产品(二):360全景环视(SVC)、多分割显示、行车记录

前言 随着新能源汽车的快速发展,带动了车载器件的大发展,大的比如域控,小的创新更是不断涌现。而车载显示屏可以说是一大类产品,产品形态也是愈发多样化,比如:仪表cluster、中控IVI、副驾屏、行车记录仪、流媒体后视镜、透明A柱屏、方向盘屏(替代方向盘按键)、门饰板显…