简单理解几种IO模型

前言

最近在学习的过程中总是遇到IO模型这个概念,对它只有些模糊的印象,只知道NIO,BIO这些名词,再具体些就说不出啥所以然了。今天抽空特地好好看了下IO模型,发现确实能帮我更好的了解程序。比如说,我们都知道Redis是单线程的,那它是如何处理高并发的呢?那就是采用IO多路复用模型监听多个Socket,然后再用对应的handle进行处理。看到了吧,了解IO模型还是很有用的。(刚学会就出来嘚瑟的丑恶嘴脸~)

简单理解

首先我们举一个经典例子:
1.这天小龙去餐馆吃饭,他点了份蛋炒饭,然后坐在凳子上等着啥也不做,等吃完饭再去干别的。这憨憨吃饭5分钟等了俩小时。这就是同步堵塞IO模型(BIO)。

2.下顿饭这憨憨学聪明了换了家餐馆,他又点了份蛋炒饭,这次他一边玩手机一边等,但不知道饭好了没,所以他每过1分钟跑去问大厨饭好了没,终于在跑了59次后饭好了。正在减肥的小龙对饭馆赞赏有加,直呼wdnmd。这就是同步非堵塞模型(NIO)。

3.这货又饿了。这次他来到个高级餐厅,又点了份蛋炒饭坐下了,但这家餐厅不让玩手机,所以他只能干等,但是安装了个屏幕用来显示饭好了没,这样他只要抬头看下就行了,也不用来回跑了。这次他总算吃了顿还算可以的饭。这就是IO多路复用,也叫异步堵塞IO。

4.可是这货还是不满意,他决定破费去趟五星级酒店看看。小龙依旧忘不了他的蛋炒饭。这次他一边等一边玩手机,那他怎么知道饭好了没呢?人家可是五星级酒店,饭好了直接给你送上桌啊。这憨憨感叹money力量强大。这就是异步非堵塞IO模型。

概念理解

我们一定要理解**同步与异步**,**堵塞与非堵塞**的概念,这是非常重要的!

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

不好理解?那我对照上面的例子通俗的解释下。在等饭的过程中坐在那里啥也不干就是堵塞,能玩手机就是非堵塞;你一直站在窗口等饭或者一遍遍的去问饭好了没就是同步,饭馆做好了然后过来通知你或者给你端上来那就是异步。怎么样,这样解释够清楚了吧。

一、同步堵塞IO模型

在这里插入图片描述
用户线程发起read请求后一直等待直到read完成。

一、同步非堵塞IO模型

在这里插入图片描述
用户线程发起read请求后会立即返回,在此期间用户线程可以做其它的任务,但是需要轮询判断数据是否准备好了,好了之后才能进行read。在轮询的过程中会耗费比较大的CPU资源。

三、(IO多路复用)异步堵塞IO模型

在这里插入图片描述
IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。
一个线程监视多个socket,将socket放入到select里面堵塞的等待系统调用。到数据到达时,socket会被激活完成read操作。
相比同步堵塞IO模型,IO多路复用增加了监视socket和select函数调用操作,这样看起来占用了更多的资源,但是select却能处理多个socket。也就是一个线程处理多个IO请求,而在同步堵塞IO模型中只能通过多线程完成操作。

四、异步非堵塞IO模型

在这里插入图片描述
异步IO模型中,用户线程直接使用内核提供的异步IO API发起read请求,且发起后立即返回,继续执行用户线程代码。然后操作系统开启独立的内核线程去处理IO操作。当数据到达时,由内核负责读取socket中的数据,并写入用户指定的缓冲区中。最后内核将read的数据分发给内部Proactor,Proactor将IO完成的信息通知给用户线程(一般通过调用用户线程注册的完成事件处理函数),完成异步IO。

参考:https://blog.csdn.net/sehanlingfeng/article/details/78920423

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值