Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1269031
  • 博文数量: 287
  • 博客积分: 11000
  • 博客等级: 上将
  • 技术积分: 3833
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-16 08:43
文章分类
文章存档

2013年(15)

2012年(17)

2011年(17)

2010年(135)

2009年(85)

2008年(18)

分类: 系统运维

2011-07-22 15:49:49

RPGLE程序可重入性,观察和应用技术

 

AS400 OS/400环境下,ILE开发的应用系统最强的特性,就是处理单元代码可重入性。

1.   概念

可重入性指,处理单元,在不断调用过程中,从第一调用os装载到物理内存后,后续的调用,无需进行处理单元代码装载,直接再进入到上次调用退出后的代码运行临时分区,再从代码执行初始执行点开始,到代码出口。

2.   优点

采用代码可重入模式的好处,减少代码装载初始化过程的时间。

在代码装载初始化过程中,OS要为被调用的执行代码,开辟一个运行空间,要对三种系统资源进行初始化,1ODP路径的开辟;2D表中变量的空间开辟和初值初始化;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

 

这样,我们又回到处理单元装载后的初始状态了。

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

niuhua772011-08-29 10:15:19

忽然想起一个问题:不是所有的应用的都适合使用重入技术吧?因为重入技术是以占用大量的资源为前提的(LR不能set on,AG也不能释放),所以只能针对频繁使用的应用,我的理解正确否?

chinaunix网友2011-07-22 16:10:45

第一个来学习