NIO
这瓜保熟么
平常心
展开
-
常见的IO模型
https://www.cnblogs.com/straybirds/p/9479158.html转载 2021-01-02 21:57:32 · 111 阅读 · 0 评论 -
JAVA NIO之浅谈内存映射文件原理与DirectMemory
JAVA类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段。本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理。 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read()、write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态, 然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区, 然后再把数据从内核IO缓冲区拷贝到...转载 2020-09-14 17:11:29 · 181 阅读 · 0 评论 -
Nio-slice方法解决替代忘记写flip方法的作用
filp,slice,和duplicatefilp: 英文翻译为反转 slice: 切片filp用于切换读写模式. 创建Buffer时是写入模式,读取时需要切换才能进行读取. 切换时主要变更 Buffer的position和limit.public class Test { public static void main(String[] args) { ByteBuffer allocate = ByteBuffer.allocate(16); ...转载 2020-09-14 14:38:52 · 249 阅读 · 0 评论 -
Java NIO系列教程ServerSocketChannel
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(9999));转载 2020-08-27 21:48:23 · 154 阅读 · 0 评论 -
Nio-Selector对象的wake up/close方法
wake up 在使用Selector对象的 select() 或者 select(long) 方法时候,当前线程很可能一直阻塞下去,那么用另一个线程去执行 Selector.wakeUp() 方法会唤醒当前被阻塞的线程,使其 select() 立即返回。 当然,如果当前线程没有阻塞,那么执行了wakeUp() 方法之后,下一个线程的 select() 方法会被立即返回,不再被阻塞下去。 close 显然,close() 方法能够关闭当前的选择器。 当一个线程当前呈阻塞状态,那么中原创 2020-08-27 21:26:20 · 900 阅读 · 0 评论 -
传统IO的阻塞和NIO的非阻塞说明和NIO的优势
数据的传递需要从用户空间或者磁盘等硬件拷贝至内核缓冲区,在从内核缓冲区拷贝至网关后传输至网络,网络畅通情况下计算机一边向缓冲区写数据,一边将缓冲区的数据读取至网关。数据的接收需要从网关拷贝至内核缓冲区后,再从内核空间拷贝至用户空间或者磁盘等硬件,网络畅通情况下计算机一边将数据从网关接受写入内核缓冲区,一边将数据从缓冲区拷贝至用户空间或者直接持久化至磁盘等。当网络不畅通时,缓冲区被写满或者读完,会产生阻塞IO事件,假设叫“缓冲区满”和“缓冲区空”事件。传统IO在内核缓冲区触发写满或者读完事件时,会转载 2020-08-22 22:01:11 · 207 阅读 · 0 评论 -
NIO-SocketChannel.configureBlocking(false)作用
非阻塞模式可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用connect(), read() 和write()了。connect()如果SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在连接建立之前就返回了。为了确定连接是否建立,可以调用finishConnect()的方法。像这样:socketChannel.configureBlocking(false);socketChanne原创 2020-08-22 21:56:07 · 4358 阅读 · 4 评论 -
Socket和ServerSocket/SocketChannel与ServerSocketChannel区别
一:Socket与ServerSocket区别交互过程Socket与ServerSocket的交互,下面的图片我觉得已经说的很详细很清楚了。1.1 ServerSocket类创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如: ServerSocket MyListener=new ServerSocket(600); 这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同...原创 2020-08-22 21:21:53 · 2557 阅读 · 0 评论 -
Nio-DirectByteBuffer作用
由于Zookeeper中使用了DirectByteBuffer进行IO操作,在此简单介绍下DirectByteBuffer和HeapByteBuffer的区别.HeapByteBuffer是在堆上分配的内存,而DirectByteBuffer是在堆外分配的内存,又称直接内存.使用HeapByteBuffer进行IO时,比如调用FileChannel.write(HeapByteBuffer)将数据写到File中时,有两个步骤:将HeapByteBuffer的数据拷贝到DirectByteBuffer转载 2020-08-19 15:34:00 · 603 阅读 · 0 评论 -
IO多路复用机制:select、poll、epoll的区别
1.单个进程打开的文件描述符(fd文件句柄)不一致 select :有最大连接数限制数为1024,单个进程所能打开的最大连接数由FD_ZETSIZE宏定义。 poll:poll本质上与select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。 epoll:虽然连接有上限,但是很大,1G内存的机器可以打开10万左右的连接,以此类推。2.监听Socket的方式不一致select :轮询的方式,一个一个的socket检查过去,发现有socket活跃时才进行处理,当线性转载 2020-05-28 15:28:05 · 317 阅读 · 0 评论 -
NIO Buffer
Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了: 上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入...翻译 2018-09-03 18:32:09 · 107 阅读 · 0 评论 -
Java NIO
1:java NIO之SelectedKey SelectedKey是channel与Selector绑定的标记,每将一个channel注册到一个selector就会产生一个SelectedKey,并将这个SelectedKey放入到Selected的key set中,注意,key set 只能通过这种方式添加,不可以直接添加,但是可以手动移除。在ServerSocketChanne...翻译 2018-09-03 17:15:27 · 301 阅读 · 1 评论 -
什么是套接字(Socket)
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。生成套接字,主要有3个参数:通信的目的IP地址、使用的传输 ...翻译 2018-08-19 15:23:08 · 85544 阅读 · 9 评论 -
Netty-线程模型
1 Proactor和ReactorProactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。I/O多路复用机制都依赖于一个事件分解器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图:1.1 select,poll,epoll在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简...翻译 2018-08-19 15:53:58 · 179 阅读 · 0 评论 -
NIO Reactor模型 & Netty线程模型
1、Reactor模式思想:分而治之+事件驱动1)分而治之一个连接里完整的网络处理过程一般分为accept、read、decode、process、encode、send这几步。Reactor模式将每个步骤映射为一个Task,服务端线程执行的最小逻辑单元不再是一次完整的网络请求,而是Task,且采用非阻塞方式执行。2)事件驱动每个Task对应特定网络事件。当Task准备就绪时,...翻译 2018-08-19 16:08:07 · 485 阅读 · 0 评论 -
Java NIO之Selector(选择器)
一、Java NIO 的核心组件Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 NIO是面向通道和缓冲区的,意思就是:数据总是从通道中读到buffer缓冲区内,或者从buffer写入到通道中。二、Java NIO SelectorSelector 一般称 为选择器 ,当然...翻译 2018-08-19 18:24:00 · 1647 阅读 · 0 评论 -
java aio和nio的区别
AIO 是彻底的异步通信。NIO 是同步非阻塞通信。有一个经典的举例。烧开水。假设有这么一个场景,有一排水壶(客户)在烧水。AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。可以看出AIO是最聪明省...翻译 2018-08-31 00:35:39 · 41872 阅读 · 13 评论 -
Reactor模式简单实现与理解
/** * * 经典的网络服务在每个线程中完成对数据的处理: * 但这种模式在用户负载增加时,性能将下降非常的快。 * 系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打 开一个I/O通道后, * read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等, * 这会影响我们程序继续做其他事情,那 么改进做法就是开设线程,让线程去...翻译 2018-08-31 19:54:27 · 734 阅读 · 0 评论 -
NIO
一.NIO中的几个基础概念在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。 首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:public class Test { public static void main(St...翻译 2018-08-21 22:18:50 · 109 阅读 · 0 评论 -
Nio使用Selector客户端与服务器的通信
使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程。而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理。 简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后...转载 2018-09-03 00:16:14 · 1002 阅读 · 2 评论 -
BIO通信的弊端
Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于N...翻译 2018-08-19 14:47:39 · 504 阅读 · 0 评论