【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

如何理解io?

IO指的是计算机系统中输入(Input)和输出(Output)的过程,以计算机本身为参照物,是计算机与外部设备进行数据交互的机制。

输入(Input)是向计算机发送数据的过程,而输出(Output)是从计算机向外部设备发送数据的过程。

IO操作主要包括等待和拷贝两个步骤:

IO = 等待 + 拷贝(等待是主要矛盾)

在等待外部设备准备好数据后,CPU通过针脚发送中断信号通知操作系统。操作系统进入内核态,进行数据拷贝。

因此,IO操作基本可以概括为等待和拷贝两个动作。

高效IO

在IO操作中,时间主要消耗在等待上,因为拷贝的时间相对于等待来说要短得多。

高效的IO操作意味着减少等待时间,从而增加拷贝操作在整个过程中的比重。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

第一种IO模型:阻塞IO模型

阻塞IO模型的特点是在系统调用时,如果外部设备未准备好数据,进程会一直等待数据准备就绪。一旦数据准备好,数据就会从内核空间拷贝到用户空间,并返回成功标识符。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                 struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,               const struct sockaddr *dest_addr, socklen_t addrlen);

第二种IO模型:非阻塞IO模型

非阻塞IO模型与阻塞IO模型的最大区别在于,当没有数据可用时,非阻塞IO会立即返回,并返回EWOULDBLOCK错误码。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

#include #include #include using namespace std;void SetNoBlock(int fd){    int info=fcntl(fd,F_GETFL);    if(info

第三种IO模型:信号驱动IO模型

在信号驱动IO模型中,当内核准备好数据时,会使用SIGIO信号通知应用程序进行IO操作。

与非阻塞IO不同的是,信号驱动IO不会循环检测数据是否准备好,而是当数据真正可用时发送SIGIO信号,确保IO操作成功。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

第四种IO模型:IO多路转接模型

IO多路转接模型包括select、poll和epoll等方法。通过允许单个线程同时监控多个文件描述符的I/O状态,可以避免为每个I/O操作创建单独线程,从而减少资源消耗和上下文切换开销。

虽然图示上看起来与阻塞IO模型类似,但IO多路转接的关键在于可以一次性等待多个文件的状态变化(一切皆文件)。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

第五种IO模型:异步IO模型

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

前四种模型都是同步IO,因为它们参与了等待或拷贝的过程。阻塞IO参与了等待和拷贝,非阻塞IO至少参与了拷贝,IO多路转接可以管理多个文件并设置为非阻塞。

异步IO则直接返回,等待和拷贝的过程都由系统完成。处理完成后,系统通过事件、信号等方式通知应用程序。

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

同步通信和异步通信

同步通信需要参与等待和拷贝的过程,参与其中任何一个步骤即为同步。

异步通信虽然也需要等待和拷贝,但这两个过程完全由系统完成,调用者无需关心这两个过程。系统处理完毕后会通知调用者。

需要注意的是,线程同步和线程互斥与此概念不同。它们是为了保护临界资源,确保资源的一致性。

阻塞和非阻塞

阻塞调用会在调用成功之前挂起线程,直到得到结果后才返回。

非阻塞调用会立即返回,不会阻塞线程。

fcntl函数

文件描述符默认是阻塞的。

函数原型

#include #include int fcntl(int fd, int cmd, ... /* arg */ );

cmd是命令,指定操作类型。主要操作类型包括:

获取、设置文件状态信息:cmd=F_GETFL,F_SETFL。复制现有描述符:cmd=F_DUPFD。获取、设置文件描述符标志:cmd=F_GETFD,F_SETFD。获取、设置异步IO所有权:cmd=F_GETOWN,F_SETOWN。获取、设置记录锁:cmd=F_GETLK,F_SETLK,F_SETLKW。

cmd 功能

