Java教程

ABAP内存组织与内部会话

本文主要是介绍ABAP内存组织与内部会话,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

ABAP内存组织与内部会话

        从ABAP程序对AS ABAP的存储访问的的视角来说,可以访问到应用服务器的存储区域是共享内存(shared memory),SAP内存(SAP memory),ABAP内存(ABAP memory)和内部会话中的(回滚区)roll area。内存区域从小到大的顺序为数据对象,ABAP内存,SAP内存,共享内存,中央数据库,他们分别处于内部会话,主会话(外部会话),用户会话,应用服务器,AS ABAP层级上。对应关系如下表:

级别

Internal Session

Main Session

user Session

Application Server

AS ABAP

存储

ABAP Object

ABAP Memory

SAP Memory

Shared Memory

Database

        中央数据库可以作为所有应用服务器共享的最高级存储,在单个应用服务器中最高的存储区域为共享存储(shared memory),该级存储被应用服务器中多个会话共享,然后针对单独用户会话来说,在用户会话中最高存储为SAP内存,SAP内存被用户会话中的多个主会话也就是外部会话共享,主会话中又可能会产生多个内部会话,内部会话共享主会话的内存区域ABAP内存,而在内部会话中的数据存储是数据对象。详情见下图:        

         AS ABAP的应用层是可以被部署到多个应用服务器中的,通常来说这些应用服务器是分布在不同计算机上的实例,当然不同的应用服务器也是可以运行在同一台计算机上的,所有的应用服务器访问AS ABAP的中央数据库,每个应用服务器有他自己的shared memory,abap运行时环境给程序,程序数据和buffers使用共享内存。ABAP程序可以在共享存储(注意:如果在程序显式的进行数据存储并频繁使用应用服务器的共享内存,会导致资源稀缺,形成瓶颈。)中存储共享对象(shared objects)和数据群集(data clusters),ABAP程序可以访问跨事务应用buffers(cross-transactional application buffers)中的数据群集,或者共享对象内存中的共享对象。 当登陆到应用服务器上时会打开一个用户会话,每个用户会话都会被分配它自己的的SAP内存,而对于每个用户会话,都有一个主会话被打开,每个主会话都被分配它自己的ABAP内存,在ABAP内存中数据群集也可以被存储,调用序列中的的程序们共享访问这些数据群集;而每个ABAP程序的调用都会创建一个新的内部会话来加载该程序,内部会话的内存区域被称为回滚区域(roll area),它被分割为堆和栈两个区域。该区域是程序中可变对象持有的区域,而不能够被改变得程序数据是被存储在PXA中。回滚区域包含了在PXA区域中必要数据的引用。从技术的角度来讲,回滚区域和全局PXA被存储在应用服务器的共享内存中,然后通过SAP内存管理,内部会话中程序和数据的组织如下图:

    在内部会话中可能会有多个程序被组织到一个程序组里,在内部会话被返回之后这个程序组就被拆解掉了,然后就不能访问内部会话的数据和对象了。

    比如在使用SUBMIT或者事务码进行一个ABAP程序的调用,此时会创建一个内部会话,首先主程序组被创建,被调用的程序成为了程序组中的的主程序(这个主程序可能是可执行程序,模块池或者一个函数组),最后内部会话的生命周期会随着主程序的消亡一起结束。而每次当外部加载一个新的类池或者一个函数时,也就是对类池或者函数组暴露的组件(全局类或者函数模块可见的组件)的访问,此时附加程序组会被被创建,并且这个类池或者函数组成为了附加程序组的主程序。附加的程序组的生命周期是伴随着内部会话的。但是当外部调用非函数组或者类池被时候,是不会形成附加程序组的,取而代之的是它们被加载到用户的程序组,例如:

  • 在外部调用可执行程序中的子例程,模块池或者子例程池。
  • 如果屏幕不是在函数组中定义的时候使用屏幕语句CALL SUBSCREEN sub_area INCLUDING prog.
  • 当使用绝对类型名称对可执行程序,模块池,或者子例程的本地数据类型或者对象类型访问时.
  • 如果必要组件不是在一个函数组,使用例如SET PF-STATUS OF program这样的语句。

其他的一些补充

     关于应用服务器

  • 不同用户可以通过使用配置文件参数(profile parameters)决定共享内存的最大空间。
  • 在系统中我们可以使用事务码SM51可看到当前AS ABAP的应用服务器的概览,和他的实例安装在哪台主机上。
  • 当前安装的实例的主机名在ABAP中可以通过sy-host获得。    
  • 事务ST02(SAP Memory Management)展示了当前共享内存的占用和其他的一些配置文件参数。

   关于用户会话(User session)

  • SPA/GPA参数也可以被存储在SAP内存
  • 一个额外的用户会话可以通过在程序中使用远程过程调用指定destination为 “NONE”来打开。
  •  调用序列中程序共享ABAP内存中的数据群集,这些数据会伴随着调用序列中的顶层事务的生命周期的消亡而消亡。

关于主会话(Main session)

  • 用户会话中额外的的主会话可以在远程过程调用中使用START NEW TASK来打开,或者在'/o'后面输入tcode打开,
  • 每个用户会话最大的可以有16个主会话。
  • 实际上会话的数量是被系统参数rdisp/max_alt_modes决定的,他的默认值是6。
  • 在调用序列中的程序使用语句EXPORT和IMPORT可以共同访问ABAP内存,所以ABAP Memory可以用来在call sequence中的程序间传递数据。

关于内部会话(Internal Session)

  • 在一个主会话(外部会话)中,可以有最多9个内部会话,它们是属于调用序列的,共享ABAP内存。
  • 在64位的平台上,一个内部会话理论上可以要求4TB的内存,在32位的平台上,理论的限制是4GB。但实际的上限常常低于理论的上限,由于实际安装的物理主存才是实际的最大可用并且它们要被分给所有的用户。
  • 类的实例,除了共享对象,是被驻存与内部会话。因此不能够存储对象的引用到ABAP内存。

关于程序组中的程序

  • 对于程序组中的程序,就生成附加程序组来说分配的程序引言语句(introductroy program statement)比程序类型更加重要,比如,在一个例程池中使用语句FUNCTION-POOL代了PROGROM,当程序被外部使用加载的时候,它就形成了一个附加程序组。
  • 如果程序组中的所有程序使用主程序的interface work area,screens,lists,和GUI status等,外部调用里面程序时,那么此时程序的类型分配特别重要。

关于PXA

    管理ABAP程序中固定数据的程序内存(program execution area)区域。PXA明显包含在应用服务器特定时间并发的所有运行程序的字节码(bytecodes)。应用服务器中的所有内部会话共享这部分内存,并且每个应用服务器只有一个PXA。程序一旦被执行过一次,程序的字节码就会被保存到PXA的缓冲,为了尽可能的阻止当程序重新执行事件发生时加载数据库时从数据库冲重新加载。PXA也缓冲公共的资源,比如常量的值,和为boxed components的inital value sharing.

这篇关于ABAP内存组织与内部会话的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!