bio

BIO、NIO、AIO

可紊 提交于 2020-02-18 20:11:06
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

什么是 BIO,NIO,AIO?(一)

泄露秘密 提交于 2020-02-15 00:44:31
一.什么是io? IO的全称其实是:Input/Output的缩写。 bio是blocking io即 阻塞io的意思 二.BIO BIO 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。 简单来讲:就是 在一个线程进行读写操作的时候,其他线程是被阻塞得 三.NIO NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。 简单来讲: NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。 AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回

Netty学习(1):IO模型之BIO

牧云@^-^@ 提交于 2020-02-13 09:38:44
概述 Netty其实就是一个异步的、基于事件驱动的框架,其作用是用来开发高性能、高可靠的IO程序。 因此下面就让我们从Java的IO模型来逐步深入学习Netty。 IO模型 IO模型简单来说,就是采用如何的方式来进行数据的接受和发送,因为存在着发送方和接收方两个角色,因此IO模型一般分为以下3类: BIO(同步阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞) 。其3者的区别如下: BIO:是最传统的Java IO模型,采用的方式为服务器新接受到一个连接,就建立一个线程,但是如果这个连接不做任何事情,该线程也会被创建,闲置着,增加不必要的开销。 NIO:服务器用一个线程处理多个请求,将所有请求注册到一个线程管理的多路复用器(Selector)上。适用于连接数量多,但连接比较轻量的服务上,如聊天,弹幕等。 AIO:其特点是由OS完成后,才通知服务端程序启动程序来处理,使用场景为相册服务器等。因不是很清楚具体实现,因此在这不展开了。 BIO代码实现 使用BIO模型来实现一个服务器端和客户端,并采用线程池的概念,使其可以连接多个客户端。 服务端 首先,让我们来看建立一个服务端需要哪些步骤: // 创建线程池,如果有连接,就创建一个线程 ps:这里手动指定参数创建线程池会更好,但这里因为不是重点,因此就采用默认的线程池来实现。 ExecutorService executorService

BIO和NIO

删除回忆录丶 提交于 2020-02-09 09:51:33
在了解BIO,NIO,AIO之前先了解一下IO的几个概念: 1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用(call back)。 2. 阻塞与非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 BIO是同步阻塞,NIO是同步非阻塞,它们都是同步的,即没有得到结果之前,该*调用*就不返回。而AIO是异步的,这里不做了解。 Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是

块设备驱动

删除回忆录丶 提交于 2020-02-04 06:23:45
注册块IO设备 为了注册块IO设备,register_blkdev()被使用。取消注册时使用unregister_blkdev()方法。自从4.9版本的内核开始,对register_blkdev()的调用是可选的。 下面是一个典型的场景。 # include <linux/fs.h> # define MY_BLOCK_MAJOR 240 # define MY_BLKDEV_NAME "mybdev" static int my_block_init ( void ) { int status ; status = register_blkdev ( MY_BLOCK_MAJOR , MY_BLKDEV_NAME ) ; if ( status < 0 ) { printk ( KERN_ERR "unable to register mybdev block device\n" ) ; return - EBUSY ; } //... } static void my_block_exit ( void ) { //... unregister_blkdev ( MY_BLOCK_MAJOR , MY_BLKDEV_NAME ) ; } 注册一个磁盘 尽管register_blkdev()方法获取了major,但是它没有为系统提供设备(磁盘)。alloc_disk(

Java IO

前提是你 提交于 2020-02-03 00:26:33
Java IO可以从三个方面理解,即硬盘、网络和终端,在这三个方向上都存在输入输出。然后根据处理模型的不同,Java的IO处理又可以划分为BIO、NIO和AIO。 一、java.io 从传输的内容的不同,总体上可以分为两大类,即字节流和字符流。 (一)字节流 A。输入流 这里又区分为节点流和处理流,由于处理流都是装饰器流,所以都会迭代在节点流之上工作。 B。输出流 输出流当然与输入流类似,节点流可以单独使用,但是处理流需要迭代节点流来使用 (二)字符流 我们都知道计算机其实只能存储0和1,或者说字节,这里之所以还有个字符流,只是为了方便使用,底层与终端真正交互肯定还是用的字节流。 A。输入流 也是一样的体系。 B。输出流 一般建议使用处理流包装之后的节点流来处理数据,比较提供了更多的功能和灵活性。 二、Java BIO、Java NIO与Java AIO 从包空间来看,java.io中的类都是BIO,而java.nio中的类则既有NIO又有AIO。另外,还可以从同步异步以及阻塞非阻塞来理解。 同步与异步,这个主要是从接受者来区分。 同步就是发起一个请求后,接受者未处理完请求之前,不返回结果。 异步就是发起一个请求后,立刻得到接受者的回应表示已接收到请求,但是接受者并没有处理完,接受者通常依靠事件回调等机制来通知请求者其处理结果。 阻塞和非阻塞,这个主要从请求者来区分。

