首页 > 编程语言 >java IO流:介绍下阻塞、非阻塞、同步、异步 I/O 的概念

java IO流:介绍下阻塞、非阻塞、同步、异步 I/O 的概念

时间:2023-11-05 19:33:57浏览次数:33  
标签:异步 java 饭堂 read 阻塞 内核 IO 拷贝到


  • 这里先介绍下阻塞、非阻塞、同步、异步 I/O 的概念。
  • 先来看看阻塞 I/O,当用户程序执行 read ,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read 才会返回。
  • 注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程。过程如下图:
  • 知道了阻塞 I/O ,来看看 非阻塞 I/O,非阻塞的 read 请求在数据未准备好的情况下立即返回,可以继续往下执行,此时应用程序不断轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read 调用才可以获取到结果。过程如下图:
  • 注意,这里最后一次 read 调用,获取数据的过程,是一个同步的过程,是需要等待的过程。
    这里的同步指的是内核态的数据拷贝到用户程序的缓存区这个过程。
  • 举个例子,如果 socket 设置了 O_NONBLOCK 标志,那么就表示使用的是非阻塞 I/O 的方式访问,而不做任何设置的话,默认是阻塞 I/O。
  • 因此,无论 read 和 send 是阻塞 I/O,还是非阻塞 I/O ,都是同步调用。因为在 read 调用时,内核将数据从内核空间拷贝到用户空间的过程都是需要等待的,也就是说这个过程是同步的,如果内核实现的拷贝效率不高,read 调用就会在这个同步过程中等待比较长的时间。
  • 而真正的 异步 I/O 是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程都不用等待。
  • 当我们发起 aio_read (异步 I/O) 之后,就立即返回,内核自动将数据从内核空间拷贝到用户空间,这个拷贝过程同样是异步的,内核自动完成的,和前面的同步操作不一样,应用程序并不需要主动发起拷贝动作。过程如下图:
  • 举个你去饭堂吃饭的例子,你好比应用程序,饭堂好比操作系统。
  • 阻塞 I/O 好比,你去饭堂吃饭,但是饭堂的菜还没做好,然后你就一直在那里等啊等,等了好长一段时间终于等到饭堂阿姨把菜端了出来(数据准备的过程),但是你还得继续等阿姨把菜(内核空间)打到你的饭盒里(用户空间),经历完这两个过程,你才可以离开。
  • 非阻塞 I/O 好比,你去了饭堂,问阿姨菜做好了没有,阿姨告诉你没,你就离开了,过几十分钟,你又来饭堂问阿姨,阿姨说做好了,于是阿姨帮你把菜打到你的饭盒里,这个过程你是得等待的。
  • 异步 I/O 好比,你让饭堂阿姨将菜做好并把菜打到饭盒里后,把饭盒送到你面前,整个过程你都不需要任何等待。
  • 很明显,异步 I/O 比同步 I/O 性能更好,因为异步 I/O 在「内核数据准备好」和「数据从内核空间拷贝到用户空间」这两个过程都不用等待。


标签:异步,java,饭堂,read,阻塞,内核,IO,拷贝到
From: https://blog.51cto.com/zhangxueliang/8194799

相关文章

  • java IO设计模式:观察者模式
    NIO中的文件目录监听服务使用到了观察者模式。NIO中的文件目录监听服务基于WatchService接口和Watchable接口。WatchService属于观察者,Watchable属于被观察者。Watchable接口定义了一个用于将对象注册到WatchService(监控服务)并绑定监听事件的方法register。WatchServ......
  • 几种常见的运动检测(Motion detection)方法
    本文选自《Multiplemethodsformotiondetection》,原文参考文末链接。 运动检测有许多不同的方案,但哪一个最适合您的需求?在这里,我将介绍一些使用最广泛的运动传感器技术,并探讨每种技术都可以发挥其优势的情况。 https://mp.weixin.qq.com/s/RsKubZTD97Mt44qd0sH1SA ......
  • java IO流:字符缓冲流
    ......
  • java基础:对Java集合的理解
    对Java集合的理解  集合是我们在工作中使用频率非常高的组件了。下面的两张图是集合框架的类图结构。TreeSet的本质是TreeMapHashSet的本质是HashMapJava集合是一组用于存储和操作对象的类和接口,提供了各种数据结构和算法的实现,用于解决不同的数据存储和访问需求。Java集合框架位......
  • Java基础:创建对象有几种方式?
    Java创建对象有几种方式?new关键字  平时使用的最多的创建对象方式Useruser=newUser();反射方式  使用newInstance(),但是得处理两个异常InstantiationException、IllegalAccessException:Useruser=User.class.newInstance();Objectobject=(Object)Class.forName("java.l......
  • java基础:Object中的常用方法
    介绍下Object中的常用方法clone方法  保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常,深拷贝也需要实现Cloneable,同时其成员变量为引用类型的也需要实现Cloneable,然后重写clone方法。finalize方法  该方......
  • java集合:什么是 fail-fast?
    说说什么是fail-fast?  fail-fast机制是Java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。  例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会......
  • java基础:static都有哪些用法?
    static都有哪些用法?  所有的人都知道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享.  除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作:publiccalssPreCache{static{//执行相关......
  • java基础:再哈希法解决哈希冲突代码示例
    再哈希法(Rehashing)是解决哈希冲突的另一种方法。它与开放定址法不同,再哈希法使用多个哈希函数来确定冲突元素的位置,而不是在同一个哈希表中进行探测。下面是一个使用再哈希法解决哈希冲突的示例代码:publicclassRehashingHashTable{privateEntry[]table;privateint......
  • java基础:深拷贝和浅拷贝的区别是什么?
    深拷贝和浅拷贝的区别是什么?原型模式:设计模式-->Springbean的Scope浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷贝:被复制对象的所有变量都含有与原来......