分类:
2011-07-06 16:34:44
一
绑定的基本概念(看图说话)
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(‘BD
……
C CALLB ‘M
……
此时,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。这个也不多说了。