linux网络向学习总结(5大io模型与阻塞io)

1.浅谈io

  • 在计算机系统中,io作为描述数据在计算机同其他外部设备之间传输的过程,。可以理解为一个完整的生物个体,需要依靠某种途径来传递信息,从而达到控制下一步的行为的必然逻辑。毕竟信号的传播,需要依赖其产生的种种环境,色彩依靠光,声音依靠稳定充足的介质。
  • io也分为不同的类型(类型会在最后说出,先讨论为何要分类型),因为io的可以理解为 "等 + 拷贝"这一个简单的流程,因此我们想要让计算机高效的运行io,就要优化io的结构,或者通过某种手段来让io的时间变短。''拷'' 贝是必然的,我们就是想让这个数据在他的目的设备(或者文件内)出现并执行我们想要的结果,那么就需要来让 ''等''这个过程变短了。这么说或许有些草率,用一个比较形象的例子来说的话,就好比是钓鱼,你可以就盯着你手上的鱼竿,直到上鱼为止,也可以很多鱼竿一同出击。目的都是为了 '钓鱼' 但其实我们可以让等待的过程,通过特殊方式操作变短,这样时间就会''变短''(概率的)。那么就有了以下5种io模型。

 2.五大io模型(初步理解)

  1. 阻塞io:最基础,最常见的io,在我们的内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认都是阻塞方式。为啥要阻塞住呢?目的是为了方便管理我们的资源,让变成简便性,就像很多没有初始值的数组默认都是零一样(其实是非常方便的设定,理解为必然设定就好)。
  2. 非阻塞io:如果内核还没有把数据准备好的话(一段时间的阻塞后),系统调用会直接返回,清切返回EWOULDBLOCK错误码。在我们多次确认没有鱼上钩之后,信心和精力难免受挫。(因此)非阻塞io其实是一个非常浪费计算机资源的方式,他往往需要程序员以循环的方式反复尝试读写文件描述符,这个过程称为轮询.这 对CPU来说是较大的浪费,一般只有特定场景下才使用.
  3. 信号驱动io:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行io操作,有些西餐厅中会有按钮铃铛,用来呼唤服务员,大抵就像这个一样吧。
  4. io多路转接(也叫多路复用,同时也是理论效率最高的io):简单来说就是一口气运行好多个io,就像我们使用很多鱼竿钓鱼,但实际上最核心的理念在于,io多路转接能够同时等待多个文件描述符的就绪状态。我们以节约时间的角度来看,的确这样最快速。
  5. 异步io(同以上的4种有本质的区别,后面会说):由内核在数据拷贝完成时,通知应用程序,而信号驱动是告诉应用程序 何时可以开始拷贝数据。这个看上去挺神奇的。就是说,我们钓鱼呢,可能是喜欢吃鱼,那么我们直接便宜买别人钓上来的不就好了。

 3.运行理念和适配场景

上述了几种io的大致情况,在有了初步的了解,我们再说说深层次的

  • 首先说一下同步和异步,同步就是一条线程,自己做事来达到自己想要的结果。
  • 异步呢就是少说有两条以及以上的线程,通过层层推进,来达到目的。
  • 文件描述符和SIGIO等不过多赘述

阻塞io:

核心理念:同步等待,简单直接

运行流程

  1. 应用程序发起I/O系统调用

  2. 内核准备数据(如从网络接收数据)

  3. 在内核准备数据的整个过程中,线程被挂起

  4. 数据准备好后,从内核空间拷贝到用户空间

  5. 系统调用返回,应用程序继续执行

 特点:每个io都需要一个单独的线程,编程简单,但资源消耗比重较大

非阻塞io:

核心理念:轮询检查,避免线程阻塞

运行流程

  1. 应用程序发起非阻塞I/O系统调用

  2. 内核立即返回(如果数据未就绪则返回EWOULDBLOCK错误)

  3. 应用程序不断轮询检查I/O状态

  4. 当数据就绪时,执行实际I/O操作

  5. 数据从内核空间拷贝到用户空间 

特点:前面也就说到了,因为有轮询这样的循环机制,会导致cpu的占用率高,但响应延迟低。

信号驱动io :

核心理念:内核通知,避免轮询

运行流程

  1. 应用程序设置信号处理程序(SIGIO)

  2. 发起信号驱动I/O系统调用并立即返回

  3. 内核在数据就绪时发送信号

  4. 应用程序收到信号后执行I/O操作

  5. 数据从内核空间拷贝到用户空间

特点: 可以减少轮询开销,但是需要可怜的程序员细心维护,信号处理非常复杂。

多路复用:

核心理念:单线程监控多个I/O通道

运行流程

  1. 应用程序调用select/poll/epoll等系统调用

  2. 内核监控多个文件描述符

  3. 当任一描述符就绪时返回

  4. 应用程序处理就绪的I/O操作

  5. 数据从内核空间拷贝到用户空间

特点:单线程处理多连接,适合高并发,但会有系统调用开销

异步io:

核心理念:全异步,彻底非阻塞

运行流程

  1. 应用程序发起aio_read等异步I/O调用

  2. 调用立即返回,应用程序继续执行

  3. 内核在后台准备数据

  4. 数据就绪后,内核自动将其拷贝到用户空间

  5. 内核通知应用程序I/O完成

特点:编辑非常困难,但是性能也相对应的好。 

 

模型第一阶段(等)第二阶段(拷贝)线程状态
阻塞阻塞等待阻塞等待全程阻塞
非阻塞立即返回+轮询阻塞等待轮询间运行
信号立即返回阻塞等待接受信号后处理
多路复用select阻塞阻塞等待部分阻塞
异步立即返回立即返回完全不阻塞

到后面就没有内容了,如果你想问为啥不配图,老实说,我画图一般,没啥自信拿给别人看,网上有非常清晰的流程图,想深入学习的可以进一步查找。

非常感谢您的观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值