IO模型

本文通过生动的外卖比喻,详细介绍了完全阻塞、非阻塞式、IO多路复用、SIGIO及asyncio五种IO模型的工作原理,并探讨了它们之间的相互转化。

《unix网络编程》里总结了五类IO模型。为了更好的理解,举一个叫外卖的例子来说明。

一、完全阻塞模型


        就是说如果我客户端发起了connect请求,那么当前线程就会休眠,等待服务端响应完毕,返回消息才会继续走下去。

代码比如:

socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("192.168.0.13", 8000));
System.out.println("Hello");

        在connect没有完成之前 最后三行的println根本不会执行 也就是说客户端会阻塞在这个地方,就好比我点个外卖 然后我就去大门傻等着,外卖不送到 我就啥也不做 知道外卖小哥来,我才拿起外卖回家去吃。这样做显然效率不高。

二、非阻塞式IO

        把非阻塞式的文件描述符称为非阻塞式I/O。可以通过设置SOCK_NONBLOCK标记创建非阻塞式的socket fd,或者使用fcntl将fd设置为非阻塞。

        对非阻塞fd调用系统接口时,不需要等待事件的发生而立即返回 事件没有发生,接口返回-1,此时需要通过errno的值来区分是否出错。立即返回时的errno值不尽相同,如,recv,send,accept errno通常被设置为EAGIN或者EWOULDBLOCK,connect则为EINPRO-GRESS。


        就是说客户端程序会一直不停地尝试读取数据,但是不会阻塞在那个读的方法里,如果读的时候,没有读到内容,也会立即返回。这就允许我们在客户端里 读不到数据时 可以搞点其他的事情了。就像叫外卖,我可以边扫地边等,扫两下就跑出去看看外卖到了没,一直这样循环 直到我取到了外卖,才从这个循环出来,进入吃的流程。

三、IO多路复用

        最常用的I/O事件通知机制就是I/O复用(I/O multiplexing)。Linux 环境中使用select/poll/epoll_wait 实现I/O复用,I/O复用接口本身是阻塞的,在应用程序中通过I/O复用接口向内核注册fd所关注的事件,当关注事件触发时,通过I/O复用接口的返回值通知到应用程序。I/O复用接口可以同时监听多个I/O事件以提高事件处理效率。


        还是外卖的例子,如果我们整栋楼的人,很多人叫了外卖,都有下楼来看外卖到没到的需求,于是物业就出了个招,让门卫小哥帮大家看着,整栋楼上的,不管是谁的外卖到了,先放到门卫小哥那里,然后门卫小哥再通知你下来拿自己的外卖。这样一来,我们就把本来多个人要跑去看自己的外卖到了这件事交给门卫小哥去做了。而我们解放出来,就可以继续看电视,打扫卫生,刷知乎了。由于我们可以继续 做自己的事情,外卖小哥和门卫小哥在同时也在工作,互不干扰,所以这种工作方式就被称为异步模型

四、SIGIO

        除了I/O复用方式通知I/O事件,还可以通过SIGIO信号来通知I/O事件,如图所示。两者不同的是,在等待数据达到期间,I/O复用是会阻塞应用程序,而SIGIO方式是不会阻塞应用程序的。


        上面这张图,就是我们现实生活中真正的外卖。数据到达以后,给客户端发一个消息,让客户端过来取数据。这就像外卖小哥到你家门口给你打电话,让你出来取一下。显然,这种是最方便的,也是最合理的。但实际上,在真正的编程中,我们很少使用这种模型。

五、async io

        POSIX规范定义了一组异步操作I/O的接口,不用关心fd 是阻塞还是非阻塞,异步I/O是由内核接管应用层对fd的I/O操作。异步I/O向应用层通知I/O操作完成的事件,这与前面介绍的I/O 复用模型、SIGIO模型通知事件就绪的方式明显不同。以aio_read 实现异步读取IO数据为例,如图所示,在等待I/O操作完成期间,不会阻塞应用程序。


        这个图,如果对应到外卖有点不合适了,比较像网购空调,我所要做的,只是下单,而快递小哥会把空调送过来,他也不会让你自己去取,他会让安装师傅直接帮你安装。这个过程中,你什么都不需要做。你所要做的仅仅是发起一个请求。这种IO模型就是纯正的异步IO。这种纯异步IO的最典型例子就是node.js中的callback。

这5种IO并不是相互对立的,通过一定的技巧,是可以相互转化的。

裂缝目标检测数据集 一、基础信息 数据集名称:裂缝目标检测数据集 图片数量: 训练集:462张图片 验证集:21张图片 测试集:9张图片 总计:492张图片 分类类别: crack(裂缝):指物体表面的裂缝,常见于建筑、基础设施等场景,用于损伤检测风险评估。 标注格式: YOLO格式,包含边界框类别标签,适用于目标检测任务。 数据格式:图片来源于实际场景,格式兼容常见深度学习框架。 二、适用场景 建筑与基础设施检查: 数据集支持目标检测任务,帮助构建能够自动识别裂缝区域的AI模型,用于建筑物、道路、桥梁等结构的定期健康监测维护。 工业检测与自动化: 集成至智能检测系统,实时识别裂缝缺陷,提升生产安全效率,适用于制造业、能源等领域。 风险评估与保险应用: 支持保险工程行业,对裂缝进行自动评估,辅助损伤分析风险决策。 学术研究与技术开发: 适用于计算机视觉与工程领域的交叉研究,推动目标检测算法在现实场景中的创新应用。 三、数据集优势 精准标注与任务适配: 标注基于YOLO格式,确保边界框定位准确,可直接用于主流深度学习框架(如YOLO、PyTorch等),简化模型训练流程。 数据针对性强: 专注于裂缝检测类别,数据来源于多样场景,覆盖常见裂缝类型,提升模型在实际应用中的鲁棒性。 实用价值突出: 支持快速部署于建筑监测、工业自动化等场景,帮助用户高效实现裂缝识别与预警,降低维护成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值