Java NIO(IO原理、通道、缓冲区、选择器)

本文深入探讨Java NIO的IO原理,包括同步阻塞IO、同步非阻塞IO、IO多路复用和异步IO模型。详细讲解了Java NIO的通道、选择器和缓冲区,并对比了NIO与OIO的区别,同时阐述了选择器在多通道管理中的作用,以及缓冲区在数据读写中的关键角色。
摘要由CSDN通过智能技术生成


IO原理

用户IO读写在底层上是调用了read和write系统调用,
但是read和write系统调用并不是直接在内存和物理设备之间交换数据。

就是说,上层程序的IO,并不是物理级别的读写,而是缓存的复制
read和write系统调用都不负责数据在内核缓冲区和物理设备(如磁盘)之间的交换,
底层的读写交换是由操作系统内核完成的。

缓冲区是为了减少频繁的设备之间的物理交换。
外部设备直接读写,涉及操作系统的中断。
发生系统中断时,需要保存之前的进程数据和状态等信息,结束中断之后,还需要恢复之前的进程数据和状态等信息,就是为了减少这样的底层系统的时间消耗、性能消耗,于是出现内存缓冲区。

上层调用系统调用仅仅是把数据从内核缓冲区复制到上层应用的缓冲区(进程缓冲区),和将数据从进程缓冲区复制到内核缓冲区中
底层操作系统会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行IO设备的中断处理,集中执行物理设备的实际IO操作,这种机制提升了系统的性能。至于什么时候中断由操作系统内核决定。

Linux系统中,操作系统内核只有一个内核缓冲区。每个用户进程都有自己的独立的缓冲区(进程缓冲区)。


四种IO模型

同步和异步

  • 同步IO:用户空间的线程是主动发起IO请求的一方,内核空间是被动接受方。
  • 异步IO:系统内核是主动发起IO请求的一方,用户空间的线程是被动接受方。

同步阻塞IO (Blocking IO) BIO

需要内核IO操作彻底完成之后,才返回到用户空间执行用户的操作
传统的IO模型都是同步阻塞IO,java中默认创建的socket都是阻塞的。

Java.io包下的类:
InputStream
OutputStream
Reader
Writer

网络编程:
ServerSocket
Socket

阻塞:
read方法 accept方法 阻塞式的

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketBIO{
   
	public static void main(String[] args) throws Exception{
   
		ServerSocket server = new ServerSocket(9000,20);
		System.out.println("new ServerSocket(9000)");
		while(true){
   
			Socket client = server.accept(); 
			//阻塞1  接收客户端
			
			System.out.println(client.getPort()); 
			new Thread(new Runnable(){
    
			//每连接一个客户端new 一个线程
			
				public void run() {
   
				InputStream in = null;
				try{
   
					in = client.getInputStream();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					while(true){
   
						String dataline = reader.readLine();
						 //阻塞2  虽然连上了,但是不一定发消息
						 
						if(null != dataline){
   
							System.out.println(dataline);
						}else{
   
							client.close();
							break;
						}
					}
				}catch(Exception ex) {
   
					ex.printStackTrace(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值