
IO-NIO
文章平均质量分 90
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
说清 Epoll 原理
从事服务端开发,少不了要接触网络编程。Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。Epoll 很重要,但是 Epoll 与 Select 的区别是什么呢?Epoll 高效的原因是什么?网上虽然也有不少讲解 Epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 Epoll 的原理。本文核心思想是:要让读者清晰明白转载 2020-07-28 15:35:15 · 663 阅读 · 0 评论 -
nio FileChannel中文乱码问题
http://www.voidcn.com/blog/chuyouyinghe/article/p-5979076.html最近用nio读取文件时,英文正常,读取中文时会出现乱码,经查可以用Charset类来解决:代码如下:package com.example.demo;import java.io.FileNotFoundException;import ja转载 2017-08-11 17:48:26 · 2907 阅读 · 1 评论 -
利用FileChannel完成文件的读、写、复制
内容:通过NIO中的FileChannel完成文件的读、写、复制。[java] view plain copypublic class NioFileCopy { private RandomAccessFile aFile = null; private FileChannel inChannel = null;转载 2017-08-11 17:46:20 · 3331 阅读 · 0 评论 -
Java NIO 读取文件、写入文件、读取写入混合
前言Java NIO(new/inputstream outputstream)使用通道、缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position)、限制(limit)、容量(capacity)),这些知识点要通过写程序慢慢体会。NIO vs 传统IONIO是面向缓冲、通道的;传统IO面向流通道是双向的既可以写、也可以转载 2017-08-11 17:22:54 · 11647 阅读 · 0 评论 -
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结
IO基本概念Linux环境Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)。描述符就是一个数字(可以理解为一个索转载 2016-11-01 11:50:00 · 1287 阅读 · 0 评论 -
Java NIO- Buffer
Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。下面是NIO Buffer相关的话题列表:Buffer的基本用法Buffer的capacity,position和l转载 2016-10-28 13:48:22 · 896 阅读 · 0 评论 -
JAVA 中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词。如有不足之处,还望告知。转载 2015-08-23 11:25:34 · 1198 阅读 · 0 评论 -
Java NIO示例:多人网络聊天室
一个多客户端聊天室,支持多客户端聊天,有如下功能:功能1: 客户端通过Java NIO连接到服务端,支持多客户端的连接功能2:客户端初次连接时,服务端提示输入昵称,如果昵称已经有人使用,提示重新输入,如果昵称唯一,则登录成功,之后发送消息都需要按照规定格式带着昵称发送消息功能3:客户端登录后,发送已经设置好的欢迎信息和在线人数给客户端,并且通知其他客户端该客户端上线功能4:服务器收到已登录转载 2016-10-27 14:52:49 · 1516 阅读 · 0 评论 -
JAVA NIO 服务器与客户端实现示例
以下代码只兼容Java 7及以上版本,对于一些关键地方请看注释说明。公共类:12345678910111213141516171819202122package转载 2016-10-27 14:41:03 · 2435 阅读 · 0 评论 -
基于Java NIO的Socket通信
Java NIO模式的Socket通信,是一种同步非阻塞IO设计模式,它为Reactor模式实现提供了基础。下面看看,Java实现的一个服务端和客户端通信的例子。NIO模式的基本原理描述如下:服务端打开一个通道(ServerSocketChannel),并向通道中注册一个选择器(Selector),这个选择器是与一些感兴趣的操作的标识(SelectionKey,即通过这个标识可以定位到...转载 2016-10-27 14:39:39 · 1002 阅读 · 0 评论 -
Java NIO direct buffer的优势在哪儿?
1.Direct+buffer是相当于固定的内核buffer还是JVM进程内的堆外内存?答:JVM进程的Java堆外申请的内存,是用户空间的,这是毫无疑问的,因为前边有答主已经贴过代码了,DirectByteBuffer的创建就是使用了+malloc+申请的内存。2.为什么在执行网络IO或者文件IO时,一定要通过堆外内存呢?@ETIN 的答案也说了,如果是使用DirectBuf转载 2018-02-09 13:49:20 · 1599 阅读 · 0 评论 -
ByteBuffer常用方法详解
缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数举个简单的例子,比如A地有1w块砖要搬到B地由转载 2017-08-11 18:53:41 · 52544 阅读 · 5 评论 -
DirectByteBuffer内存申请与释放 && 可能会导致内存泄露的原因
DirectByteBuffer类是在Java Heap外分配内存,对堆外内存的申请主要是通过成员变量unsafe来操作,下面介绍构造方法 // Primary constructor // DirectByteBuffer(int cap) { // package-private super(-1, 0, cap, cap);...转载 2018-02-11 12:08:02 · 3313 阅读 · 0 评论 -
IO多路复用问题
https://www.jianshu.com/p/12c4081365dfselect,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞...转载 2019-05-30 21:31:06 · 926 阅读 · 0 评论 -
Netty中的三种Reactor(反应堆)
https://www.cnblogs.com/duanxz/p/3696849.htmlNetty的I/O线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端SocketChannel。由于读写操作都是非阻塞的,这就可以充分提升I/O线程的运行效率,避免由频繁的I/O阻塞导致的线程挂起。另外,由于Netty采用了异步通信模式,一个I/O线程...转载 2019-05-30 16:42:26 · 4576 阅读 · 0 评论 -
IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别
https://www.cnblogs.com/aspirant/p/6877350.html如果面试问到IO操作,这篇文章提到的问题,基本是必问,百度的面试官问我三个问题(1)什么是NIO(Non-blocked IO),AIO,BIO(2) java IO 与 NIO(New IO)的区别(3)select 与 epoll,poll区别我胡乱说了一气,自己边说边觉得完蛋了。...转载 2018-09-09 11:30:46 · 954 阅读 · 0 评论 -
事件驱动模型
这个图是整个 Node.js 的运行原理,从左到右,从上到下,Node.js 被分为了四层,分别是 应用层、V8引擎层、Node API层 和 LIBUV层。应用层: 即 JavaScript 交互层,常见的就是 Node.js 的模块,比如 http,fsV8引擎层: 即利用 V8 引擎来解析JavaScript 语法,进而和下层 API 交互NodeAPI层: 为上层模块提供系统调用,...转载 2018-06-06 10:27:37 · 1299 阅读 · 0 评论 -
Linux IO模式及 select、poll、epoll详解
https://segmentfault.com/a/1190000003063859注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO...转载 2018-06-05 18:08:32 · 609 阅读 · 0 评论 -
堆外内存 之 DirectByteBuffer 详解
https://www.jianshu.com/p/007052ee3773堆外内存释放代码:http://blog.csdn.net/z69183787/article/details/79316599堆外内存堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统...转载 2018-02-11 14:04:18 · 1743 阅读 · 0 评论 -
使用sun.misc.Cleaner或者PhantomReference实现堆外内存的自动释放
http://blog.csdn.net/aitangyong/article/details/39455229我之前的一篇博客:System.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放 文章末尾处:提到java NIO包是通过sun.misc.Cleaner和PhantomReference来实现堆外内存转载 2018-02-12 14:29:36 · 1615 阅读 · 0 评论 -
HeapByteBuffer 和 DirectByteBuffer 以及回收 DirectByteBuffer
http://www.importnew.com/19191.htmlbyte buffer一般在网络交互过程中java使用得比较多,尤其是以NIO的框架中;看名字就知道是以字节码作为缓冲的,先buffer一段,然后flush到终端。而本文要说的一个重点就是HeapByteBuffer与DirectByteBuffer,以及如何合理使用DirectByteBuffer。1、HeapByteBuff...转载 2018-02-11 13:50:54 · 1226 阅读 · 0 评论 -
Java nio 客户端连接Server
在做通信系统的开发过程中,经常需要使用Socket通信。java新的io机制给我提供了一个很好的异步socket通信方式,这段时间用java写了一个客户端用来连接server。发现运行效率还比较让人满意。下面是我实现的部分功能。连接服务器的socket,多线程启动。如果连接失败就重连。Java代码 public class CommonSocket exten转载 2016-10-27 14:37:13 · 2116 阅读 · 0 评论 -
怎样理解阻塞非阻塞与同步异步的区别?
作者:严肃链接:https://www.zhihu.com/question/19732473/answer/20851256来源:知乎著作权归作者所有,转载请联系作者获得授权。“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/转载 2016-10-24 12:12:57 · 3001 阅读 · 0 评论 -
JAVA NIO non-blocking模式实现高并发服务器
Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要讲的是如何使用NIO的网络新特性,来构建高性能非阻塞并发服务器.文章基于个人理解,我也来搞搞NIO.,求指正.在NIO之前服务器还是在使用阻塞式的java socket. 以Tomcat最新版本没有开启NIO模式的源码为例, tomcat会acc转载 2014-04-14 11:12:42 · 16729 阅读 · 2 评论 -
Java io 与 nio 的线程优化(Java中的阻塞和非阻塞IO包各自的优劣思考)
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞转载 2014-04-14 11:20:52 · 2070 阅读 · 0 评论 -
java NIO的多路复用及reactor模式
java nio从1.4版本就出现了,而且依它优异的性能赢得了广大java开发爱好者的信赖。我很纳闷,为啥我到现在才接触,难道我不是爱好者,难道nio不优秀。经过长达半分钟的思考,我意识到:时候未到。以前总是写那些老掉牙的web程序,唉,好不容易翻身啦,现在心里好受多了。因为真不想自己到了30岁,还在说,我会ssh,会ssi,精通javascript,精通数据库,精通。。。人生苦短,要开拓点不是吗转载 2014-04-14 11:14:39 · 4172 阅读 · 0 评论 -
Java NIO Reactor模式
Java代码 package com.zzq.nio.reactor; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import转载 2014-04-14 11:03:53 · 4193 阅读 · 0 评论 -
Java NIO 反应器(Reactor)模式
概述Java NIO非堵塞技术实际是采取反应器模式,或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。同步和异步区别 : 有无通知(是否轮询)堵塞和非堵塞区别 : 操作结果是否等待(是否马上又返回值),只是设计方式的不同。NIO 有一个主要的转载 2014-04-14 11:03:12 · 3029 阅读 · 0 评论 -
Java NIO使用及原理分析(三)
转载自:李会军•宁静致远在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等。在本文中我们来看一下缓冲区一些更细节的内容。缓冲区的分配在前面的几个例子中,我们已经看过了,在创建一个缓冲区对象时,会调用静态方法allocate()来指定缓冲区的容量,其实调用 allocate()转载 2014-04-14 10:34:14 · 1210 阅读 · 0 评论 -
Java NIO使用及原理分析(二)
转载自:李会军•宁静致远在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用get()方法从缓冲区获取数据或者使用put()方法把数据写入缓冲区,都会引起缓冲区状态的变化。本文为NIO使用及原理分析的第二篇,将会分析NIO中的转载 2014-04-14 10:33:21 · 1268 阅读 · 0 评论 -
Java NIO使用及原理分析 (四)
转载自:李会军•宁静致远在上一篇文章中介绍了关于缓冲区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O。通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处转载 2014-04-14 10:35:02 · 1566 阅读 · 0 评论 -
Netty源码学习-Java-NIO-Reactor
Netty里面采用了NIO-based Reactor Pattern 了解这个模式对学习Netty非常有帮助 参考以下两篇文章: http://jeewanthad.blogspot.com/2013/02/reactor-pattern-explained-part-1.html http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf转载 2014-04-14 11:18:06 · 4336 阅读 · 0 评论 -
java nio Selector的使用-服务器端
前些时候花了一些时间在研究java.nio的api使用机制,看了好久,也觉得不习惯它的使用方式和用法.毕竟自己对C语言了解太少,也不太了解C语言在网络编程上的用法。对这种底层下的编程太不习惯,还是应该好好了解下底层的东西,要不然就光会使用别人的东西,如果是自己写一个,就写不出来了。 从java1.4以来,java nio就出现在java的api中,在日常的使用当中,基本上都是围绕着j转载 2014-04-14 11:21:35 · 2124 阅读 · 0 评论 -
java nio Selector的使用-客户端
java nio Selector的使用-客户端 接上一篇,客户端的程序就相对于简单了,只需要负责连接,发送下载文件名,再读数据就行了。主要步骤就是注册->连接服务器->发送下载请求->读数据->断开连接。 第一步:注册,并注册connect事件。Java代码 if(selector == null) selector = Sel转载 2014-04-14 11:22:02 · 1740 阅读 · 0 评论 -
同步异步阻塞非阻塞Reactor模式和Proactor模式 (目前JAVA的NIO就属于同步非阻塞IO)
在高性能的 I/O 设计中,有两个比较著名的模式 Reactor 和 Proactor 模式,其中 Reactor 模式用于同步 I/O ,而 Proactor 运用于异步 I/O 操作。 在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步 , 同步和异步 是针对应用程序和内核的交互而言的 ,同步指的是用户进程触发 IO 操作并等待或者轮询的去转载 2016-09-20 11:31:35 · 2451 阅读 · 0 评论 -
netty学习笔记(一)—结合reactor模式探索netty对网络io的处理机制
Reactor与Proactor简介reactor、proactor常见的翻译是反应器(堆)、前摄器,这名字听着总让人一头雾水的,抓不着本质。后来看看对应形容词的英文释义,再结合技术角度的描述,总算有了基础的认识:reactive: reacting to events or situations rather than starting or doing new thin转载 2016-09-12 13:02:49 · 1345 阅读 · 0 评论 -
Java NIO 教程
Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据转载 2016-09-12 10:48:01 · 1160 阅读 · 0 评论 -
IO中同步、异步与阻塞、非阻塞的区别
一、同步与异步同步/异步, 它们是消息的通知机制1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息...转载 2016-09-12 10:44:41 · 2231 阅读 · 0 评论 -
Java BIO、NIO、AIO 学习
先来个例子理解一下概念,以银行取款为例:同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API)。阻塞 : ATM排队取款,你只能等待(使用阻塞I转载 2014-03-17 09:23:38 · 1708 阅读 · 0 评论 -
Java NIO原理图文分析及代码实现
前言:最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://转载 2015-08-23 11:16:01 · 1073 阅读 · 0 评论