全部博文(287)
分类: 系统运维
2011-07-22 15:49:49
在AS400 OS/400环境下,ILE开发的应用系统最强的特性,就是处理单元代码可重入性。
1. 概念可重入性指,处理单元,在不断调用过程中,从第一调用os装载到物理内存后,后续的调用,无需进行处理单元代码装载,直接再进入到上次调用退出后的代码运行临时分区,再从代码执行初始执行点开始,到代码出口。
2. 优点采用代码可重入模式的好处,减少代码装载初始化过程的时间。
在代码装载初始化过程中,OS要为被调用的执行代码,开辟一个运行空间,要对三种系统资源进行初始化,1)ODP路径的开辟;2)D表中变量的空间开辟和初值初始化;3)事务处理的系统资源的关联和分配,以及相关初始化。
3. 观察我们把文《案例分析:ODP概念与编程应用、事务处理》中的RPG1.rpgle代码修改一下。
RPG1.RPGLE:
H OPTION(*ShowCpy:*NODEBUGIO)
H DFTACTGRP(*NO)
h actgrp('TEST')
*
FMyFile if e disk
F recno(rrn)
*
drpg2 pr extpgm('RPG2')
d ckey 5 0
*
d MyDs ds likerec(REC)
d MyDs2 ds likerec(REC)
*
d rrn s 5 0 inz
d s_no s 5 0 inz
/free
read rec MyDs2;
setll 100 rec ;
read rec MyDs ;
callp rpg2(rrn) ;
s_no = s_no + 1 ;
return ;
/end-free
修改后,编译后进入debug调试状态,我们可以观察到,第一次进入RPG1时,read记录到结构MyDs2的记录数据是记录位置一的记录数据,即RRN=1;这时,s_no的初始化值是数字0。
在处理单元RPG1再次被调用,进入debug状态进行观察时,初始读入(read)记录数据的RRN就是101位置了,因为上次RPG1退出时记录指针位置是在RRN=100之后,101之前。同时,我们也可以观察到程序第二次进入后,s_no的值已经是数字1了,因为上一次退出之前,对s_no进行操作,s_no = s_no + 1。
说明第二次代码重入后,ODP的记录指针与上一次退出的位置一样;初始值已经不是第一次代码装载时的初始值,而是与上一次代码退出后的变量值一样。
4. 应用技术在理解处理单元代码可重入性意义之后,大部分情况下,我们都要再现第一次代码装载时的初始化状态,因为代码是我们根据处理需要而设定的初始化状态,是可以预见的。而不是,处理单元代码上次退出后的状态值。
就RPG1.rpgle代码为例,恢复初始化值的技术如下:
H OPTION(*ShowCpy:*NODEBUGIO)
H DFTACTGRP(*NO)
h actgrp('TEST')
*
FMyFile if e disk
F recno(rrn)
*
drpg2 pr extpgm('RPG2')
d ckey 5 0
*
d MyDs_2 ds likerec(REC)
d MyDs2_2 ds likerec(REC)
*
dMyDataSet ds
d rrn 5 0 inz
d s_no 5 0 inz
d MyDs likeds(MyDs_2)
d MyDs2 likeds(MyDs2_2)
d s_swsh s 1 0 inz
/free
If s_swsh = 1 ;
//数据记录指针初始化
Setll 0 rec;
//初始化变量
Clear MyDataSet ;
Reset MyDataSet ;
Endif ;
read rec MyDs2;
setll 100 rec ;
read rec MyDs ;
callp rpg2(rrn) ;
s_no = s_no + 1 ;
s_swsh = 1 ;
BegSr *inzsr ;
//变量初始化
Rrn = 0 ;
s_no = 0 ;
EndSr ;
return ;
/end-free
这样,我们又回到处理单元装载后的初始状态了。