NIO的流程以及与BIO的差别

霸气de小男生 提交于 2020-02-02 00:32:36
NIO: 同步非阻塞 ,服务器实现模式为 一个线程处理多个请求 ,即客户端发送的连接请求都会 注册到多路复用器 上,多路复用器轮询到连接有IO请求就进行处理。 连接数目多,且连接比较短,用于聊天室,弹幕系统 NIO是 JDK1.4 JAVA提供了一系列改进的输入/输出的新特性,被统称为NIO,同步非阻塞IO,相关的类都在java.nio包内 NIO的特性: NIO有三个核心部分: Channel(管道),Buffer(缓冲区),selector(选择器 ) 1.NIO是面向缓冲区,或者面向块编程的,数据读取到一个他稍后处理的缓冲区(Buffer),需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞的高伸缩性网络。 2.Java NIO 的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情,非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程工时可以去做别的事情 3.NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理,不像之前的阻塞IO那样 必须得分配10000个 4.HTTP2.0使用了多路复用技术

[Netty学习笔记]一、I/O模型

冷暖自知 提交于 2020-01-30 13:47:49
I/O模型 I/O模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。 Java共支持是三种网络编程模型:BIO/NIO/AIO BIO模型 Java BIO:同步阻塞(传统阻塞型),服务器实现模式是一个连接一个线程,即 客户端有连接请求时服务器端就需要启动一个线程来进行处理。如果这个连接不做任何事情就会造成不必要的线程开销 其中BIO常用的编程对象即 ServerSocket 和 Socket ,分别对应服务端和客户端。 需要了解的是 ServerSocket#accept 方法是阻塞的,没有客户端连接进来会一直阻塞在那里。 InputStream#read也是一个阻塞方法,如果没有内容可读的话,会阻塞在那里 以一个例子,来理解 客户端有连接请求时,服务端会创建一个与之对应的线程,并且这个连接不做任何事情也不会被断开,会造成不必要的线程开销 /** * Created by myk * 2020/1/6 下午2:19 * 使用BIO模型编写一个服务器端,监听6666端口,当有客户端连接时,就启动一个线程与之通讯。 */ public class Server { private static int PORT = 6666 ; public static void main ( String [ ] args ) throws

BIO,NIO与AIO的区别

泪湿孤枕 提交于 2020-01-25 10:12:27
要说清这几种IO的区别,首先必须辨析清楚同步与异步,阻塞与非阻塞的区别。 一:同步与异步 同步和异步关注的是 消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由*调用者*主动等待这个*调用*的结果。 而异步则是相反, *调用*在发出之后,这个调用就直接返回了,所以没有返回结果 。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。 典型的异步编程模型比如Node.js 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。 二:阻塞与非阻塞 阻塞和非阻塞关注的是 程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起

BIO、NIO、AIO模型分析

耗尽温柔 提交于 2020-01-22 15:21:10
什么是 I/O 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,常见的I/O有磁盘I/O和网络I/O。 什么是IO的Block呢?考虑下面两种情况: 用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存 对于第一种情况,算作Block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。对于第二种情况,不算做Block。 一个解释是,所谓“Block”是指操作系统可以预见这个Block会发生才会主动Block。例如当读取TCP连接的数据时,如果发现Socket buffer里没有数据就可以确定定对方还没有发过来,于是Block;而对于普通磁盘文件的读写,也许磁盘运作期间会抖动,会短暂暂停,但是操作系统无法预见这种情况,只能视作不会Block,照样执行。我们讨论的BIO、NIO和AIO都是针对网络I/O模型。 进程中的IO调用步骤大致可以分为以下四步: 进程向操作系统请求数据 ; 操作系统把外部数据加载到内核的缓冲区中; 操作系统把内核的缓冲区拷贝到进程的缓冲区 ; 进程获得数据完成自己的功能 ; 当操作系统在把外部数据放到进程缓冲区的这段时间