linux 阻塞/非阻塞、 同步/异步(网络IO) Unix/Linux上的五种IO模型
典型的一次 IO 的两个阶段是什么?数据就绪 和 数据读写
网络IO阶段1: 数据就绪(数据准备):根据系统 IO 操作的就绪状态(分为阻塞和非阻塞)
阻塞:调用IO的方法的线程进入阻塞状态
非阻塞:不会改变线程的状态,通过返回值判断
网络IO阶段2: 数据读写:根据应用程序和内核的交互方式(将TCP缓冲区的数据接收到自己定义的数据中 例: char buf[1024] = {0};)(int size = recv(sockfd, buf, 1024, 0);)
同步:(自己取机票,效率低,编程简单)数据是自行搬运的而不是操作系统搬运的。数据的读写是应用程序自己读写为同步,数据搬完才能继续执行下一步。
异步:(别人送机票,效率高,编程复杂)
异步IO接口:sockfd,buf,通知方式,操作系统将数据放到buf当中(异步),
在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO,异步一般和非阻塞结合使用
面试:
一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶段分为阻塞和非阻塞,表现结果就是,阻塞当前线程或是直接返回。
同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以处理其他逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。
Unix/Linux上的五种IO模型:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)