学习NIO
来源:互联网 发布:大淘客数据接口怎么用 编辑:程序博客网 时间:2024/05/22 12:51
高并发量引起的问题
一个使用传统阻塞I/O的系统,如果还是使用传统的一个请求对应一个线程这种模式,一旦有高并发的大量请求,就会有如下问题:
1、线程不够用,就算使用了线程池复用线程也无济于事;
2、阻塞I/O模式下,会有大量的线程被阻塞,一直在等待数据,这个时候的线程被挂起,只能干等,CPU利用率很低,换句话说,系统的吞吐量差;
3、如果网络I/O堵塞或者有网络抖动或者网络故障等,线程的阻塞时间可能很长。整个系统也变的不可靠;
为了说明白NIO,得先介绍一些IO模型。
阻塞I/O
当用户线程发起一个IO请求的时候,请求会到达内核,内核获取到数据后,将数据从内核空间拷贝到用户空间。期间,当内核未将数据准备好时,用户线程一直处于阻塞状态,CPU利用率不高。
为什么非得从内核空间拷贝到用户空间呢?
出于系统安全考虑,用户线程是没法直接读取内核态内存的。
非阻塞IO
当用户线程发起IO请求时,不用等到内核准备好数据才能返回,而是可以立刻返回,没有被阻塞住。但是用户线程始终还是得获取到数据,所以只能不断的轮询,检查内核空间的数据是否准备好,这样则很耗CPU。
IO多路复用
IO多路复用,其实是利用select函数阻塞多个IO操作,并对这些IO操作进行轮询检测,一旦数据准备好后,就可以通知线程进行真正的IO操作(此时数据已经在内核空间准备好了,此时用户线程直接进行拷贝的动作即可)。期间如果数据未准备好,用户线程可以可以干其他事情的。
JAVA NIO
JAVA NIO是非阻塞的,同时实现了IO多路复用。NIO中用户线程不会被读写操作阻塞住,它可以继续干事情,所以NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。
Selector 和 Channel
多个Channel以事件的方式可以注册到同一个Selector,从而达到用一个线程处理多个请求成为可能。
Channel
表示一个连接通道,连接的对象可以是文件、网络socket、硬盘。
Selector
一个组件,可以检测多个NIO channel,看看读或者写事件是否就绪。
参考的文章
Java NIO通信框架在电信领域的实践
高性能io模型浅析
Java I/O模型从BIO到NIO和Reactor模式
- NIO学习
- Nio学习
- 学习NIO
- nio 学习
- NIO学习
- NIO学习
- 学习NIO
- NIO 学习
- NIO学习
- NIO学习
- NIO学习
- NIO学习
- NIO学习一、NIO简介
- java.nio包学习
- nio socket 学习
- Java Nio学习笔记
- java nio 缓冲区学习
- NIO学习笔记
- (转)Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- Mysql多列索引——最左精确匹配
- python的reduce()函数
- C# Invoke and BeginInvoke
- java中的代理模式
- 学习NIO
- ACM之LeetCode中Median of Two Sorted Arrays
- 摸爬滚打DirectX11_day_11——三维粒子系统
- 九、java中的static,final,this,super
- springboot微服务
- 一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本
- mysql教程1-安装与常用命令
- leetcode 47. Permutations II
- deepin 中文为啥网页那么大