1.浅谈io
- 在计算机系统中,io作为描述数据在计算机同其他外部设备之间传输的过程,。可以理解为一个完整的生物个体,需要依靠某种途径来传递信息,从而达到控制下一步的行为的必然逻辑。毕竟信号的传播,需要依赖其产生的种种环境,色彩依靠光,声音依靠稳定充足的介质。
-
io也分为不同的类型(类型会在最后说出,先讨论为何要分类型),因为io的可以理解为 "等 + 拷贝"这一个简单的流程,因此我们想要让计算机高效的运行io,就要优化io的结构,或者通过某种手段来让io的时间变短。''拷'' 贝是必然的,我们就是想让这个数据在他的目的设备(或者文件内)出现并执行我们想要的结果,那么就需要来让 ''等''这个过程变短了。这么说或许有些草率,用一个比较形象的例子来说的话,就好比是钓鱼,你可以就盯着你手上的鱼竿,直到上鱼为止,也可以很多鱼竿一同出击。目的都是为了 '钓鱼' 但其实我们可以让等待的过程,通过特殊方式操作变短,这样时间就会''变短''(概率的)。那么就有了以下5种io模型。
2.五大io模型(初步理解)
- 阻塞io:最基础,最常见的io,在我们的内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认都是阻塞方式。为啥要阻塞住呢?目的是为了方便管理我们的资源,让变成简便性,就像很多没有初始值的数组默认都是零一样(其实是非常方便的设定,理解为必然设定就好)。
- 非阻塞io:如果内核还没有把数据准备好的话(一段时间的阻塞后),系统调用会直接返回,清切返回EWOULDBLOCK错误码。在我们多次确认没有鱼上钩之后,信心和精力难免受挫。(因此)非阻塞io其实是一个非常浪费计算机资源的方式,他往往需要程序员以循环的方式反复尝试读写文件描述符,这个过程称为轮询.这 对CPU来说是较大的浪费,一般只有特定场景下才使用.
- 信号驱动io:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行io操作,有些西餐厅中会有按钮铃铛,用来呼唤服务员,大抵就像这个一样吧。
- io多路转接(也叫多路复用,同时也是理论效率最高的io):简单来说就是一口气运行好多个io,就像我们使用很多鱼竿钓鱼,但实际上最核心的理念在于,io多路转接能够同时等待多个文件描述符的就绪状态。我们以节约时间的角度来看,的确这样最快速。
- 异步io(同以上的4种有本质的区别,后面会说):由内核在数据拷贝完成时,通知应用程序,而信号驱动是告诉应用程序 何时可以开始拷贝数据。这个看上去挺神奇的。就是说,我们钓鱼呢,可能是喜欢吃鱼,那么我们直接便宜买别人钓上来的不就好了。
3.运行理念和适配场景
上述了几种io的大致情况,在有了初步的了解,我们再说说深层次的
- 首先说一下同步和异步,同步就是一条线程,自己做事来达到自己想要的结果。
- 异步呢就是少说有两条以及以上的线程,通过层层推进,来达到目的。
- 文件描述符和SIGIO等不过多赘述
阻塞io:
核心理念:同步等待,简单直接
运行流程:
-
应用程序发起I/O系统调用
-
内核准备数据(如从网络接收数据)
-
在内核准备数据的整个过程中,线程被挂起
-
数据准备好后,从内核空间拷贝到用户空间
-
系统调用返回,应用程序继续执行
特点:每个io都需要一个单独的线程,编程简单,但资源消耗比重较大
非阻塞io:
核心理念:轮询检查,避免线程阻塞
运行流程:
-
应用程序发起非阻塞I/O系统调用
-
内核立即返回(如果数据未就绪则返回EWOULDBLOCK错误)
-
应用程序不断轮询检查I/O状态
-
当数据就绪时,执行实际I/O操作
-
数据从内核空间拷贝到用户空间
特点:前面也就说到了,因为有轮询这样的循环机制,会导致cpu的占用率高,但响应延迟低。
信号驱动io :
核心理念:内核通知,避免轮询
运行流程:
-
应用程序设置信号处理程序(SIGIO)
-
发起信号驱动I/O系统调用并立即返回
-
内核在数据就绪时发送信号
-
应用程序收到信号后执行I/O操作
-
数据从内核空间拷贝到用户空间
特点: 可以减少轮询开销,但是需要可怜的程序员细心维护,信号处理非常复杂。
多路复用:
核心理念:单线程监控多个I/O通道
运行流程:
-
应用程序调用select/poll/epoll等系统调用
-
内核监控多个文件描述符
-
当任一描述符就绪时返回
-
应用程序处理就绪的I/O操作
-
数据从内核空间拷贝到用户空间
特点:单线程处理多连接,适合高并发,但会有系统调用开销
异步io:
核心理念:全异步,彻底非阻塞
运行流程:
-
应用程序发起aio_read等异步I/O调用
-
调用立即返回,应用程序继续执行
-
内核在后台准备数据
-
数据就绪后,内核自动将其拷贝到用户空间
-
内核通知应用程序I/O完成
特点:编辑非常困难,但是性能也相对应的好。
| 模型 | 第一阶段(等) | 第二阶段(拷贝) | 线程状态 |
|---|---|---|---|
| 阻塞 | 阻塞等待 | 阻塞等待 | 全程阻塞 |
| 非阻塞 | 立即返回+轮询 | 阻塞等待 | 轮询间运行 |
| 信号 | 立即返回 | 阻塞等待 | 接受信号后处理 |
| 多路复用 | select阻塞 | 阻塞等待 | 部分阻塞 |
| 异步 | 立即返回 | 立即返回 | 完全不阻塞 |
到后面就没有内容了,如果你想问为啥不配图,老实说,我画图一般,没啥自信拿给别人看,网上有非常清晰的流程图,想深入学习的可以进一步查找。
&spm=1001.2101.3001.5002&articleId=148106606&d=1&t=3&u=bbd76abf0ce444cb9c031c6c73066a69)
2260

被折叠的 条评论
为什么被折叠?



