四种常用的IO模型

news/2024/12/26 2:55:21/文章来源:https://www.cnblogs.com/shigongp/p/18423686

不管是做C端还是做B端,都要接触网络。文件操作,rpc,网上冲浪等,都与网络相关。网络又离不开IO。用的最多的IO操作就是读取和写入了。在Linux系统中,用read系统调用来发起读取操作,用write系统调用来发起写入操作。虽然在开发中,很少接触到底层的原理。但是学习后可以让我们写出更高质量的代码。

当发起read系统调用后,是否就可以读取数据了?在这过程中数据是怎么样传输的?这就不得不要了解操作系统的知识了。在现代的操作系统,操作系统主要是内核管理的,为了保护内核,将内存分为了内核空间和用户空间。内核运行在内核空间,用户程序运行在用户空间。如果用户程序想要读取或写入,只能通过系统调用,而不能直接访问硬件设备。那么发起系统调用后就直接访问硬件设备吗?假如程序要发送数据,但是要隔段时间发送,为了提高效率,引入了缓存。不管是在内核空间的程序,还是用户空间的程序。比如,调用write写入数据,并不会将数据直接通过网卡发送。而是先放在内核空间的缓存中,积累一定量的数据后在发送。read系统调用也是如此。read,write系统调用如下所示:

在客户端,通过write调用发送请求,在服务端,通过read调用获取请求并处理后在通过write调用发送响应。客户端在通过read调用读取响应。

当有少量请求时,IO对系统的吞吐量等影响较小,但是有大量请求时,比如几万,甚至10几万时对系统影响就很大了。这时主要关注哪些地方影响了系统的效率,以及怎么解决。这就不得不了解IO模型了。

IO模型

阻塞IO指的是需要等待内核IO操作完成后才返回用户空间执行指令.
非阻塞IO指的是用户进程发起IO后不需要等待内核完成即可返回用户空间执行指令.
同步IO:用户进程主动发起IO,内核被动接收.
异步IO:系统内核主动发起IO,用户进程被动接收.

同步阻塞IO

用户进程/线程主动发起IO后,需要等待内核IO完成操作才能返回用户空间执行指令.用户从发起调用开始,直到数据到达并复制到用户缓冲区为止,整个过程都是阻塞的,用户程序不能做其他的事。

特点:发起IO的用户线程被阻塞了。
优点:开发简单,用户线程被阻塞期间不占用CPU。
缺点:一个线程维护一个连接,并发量大时内存,线程开销巨大。

同步非阻塞IO

用户进程/线程主动发起IO后,不需要等待内核操作完成即可返回用户空间执行指令.由于非阻塞,第一次发起系统调用后,数据可能未到达,此时会立刻返回。所以需要用户程序不断发起系统调用询问内核数据是否已准备好。

特点:用户线程不断进行IO系统调用轮询数据是否准备好,没准备好就继续轮询,直到IO调用完成。

优点:进行IO调用时,如果内核没有数据则不会阻塞线程,时实性好。
缺点:需要不断进行轮询内核,占用大量CPU时间。

异步阻塞IO

异步阻塞IO经典的用例是IO多路复用.由内核监控socket的状态,一旦有socket就绪(可读/可写),内核将socket连接返回给用户,用户根据socket连接进行IO调用.首先需要将所有的Socket交由操作系统的select/epoll选择器中。在Java中对应的是Selector类。再轮询select/epoll选择器,获取已就绪的Socket。用户程序根据就绪的Socket列表发起系统调用,用户程序会被阻塞。直到内核将数据复制到用户缓冲区中为止才会解除阻塞。

特点:涉及两种系统调用,一种是查询socket状态的系统调用,比如select/epoll,另一种是IO调用。需要操作系统提供IO多路复用支持。

优点:一个线程管理成千上万个socket连接。

缺点:select/epoll调用时是阻塞的,IO调用时也是阻塞的。

异步非阻塞IO

用户将IO事件的IO操作完成后的回调函数注册到内核,由内核主动调用,并将数据复制到用户缓冲区,通知用户直接使用.内核在等待内核缓冲区中数据到达,和将数据从内核缓冲区中复制到用户缓冲区中都不会阻塞用户程序。

优点:内核准备数据和复制数据不是阻塞的
缺点:需要操作系统支持

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

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

相关文章

