Netty学习前置知识:IO模型

一、前言

我们知道Netty是一个NIO框架,所以在学习Netty之前我们需要补充一下NIO相关的知识。笔者将结合最近看的一些博客,以及视频做一些总结。

二、I/O模型

I/O (输入输出)即Input和Output的简称,计算机之间的通信都可以抽象为IO,即一个输入一个输出。当然不仅仅局限于计算机之间通信,也包含计算机和用户、内核空间和用户空间都有IO的身影。接下来我们介绍一下各种类型的IO。在此之前我们需要知道一些名称。我们知道在操作系统中我们所编写的程序是运行在用户空间,而一些基础的服务(例如操作网卡、读取文件等等)这些都是在内核空间的,所以我们当我们需要读取数据时就涉及到了用户空间和内核空间的交互,这里也有很多种类型。

同步阻塞

站在内核角度,所谓的同步阻塞值的是内核在处理用户请求时,用户的请求无法做别的事只能等待内核空间万完成的数据的读取。
image.png
通俗版本:例如我们去商店买可乐,问老板是否有可乐,老板去仓库寻找可乐再此过程中我们什么也不做就等待,这就是同步阻塞。

同步非阻塞

早先版本

同步非阻塞的模型是存在问题的,阻塞的过程用户线程什么都不能做只能等待所以在之后的日子,计算机大神们对这个模型做了“升级”,出现了同步非阻塞。但是这次的优化还是比较有限的,唯一的区别就是内核在准备数据的过程中,用户线程不再单纯的阻塞什么都不做,而是一直询问内核是否已经完成。当然了这个优化非常有限只是不再阻塞了,不过也算一种进步。
image.png
通俗版本:还是去商店买可乐的例子,这次有所不同,老板在去仓库找可乐的过程中,我们不断的询问好了吗老板好了吗老板。

内核升级(多路复用)

早先版本的NIO只是通过简单的轮训来实现非阻塞,显然这个是存在缺陷的。如果有大量的线程一直在轮训这对CPU来说非常不友好,所以内核再度升级,内核新增了系统调用select(这是NIO中一个非常重要的组件)
所谓的select从字面意思来理解就是一个选择器,所以的用户空间的连接都注册到select中,内核会将准备好数据的连接返回给用户空间,用户空间无需一直轮训。(下图是一个简易版本)这就是IO多路复用,当然IO多路复用还有其他的实现poll和epoll,例如redis中采用 epoll来实现IO多路复用。
所谓的IO多路复用指的是一个或多个线程可以处理多个连接(不一定非得一个连接对应一个线程),无需创建维护过多的线程。
image.png
通俗版本:一群人去超市买不同的商品,但这帮人没有一直问老板好了吗好了吗,而是等老板在仓库找到后告诉外面的人,已经找到了。

信号驱动IO模型

当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。
通俗版本:我们去商店买东西,然后留了个电话给商店老板,让他找到后打电话通知我,我再去拿东西。

异步IO(AIO)

异步IO又称之为AIO,和信号驱动IO有点类似。当进程发起一个IO操作,进程返回(不阻塞),但也不能返回结果。内核把整个IO处理完后,会通知进程结果,如果IO操作成功则进程直接获取到数据
image.png

注意:
此模型和前面模型最大的区别是:前4个从内核空间拷贝数据这一过程是阻塞的,需要自己把准备好的数据,放到用户空间。
而全异步不同,异步IO是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程都不用等待。
用户线程完全不需要关心实际的整个IO操作是如何进行的,只需要先发起一个请求,当接收内核返回的成功信号时表示IO操作已经完成,可以直接去使用数据,它是最理想的模型
引用自:https://blog.csdn.net/qq_44836676/article/details/124672227

三、小结

至此我们已经学习了IO的物种模型,这是学习Netty的前置知识。下一篇文章我们会学习NIO的三大组件,希望对你有所帮助。

四、未完待续

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值