个人理解的BIO/NIO/AIO

本文通过生动的例子,如烧水壶比喻,详细解释了网络通信中的BIO、NIO及AIO的区别。从同步和异步的角度出发,阐述了不同IO模型如何处理并发连接请求,及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络通信过程

        一般网络通信设计到两台电脑A,B。假设每个电脑都是Linux内核,那么两个用户程序的通信过程就是:A上的用户线程->A的内核->A的网卡->网线->B的网卡->B的内核->B上的用户线程

同步和异步

        那么一般的同步形容的是哪一部分的内容呢?按照我的理解是,对于A、B而言,如果是同步,在内核->用户线程或者用户线程->内核这一步就是用户线程需要花CPU同步执行的,就是需要等待。但是如果是异步,这两个过程就是让内核去执行的,也就是把用户线程解放了,自然就达到了异步的要求。

BIO

        不论有多少个A(A1,A2,A3…)发起连接请求,就有多少个B(B1,B2,B3)接收请求,B需要等待整个过程,B1线程接受A1的请求之后,只能专门盯着对应A1的这个socket,也不能去做别的。如果并发量上去之后,这个负载就很大了。
        比方说:十个烧水壶,需要十个人盯着,水壶要烧开了,对应的人就把这个水壶的开关关掉,再喝里面的热水。

NIO

        NIO就是虽然有多个A在连接,连接肯定有先后,而且传输数据有快慢,但是只有一个线程B进行处理,如果A1先到,就先处理A1,来了A2,如果之前没处理好,就要等待B处理好A1,再来处理A2;但是,如果A1没好,就先处理其他准备好的,比如A2。这个就是同步非阻塞,就是B不会阻塞在一个请求线程上,但是这个线程还是同步处理,B线程需要自己去内核拿数据。
        这个过程描述起来就是一个Reactor模型,B可以监听多个socket,只要一个socket有事件,就处理这个事件,也是一个IO多路复用的思想,这样一个线程就能处理多个请求,但是如果每个请求的数据传输量都很大,那么其实这个效率也会退化到BIO差不多的水准。
        比方说:十个烧水壶,只要一个人盯着,只要有一个水壶要烧开了,这个人就把这个水壶的开关关掉,再有一个要烧开了,就再把那个给关掉。水壶里面的水就是数据,烧开的过程就是数据准备的过程,人关掉热水的过程就是数据从内核到用户线程的过程。

AIO

        AIO与NIO的差别就在于,数据从内核到用户线程这一步,是由内核完成的,这样用户线程就能专们处理业务逻辑相关的程序。对于用户线程来说,数据是即拿即用的。
        比方说:十个烧水壶,一个人只要打开开关(接收请求),然后水烧开了,水壶会自动断电,整个过程就是全自动的,异步非阻塞,你要用了就自己过来拿。

这三个IO迷惑了半年,用一种我能理解的方式解释了一下,如果行文有误,麻烦各位解惑。

参考资料:理解同步IO和异步IO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值