• IO(五)


    Java IO和Linux IO之间的关系。

    写完前面的文章,我在思考,Java IO 会不会就是Linux 那三个函数(select ,poll,epoll)的包装呢?

    如果是这样的话,那在Windows上使用Java,岂不是会同Linux上不一样,所以下载的时候版本确实不同,但是似乎是对的,似乎是错的。

    这个图是IO的单机流程,如果Java操作的是用户空间,那么对于内核空间的执行肯定是需要对应的操作系统来发出order的。然后再结合驱动层。

    当我们在Java中发起一个文件读操作会发生什么呢?首先内核会将数据从磁盘读到内存,再从内核拷贝到用户态的堆外内存(这部分是jvm实现),然后再将数据从堆外拷贝到堆内。拷贝到堆内其实就是我们在Java中自己手动申请的byte数组中。

    所以按照以上的流程可以推测出在由于内核的不同,Linux和Windows上执行Java,是理论上会有区别的,但是在开发中我们并没有这种感觉。

    这个如果深入的讲,应该是Windows 内核和Linux内核的架构都是基于X86的等等思想去进行深究。

    如果往上思考应该是JVM在Linux上和Windows平台是不一样的,所以导致了内核的不同依然可以同样的运行。


    写到这边可以整理一下。

     整体应该是这个的一个流程,然后基于Linux内核的进步,慢慢有了select-->poll->epoll,于是有了BIO,NIO,AIO等IO

    BIO  如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善

    NIO 服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。

    AIO  客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。

    BIO和NIO是一个维度的对比,AIO是不同维度的思考。

     
    smartcat.994
  • 相关阅读:
    zabbix--完整安装攻略
    python--8大排序(原理+代码)
    python--二分法查找
    celery生产者-消费者
    python--基础知识点梳理(之数据结构)
    mysql--事务详解
    python--基础知识点梳理(三)深浅拷贝、进线协程、os和sys、垃圾回收机制、读文件的三种方式
    python--基础知识点梳理(二)面向对象
    python--基础知识点梳理(一)数据类型、迭代生成装饰器、函数
    java 集合
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14033988.html
Copyright © 2020-2023  润新知