Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47951
  • 博文数量: 10
  • 博客积分: 557
  • 博客等级: 下士
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-25 20:13
文章分类

全部博文(10)

文章存档

2011年(9)

2010年(1)

分类:

2011-07-06 16:34:44

 

绑定的基本概念(看图说话)

 

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

 

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

 

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

 

绑定的过程。

By copy

编译期:CRTPGM的时候,PGM1MOD1之间的物理绑定。二者成为了一个整体,完成绑定。

 

By reference

编译期:PGM1SRV0之间建立符号链接。

运行期: PGM1被调用的时候,系统会根据PGM1SRV0之间的符号链接,转换成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,并且这个moduleunresolved import提供与之匹配的export

例如:Binding Directory BD1 有如下 4entry               

Object                  Type                    Library                  

M11                      *MODULE           *LIBL  

M22                      *MODULE           *LIBL

S1                        *SRVPGM            *LIBL  

S2                        *SRVPGM            *LIBL  

 

PGM2:

H BNDDIR(‘BD1’)

……

C   CALLB  ‘M11’

……

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

 

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

例如:Binding Directory BD2 有如下 2entry               

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 importP2,而binding directoryBD2里的M2刚好提供export P2。所以M2也是以by copy的方式绑定的(根据绑定规则2).M3,不属于以上任何一种情况,但是M3export P3,却是BND文件里当前(*current)的输出接口,是创建service program必须要使用的,所以虽然M3不属于前两个规则的任何一个,但是也要以by copy的方式绑定。

 

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

 

By reference2种方式,如下:

1. BNDSRVPGM parameter上指定的service program,都是以by reference的方式绑定。这个也没什么好说的。

例如:CRTPGM  PGM(PGM1)  MODULE(MOD1 MOD2)  BNDSRVPGM(SRV0)

 

2.Binding Directory 里的service program,并且这个service program里的moduleunresolved import提供与之匹配的export。这个也不多说了。

 

 

 

阅读(1308) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~