Linux-笔记 高级I/O操作

前言

        I/O(Input/Output,输入/输出)是计算机系统中的一个重要组成部分,它是指计算机与 外部世界之间的信息交流过程。I/O 操作是计算机系统中的一种基本操作,用于向外部设备(如 硬盘、键盘、鼠标、网络等)读取数据或向外部设备写入数据。

        常见的I/O操作方式:

        1)同步 I/O(Synchronous I/O):在进行 I/O 操作时,程序会一直等待操作完成后再 继续执行后面的代码。如果 I/O 操作阻塞,程序会一直等待,直到操作完成或超时。

        2)异步 I/O(Asynchronous I/O):在进行 I/O 操作时,程序会立即返回,而不必等待 操作完成。当操作完成后,操作系统会通知程序。这种方式可以允许程序在等待 I/O 操作完 成的同时执行其他代码。

        3)阻塞 I/O(Blocking I/O):在进行 I/O 操作时,程序会一直等待操作完成后再继续执行后面的代码。如果 I/O 操作阻塞,程序会一直等待,直到操作完成或超时。阻塞 I/O 是 同步 I/O 的一种。

        4)非阻塞 I/O(Non-blocking I/O):在进行 I/O 操作时,程序会立即返回,而不必等待操作完成。如果 I/O 操作无法立即完成,程序也会立即返回,但是会周期性地检查操作是否完成。非阻塞 I/O 是同步 I/O 的一种。

        5)I/O 多路复用(I/O Multiplexing):是一种同时监视多个 I/O 事件的机制,通常使用select、poll、epoll 等系统调用。程序通过这些调用告知操作系统它要监视哪些 I/O 事件,当有 I/O 事件发生时,操作系统通知程序,并返回发生事件的描述符。I/O 多路复用通常是异步 I/O 模型的一部分。

阻塞I/O与非阻塞I/O

        阻塞和非阻塞的主要区别在于程序在进行 I/O 操作时是否会被阻塞。在实际应用中,阻塞 I/O 的使用场景较为有限,因为阻塞 I/O 会导致程序性能下降,会造成资源浪费。非阻塞 I/O 则可以较好地解决这个问题,但需要程序周期性地检查 I/O 操作是否完成,增加了编程难度。

接下来通过几个小实验来区分阻塞I/O与非阻塞I/O的区别。

       1)阻塞I/O读取鼠标的数据,运行后发现不动鼠标就会一直阻塞直到移动鼠标,这就是阻塞I/O的特点。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(void) 
{char buf[1024];int fd, ret;fd = open("/dev/input/event2", O_RDONLY);if (-1 == fd) {perror("open error \r\n");exit(-1);}memset(buf, 0, sizeof(buf));ret = read(fd, buf, sizeof(buf));if (0 > ret) {perror("read error \r\n");close(fd);exit(-1);}printf("读到:%d\r\n", ret);close(fd);exit(0);
}

        2)非阻塞I/O读取鼠标数据,发现运行后立刻结束了程序,并输出了一些错误信息,提示信息为"Resource temporarily unavailable",意思就是说资源暂时不可用;原因在于调用 read()时,如果鼠标并没有移动或者被按下(没有 发生输入事件),是没有数据可读,故而导致失败返回,这就是非阻塞 I/O。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(void) 
{char buf[1024];int fd, ret;fd = open("/dev/input/event2", O_RDONLY | O_NONBLOCK);if (-1 == fd) {perror("open error \r\n");exit(-1);}memset(buf, 0, sizeof(buf));ret = read(fd, buf, sizeof(buf));if (0 > ret) {perror("read error \r\n");close(fd);exit(-1);}printf("读到:%d\r\n", ret);close(fd);exit(0);
}

                

        3)通过非阻塞I/O+轮询读取鼠标数据,可以发现采用非阻塞方式也会停留住,等到移动鼠标才退出程序,这样虽然可行但是会占用很高的CPU使用率。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(void)
{char buf[1024];int fd, ret;fd = open("/dev/input/event2", O_RDONLY | O_NONBLOCK);if (-1 == fd){perror("open error \r\n");exit(-1);}memset(buf, 0, sizeof(buf));for (;;){ret = read(fd, buf, sizeof(buf));if (0 < ret){printf("成功读取<%d>个字节数据\n", ret);close(fd);exit(0);}}printf("读到:%d\r\n", ret);close(fd);exit(0);
}

        4)通过对比发现阻塞式 I/O 的优点在于能够提升 CPU 的处理效率,当自身条件不满足时,进入阻塞状态,交出 CPU 资源,将 CPU 资源让给别人使用;而非阻塞式则是抓紧利用 CPU 资源,譬如不断地去轮训,这样就会导致 该程序占用了非常高的 CPU 使用率!

        但是阻塞I/O也有缺点,我们都知道使用阻塞I/O会在没获取到鼠标移动数据的时候会阻塞,那么如果我在读取鼠标数据之后还有很多任务呢,那我一直不移动鼠标后面的任务就不用完成了吗,肯定不是。虽然我们可以通过创建多个线程去解决这个问题,但是也可以尝试其他办法,比如使用fcntl函数。

        5)使用fcntl函数

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

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

