Chinaunix

标题: 关于UPDSRVPGM后立即生效的问题 [打印本页]

作者: niuhua77    时间: 2011-11-18 11:37
标题: 关于UPDSRVPGM后立即生效的问题
本帖最后由 niuhua77 于 2011-11-18 11:45 编辑

问题: 做过ILE 模式开发的同学都有过这样的经历:
已经执行过的service program,重新编译了一个module后,并且更新了相应的service program (UPDSRVPGM),然后再次调用这个service program下的这个module,但是结果显示module并没有更新,举个例子:


整个程序的组织结构关系,我描述的还清楚吧,现在执行:
= =>CALL  PGM(PGMA),则会在屏幕上显示:AAA。
下面把MOD1的功能改成dSPLY  BBB,即:


然后重新编译MOD1、更新SRV0,重新执行CALL PGM(PGMA)
得出的结果仍然是:AAA
刚才明明重新创建了MOD1,并且也进行了UPDSRVPGM,应该打印的是BBB,为什么还是AAA呢?如何才能让程序调用最新的Module呢?
解决办法:
1 最简单粗暴直接的办法就是sign off ,再重新登陆。
2 用命令RCLACTGRP  ACTGRP(QILE)

下面是我对此的理解(正确性有待验证):
当更新一个PGM(module)时,旧的程序版本会被系统移到QRPLOBJ这个library中。如果在更新PGM(module)时,PGM(module)恰好处于活动的状态,那么系统会自动让用户继续使用QRPLOBJ中的旧版本程序,而不会报错,当然用户也无法使用新版本的程序。
当再次加载此程序的时候,才会使用新版本的程序。      那什么时候会再次加载程序?
对于service program而言:
1  program运行时系统会检查其activation group是否创建,若没有创建,则会创建activation group。然后系统会在activation group中检查相关的service program是否已经被激活,如果service program尚未被激活,则系统会激活service program;如果service program已经被激活,就不会再次进行激活。简单的说service program 只有在PGM首次运行的时候,才会被激活,并且此后这个service program一直处于活动状态,直到activation group被删除。(RED BOOK)

2 这段完全是我个人的猜想,没找到相关的理论做支撑。
当更新service program时,因为service program在第一次被调用的时候,已经被激活了,所以仅仅更新了ASP(硬盘)中的service program,而没有更新activation group中的service program。这时候最直接的想法就是让activation group重新加载service program,这样就可以把ASP中新版本的service program重新加载到activation group中了。但是系统并没有现成的命令,可以删除activation group中的service program再进行重新加载,所以我们要用SIGN OFF和RCLACTGRP来先删除activation group,这样activation group中的所有资源就都被释放掉了。然后PGM A再次运行的时候系统自动又会创建activation group,然后会重新加载service program,这样就会使用到新版本的service program了。

下图为我设想的简易流程图


以上有一部分内容没有找到论据,正确性有待验证,欢迎讨论批评指正
作者: niuhua77    时间: 2011-11-18 11:46
对于自己的猜想,没什么信心,谁知道到底怎么回事,给我解释一下吧
作者: banym1982    时间: 2011-11-18 15:57
你程序结束前里有释放资源的命令吗?你可以自己尝试下来论证自己的想法,signon之后别调用原来的module, 直接改module,updsrvpgm,然后调用,看是用的是改之后的还是改之前的
作者: xjromance    时间: 2011-11-18 16:00
学习了
作者: niuhua77    时间: 2011-11-18 16:28
回复 3# banym1982


程序第一次执行完后没有释放资源,这就是问题的所在。

sign on后直接修改module,然后updsrvpmg,然后call 程序,这样会执行更新后的module。

因为只有在service program处于active状态的时候,你去更新service program才会出现不会立即生效的问题。

因为刚登陆系统,service program还没有被激活,不存在replace while program active这种情况,所以module马上就会被更新到。
作者: niuhua77    时间: 2011-11-18 16:28
回复 4# xjromance


    一起讨论吧
作者: niuhua77    时间: 2011-11-18 16:46
本帖最后由 niuhua77 于 2011-11-18 16:47 编辑

我再说说我的疑惑,IBM red book上说:If there are active users of the program when you replace it,

the active users continue to operate from the version in QRPLOBJ without reallyknowing it.

我对这句话的理解是,如果replace一个处于active状态的program,那么user实际上使用的是library:QRPLOBJ中的旧版本的program。

对这句话,有2个单词需要好好理解:

1 active ——什么样的program是active?  call stack中正在使用的program 肯定是active的。还有一部分service program暂时没有被使用,但是已经被激活了,也应该算是active的。

2 user —— 这里的user跟我们的user profile 应该不是一个概念。举个例子,假如PGMA 调用PGMB,那么PGMA就是PGMB的user。在一个job中,PGMB可以对应多个user,因为PGM1

PGM2 PGM3都有可能调用PGMB。

我的理解对么?
作者: ping222s    时间: 2011-11-18 21:06
加精华。。。。andy厉害啊
作者: niuhua77    时间: 2011-11-19 13:12
回复 8# ping222s


    呵呵,谢谢,不敢妄称厉害。

    有一部分只是我个人的想法,没有找到理论依据,不敢说正确。

    贴出来想找人讨论一下。