java学习9.21

今天回炉mybatis的用法,由于之前只是跟着教程走能成功配置数据库,但是一旦出现细小的区别就会产生自己改不了的bug,因此熟悉mybaits和其他技术的内容。知道问题出在哪里,以及怎么改。 mybatis配置 1.导入操作 (1)官网下载jar包并导入 (2)maven直接导入依赖 2.导入完之后创建…

龙祖维的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 熟悉博客、向老师介绍自己姓名-学号 龙祖维 2022329301084一、自我介绍 基本信息 我叫龙祖维,来自湖南郴州,是22电气工程及其自动化2班的一名学生 兴趣爱好 我喜欢运动,篮球、足球、乒乓及羽毛…

企业如何快速拥有专属的Agent平台?

LinkAI3.0基于企业场景全新打造的Agen3.0平台,既聚焦业务,带来了新的业务型功能,也基于管理需求,增加了通用的管理型功能:全新「客户管理」支持AI生成客户标签及画像;工作流自定义变量拓展个性化的使用场景;支持精细化管控成员角色权限的「企业空间」;「企业专属智能体…

docker阶段04 Docker仓库管理(Harbor), Docker 的资源限制

Docker 仓库管理 上传docker hub官方镜像仓库#1.给本地镜像打标签 上传本地镜像前必须先给上传的镜像用docker tag 命令打标签 标签格式: docker.io/用户帐号/镜像名:TAG #范例: [root@ubuntu1804 ~]#docker tag alpine:3.11 docker.io/wangxiaochun/alpine:3.11-v1#2.登录 do…

【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统

Easy-Blog 是一套集成文章发表、页面创建、知识库管理、博客后台管理等功能于一体的博客系统。Github项目地址:https://github.com/fecommunity/easy-blog, 欢迎Star。Github项目地址:https://github.com/fecommunity/easy-blog, 欢迎Star。Easy-Blog Easy-Blog 是一套集成…

为啥chrome查看到网页,只有5000多行,应该有1万多行才对

大家好,我是皮皮。 一、前言 前几天在Python白银交流群【磐奚鸟】问了一个Python网络爬虫处理的问题,这里拿出来给大家分享下。二、实现过程 这里【惜君】给了一个指导,可能网站有限制数据量。这里【瑜亮老师】发现了问题所在,如下图所示:数据方面确实存在,顺利地解决了粉…

Maven 使用方法

MavenMaven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),其表现于一个XML文件(pom.xml),其中包含了项目的基本学习,依赖关系,插件配置,构建路径等等为什么使用Maven导入第三方jar包更便捷:之前我们在使用第三方框架时我们会把jar包复制粘贴到WEB-IN…

CIDR与ICMP

CIDR CIDP:无类域间路由/超网 将多个小的子网,用一个相对更大的地址范围进行概括,以此实现表项的优化 如何求cidr后的ip 1.将子网转换成2进制: 0000 1010.0000 0001.0000 0000.0000 0000——10.1.0.0 0000 1010.0000 0001.0000 0001.0000 0000——10.1.1.0 0000 1010.0000 …

lightgbm的输出到低是怎么来的

结论:假设有100棵树,总输出就是100棵树每个输入所对应的输出叶子结点之和1 可以打印出每个样本在每棵树上所属的叶子结点id2 可以打印每棵树每个叶子结点的输出 3 找到每棵树对应叶子结点,加起来 4 查看该样本的模型输出,发现是一致的 5 可以画图每棵树的结构图,方便理解

使用vscode和markdown写博客

博客创建事要Reason 最近因为在做学校的实训项目,真正接触到了实际开发,遇到了不少的问题,由于之前也有在scdn上写博客的习惯(实际写的很乱,而且个人不是很喜欢csdn哈QAQ),所以想要重新维护一个规整的个人博客,于是此博客应允而出。Condition 在了解之后,发现博客园的…

CSP-S 2024

CSP-S 2024 游记初赛 感觉没啥好写的,毕竟弱省不是保龄都能过吗? Day -1 周五,一天有 \(\frac{10}{13}\) 都是奥赛,遂打模拟赛。 传送门。 题都不是不可做题,改得挺快,觉得明天初赛了就看了看初赛题,但没啥动力,半颓状态过了一晚。 晚上做了个诡异的梦。梦里又做了个梦…