58 高级IO

本章重点

理解五种io模型的基本概念,重点是io的多路转接
掌握select模型,实现select版本的tcp服务器
掌握poll模型,实现poll版本的tcp服务器
掌握epoll模型,实现epoll版本的tcp服务器
理解epoll的LT模型和ET模式
理解select和epoll的优缺点对比

目录

  1. 阻塞和非阻塞
  2. 同步和异步
  3. 五种io模型
  4. 其他io模型

1. 阻塞和非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  • 阻塞调用的是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

2. 同步和异步

(synchronous communication/ asynchronous communication)
同步和异步关注的是消息通信机制

  • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了,换句话说,就是由调用者主动等待这个调用的结果
  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果,换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通过状态,通知调用者,或者通知回调函数处理调用

另外,我们在多线程的时候,也提到同步和互斥,这里的是完全不相干的概念

  • 进程/线程同步也是线程/进程之间直接的制约关系
  • 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待,传递信息所产生的制约关系,尤其是在访问临界资源的时候

同步要弄清是同步通信异步通信还是同步与互斥的同步

3. 五种IO模型

read和write的时候,本质是把数据从用户层拷贝给os,io的过程包括了等+拷贝,如果读写事件没就绪,就会一直阻塞住,所以,要进行拷贝,需要读写事件条件成立。高效的IO,单位时间内,io的过程中,等的比重越小,io效率越高

可以拿钓鱼作为例子

同步阻塞io:在内核数据准备好之前,系统调用一直等待,所有的套接字,默认都是阻塞方式
是最常见的io模型
在这里插入图片描述
以read为例:
进程发起read,进行recvfrom系统调用,同时进程进入阻塞(进程是自己选择阻塞与否),等待数据;内核开始准备数据(从磁盘拷贝到内核缓冲区),进程请求的数据并不是一下就能准备好;准备数据是需要时间的;内核将数据从内核缓冲区拷贝到了用户缓冲区,内核返回结果,进程解除阻塞。也就是说,内核准备数据和数据从内核拷贝到用户空间这两个过程都是阻塞的。

优点:能够及时返回数据,无延迟。调用代码逻辑简单。
缺点:等待浪费很长时间,影响程序性能。

同步非阻塞io:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码
非阻塞io往往需要再用循环的方式反复尝试读写文件描述符,这个过程称为轮询,这对cpu来说是比较大的浪费,一般只有特定场景下使用
在这里插入图片描述
以read为例:
进程发起read,进行recvfrom系统调用,如果kernel中的数据还没有准备好,就立刻返回一个error;调用返回后进程可以进行其他操作,然后再次发起recvfrom系统调用,不断重复;(这个过程称为轮询polling)kernel中的数据准备好以后,再次收到recvfrom调用,就将数据拷贝到了用户内存,然后返回;需要注意,在数据从内核拷贝到用户内存的过程中,进程仍然是属于阻塞的状态。

优点:能在IO操作的过程中处理其他事物。
缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。

信号驱动io:内核将数据准备好的时候,使用SIGIO信号通知应用程序io操作
在这里插入图片描述先定义io就绪的信号处理方式,当收到通知,表示io就绪,发起io调用完成操作。一般用于udp,tcp该信号产生过于频繁

优点:效率更高,更加及时,充分利用资源(在没有收到io信号之前,可以进行其他任务处理,收到之后再进行io请求)
缺点:io复杂度高,需要正确处理信号操作。数据复制到缓冲区时,仍然会阻塞,性能有待提升

io多路转接:虽然从流程图上看和阻塞io类似,实际上最核心的在于能够同时等待多个文件描述符的就绪状态
在这里插入图片描述
常见的select,poll,epoll都是多路复用,本质上都是同步io,都需要再读写事件就绪后自己负责读写,这个过程是阻塞的

异步io:由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时开始拷贝数据)
在这里插入图片描述

事件驱动型io,用户发起io立即返回,可以处理其他任务,内核等待数据准备完成,然后拷贝到用户内存,当一切都完成后,会给用户进程发送信号,通知完成。两个阶段进程都是非阻塞的

优点:显著提高了系统的整体效率和响应速度,高度利用系统资源,尤其是在高并发的环境下,显著提升系统的吞吐量和性能
缺点:复杂度高,对底层系统依赖性强,需要底层支持

小结:
任何io过程中,都包含两个步骤,第一是等待,第二是拷贝,而且在实际的应用场景中,等待消耗的时间往往都高于拷贝的时间,让io更高效,核心的方法就是让等待的时间尽量少

上面所有可以看出阻塞和非阻塞io的区别是等的方式不同,但还是必须有这个过程。异步和同步看有没有参与io过程,信号驱动虽然没有等,但必须拷贝。异步不参与过程,最后只拿结果

4. 其他高级IO

非阻塞io,记录锁,系统V流机制,I/O多路转接(也叫多路复用),readv和wrotev函数以及存储映射IO(mmap),这些统称为高级IO

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

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

相关文章

关于数据存储位置的一点知识

关于数据存储位置的一点知识

[算法]插入排序和希尔排序

