Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304295
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2015-07-27 02:55:02

*激活组


随着AS400的程序模型从OPM发展到ILE,写法上有了巨大的提升。激活组的引入,作为ILE最重要的变化,影响到整个系统程序的组织和性能。可是目前,仍然有很多系统,沿用着老式的OPM写法和程序组织,没有对激活组做好规划,只是使用缺省激活组管理,从而失去了ILE激活组带来的可控资源管理和性能提升,颇为可惜。因此,我介绍一下在Firebird核心系统中,对ILE激活组的使用方式,作为参考。更详细的信息,可以查看IBM官方手册的《ILE Concepts》文档。


随着从RPG升级到RPGLE,CL升级到CLLE,当前的程序,已经都是ILE程序了。ILE程序的运行,首先要进行程序的激活。ILE通过激活组来管理程序的运行和静态存储区域。激活组是比job粒度更小的单位,不同job之间互不影响,即使不同job存在同名的激活组,系统也是分开独立管理的。一旦程序加载进激活组激活,静态存储区域就会被初始化(包含F表文件的打开,D表定义的变量INZ初始化,以及执行*INZSR过程)。如果程序没有被激活组清除,并且激活组也没有被删除,那么下次运行程序时,将会直接用已加载的程序和存储区域执行。这时注意三点。一,已加载的程序不受文件系统上的程序目标更改的影响,即改变了程序目标,但执行的仍是老代码。二,F表打开的文件,以及访问的文件位置,均会保留上次执行结束时的状态,这个效果对性能加速非常有用。三,D表的INZ和*INZSR不会再次执行,全局变量会保留上次执行结束时的残留值,因此程序在开始处需要执行RESET(设置成初始化数据),或者CLEAR(根据数据类型清空内容)。在实际使用中,程序不设置INZ和*INZSR,将所有独立变量统一定义在D_VARS结构下,在*ENTRY后,首先执行CLEAR的动作。


ILE程序必须加载到激活组运行,而运行在哪个激活组,是在编译程序时指定的。通过CRTPGM或者CRTSRVPGM命令,包括衍生的CRTBNDRPG,CRTBNDCL,CRTSQLRPGI,可以用DFTACTGRP和ACTGRP参数选择激活组的属性。可以选择的方式有:DFTACTGRP默认为*YES,表示使用系统默认的激活组,系统默认激活组是不会被删除的;DFTACTGRP为*NO,ACTGRP为*CALLER,表示与调用者在同一个激活组;DFTACTGRP为*NO,ACTGRP为*NEW,表示让系统自动新增一个系统命名的激活组,系统保证激活组一定是与已有激活组不同的名字,因此一定是新建立;DFTACTGRP为*NO,ACTGRP为用户自定义名称,表示使用用户命名的激活组,如果激活组不存在则建立,已存在则直接使用。
激活组可以解决一个很特殊的问题。我们知道有一种程序写法叫做递归调用,即程序调用自身执行。缺省情况下,这种调用AS400会报错。这是因为程序调用自身时,激活组内已经存在一份正在运行的程序目标和存储区域,未执行完时必须保留,再调用自身时就产生了冲突。那么如何实现递归呢?我们可以把程序编译成*NEW激活组,这样调用自身也是在另外一份激活组内加载独立的目标和存储区域,不会再报错。
激活组是用来管理程序资源的,激活组删除时程序资源会自动释放。那么,激活组会出现哪些情况呢?RPG程序中的LR资源释放指示器会产生什么影响呢?我们依次进行分析说明。
一,系统默认激活组是从不删除的,一直到job结束,随着job的释放而释放。因此,在默认激活组执行的程序,有两种方式释放资源。第一种是在RPG程序中SETON LR指示器,那么在程序RETURN后就会被清理。第二种是不做SETON LR,加载的程序下次调用仍可使用,直到调用了RCLRSC命令。RCLRSC命令只对缺省激活组有效,调用后,在缺省激活组的已执行结束但未释放的程序,将被清理。
二,用*NEW系统自动建立的激活组,当建立程序执行结束RETURN时,系统自动进行删除激活组,也就自动释放所有组内程序资源,因此不需要程序设置LR。
三,用ACTGRP指定用户自定义名称的激活组,不会自动删除,当组内所有程序均不在运行状态时,使用RCLACTGRP命令,指定名称或者ACTGRP(*ELIGIBLE)删除。删除后,释放所有组内程序资源。既然使用了自定义的激活组,就是为了利用激活组的性能加速,因此我们也不用再设置LR了。


充分使用激活组的功能,对应用系统有着重要的意义。在核心系统中,联机和批处理主控程序运行于*NEW激活组,交易程序运行于CORE激活组,交易调用的各级模块程序均指定为*CALLER,可以由主控控制何时执行RCLACTGRP。
首先,可以用激活组的目标加载,实现应用程序版本更新。程序上线时,更新了新的目标,不会对已经调用过此目标的job产生影响,而只要触发主控的激活组回收,即可实现新目标的运行切换。
其次,保留的程序资源,可以实现极大的性能加速。批处理往往是循环重复调用模块组件访问相同的表,节省了文件的打开关闭动作,加速效果非常显著。联机交易结合同一环境启用多套联机主控子系统的支持,一样能达到很好的效果。银行交易有特殊性,交易量排名前几的交易,往往占比很大,因此考虑对这些交易各自启动专用主控子系统,就可以达到同样的交易程序重复执行最大加速的效果。


曾几何时,RPG程序开发规范上,写着在RETURN前必须SETON LR指示器。而现在,到了抛弃指示器,拥抱ILE新环境的时候了。


阅读(2381) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~