阅读一个分布式框架,这些必备的 NIO 知识你要知道
2021-05-07 06:08:03因为一个分布式的开源框架,通常是集群部署的,不同的节点和节点之间需要相互通信来完成复杂的功能,而阅读到这些源码的时候,如果不了解它通信机制的话,就会迷失在代码里,像走进了一片原始森林。
一、开篇
阅读一个分布式开源项目的时候,最重要的就是了解这个项目的通信框架。
因为一个分布式的开源框架,通常是集群部署的,不同的节点和节点之间需要相互通信来完成复杂的功能,而阅读到这些源码的时候,如果不了解它通信机制的话,就会迷失在代码里,像走进了一片原始森林。
比如 HDFS ,使用的通信框架是自己封装的 Hadoop Rpc;Spark 底层通信就是用的 Netty;而最近阅读的 Kafka 源码,底层使用的是原生的 Java NIO。
所以本次,我们来聊一聊 Java NIO 的那些主要的知识点。
二、多图弄懂 NIO 三大核心概念
谈到 NIO,就会有三个核心的概念:通道、缓冲、选择器。
直接开门见山,或许听起来会有点迷茫,我们需要从头开始说。
1、通道
以前在并发要求不是很高的情况下,是 CPU 来全权处理输入输出的(中断),如下图:
用户程序向服务端发起读写请求,cpu 直接处理这些请求。这样有一个弊端,当 IO 请求非常多的时候,会大量占用 CPU,使得整个系统的处理能力会下降。
随着计算机的发展,出现了一种新的方式,使用 DMA 来全权处理 IO 请求,如下图:
DMA 是 Direct Memory Access,直接内存访问控制。
为什么要增加这个设备呢?是因为 CPU 中断方式不能满足数据传输速度的要求,因为在中断方式下,每次中断需要保存断点和现场,中断返回时,要恢复断点和现场。
所有这些原因,使得中断方式难以满足高速外设对传输速度的要求。
所以,就有了 DMA 这样的设备,在 DMA 方式的数据传输过程中,当 I/O 设备需要进行数据传送时,通过 DMA 控制器向 CPU 提出 DMA 传送请求,CPU 响应之后将让出系统总线,由 DMA 控制器接管总线进行数据传输,而此时 CPU 除了做一些初始化操作之外,可以去做自己的事情。
但是有了 DMA,仍然满足不了业务快速发展的需要,因为当 I/O 请求过多时,会出现总线冲突的问题。
所以后面就出现了通道(Channel),它和 DMA 不同的地方是,通道有自己的指令系统和程序,是一个协处理器;而 DMA 只能实现固定的数据传送控制。
而 Java NIO 中的 Channel ,就是对上图中通道的实现。
2、缓冲
理解了通道的概念,缓冲区也很好理解了。
通道表示打开到 I/O 设备的(例如:文件、套接字)的连接,但是通道本身并不存储数据。真正作为数据传输载体的是缓冲区。
当应用程序要写数据时,需要先把数据写到缓冲区里,然后由通道负责把缓冲区的数据发送到目的地(文件、磁盘、网络),然后再从缓冲区把数据取出来。
若需要使用 NIO 系统,需要获取用于连接 I/O 设备的通道以及用于容纳数据的缓冲区,然后操作缓冲区,对数据进行处理。
3、选择器
选择器也叫做多路复用器,是一种非阻塞式的 I/O 。既然谈到了非阻塞式,必然要先谈谈阻塞式。阻塞式如下图所示:
客户端向服务端发出一个读写请求时,服务端的线程会一直看内核地址空间是否有数据了。
客户端没有数据发送过来时,服务端的线程会一直等待,在此期间是什么事情都做不了的。
直到客户端有数据发送过来,会把数据从内核地址空间拷贝到用户地址空间,然后才读取到了数据的。
这就导致如果有大量的请求过来,后面的请求要等待前面的请求执行完毕,会造成大量的排队,无法充分利用 cpu 资源,性能就会急剧下降。
再看看选择器是如何工作的。
现在客户端服务端之间通信是用通道+缓冲区的,那么所有的通道都会注册到选择器上来。选择器会监控这些通道的 I/O 状态,比如连接、读、写的情况。
当某一个通道上的某个事件完全就绪时,选择器才会把这个任务分配到服务端的一个或者多个线程上。
当客户端没有事件准备好时,服务端的线程是不会阻塞的,它可以做自己的事情,直到客户端事件就绪,才会去处理。
这种非阻塞式相比较阻塞式,可以进一步的利用 cpu 资源。
三、理解了概念,再来学 API
1、缓冲区的 API
要彻底理解缓冲区,必须知道缓冲区的四个属性,mark,position,limit,capacity,只需要跑一遍代码就知道了。
(1)分配一定大小的缓冲区
运行结果:
这里我们分配了 10 个字节的缓冲区,也就是在 ByteBuffer 的 final byte[] hb; 属性上开辟了 10 个字节的空间。
所以容量 capacity 为 10 , limit 可读写数据的最大位置 也是 10 ,position 为可以操作数据的位置为 0 。
(2)往缓冲区写数据
运行结果:
这里我们往缓冲区写了 5 个字节的数据,那么 capacity 和 limit 都还是10,但是 position 为 5 了,因为前面已经写入了 5 个了
(3)切换成读数据的模式
那我们现在想从缓冲区读取一些数据出来,就需要切换成 flip 模式,flip 会改变一些属性的值
运行结果:

