对bio nio aio的理解

看来很多关于bio nio aio博客,每次都是看不太懂,终于有点头绪,写博客记录下备用。

在了解bio nio aio之前,首先这三个都是针对系统io来说的(包括网络io、磁盘io、内存io),先要知道程序读取数据是分两步走,第一步是数据先到达内核空间(即系统空间),第二步是由内核空间再拷贝到程序空间。

第二步拷贝数据时,线程或进程会阻塞在这里,而不能去做其他事情,这里就是同步,线程或进程可以做其他事情,这就是异步。

阻塞和非阻塞,体现在第一步内核空间准备数据时,不停的轮训数据有没有准备好,这里就是非阻塞,如果一直等到有数据,这里就是阻塞。

bio是同步阻塞,即线程或进程直到把数据拷贝到程序空间,才能做其他事情。以Tomcat为例,之前bio模型,每一个连接就会启动一个线程去处理数据,包括准备数据和拷贝数据,期间不能做其他事情,直到这个连接关闭,线程过多时,还会涉及到线程频繁的上下文切换,这里是很耗系统资源的。

nio是同步非阻塞,Tomcat的nio模型,每创建一个连接,Tomcat并不会启动一个新线程处理这个连接,而是把socket注册到多路复用器selector上,注意创建连接和真正有请求发生是两码事,特别是http 1.1 keep-alived 长连接出来以后,并不是每时每刻都有请求发送的,长连接的目的是省去了tcp三次握手频繁的创建和关闭所消耗的时间,selector是一个单独的线程,会不断轮询注册到上面的socket,也就是问内核空间哪个socket有数据过来了,即有请求发生了,数据有没有准备好,socket数据准备好了,就会开一个线程,拷贝数据到程序空间,解析url,执行代码,如果后端有jdbc这种连接,nio是处理不了的,线程还是要等的,即同步阻塞,对Tomcat来说,nio处理的是客户端和服务端的连接,这里不讨论后端资源如何管理。所以nio相对bio来说,能够处理大量的并发连接。

aio是异步非阻塞,即内核先把数据准备好,然后再把数据主动拷贝到程序空间,准备数据和拷贝数据程序都不参与,拷贝好了,系统通知程序可以执行程序了,好像这个编程比较复杂,介绍的比较少,也没太关注这块,用得比较少。

参考:https://blog.csdn.net/skiof007/article/details/52873421


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值