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

2013年(15)

2012年(17)

2011年(17)

2010年(135)

2009年(85)

2008年(18)

分类: 系统运维

2010-07-23 09:55:37

问题:(如题)
 
回答:
    这个问题很有代表性,往往是做400开发的非常缺乏深究学习的忽略环节,甚至包括一些资历非常深的开发人员、总体和概要设计人员。
不是在loop中就不能用call。
 
    首先,要掌握400环境下的call有几种方法,这些call之间的公共和差异。还有熟悉call的运行机制。再进一步深化,就是0S400的支持。
    call的方式有
    1)动态的call;
    2)callb,pgm内modules的静态调用;
    3)callp,不同pgm之间静态moudles的调用。
    从字面上就知道,静态调用,速度比动态调用快,因为静态调用在编译pgm时,os400就通过db2400把调用关系prototype,原型接口,记录下来,modules之间的关系也通过指针的形式在os400用户信息表中进行登记。在静态调用时,调用路径已经存在os400表中。然而,动态调用,调用关系如果没有在pgm中直接定义,os400就会自动到libl中查找排序在第一个位置的obj(*pgm),就是说,os400会消耗系统资源进行临时路径查找。
 
    无论调用关系式call、callb、或callp,在第一次进入pgm时,os400都会初始化H表中的系统支持定义、D表中的变量,都会把pgm的目标代码通过pool装入到内存中。     
    如果在pgm结束,没有设置*inlr为*on,即释放pgm上述的系统资源,而仅仅用return,这时,这个pgm在下次重新进入时,OS400会自动保留上次pmg的运行环境,即H和D表的定义,而不必重新装载这些定义;保留ODP的路径和状态。重新进入的操作,只需reset D表中的变量;重新设置表中的指针。
 
    对上述说法,可能会进一步提问,那么程序代码呢?是否还存在pool中,或者内存中?
    如果在编写pgm代码时,用到AG,或者通过系统命令把pgm装载到内存中,这时pgm就一直保留在内存中,程序代码无需通过硬盘-pool-内存,反复pagein,或pageout,而仅仅是物理内存上的电子开关操作,这时,PGM在os下保持最高速度的响应和运行。
 
    如果还要进一步提高pgm的运行效率,通过procedures的modules的并发,即多线程处理,除了pgm的编写技能和模式,还需OS400的设置和支持。这又是另外一个话题了。
阅读(2351) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~