作者: passthru    时间: 2011-11-20 17:45
问题: 做过ILE 模式开发的同学都有过这样的经历:
已经执行过的service program,重新编译了一个module后 ...
niuhua77 发表于 2011-11-18 11:37



    Andy,你思维有问题。这不是技术交流的方式,前提都不存在了,还津津探讨问题。

   在公开场合,特别这里是400论坛,这样的交流技术方式,会误导他人。
作者: niuhua77    时间: 2011-11-20 18:15
回复 10# passthru


    呵呵

    首先,前提是存在的,即我提出来的问题:service program中的module重新编译后,无法立即生效,这个现象是确实存在的。
  
    其次,我也提出了解决办法:SIGN OFF或者RCLACTGRP

    最后,我对这一问题的产生原因和解决办法,从理论上进行了一些描述,其中有些是red book上的论述,有些是我自己的猜想。

    既然是猜想,对与错都正常。我可没说我一定是正确的,如有误导,纯属不幸啊。。。。。。

    有问题,拿出来大家一起探讨探讨,难道不好么???
作者: passthru    时间: 2011-11-22 22:03
我再说说我的疑惑,IBM red book上说:If there are active users of the program when you replace it,

...
niuhua77 发表于 2011-11-18 16:46



    signoff and signin,即使*pgm任然是旧的,即资源没有释放,这是查看joblog,更新srvpgm处在失败状态。相反,如果资源释放,查看joblog,srvpgm已经更新,即*pgm是新的,所调用的*srvpgm是新的。

  这点与你的论点毫无相关。你钻进死胡同了。
作者: 哥是浮云    时间: 2011-11-23 10:06
signoff and signin,即使*pgm任然是旧的,即资源没有释放,这是查看joblog,更新srvpgm处在失败 ...
passthru 发表于 2011-11-22 22:03



    搞半天原来是资源没释放所造成的,就是实际上楼主说的SRV0在第一次被调用的时候被激活,UPDSRVPGM后,call 程序实际上调用的还是SRV0的前版本,因为之前的资源没有释放. 使用RCLACTGRP是为了释放资源. 我这么理解对吧?

NOTE: The Reclaim Activation Group (RCLACTGRP) command deletes a specified activation group and frees the resources that are scoped to it. (RCLACTGRP删除了一个指定的activation group并且释放被其占用的资源.)
作者: 哥是浮云    时间: 2011-11-23 10:09
但我们一般会在RPGLE程序后面SETON LR,不就是通过这种方式来让系统回收资源的吗? 难道对Service Program无效? 求真相.
作者: niuhua77    时间: 2011-11-23 11:12
回复 12# passthru

   不讨论我前面写的无聊的话题了,就此打住。。。。。
  
  刚刚试了一下,就昨晚讨论的问题:一个处于活动状态的srvpgm(即已经被激活,还没有释放),经验证是可以更新成功的。

重新编译module:
  Replaced object PASSBY1 type *MODULE was moved to QRPLOBJ.               
  Module PASSBY1 placed in library LIB1. 00 highest severity. Created on  
   23/11/11 at 10:58:16.     

更新srvpmg:
   4 > UPDSRVPGM SRVPGM(LIB1/PASS) MODULE(LIB1/PASSBY1)     
         AUT and USRPRF parameter values were ignored.         
         Replaced object PASS type *SRVPGM was moved to QRPLOBJ.
         Service program PASS created in library LIB1.
         Service program PASS in LIB1 updated.
作者: niuhua77    时间: 2011-11-23 11:17
回复 14# 哥是浮云


    个人人为,seton lr只能回收 变量、文件、*pgm类型的资源,但是无法*srvpgm类型的资源。

    srvpgm被激活后,只能等着它所在的AG被删除了,否则srvpgm不会被释放。
作者: passthru    时间: 2011-11-23 13:38
本帖最后由 passthru 于 2011-11-23 13:47 编辑
回复  passthru

   不讨论我前面写的无聊的话题了,就此打住。。。。。
  
  刚刚试了一下,就昨晚讨 ...
niuhua77 发表于 2011-11-23 11:12



    "重新编译module:
  Replaced object PASSBY1 type *MODULE was moved to QRPLOBJ.               
  Module PASSBY1 placed in library LIB1. 00 highest severity. Created on  
   23/11/11 at 10:58:16.     

更新srvpmg:
   4 > UPDSRVPGM SRVPGM(LIB1/PASS) MODULE(LIB1/PASSBY1)     
         AUT and USRPRF parameter values were ignored.         
         Service program PASS created in library LIB1.
         Service program PASS in LIB1 updated."

这个例子是成功updated,就不会出现CCC是原AAA的现象。否则,updated不成功。
作者: passthru    时间: 2011-11-23 13:53
本帖最后由 passthru 于 2011-11-23 13:57 编辑
回复  哥是浮云


    个人人为,seton lr只能回收 变量、文件、*pgm类型的资源,但是无法*srvpgm类型的 ...
niuhua77 发表于 2011-11-23 11:17



    如果*pgm的AG是*new,程序调用*srvpgm后,即*srvpgm是*caller,当*pgm结束时,OS立即释放*srvpgm的系统资源。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2