flip 会改变 position 的值为 0 ,并且 limit 为5,表示我要从头开始读,并且只能读到 5 的位置
(4)读取一些数据
运行结果:
读取了数据之后,position 就变成 5 了,表示我已经读取到 5 了。
(5)重复读
运行结果:
rewind 表示重复读取 buffer 里面的数据
(6)清除数据
运行结果:
clear() 之后,position 回到了 0 ,limit 回到了 10,又可以重头开始写数据了,能写 10 个字节。
但是要注意的是,缓冲里面的数据并没有清空掉,数据还在里面,处于被“遗忘”状态。这几个指针回到了最初的状态。
(7)标记
这是第四个属性:mark。
mark 可以记录 position 的位置。可以通过 reset() 方法回到 mark 的位置。
2、使用通道、缓冲区、选择器完成一个网络程序
(1)服务端
1、首先使用 ServerSocketChannel.open(),打开一个通道,设置成非阻塞模式;
2、绑定到 8989 端口上;
3、把通道注册到选择器上;
4、while 循环,选择器上是否有事件,如果事件是客户端的连接事件,则打开一个 SocketChannel,注册成非阻塞模式,并且往选择器上注册一个读数据的事件;
5、当客户端发送数据过来的时候,就可以打开一个通道,读取缓冲区上的数据;
6、并且此时,服务端是可以同时接受多个客户端的请求的。
(2)客户端
1、客户端打开一个 SocketChannel,配置成非阻塞模式;
2、使用 ByteBuffer 发送数据(注意发送之前,要 flip);
3、关闭通道。
四、总结
本次我们初步探究了一下 Java NIO 的几个核心概念,通道、缓冲区、选择器。
但是你要知道,这是冰山一角,通道和选择器如果要深究的话,会涉及到操作系统底层和很多计算机组成原理的知识。
比如选择器就涉及到了 select,poll,epoll 的概念,这几个概念如果再打开的话,还会牵涉到硬件中断,内核的一些知识。
所以学海无涯苦作舟,越来越对这句话感同身受。
求!网管应掌握的相关知识(电脑方面)
网管必备之十问十答今天,随着计算机的广泛应用和网络的流行,越来越多的单位和部门开始引入计算机网络管理,从而相应的需要更多的优秀网管.已有几年“脑龄的你是不是也有成为网管的雄心壮志?在你成为一名合格的网管前,你必须先把下面的十个问题弄清楚。 如果连这些最基本的网管知识你都不具备的话,那你怎么能不补这堂课呢?★计算机网络是什么?这是首先必须解决的一个问题,绝对是核心概念.我们讲的计算机网络,其实就是利用通讯设备和线路将地理位置不同的、功能独立的多个计算机系统互连起来,以功能完善的网络软件(即网络通信协议、信息交换方式及网络操作系统等)实现网络中资源共享和信息传递的系统。 它的功能最主要的表现在两个方面:一是实现资源共享(包括硬件资源和软件资源的共享);二是在用户之间交换信息。 计算机网络的作用是:不仅使分散在网络各处的计算机能共享网上的所有资源,并且为用户提供强有力的通信手段和尽可能完善的服务,从而极大的方便用户。 从网管的角度来讲,说白了就是运用技术手段实现网络间的信息传递,同时为用户提供服务。 ★计算机网络由哪几个部分组成?计算机网络通常由三个部分组成,它们是资源子网、通信子网和通信协议.所谓通信子网就是计算机网络中负责数据通信的部分;资源子网是计算机网络中面向用户的部分,负责全网络面向应用的数据处理工作;而通信双方必须共同遵守的规则和约定就称为通信协议,它的存在与否是计算机网络与一般计算机互连系统的根本区别。 所以从这一点上来说,我们应该更能明白计算机网络为什么是计算机技术和通信技术发展的产物了。 ★计算机网络的种类怎么划分?现在最常见的划分方法是:按计算机网络覆盖的地理范围的大小,一般分为广域网(WAN)和局域网(LAN)(也有的划分再增加一个城域网(MAN))。 顾名思义,所谓广域网无非就是地理上距离较远的网络连接形式,例如著名的Internet网,Chinanet网就是典型的广域网。 而一个局域网的范围通常不超过10公里,并且经常限于一个单一的建筑物或一组相距很近的建筑物网是目前最流行的计算机局域网。 ★计算机网络的体系结构是什么?在计算机网络技术中,网络的体系结构指的是通信系统的整体设计,它的目的是为网络硬件、软件、协议、存取控制和拓扑提供标准.现在广泛采用的是开放系统互连OSI(Open System Interconnection)的参考模型,它是用物理层、数据链路层、网络层、传送层、对话层、表示层和应用层七个层次描述网络的结构.你应该注意的是,网络体系结构的优劣将直接影响总线、接口和网络的性能.而网络体系结构的关键要素恰恰就是协议和拓扑。 目前最常见的网络体系结构有FDDI、以太网、令牌环网和快速以太网等。 ★计算机网络的协议是什么?刚才说过网络体系结构的关键要素之一就是网络协议。 而所谓协议(Protocol)就是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述,它的作用和普通话的作用如出一辙。 依据网络的不同通常使用Ethernet(以太网)、NetBEUI、IPX/SPX以及TCP/IP协议。 Ethernet是总线型协议中最常见的网络低层协议,安装容易且造价便宜;而NetBEUI可以说是专为小型局域网设计的网络协议。 对那些无需跨经路由器与大型主机通信的小型局域网,安装NetBEUI协议就足够了,但如果需要路由到另外的局域网,就必须安装IPX/SPX或TCP/IP协议.前者几乎成了Novell网的代名词,而后者就被著名的Internet网所采用.特别是TCP/IP(传输控制协议/网间协议)就是开放系统互连协议中最早的协议之一,也是目前最完全和应用最广的协议,能实现各种不同计算机平台之间的连接、交流和通信。 ★计算机网络的拓扑结构是什么?计算机网络的拓扑结构是指网络中各个站点相互连接的形式,在局域网中明确一点讲就是文件服务器、工作站和电缆等的连接形式.现在最主要的拓扑结构有总线型拓扑、星型拓扑、环型拓扑以及它们的混合型。 顾名思义,总线型其实就是将文件服务器和工作站都连在称为总线的一条公共电缆上,且总线两端必须有终结器;星型拓扑则是以一台设备作为中央连接点,各工作站都与它直接相连形成星型;而环型拓扑就是将所有站点彼此串行连接,像链子一样构成一个环形回路;把这三种最基本的拓扑结构混合起来运用自然就是混合型了。 ★计算机网络建设中涉及到哪些硬件?计算机网络的硬件系统通常由五部分组成:文件服务器、工作站(包括终端)、传输介质、网络连接硬件和外部设备。 文件服务器一般要求是配备了高性能CPU系统的微机,它充当网络的核心。 除了管理整个网络上的事务外,它还必须提供各种资源和服务。 而工作站可以说是一种智能型终端,它从文件服务器取出程序和数据后,能在本站进行处理,一般有有盘和无盘之分。 接下来谈谈传输介质,它是通信网络中发送方和接受方之间的物理通路,在局域网中就是用来连接服务器和工作站的电缆线.目前常用的网络传输介质有双绞线(多用于局域网)、同轴电缆和光缆等.常用的网络连接硬件有网络接口卡(NIC)、集线器(HUB)、中继器(Repeater)以及调制解调器(Modem)等。 而打印机、扫描仪、绘图仪以及其它任何可为工作站共享的设备都能被称为外部设备。 ★计算机网络一般都装哪些操作系统?我们都知道,网络操作系统是整个网络的灵魂,同时也是分布式处理系统的重要体现,它决定了网络的功能并由此决定了不同网络的应用领域即方向。 目前比较流行的网络操作系统主要有Unix、NetWare、Windows NT和新兴流行的历史悠久,发展到今天已经相当成熟,尤其以安全可靠和应用广泛著称;相比之下,NetWare以文件服务及打印管理闻名,而且其目录服务可以说是被业界公认的目录管理杰作;Windows NT是能支持多种硬件平台的真正的32位操作系统,它保持了深受欢迎的Windows用户界面,目前正被越来越多的网络所应用;而最新的Linux凭借其先进的设计思想和自由软件的身分正跻身优秀网络操作系统的行列。 ★计算机网络未来的发展趋势如何?未来网络的发展有三种基本的技术趋势.一是朝着低成本微机所带来的分布式计算和智能化方向发展,即Client/Server(客户/服务器)结构;二是向适应多媒体通信、移动通信结构发展;三是网络结构适应网络互连,扩大规模以至于建立全球网络。 ★计算机网管的具体业务有哪些?概括的说网管的业务内容有三个方面:网络建设、网络维护和网络服务。 组建局域网(包括规划拓扑结构、物理硬件实现和网络协议设置)、新增或升级网络设备以及规划网络发展就是网络建设的具体内容;而一般的网络维护则包括网络故障检测和维修(包括硬件和软件),网络安全的防护和管理;至于网络服务则完全可以根据各种网络目的的不同而有所区别,但最常见的都有远程登陆、文件传输、电子邮件和资源共享等,当然也可以侧重一到几个方面.另外,像网站中主页的制作与更新,BBS站台的建设与管理等等也都可纳入网管的业务范围.总之,所谓网管顾名思义就是建设并管理网络的人员,他们的工作和任务就如同大酒店的员工一样,通过经营好酒店来款待从四面八方来的朋友。 优秀的网管没有不说网管这项工作苦的,但如果你肯花时间、下功夫,你说不定也能做得与华军和高春辉一样出色.不过,在你成为优秀的网管前,可千万要把今天讲的这十个问题弄清楚噢!最后,要学会基本的网络故障排除,服务器的设置,一些网络设备的基本使用方法(路由器等),如果是网吧管理员还需要对流行的软件游戏有一定了解!
急急急~稍等用韩文怎么说??
1.잠깐만 기다리세요./zam ggan man gi da li xip xxi o/请稍候(用于转接电话等等). 2.잠깐만요./zam ggan ma nio/请您稍等一会儿(用于加入对话等等)3.동안 조금을 기다리십시오.4.조금을 기다리기.
java io里关于FileReader和FileWriter的操作问题
我知道你遇到乱码问题了,乱码问题是由于写入读取时所用的编码不一致,以及文件本身的编码导致的,这个参考程序你自己学习下,是我特意做的希望可以帮到你! import ; import ; import ; import ; import ; import ; import ; import ; public class Test{public static void main(String[] args) throws Exception {//创建2个文件File file1 = new File(D://);File file2 = new File(d://);();();//从键盘输入的字符写入 fout = new FileWriter(file1);String str=null;(Please input a String:);BufferedReader fin = new BufferedReader(new InputStreamReader());str = ();(str);(str,0,());();();();//复制文件的内容到//为了让你明白通道所以我这里用了2种读写入文件的方法new Exam2()(D://, d://);}/*** 复制文件封装类* @param url1* @param url2* @throws Exception*/public void copy(String url1, String url2) throws Exception {FileInputStream input = new FileInputStream(url1);FileChannel filechannel = ();FileOutputStream output = new FileOutputStream(url2);FileChannel filechannel2 = ();ByteBuffer buf = (1024 * 8);while ((buf) != -1) {();(buf);();}();();();();} }您的进步是我最大的动力,如果你觉得我回答的合理的话,请给我多加分。 谢谢,如果不明白的话,请给我留言。 大家相互学习啊! 加油!
发表评论