前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解NIO和BIO

了解NIO和BIO

作者头像
袁新栋-jeff.yuan
发布2020-08-26 15:26:12
4090
发布2020-08-26 15:26:12
举报

什么是IO?

1.linux系统中一切皆文件当有文件 当有一个请求过来的時候就通过3次握手就会和内核创建连接关系,此时Tomcat中的启动的的端口监控就会检测到内核中的文件标识符 fd 此时由linux提供的API socket就会应用程序通过accept()去监控到对应的文件,然后启用线程read(fd)去获取socket的文件流。应用程序读根据文件标识符去读取文件流的过程也就是IO

BIO

  1. BIO 也就是这个就是在当有一个client创的时候就会启动一个线程 因为是阻塞的IO,我们的accept方法时如果他没有消息过来这个线程会一直去监听这个fd文件。所以说这样就会导致产生很多个线程最后就会导致栈溢出的问题,程序挂掉。不准确的举个列子:那就是我们给电脑无限开程序,最后导致电脑直接挂掉 2
在这里插入图片描述
在这里插入图片描述

NIO

1.正是遇到了上述问题,所以我们就得解决问题,聪明的人就提出了BIO的概念,NIO也叫Non-Blocking IO 是同步非阻塞的IO模型。线程发起io请求后,立即返回(非阻塞io)。同步指的是必须等待IO缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待IO缓冲区,可以先做一些其他操作,但是要定时轮询检查IO缓冲区数据是否就绪。Java中的NIO 是new IO的意思。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lv0HW8O4-1587399641989)(87105D5D313943C39D4ED442D800A431)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lv0HW8O4-1587399641989)(87105D5D313943C39D4ED442D800A431)]

但是又有一个问题那就是起一个线程不断的循环根据fd去监听对应是否有数据是还是很浪费性能的,因为当有1000哥连接接入,但是其中只有一个用户在传输数据,那这样每次这个线程都去内核遍历查看,其中99%的都被浪费掉了,左右又有聪明人了,就提出了IO多路复用思想,其实是NIO加上IO多路复用技术。普通的NIO是线程轮询查看一个IO缓冲区是否就绪,而Java中的new IO指的是线程轮询地去查看一堆IO缓冲区中哪些就绪,这是一种IO多路复用的思想。IO多路复用模型中,将检查IO数据是否就绪的任务,交给系统级别的select或epoll模型,由系统进行监控,减轻用户线程负担。

IO的多路复用

  1. NIO主要有buffer、channel、selector三种技术的整合,通过零拷贝的buffer取得数据,每一个客户端通过channel在selector(多路复用器)上进行注册。服务端不断轮询channel来获取客户端的信息。channel上有connect,accept(阻塞)、read(可读)、write(可写)四种状态标识。根据标识来进行后续操作。所以一个服务端可接收无限多的channel。不需要新开一个线程。大大提升了性能。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是IO?
  • BIO
  • NIO
  • IO的多路复用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档