问题:(如题)
回答:
这个问题很有代表性,往往是做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的设置和支持。这又是另外一个话题了。
阅读(2399) | 评论(0) | 转发(1) |