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是不同维度的思考。

 
posted @ 2020-11-25 09:08  smartcat994  阅读(89)  评论(0编辑  收藏  举报