Chinaunix

标题: 瞎侃ILE模式下两种绑定方式 [打印本页]

作者: niuhua77    时间: 2011-07-06 16:44
标题: 瞎侃ILE模式下两种绑定方式
一 绑定的基本概念(看图说话)

CRTPGM  PGM(PGM1)  MODULE(MOD1 MOD2)  BNDSRVPGM(SRV0)

By copy :创建PGM1的时候,MOD1,MOD2对象被copy到PGM1中。PGM1内部可以不经过地址转换,直接访问MOD1,MOD2。这种绑定方式就叫做by copy。

By reference :创建PGM1的时候,SRV0并不包含在PGM1中,SRV0和PGM1是两个独立的对象。但是会在PGM1和SRV0直接建立一个符号链接,把他们联系起来。当PGM1使用到SRV0的时候,编译器会把这个符号链接转换成SRV0的物理地址,这样PGM1就可以访问SRV0了。这种绑定方式叫做by reference。

二 绑定的过程。
By copy
编译期:CRTPGM的时候,PGM1和MOD1之间的物理绑定。二者成为了一个整体,完成绑定。

By reference
编译期:PGM1与SRV0之间建立符号链接。
运行期: 当PGM1被调用的时候,系统会根据PGM1和SRV0之间的符号链接,转换成SRV0的物理地址,通过SRV0的物理地址找到SRV0并把SRV0加在到activation group中,完成绑定。
注意:by reference方式在运行期加载service program是发生在PGM1被调用的时候。而不是PGM1调用SRV0的时候。当PGM1调用SRV0的时候,SRV0已经完成了绑定。从这个角度来说,by reference的执行速度与by copy是一样的。
总的来说,bound by reference的运行效率介于动态调用和bound by copy之间。

三 绑定的规则
使用by copy的情况有3种,如下:
1.
MODULE parameter上指定的module,都是以by copy的方式绑定。这个没什么好说的。
例如:CRTPGM  PGM(PGM1)  MODULE(MOD1 MOD2)  BNDSRVPGM(SRV0)

2.Binding Directory 里的module,并且这个module为unresolved import提供与之匹配的export。
例如:Binding Directory :BD1 有如下 4个entry                        
Object                         Type                         Library                          
M11                                *MODULE                 *LIBL  
M22                                *MODULE                 *LIBL
S1                                 *SRVPGM                 *LIBL  
S2                                *SRVPGM                 *LIBL  

PGM2:
H BNDDIR(‘BD1’)
……
C   CALLB  ‘M11’
……
此时,PGM2需要引用(unresolved import)M11,而BNDDIR刚好提供了M11(export),所以M11也以by copy的方式绑定到PGM2中。虽然BNNDIR中还包含一个M22,但是因为PGM2不需要M22,所以M22被忽视,不会被绑定到PGM2中。

3.Binding Directory里的module,虽然这个module并不为unresolved import提供export(比如下面的M3),但是这个module的export却出现在BND文件的*current block中。那么这个module也是作为by copy的方式绑定的。说的比较绕嘴,难理解,举个例子吧:
例如:Binding Directory :BD2 有如下 2个entry                        
Object                         Type                         Library                          
M2                                 *MODULE                 *LIBL
M3                                 *MODULE                 *LIBL

Module M1: imports P2
Module M2: exports P2
Module M3: exports P3

Binder language S1: STRPGMEXP PGMLVL(*CURRENT)
EXPORT P3
ENDPGMEXP

CRTSRVPGM  SRVPGM(SRV1)  MODULE(M1) SRCFILE(S1) SRCMBR(S1) BNDDIR(BD2)
首先M1作为MODULE的参数,肯定是by copy方式绑定的(根据绑定规则1)。M1有一个unresolved import:P2,而binding directory:BD2里的M2刚好提供export P2。所以M2也是以by copy的方式绑定的(根据绑定规则2).而M3,不属于以上任何一种情况,但是M3的export P3,却是BND文件里当前(*current)的输出接口,是创建service program必须要使用的,所以虽然M3不属于前两个规则的任何一个,但是也要以by copy的方式绑定。

规则3简单点说,创建service program的时候,BND文件(binder language)里需要的exprot ,此export所属的module总是以by copy的方式绑定。

By reference有2种方式,如下:
1.
BNDSRVPGM parameter上指定的service program,都是以by reference的方式绑定。这个也没什么好说的。
例如:CRTPGM  PGM(PGM1)  MODULE(MOD1 MOD2)  BNDSRVPGM(SRV0)

2.Binding Directory 里的service program,并且这个service program里的module为unresolved import提供与之匹配的export。这个也不多说了。
作者: niuhua77    时间: 2011-07-06 16:49
其实懂不懂绑定方式,对编程没有太大影响。不了解的话也不耽误编程。

新接触ILE编程模式的童鞋可以参考参考,有助于理解ILE的开发模式。
作者: vicky___lee    时间: 2011-10-21 15:45
很好的教材!
顶~
作者: niuhua77    时间: 2011-10-21 16:33
可惜都木有人看,你是第一个…………
作者: insmile    时间: 2011-10-22 00:03
本帖最后由 insmile 于 2011-10-22 00:05 编辑

木有用到这么复杂的东西,,,都是call了事。。。

这些绑来绑去的程序,个人以为维护性不好,别人修改一个模块以后,万一没有开发文档啥的,就难搞了,实际上很多公用模块都是交叉使用的,太混乱了
作者: niuhua77    时间: 2011-10-22 09:03
回复 5# insmile


    在ILE开发模式下,绑定是一个没法回避的话题。
    绑定可以提高效率,但是代码写起来,部署起来是要麻烦一点。没办法,没有一个两全齐美的方式。{:3_190:}
作者: junlee1986    时间: 2011-10-22 15:02
我来顶你了哈~~
作者: xjromance    时间: 2011-12-18 17:13
受益匪浅啊
作者: 燕麦玉米粥    时间: 2012-04-21 21:41
回复 1# niuhua77

请问,直接用CRTSRVPGM生成一个服务程序MYSRVPGM,将所需的MODULE放进去,然后CRTBNDDIR生成一个MYBNDDIR,将服务程序MYSRVPGM加到MYBNDDIR中,CRTPGM  PGM(MYLIB/MYPGM)  MODULE(MYLIB/MYPGM) BNDDIR(MYLIB/MYBNDDIR)就可以运行了
BNDDIR与.bnd的文件是什么关系呢?

   
作者: niuhua77    时间: 2012-04-23 20:23
回复 9# 燕麦玉米粥


    参考其他的帖子吧。你问的问题和本主题无关
作者: 1067049_cu    时间: 2012-06-15 14:24
回复 9# 燕麦玉米粥

你先WRKBNDDIR 看看里面的内容。
BND 类似于module/service program集合。
你可以把MODULE加入进这个BND,也可以把MODULE创建的SRVPGM加入,考虑到reference,最好是BND下面全部放SRVPGM 。
BND source member 用来创建SRVPGM , 就是创建SRVPGM时候的Export source file。
这些都是ILE下面很重要的东西。
作者: 燕麦玉米粥    时间: 2012-06-15 21:48
学习了!谢谢楼上!




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