• 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
  • 相关阅读:
    浅析 MySQL Replication(转)
    mysql优化案例
    create index 与 alter table add index 区别
    /etc/sysctl.conf参数解释(转)
    Linux内核 TCP/IP参数调优
    OneProxy常用参数说明
    转载:如何在面试中写出好的代码
    F面经:painting house
    Lintcode: Merge Sorted Array II
    Lintcode: Median
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14033988.html
Copyright © 2020-2023  润新知