zoukankan      html  css  js  c++  java
  • 图解计算机底层IO过程及JavaNIO

    CPU 简单理解为 计算机处理运算的单元 (大脑) 

    磁盘  简单理解为 绝大多数文件持久化存储的地方,从磁盘中IO寻找东西需要转磁头啊 寻址啊 总之就是很慢

    内存  简单理解为 为了方便CPU拿数据给进程用,临时存在这。能存储的数据量很小,但是很快啊,啪的一下就能把数据取出来。

    内核空间,用户空间  是操作系统层面的,一般进程只能操作用户空间,需要的时候 必须切换到内核空间才能和内存和磁盘交互。

    了解详情  虚拟内存与Linux层级结构

     虚拟内存 顾名思义 并不是不是真实的内存地址,分为内核空间,用户空间 所占比例 1:3

    通过页表映射,映射到内存的实际物理地址页 

    各种应用进程在用户空间中,不能直接调用系统资源,需要通过系统接口切换成内核态。

    JVM进程想从内存中读取数据过程

    1. 先去找JVM对应的虚拟内存地址

    2. 找到虚拟内存地址对应的内存物理地址页,看看数据是否在

    3. 如果数据不在 就缺页中断,去磁盘里找,找到了刷入内存。如果物理内存满了,依据LRU算法,将淘汰的数据刷入磁盘缓冲区

    JVM想从磁盘中读取 fuxk.txt文本文件时过程

    1. 通过磁盘驱动器,从磁盘中寻址找到数据,暂存在磁盘缓冲区

    2. 磁盘缓冲区将数据拷贝到内核缓冲区

    3. 内核缓冲区将数据拷贝到用户缓冲区

    4. 用户缓冲区将数据拷贝到JVM的内存空间

    优化的痛点和难点就在于 磁盘IO 和网络IO占用了时间和大量的开销

    优化 出发点在于: 1.尽量减少磁盘IO和网络IO的次数  2. 尽量减少IO的大小

    JavaNIO

    创建一块堆外内存,直接受操作系统管理,分配地址和释放基于malloc和free函数。

    通过一条Channel通道,直接将JVM内存与堆外内存通道打通,减去了拷贝的这一过程。

    原来的内核缓冲区与用户缓冲区之间的拷贝 变成了内核缓冲区与堆外内存的拷贝。

      

    MappedByteBuffer 内存映射  主要利用了页缓存

    将堆外内存直接映射到一块磁盘物理地址;

    关联到虚拟内存页表,页表映射的内存物理地址没有直接缺页中断,切换到内核态缺页操作去磁盘找,找到了放进内存物理地址,堆外内存映射过去就有了,JVM内存也直接能看到了

  • 相关阅读:
    【连载】Bootstrap开发漂亮的前端界面之插件开发
    【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单
    Bootstrap开发漂亮的前端界面之实现原理
    终于有SpringMvc与Struts2的对比啦
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【轮子狂魔】手把手教你用JS给博客动态增加目录
    【G】系列导航
  • 原文地址:https://www.cnblogs.com/ttaall/p/14128788.html
Copyright © 2011-2022 走看看