zoukankan      html  css  js  c++  java
  • 003 零拷贝

    一 概述

      在传统的io之中,我们复制数据都是通过堆内存完成的,但是操作系统却不是这样进行操作的,只是jdk为了维护一致的操作方法进行实现的.

      在之前的io模型之中,比如文件的读取,我们首先将数据复制到内核内存之中,然后我们需要将数据复制到堆内存之中,然后才进行的操作.

      其实,在上面的模型之中,我们不自觉的完成的内存的数据复制,其实这种复制是没有必要的,但是我们想要去掉这个数据复制,使用java本身是不能实现的,因此jdk使用了调用jni的方式实现了数据的零拷贝,让我们的java程序直接操作内核数据.

      上面的这种方式也就是我们所说的零拷贝.


    二 . 直接缓冲区

      在nio之中,我们对数据的操作都是依赖缓冲区对象的,之前我们也介绍了缓冲区可以分成两种:

    [1]非直接缓冲区:我们使用堆内存进行数据的操作.

    [2]:直接缓冲区:我们通过这种缓冲区实现零拷贝.

    首先,我们回顾一下怎么使用直接缓冲区.

            // 创建了一个直接缓冲区
            // 实际上和我们创建的非直接缓冲区再使用上没有任何的区别.
            ByteBuffer buffer = ByteBuffer.allocateDirect(10);
    public abstract class ByteBuffer
        extends Buffer
        implements Comparable<ByteBuffer>
    {
    
        // These fields are declared here rather than in Heap-X-Buffer in order to
        // reduce the number of virtual method invocations needed to access these
        // values, which is especially costly when coding small buffers.
        //
        final byte[] hb;                  // Non-null only for heap buffers
        final int offset;

    在红色部分,标记了一个偏移量,这个偏移量就是内核内存的存储位置.

  • 相关阅读:
    django orm 以列表作为筛选条件进行查询
    申请Let's Encrypt通配符HTTPS证书
    redis集群部署及踩过的坑
    MySQL的索引是什么?怎么优化?
    Session管理之超时设置和强制下线
    在MySQL中使用explain查询SQL的执行计划
    基于Docker搭建MySQL主从复制
    这些年一直记不住的 Java I/O
    高并发大容量NoSQL解决方案探索
    php 如何生成静态页
  • 原文地址:https://www.cnblogs.com/trekxu/p/10169080.html
Copyright © 2011-2022 走看看