F_GETFL,F_SETFL获取、设置文件状态信息F_DUPFD复制现有描述符F_GETFD,F_SETFD获取、设置文件描述符标志F_GETOWN,F_SETOWN获取、设置异步IO所有权F_GETLK,F_SETLK,F_SETLKW获取、设置记录锁

根据cmd的不同,可能需要传递额外的参数。例如,设置类的操作需要加入文件状态信息,如O_NONBLOCK用于设置非阻塞模式。

F_DUPFD功能

在F_DUPFD中,返回新的文件描述符,可以设置新描述符的最小值。如果该值已被占用,则生成一个比该值更大的描述符。

#include #include #include using namespace std;int main() {    int fd = open("example.txt", O_RDONLY|O_CREAT);    if (fd == -1) {        perror("open");        return 1;    }    int new_fd = fcntl(fd, F_DUPFD, 20); // 复制文件描述符,新描述符值大于等于10    if (new_fd == -1) {        perror("fcntl");        close(fd);        return 1;    }    printf("Original fd: %d, New fd: %dn", fd, new_fd);    cout

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

F_GETFL和F_SETFL功能

使用F_GETFLF_SETFL命令可以获取和设置文件状态标志。文件状态标志包括O_APPENDO_NONBLOCK等。

非阻塞:O_NONBLOCK。

#include #include #include using namespace std;void SetNoBlock(int fd){    int info=fcntl(fd,F_GETFL);    if(info

结束语

至此,我们已经深入探讨了计算机科学中的诸多重要概念,包括I/O操作、线程同步与互斥、文件描述符管理等。理解这些概念对于编写高效、可靠的程序至关重要。希望本文能够为您的学习和实践提供有益的参考。如果您在实际编程中遇到任何问题,建议查阅相关文档或进一步研究具体案例。感谢您的阅读,祝您在编程的道路上不断进步!

以上就是【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/511598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
php栏目表有哪些字段
上一篇 2025年11月9日 01:03:10
作业帮如何修改个人资料信息_作业帮修改个人资料方法
下一篇 2025年11月9日 01:03:16

