专项攻克——BIO、NIO、AIO

补充知识——同步与异步:同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

  1. 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
  2. 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果

补充知识——阻塞和非阻塞:

  1. 阻塞: 调用者发起一个请求,期间一直等待请求结果返回,无法从事其他任务,只有当条件就绪才能继续。
  2. 非阻塞:调用者发起一个请求,调用者不用一直等着结果返回,期间可以去干其他事情。

补充知识——同步阻塞、同步非阻塞和异步非阻塞的区别:

  1. 同步阻塞:客户端等着服务器执行完任务,期间不能干其他事。(BIO)
  2. 同步非阻塞:客户端在服务器执行完任务期间,能去干其他事,每隔一段时间就来看看服务器是否执行完任务。
  3. 异步非阻塞:客户端在服务器执行任务期间,能去干其他事,期间也不用查看服务器是否执行完,因为服务器执行完后会自己通知其他线程。

参考博客
BIO 是同步阻塞通信
AIO 是彻底的异步通信。
NIO 是同步非阻塞通信。
有一个经典的举例。烧开水。

场景:有一排水壶(客户)在需要烧水。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

一、BIO

​ BIO,Blocking I/O,同步阻塞IO。最开始的网络通信就是BIO模型,服务端创建一个ServerSocket,客户端创建一个 Socket 去连接服务端,这样客户端与服务端便可以进行通信了。

1.1 存在的问题——过程阻塞:

  1. 服务端需要一直等待客户端的连接请求,当客户端连接之后,服务器在处理客户端请求时,客户端只能进行等待;
  2. 如果客户端暂时没有请求,服务器将再次进入阻塞状态。

1.2 两种解决方案:

  1. 使用多线程:每连接一个客户端时,服务端便创建一个线程来专门处理该客户端的请求,主线程则继续等待其他客户端的连接请求。
  2. 使用线程池:不需要对每一个请求都创建线程,只需要去线程池中取一个线程即可。可是底层的通信机制依然是同步阻塞的,所以又被称为"伪异步IO"。

1.3 不足

开启大量线程需要消耗大量的内存资源,而且线程之间频繁的切换会降低程序的性能。并且当请求的客户端特别多时,可能会因为开销过大导致系统崩溃。
在这里插入图片描述

二、NIO

文件描述符fd(File Descriptor),是计算机科学中术语,形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

知识补充——多路复用:是指一个进程来监视多个网络连接的描述符,一旦某一个客户端的文件描述符就绪,就能通知相应的程序进行处理。

NIO,Non Blocking I/O,同步非阻塞IO。实现NIO需要通过I/O的多路复用。多路复用有 select、poll、epoll 这三种机制,可以同时监控多个fd的操作,任何一个返回内核数据就绪,应用进程再发起recvfrom系统调用。

2.1 select

当有客户端连接服务器时,服务器会为每一个客户端随机创建一个不同的文件描述符。select模型首先将所有的文件描述符收集到 bitmap 集合中,然后将集合从用户态拷贝到内核态,让内核判断哪一个文件描述符有数据。当有客户端发来请求,对应客户端的文件描述符将会被置位,select 函数将会被返回,程序则从阻塞状态解除,继续执行之后的代码,

2.2 poll

看不懂,略

2.3 epoll

看不懂,略

2.4 总结

在这里插入图片描述

三、AIO

BIO,NIO,在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不是真正的异步。AIO才是异步非阻塞的。

AIO,Asynchronous I/O,异步非阻塞IO。当通过AIO发起IO操作时,程序不需要阻塞等待底层执行完,可以继续执行接下来的操作。当IO操作结束后,操作系统会回调你设置的接口“IO操作已完成”(异步)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城有术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值