linux io 模型浅析

news/2024/9/29 15:26:00

缩写释义:
io:input/output 输入输出
fd: file descriptor 文件描述符,一个用于标识打开文件或网络连接的整数,系统为进程打开的每个文件保留一个文件描述符,可以用于读写文件

IO模型的分类:
分为同步IO和异步IO。

同步IO:用户发起IO,用户阻塞或轮训的查看是否就绪,就绪后用户进行内核态到用户态的数据拷贝。
异步IO:用户发起IO,数据是否就绪以及数据拷贝的过程全交给内核,当IO完成时内核通知用户。

同步IO分为阻塞IO、非阻塞IO、信号驱动型IO、多路复用型IO。

阻塞IO:用户发起IO后,若数据还未就绪,该线程就一直阻塞等待着数据的就绪。
非阻塞IO:用户发起IO后,若数据还未就绪,该线程不会阻塞,而是继续向后执行代码,所以需要配合循环来一直检查数据是否就绪,而这也叫做轮询。
信号驱动型IO:用户发起IO后,若数据还未就绪,该线程不会阻塞,而是继续向后执行代码,由内核来检查数据是否就绪,当数据就绪时,内核通知用户。
多路复用型IO:由一个线程来监视(等待数据就绪)多个fd,当某个fd上的数据就绪时,就通知用户。特点:多个io 复用一个后台处理进程

linux 内核提供的io多路复用方式:

  1. selector
    selector 底层使用的是位图,需要轮询检查哪些fd就绪,效率较低。
    单个线程能够监视的文件描述符的数量就是固定的(centos7.6上是1024个)。
  2. poll
    每次调用都会将fds从内核态拷贝到用户态;
    底层也是采用轮询的方式来检测文件描述符是否就绪,效率较低。
  3. epoll
    可以创建多个epoll 池,epoll 池添加 fd 的时候设置回调方法,就绪后放入队列
    使用红黑树维护监视的fd,查询效率稳定
    fd就绪后,使用双向链表实现的队列,维护就绪链表,存 就绪状态的epitem,一个 epitem 对应 一个fd

refer:
https://cloud.tencent.com/developer/article/1857255
https://blog.csdn.net/qq_67569905/article/details/132979203

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

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

相关文章

Orange Pi + SPI点亮 ws2812

开发板型号:OrangePi One 系统版本:Ubuntu 20.04 focal Desktop 接口:SPI1. 连线 TB上买的ws2812大概长这样:细节标在图上了。 带插头的一端连上即可。其带针脚一端是多组灯带串联时候用。DI接SPI的MOSI。 参考博客[1] 2. 启用硬件SPI 在设置里有一个orangepi-config的执行…

时间格式化标签说明

时间格式化标签和PHP时间格式化语法一致,可以使用不同的字母代替,中间可以穿插任意字符。常见的格式包括:Y:四位数的年份 m:两位数的月份 d:两位数的日期 H:两位数的小时 i:两位数的分钟 s:两位数的秒示例格式 以下是一些示例格式:Y-m-d:2023-09-15 Y/m/d:2023/09/…

PbootCMS模板添加栏目提示:该内容栏目编号已经存在,不能再使用

当你在PbootCMS中添加栏目时,如果提示“该内容栏目编号已经存在,不能再使用”,这通常是因为数据库中的栏目编号(scode)已经存在重复。解决这个问题的方法是修改数据库中对应的栏目编号。 解决办法 1. 使用数据库管理工具 推荐使用数据库管理工具(如Navicat Premium)来管…

大json字符串处理

背景: 当从API获取数据或与其他系统交换信息时。有时json字符串可能会非常庞大,以至于读取到内存中会导致内存溢出或者性能问题 流式处理: 如果JSON字符串过大,不适合一次性加载到内存中,可以考虑使用流式处理。例如,使用Jackson库的JsonParser,可以逐行解析JSON,从而避…

一文读懂 Git fetch 和 Git pull 的终极区别(带实验结果)

Git pull 是一个 Git 命令用来同时执行 git fetch 和 git merge。本文分享了这两个命令的区别和用法。 Git 命令是非常流行的,尤其是在分布式版本控制系统中,可以对远端的仓库进行同步。开发者需要根据项目实际所需来选择合适的命令。在本文章中,我们将解释 git fetch 和 g…

pbootcms的图片裁剪确保无论图片是横图还是竖图,都能居中裁剪

解决方案找到裁剪缩略图的方法:文件位置:/core/function/file.php 搜索:function cut_img,大约在447行优化cut_img方法:实现居中裁剪功能优化代码 以下是优化后的cut_img函数代码: // 剪切图片 function cut_img($src_image, $out_image = null, int $new_width = null, …

Online DDL

MySQL在线DDL特性提供了即时支持instant 、copy方式,还有原表in-place方式。有些过程中也允许并发DML。 语法:ALTER TABLE tbl_name , alter_option: {...}, ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY} LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}为了避免在执…

pbootcms提示提交失败,请使用POST方式提交

在PbootCMS中,如果你在模板在线留言功能中遇到“提交失败,请使用POST方式提交!”的错误,通常是因为URL名称使用了系统保留的关键字。为了避免这类问题,可以遵循以下建议: 1. 系统保留关键字 PbootCMS系统中有一些保留的关键字,这些关键字不能用作URL名称。以下是一些常见…