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;

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

  • 相关阅读:
    python+Appium自动化:BSTestRunner执行测试用例,生成测试报告
    python3基础:介绍几个函数的用法
    python3基础:格式化输出
    python+Appium自动化:框架设计
    python+Appium自动化:PageObject设计模型
    python+Appium自动化:logging配置代码分离
    python+Appium自动化:日志logging模块
    python+Appium自动化:yaml配置capability
    Monkey基本命令
    Monkey介绍
  • 原文地址:https://www.cnblogs.com/trekxu/p/10169080.html
Copyright © 2011-2022 走看看