IO模型
慢慢编程
分享编程路上的技巧和心得,慢慢和你共同进步。
展开
-
慢慢说 IO 模型:AIO
小Q:什么是 AIO 呢?AIO 即 Asynchronous I/O,异步非阻塞 I/O 模型。小Q:AIO 和 NIO 的区别是什么呢?慢慢:我们知道 NIO 是同步非阻塞模型,其不管是普通 NIO 还是多路复用,都需要去轮询查看有没有事件发生,而这个不断的轮询也是对应者同步的概念。AIO 则没有了轮询的过程。通过对事件绑定一个回调函数,当事件发生时就会自动触发这个回调函数。当然,这得需要硬件的强力支持。小Q:有没有代码演示下。慢慢:那我们来模拟下读取磁盘操作。@Slf4j.原创 2021-09-25 21:36:37 · 97 阅读 · 0 评论 -
慢慢说 IO 模型:Reactor 和 Proactor
小Q:什么是 Reactor 和 Proactor 呢?慢慢:Reactor 和 Proactor 都是以多路复用为基础的网络模型。Reactor 的主要思想是主线程监听事件的连接和文件描述符上是否有变化,具体的 IO 操作和业务逻辑交由工作线程执行。Proactor 的主要思想是将 IO 操作交给主线程,工作线程仅负责业务逻辑。小Q:能举下实际场景吗?慢慢:Reactor 的工作流程:主线程监听到有连接,往 epoll 复用表中注册读就绪事件;主线程调用 epoll_wait 等.原创 2021-09-25 21:35:50 · 110 阅读 · 0 评论 -
慢慢说 IO 模型:多路复用
小Q:什么是多路复用呢?慢慢:理解完 NIO 模型,我们可能会注意到,在 Linux 中,万物皆文件,而文件的话就得要操作到磁盘,而操作磁盘则需要用户态和内核态的切换。在 NIO 模式下,我们不断的去判断连接是否有数据传过来,这里我们就得操作到磁盘。我们在轮询的过程中不断地切换内核态和用户态,这是非常浪费资源的。于是,我们想,有没有一种方法可以不用到内核态和用户态的切换。我们可以把轮询的过程交由内核去完成,当内核监听到有连接收到数据时,再告诉我们,从而我们通过线程去处理它。把轮询交由内核,用户态只.原创 2021-09-20 21:06:35 · 89 阅读 · 0 评论 -
慢慢说 IO 模型:传统 NIO
小Q:前面说了 BIO 无法克服长连接,那么有什么模式可以支持长连接呢?慢慢:这里介绍下 NIO 模型,即同步非阻塞。每当我们去食堂点餐时,点好餐后还得要排队等厨师弄好取餐。在这个过程中,我们得一直在这条队伍里等待,不能上厕所也不能坐下休息。这里就相当于 BIO 模型中,当有一个连接建立后,就得要有一个线程去处理,直到连接处理完毕,并且这个线程在整个过程中都被占用。于是有人提出了一种思路:我们下单后就给我们一个订单号,并且有个屏幕显示现在哪个订单已经做完了。于是,我们彻底被解放了,我们可以去做其他事.原创 2021-09-19 21:08:07 · 75 阅读 · 0 评论 -
慢慢说 IO 模型:改造型 BIO
小Q:前边说了 BIO 的缺点,我们有没有什么方法对其改进呢?慢慢:为了解决前面提到的 BIO 的每一个连接都需要一个线程处理的问题,有人提出了一个解决方案,用线程池的方式对线程进行管理,防止由于海量并发接入导致线程耗尽,实现系统的可控。小Q:懂了懂了,赶快上代码。服务端public class Server { public static void main(String[] args) throws IOException { ServerSocket serv.原创 2021-09-10 22:11:56 · 69 阅读 · 0 评论 -
慢慢说IO模型:传统BIO
小Q:什么是 IO 模型?慢慢:我们先来了解下 IO。在 linux 系统中,一切皆是文件,而文件又是一串二进制流。操作系统中有很多的流,我们需要通过一个符号表才能够管理这些流,这个符号表为 fd,即文件描述符表。所以,Linux 的内核将所有外部设备都看做一个文件来操作,每一个文件的读写操作都会返回一个 fd。我们每次操作文件,都需要用户空间,内核空间,设备空间进行紧密的配合。那么如何让他们更高效的配合呢?就提出了多种的设计方案,也叫做 IO 模型。小Q:能具体讲下 BIO 模型吗?B.原创 2021-09-09 12:29:46 · 118 阅读 · 0 评论