这里简单的介绍一下插入排序和希尔排序的算法实现,为简单起见,排序为升序且排序的数组是整形数组。 一、插入排序 (一)、算法思路 把数组里的第一个元素视为有序的,然后取第二个元素与前面的元素作比较,如…

【秋招笔试题】小Q的树

解析&#xff1a;分析易得走过的路中至多存在一个分叉&#xff0c;则维护每个结点接下来的路的最大值与次大值然后相加即可。 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define int long long const int MAXN 1…

ESD防护之电容妙用

谈到ESD防护&#xff0c;应用最广泛的是ESD/TVS管&#xff0c;对于正负4KV的pin脚不上电ESD测试&#xff0c;也可以仅仅依靠nf级电容完成ESD防护。下面以一篇实际案例进行说明。 实验要求&#xff1a;正负4KV对产品connector的Pin脚进行ESD测试&#xff0c;connector中的地脚接…

栈和队列<数据结构 C版>

目录 栈&#xff08;Stack&#xff09; 栈的结构体 初始化 销毁 入栈 判空 出栈 取栈顶元素 获取栈个数 测试&#xff1a; 队列&#xff08;Queue&#xff09; 队列的结构体 单个结点 队列 初始化 销毁 入队列&#xff0c;队尾 判空 出队列&#xff0c;队头 …

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

二市在度低开,连续11个交易日低开,后市如何走?

今天的A股&#xff0c;让人愣住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市再度低开&#xff0c;连续11个交易日低开&#xff0c;让很多人愣住了。别慌&#xff01;汽车、军工板块大涨&#x…

MYSQL存储引擎InnoDB, MyISAM简介

MYSQL存储引擎 在开始谈到mysql存储引擎之前&#xff0c;我们应该知道或者了解存储引擎是什么&#xff0c;存储引擎是为了解决什么样的问题的。 在mysql中&#xff0c;存储引擎是处理不同表类型SQL操作的MySQL组件&#xff0c;同时MySQL服务器采用可插拔的存储引擎架构&#x…

XLua 原理分析 三

前面已经介绍了Lua与C#的基础通信原理&#xff0c;和Wrap中间文件的作用。有了前面2篇的基础&#xff0c;大概已经能搞清这块的原理。 为了加深对这块的印象&#xff0c;这里开始正式分析Xlua中的Lua和C#的通信。 一、Lua如何调用CS的过程 lua的初始化代码&#xff1a; pri…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中&#xff0c;拷贝一段代码后&#xff0c;代码界面一直输入CTRLV命令&#xff0c;导致乌班图桌面死掉&#xff0c;无法操作、 解决方法&#xff1a; 1、强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。 2、使用命令行界面。同时…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数&#xff0c;可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法&#xff1a; S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数&#xff0c;…

【数据结构】哈希表的模拟实现

文章目录 1. 哈希的概念2. 哈希表与哈希函数2.1 哈希冲突2.2 哈希函数2.3 哈希冲突的解决2.3.1 闭散列&#xff08;线性探测&#xff09;2.3.2 闭散列的实现2.3.3 开散列(哈希桶)2.3.4 开散列的实现 2.4 开散列与闭散列比较 1. 哈希的概念 在我们之前所接触到的所有的数据结构…

FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 推荐课程列表 逻辑很简单 点赞数 > 500 那么符合要求的课程是&#xff1a; def get_like_course(db: Session):"""获取推荐课程…

一番赏小程序搭建,线上一番赏市场

一番赏作为一个经久不衰的潮流市场&#xff0c;一直流行于消费者市场中。一番赏商品拥有不同系列&#xff0c;涵盖了热门动漫、漫画、影视等主题&#xff0c;商品包含了手办等周边商品&#xff0c;具有非常大的收藏价值。相比于其他潮玩模式&#xff0c;一番赏的性价比更高&…

Kylin 入门教程

Apache Kylin 是一个开源的分布式数据仓库和 OLAP(在线分析处理)引擎,旨在提供亚秒级查询响应时间,即使在处理超大规模数据集时也是如此。Kylin 可以有效地将原始数据预计算为多维数据立方体(Cube),并利用这些预计算结果来提供快速查询。本文将带你从基础知识到操作实践…

GC(垃圾收集)简析:为什么Java需要它?

GC&#xff08;垃圾收集&#xff09;简析&#xff1a;为什么Java需要它&#xff1f; 1、什么是GC&#xff1f;2、为什么Java需要GC&#xff1f;3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、什么是GC&#xff1f; GC&#xff…

黄果树瀑布

早上我们按计划6点吃饭&#xff0c;可是酒店没水了&#xff0c;等我们吃完饭已经近七点 &#xff0c;到景区已经7点多了。景区入口的人特别多&#xff0c;验过包裹&#xff0c;只刷脸就进去了。排队坐大巴&#xff0c;向左是陡坡塘和七星桥。 第一站陡坡塘&#xff0c;服务中心…

synergy Ubuntu 18 和Windows 配置

下载链接 Windows 版本 https://altushost-swe.dl.sourceforge.net/project/synergy-stable-builds/v1.8.8-stable/synergy-v1.8.8-stable-Windows-x64.msi?viasf1Ubuntu 18 版本 sudo apt-get install synergy配置方式 我这边配置需求是 笔记本电脑&#xff08;Windows系统…