相关推荐

  • 怎么找回谷歌浏览器收藏的网页标签

    当您发现谷歌浏览器中收藏的网页标签(即书签)不见了时,这可能由误操作删除、浏览器同步问题或配置文件损坏等多种原因造成。不必过于担心,因为通常有多种途径可以尝试找回。本文将为您分步介绍几种有效的恢复方法,从最简单的撤销操作到利用浏览器自带的备份文件进行恢复,帮助您一步步操作,从而找回丢失的重要书签。 …

    2026年9月4日
    000
  • 如何用Java将MySQL企业、部门、职位数据转换为树形JSON结构?

    本文介绍如何使用Java将MySQL数据库中的企业、部门、职位数据转换为树形JSON结构。 目标是将数据库数据转换成如下所示的层级结构: [ { “code”: “c1”, “name”: “企业A”, “departments”: [ { “code”: “d1”, “name”: “财务部”, …

    2026年9月4日
    300
  • Linux实现开机启动程序或脚本的详解

    很多时候我们需要在linux上设定一些服务或者脚本开机自启动,这样可以避免机器重启带来的服务中断等问题。下面我们来看一下linux下如何设置开启自启动: cd /etc/init.d vi myscript.sh #将myscript.sh修改为你自己的脚本名 编写自己的脚本后保存退出。 在编写脚本…

    用户投稿 2026年9月4日
    000
  • Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化

    Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化

    处理mysql数据清洗问题可通过正则表达式、分批更新和标准化规则实现自动化。1. 使用regexp_replace函数清理格式,如去除电话中的非数字字符:update users set phone = regexp_replace(phone, ‘1’, ”);…

    2026年9月4日 用户投稿
    000
  • 2024年晶圆代工市场年增长22%,台积电2025年持续维持领头羊地位

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 据市场研究机构Counterpoint Research最新报告,2024年全球晶圆代工市场年增长率达22%,展现出强劲复苏势头。 报告指出,这一增长主要源于AI应用驱动的数据中心和边缘计算对先…

    2026年9月4日
    000
  • 谷歌浏览器标签不显示了怎么设置?Chrome浏览器标签显示/隐藏快捷键

    当您发现谷歌浏览器的标签栏突然消失不见时,最常见的原因是浏览器进入了全屏模式。全屏模式旨在提供无干扰的浏览体验,因此会隐藏包括标签栏、地址栏和工具栏在内的所有界面元素。本文将为您详细解释如何退出全屏模式以恢复标签栏的显示,并提供相应的快捷键和操作步骤,让您轻松解决此问题。 立即进入“免费看电影的软件…

    2026年9月4日
    000
  • Linux ls命令详解

    linux 列出文件夹中所有文件和子目录的方法是用: ls 命令。 ls命令格式: ls [选项] [目录名] ls命令用法举例: 例一:列出/home文件夹下的所有文件和目录的详细资料: ls -l -R /home 命令参数之前要有一短横线“-”, 上面的命令也可以这样写: ls -lR /ho…

    用户投稿 2026年9月4日
    000
  • 微软正在打造基于Windows 10X的IoT操作系统

    微软推出的windows 10x系统原本是为surface neo等可折叠设备量身定制的,但其同样能够适配传统笔记本电脑。然而,根据微软在领英(linkedin)上发布的一则招聘信息,该公司似乎正在研发一款基于windows 10x的下一代物联网(iot)操作系统。该职位描述提到:“您将参与打造基于…

    2026年9月4日
    100
  • linux下实现两台服务器实时同步方法介绍

    假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器  有目录 /opt/test/ 192.168.0.2 目标服务器  有目录 /opt/bak/test/ 实现的目的就是保持这两个服务器某个文件目录保持实时同步 实现方式: 通过rsync+inotify-tools结合来实现 …

    用户投稿 2026年9月4日
    000
  • 影石创新正式登陆科创板,开盘大涨285%,总市值超700亿元

    6月11日,a股迎来“智能影像第一股”——影石创新科技股份有限公司(简称“影石创新”,股票代码:688775.sh)正式在上海证券交易所科创板挂牌上市。公司上市首日开盘价为182元/股,较发行价上涨285%,总市值突破700亿元,迅速成为科创板的明星企业之一。此次影石创新成功募资19.38亿元,位居…

    2026年9月4日
    000
  • AI做音乐推荐怎么实现_Spotify推荐算法原理与应用

    AI做音乐推荐怎么实现_Spotify推荐算法原理与应用AI做音乐推荐怎么实现_Spotify推荐算法原理与应用AI做音乐推荐怎么实现_Spotify推荐算法原理与应用AI做音乐推荐怎么实现_Spotify推荐算法原理与应用

    答案:AI音乐推荐通过协同过滤、内容分析、混合系统和上下文感知等多维度算法,结合用户行为与歌曲特征,实现个性化推荐。Spotify利用隐式反馈、音频特征提取、深度学习和NLP技术,融合用户偏好与情境因素,解决冷启动问题,并在探索与利用间平衡,持续优化用户体验。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年9月4日 用户投稿
    000
  • 谷歌转化代码设置全攻略_谷歌广告转化跟踪代码的配置方法与技巧

    解决谷歌转化代码未触发问题需检查代码安装位置是否正确,确保全局代码位于所有页面标签内,事件代码置于转化发生页面或按钮的事件中;2. 确认代码未被修改或损坏;3. 清除浏览器与网站缓存排除缓存干扰;4. 检查是否存在javascript代码冲突;5. 核实转化规则设置与实际行为一致;6. 耐心等待数据…

    2026年9月4日
    000
  • Gradle学习笔记-安装

    Gradle学习笔记-安装Gradle学习笔记-安装Gradle学习笔记-安装Gradle学习笔记-安装

    前言 本文仅记录我在Windows下安装Gradle的过程,其他操作系统的安装请参阅官方文档或使用搜索引擎查询,这里不再详述。 开始1.从官方网站下载Gradle,具体步骤这里不赘述。 2.安装Gradle非常简单,只需将下载的压缩包解压到指定目录,并正确配置环境变量即可。 (1)将下载的程序包解压…

    2026年9月4日 用户投稿
    1300
  • 美图秀秀在线版官方入口 美图秀秀手机在线修图

    美图秀秀在线版官方入口为https://pc.meitu.com,进入后可使用海报设计、智能抠图、拼图、证件照制作等功能,支持响应式操作与云端同步,具备AI画质修复、去水印、视频优化及超大图片处理技术。 美图秀秀在线版官方入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来美图秀秀在线修图…

    2026年9月4日
    100
  • Linux文件系统目录结构详解

    大家好,又见面了,我是你们的朋友全栈君。 引言 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解#%#$#%@%@%$#%$#%#%#$%@_e206a54e97690c++e50cc872dd70ee896文件目录结构的标准和每个目录的…

    2026年9月4日
    200
  • 世界级人工智能科学家许主洪加盟阿里巴巴,担任副总裁

    世界级人工智能科学家许主洪加盟阿里巴巴,担任副总裁世界级人工智能科学家许主洪加盟阿里巴巴,担任副总裁世界级人工智能科学家许主洪加盟阿里巴巴,担任副总裁世界级人工智能科学家许主洪加盟阿里巴巴,担任副总裁

    凤凰网科技讯 2月6日,凤凰网科技获悉,全球顶尖人工智能科学家许主洪教授(steven hoi)正式加入阿里巴巴,出任阿里集团副总裁,负责ai to c业务的多模态基础模型及agents相关基础研究与应用解决方案。近期,阿里ai to c业务大动作频频,引入世界级顶尖人才,组建顶级ai算法研究和工程…

    2026年9月4日 用户投稿
    100
  • 告别猴子补丁:使用bafs/illuminate-demacroable提升代码稳定性

    最近在维护一个大型laravel项目时,我发现项目中大量使用了宏(macros),这些宏通过illuminate/macroable提供的猴子补丁机制动态地扩展了核心组件的功能。虽然这在开发过程中带来了便利,但同时也带来了潜在的风险: 代码难以理解和维护: 动态添加的功能难以追踪,增加了代码理解和维…

    用户投稿 2026年9月4日
    100
  • linux进入单用户模式的方法介绍

    redhat7.2 在使用grub引导程序的时候如何进入单用户 1.在出现GURB引导画面时,按字母e,进入GRUB编辑状态 2在引导菜单后添加“1”或single,选定它,然后按字母b,就可引导到单用户模式了。  例如: red hat linux 7.2,未编辑时引导菜单是:  RedHat L…

    用户投稿 2026年9月4日
    100
  • 微信仅聊天和不让他看我有啥区别

    在微信的隐私设置中,“仅聊天”与“不让他(她)看我”是两个常被误解的功能选项。虽然它们都涉及隐私控制,但实际作用范围和使用场景存在明显差异。 “仅聊天”是一种较为严格的权限管理方式。启用该设置后,对方与你的互动将被限制在聊天界面之内。具体来说,此人无法浏览你的朋友圈、视频号动态、个人状态等公开信息。…

    2026年9月4日
    100
  • linux下如何删除乱码文件的方法

    在linux下删除文件,遇到特殊字符是一件非常头疼的事情。 1. 如果文件名带 ‘-’ 或者‘–’这样的字符 删除办法为:rm — 文件名  如文件名为:-pythontab.tgz 如果用普通方法去删除: rm -pythontab.tgz 结果错误: rm: invali…

    用户投稿 2026年9月4日
    100

发表回复

登录后才能评论
关注微信