美文网首页SAP
SAP ABAP 写时拷贝(Copy on Write)策略的一

SAP ABAP 写时拷贝(Copy on Write)策略的一

作者: 华山令狐冲 | 来源:发表于2022-06-28 09:53 被阅读0次

值语义(Value semantics)和引用语义(reference semantics)描述了动态内存对象在多个变量引用它时, 可以表现的两种方式。

用于特定类型的动态内存对象的语义, 对该类型的对象如何消耗内存产生了重要影响。

本质上,使用值语义的引用变量总是有它自己的、它所引用的内存对象的唯一副本。值语义变量类似于静态变量;像静态变量一样,它直接绑定到它所代表的内存对象。尽管变量只是一个引用,但在语义上它是内存对象本身。

相比之下,使用引用语义的引用变量被理解为指向内存对象的指针。内存对象在语义上独立于引用变量。该对象可以在许多这样的变量之间共享。

Value Semantics 的典型代表:

  • ABAP Internal Tables
  • Strings
  • Boxed Components

使用值语义解析对 ABAP 内表、字符串或 boxed组件的多次引用。 这意味着:

  • 内表、字符串或 boxed 组件的每个变量都指向它自己的内存对象的单独副本。

  • 将内表、字符串或 boxed 组件分配给第二个 ABAP 变量会触发对象的复制操作,以便每个变量都有自己的对象副本。

  • 通过特定变量对内表、字符串或装箱组件所做的更改,对于已分配给同一对象的其他变量是不可见的。

由于内部表和字符串可能会变得非常大,ABAP 通过采用惰性复制(有时也称为写时复制)策略 (Copy-On-Write) 来节省复制工作量。

我们来看一个具体的例子。

源代码如下:

REPORT z.

DATA: lv_size     TYPE abap_msize,
      lv_size1    LIKE lv_size,
      lv_consumed LIKE lv_size.

DATA: lt_table  TYPE TABLE OF tadir,
      lt_table1 LIKE lt_table.

SELECT * INTO TABLE lt_table FROM tadir.

cl_abap_memory_utilities=>get_total_used_size( IMPORTING size = lv_size ).

WRITE:/ 'total consumed: ' , lv_size.

lt_table1 = lt_table.

cl_abap_memory_utilities=>get_total_used_size( IMPORTING size = lv_size1 ).

lv_consumed = lv_size1 - lv_size.

WRITE:/ 'total consumed after = ' , lv_consumed.

APPEND lt_table[ 1 ] TO lt_table.

CLEAR: lv_size.

cl_abap_memory_utilities=>get_total_used_size( IMPORTING size = lv_size ).

lv_consumed = lv_size - lv_size1.
WRITE:/ 'total consumed after copy on write:', lv_consumed.

这个测试程序的5个关键点:

  1. 从数据库表 TADIR 里读取其全部数据,存储到内表 lt_table 内。打印当前应用程序所在的会话总共消耗的内存字节数。

  2. 将内表 lt_table 的内容复制给 lt_table1. 这里并不触发真实的内表间数据拷贝操作,因为内表 lt_table1 和 lt_table 此刻都指向同一块内存区域。

  3. 打印出当前应用程序所在的会话,同第一步执行完毕后的内存增量。因为没有实际的数据拷贝操作,我们可以断定,这个打印出来的值应该很小。

  1. 修改 lt_table 的值,之后,两个内表指向的内存区域不再是同一块,触发了 ABAP 的写时拷贝逻辑,造成了实际的内表拷贝操作,引起了大量的内存分配。
  2. 打印出第四步执行完后的应用程序内存增量。可以断定,因为 TADIR 数据库的全部内容从一个内表复制到另一个内表,因此这个增量的值和第一个步骤打印的值非常接近。

相关文章

  • SAP ABAP 的两种内存对象类型

    要研究 SAP ABAP 内表的写时复制(copy on write)机制,ABAP Memory Inspect...

  • SAP ABAP 写时拷贝(Copy on Write)策略的一

    值语义(Value semantics)和引用语义(reference semantics)描述了动态内存对象在多...

  • 如何理解copy-on-write

    copy on write, 写时复制,它通过浅拷贝(shallow copy)只复制引用而避免复制值;仅当有“写...

  • 写时拷贝

    什么是写时拷贝 写时拷贝(copy-on-write, COW)就是等到修改数据时才真正分配内存空间,这是对程序性...

  • Swift - 学习

    1.类和结构体的区别 Swift中结构体和类的比较 2.写时拷贝机制 Swift Copy-On-Write 写时...

  • 实践中学习cve-2016-5195

    该漏洞是Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有...

  • Linux写时拷贝技术(copy-on-write)

    COW技术初窥 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统...

  • ABAP-服务器文件

    教程 简单例子:ABAP 写数据到SAP服务器文件ABAP 写数据到SAP服务器文件并读取SAP服务器文件上传和下...

  • Java并发 - COW容器

    0. COW是什么 COW:Copy On Write写时复制,并发的一种优化策略。当多个线程访问某共享资源时,如...

  • Copy-on-Write模式

    Copy-on-Write,经常被缩写为 COW 或者 CoW,顾名思义就是写时复制。 Copy-on-Write...

网友评论

    本文标题:SAP ABAP 写时拷贝(Copy on Write)策略的一

    本文链接:https://www.haomeiwen.com/subject/kbonvrtx.html