相关文章

https基础概念

目录 1.什么是https 1.1.https概念 1.2.一些术语 2.https如何加密 2.1.使用对称加密 2.2.使用非对称加密 1.什么是https 首先&#xff0c;https不是http的复数形式 1.1.https概念 &#xff08;1&#xff09;产生背景 为什么会出现https&#xff0c;是因为http协议在传…

如何通过有效的跟进,吸引国外客户回复?

相信很多外贸业务员都知道&#xff0c;想要走到最终达成订单成交的那一步&#xff0c;首要前提就是客户愿意和你继续谈。第一次询价就买的这种客户属于刚需&#xff0c;可遇而不可求&#xff0c;大部分的客户都需要通过我们坚持不懈的跟进最后达成交易。 所以如何通过有效的跟…

小白学python(第二天)

哈喽&#xff0c;各位小伙伴们我们又见面了&#xff0c;昨天的文章吸收得如何&#xff1f;可有不懂否&#xff1f;如有不懂可以在品论区留言哦&#xff0c;废话不多说&#xff0c;开始今天的内容。 字符及字符串的续讲 字符&#xff1a;英文字母&#xff0c;阿拉伯数字&#x…

大数据面试题之Hive(2)

目录 Hive的join操作原理&#xff0c;leftjoin、right join、inner join、outer join的异同? Hive如何优化join操作 Hive的mapjoin Hive语句的运行机制&#xff0c;例如包含where、having、group by、orderby&#xff0c;整个的执行过程? Hive使用的时候会将数据同步到HD…

Laravel 响应对象深度解析:构建动态 HTTP 响应

在 Laravel 框架中&#xff0c;响应&#xff08;Response&#xff09;对象扮演着至关重要的角色&#xff0c;它负责将应用程序的输出发送给客户端。Laravel 的响应系统非常灵活&#xff0c;允许开发者以多种方式构建和自定义响应。本文将深入探讨 Laravel 中响应对象的工作机制…

Keil汇编相关知识

一、汇编的组成 1.汇编指令&#xff1a;在内存中占用内存&#xff0c;执行一条汇编指令会让处理器进行相关运算 分类&#xff1a;数据处理指令&#xff0c;跳转指令&#xff0c;内存读写指令&#xff0c;状态寄存器传送指令&#xff0c;软中断产生指令&#xff0c;协助处理器…

AcWing算法基础课笔记——状态压缩DP:蒙德里安的梦想

状态压缩DP 状态是整数&#xff0c;但把它看成二进制数&#xff0c;二进制中每一位是0或1表示不同的情况。 蒙德里安的梦想 291. 蒙德里安的梦想 - AcWing题库 题目 求把 NM&#x1d441;&#x1d440; 的棋盘分割成若干个 1212 的长方形&#xff0c;有多少种方案。 例如…

electron-builder 打包过慢解决

报错内容如下 > 6-241.0.0 build > electron-builder • electron-builder version24.13.3 os10.0.22631 • loaded configuration filepackage.json ("build" field) • writing effective config filedist\builder-effective-config.yaml • pack…

地下管线管网三维建模系统MagicPipe3D

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

清科ZF引导基金数据(1990-2023年)

清科ZF引导基金数据&#xff0c;参考经济学家吴超鹏和严泽浩在《经济研究》2023年的研究&#xff0c;通过清科私募通数据库&#xff0c;获取ZF引导基金的管理机构信息。数据涵盖了ZF引导基金的关键信息&#xff0c;如基金名称、管理机构详情、所属层级、发展阶段、地域分布、初…

java学习 - Redis五大数据类型

redis通用命令 命令说明时间复杂度type key判断key的数据类型O(1)keys [pattern]获取数据库中所有符合pattern的keyO(n)dbsize获取数据库的key的数量O(1)exists key判断是否存在key;存在返回1&#xff0c;不存在返回0O(1)del key [key…]删除key;返回删除个数O(1)expire key s…

Batch学习:开启高效学习之旅

Batch学习&#xff1a;开启高效学习之旅 Batch学习是一种学习方法&#xff0c;它将学习内容划分为多个批次进行学习。这种方法有助于学生更好地掌握知识&#xff0c;提高学习效果。本文将详细介绍Batch学习的概念、方法和优势&#xff0c;并探讨如何有效地实施Batch学习。 一…

数据集MNIST手写体识别 pyqt5+Pytorch/TensorFlow

GitHub - LINHYYY/Real-time-handwritten-digit-recognition: VGG16和PyQt5的实时手写数字识别/Real-time handwritten digit recognition for VGG16 and PyQt5 pyqt5Pytorch内容已进行开源&#xff0c;链接如上&#xff0c;请遵守开源协议维护开源环境&#xff0c;如果觉得内…

redis集群简单介绍及其搭建过程

Redis集群 1、哨兵模式 哨兵可以有多个&#xff0c;从服务器也可以有多个&#xff0c;从服务器也可以有多个&#xff0c;在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会实现主从切换&#x…

百度大模型安全荣获2024世界智能产业博览会“Find智能科技创新应用典型案例”

6月20日&#xff0c;2024世界智能产业博览会在天津开幕。会议聚焦人工智能、智能网联汽车、智能制造等年度热点议题&#xff0c;由世界智能产业博览会组委会指导&#xff0c;世界智能产业博览会组委会秘书处、中国新一代人工智能战略发展研究院、中国软件行业协会、中国网络空间…

极客之夜 | XCTF国际网络攻防联赛十周年庆典圆满落幕

在数字化浪潮的推动下&#xff0c;网络安全已成为全球关注的焦点。十年磨一剑&#xff0c;XCTF国际网络攻防联赛以其卓越的赛事品质和深远的影响力&#xff0c;成为网络安全领域的一面旗帜。极客之夜&#xff0c;我们齐聚一堂&#xff0c;共同庆祝XCTF的十年辉煌&#xff0c;展…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客需要学习前置知识&#xff1a; 聚类&#xff0c;可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法&#xff0c;可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝…

OVS:网桥的状态:fail_mode模式

目录 1.创建一个普通的ovs网桥不做任何配置 2.检测fail_mode值&#xff0c;默认为空 3.创建netns并配置sto网桥的两个普通端口并配置IP信息 4.默认情况下的两个端口下挂两个虚拟机v3,v4天然通信-ping-ok 5.修改网桥的fail_mode为standalone,原来的通信没有影响 6.修改了…

okcc呼叫中心系统通话声音小有哪几种处理办法?

处理OKCC呼叫中心系统通话声音过小的几种方法包括&#xff1a; 第一种&#xff1a; 1、IP话机&#xff1a;通过话机上的音量调节按钮来进行调节。 2、模拟话机&#xff1a;修改语音网关上的增益来实现。 “ 往IP增益”表示电话呼入的声音调节&#xff0c;主要针对内部分…

伸缩盒模型,flex布局

目录 1、伸缩容器、伸缩项目 2、主轴方向(flex-direction) 3、主轴换行方式(flex-wrap) 4、flex-flow 5、主轴对齐方式(justify-content) 6、侧轴对齐方式_一行(align-items) 7、侧轴对齐方式_多行(align-content) 8、元素水平垂直居中 9、项目在主轴的基准长度(flex-b…