大型机提供了许多串行化服务,最常见的就是使用入队(ENQ)和出队(DEQ)宏,除此之外,也还有低成本的对比和交换(CS)指令可用。 CS指令的格式如下: CS R1,R2,D1 R1和R2是寄存器,D1是内存引用,这个指令执行时,R1中的内容与D1位置的内容进行比较,如果它们相等,R2就存入到D1中,并将状态码置为0;如果不相等,状态码置为1,并将D1的内容载入到R1中。 这个指令特殊之处在于所有处理器可以串行访问D1,因此确保一次最多只能有一个程序更新D1。 我们以控制下一个发票号码的计数器为例,访问这个计数器时必须是串行的,只有这样应用程序才能产生连续的,不重复的发票……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
大型机提供了许多串行化服务,最常见的就是使用入队(ENQ)和出队(DEQ)宏,除此之外,也还有低成本的对比和交换(CS)指令可用。
CS指令的格式如下:
CS R1,R2,D1
R1和R2是寄存器,D1是内存引用,这个指令执行时,R1中的内容与D1位置的内容进行比较,如果它们相等,R2就存入到D1中,并将状态码置为0;如果不相等,状态码置为1,并将D1的内容载入到R1中。
这个指令特殊之处在于所有处理器可以串行访问D1,因此确保一次最多只能有一个程序更新D1。
我们以控制下一个发票号码的计数器为例,访问这个计数器时必须是串行的,只有这样应用程序才能产生连续的,不重复的发票号码,如果生成发票号码的每个进程都遵循以下逻辑,要实现这种效果也很容易:
L R2,INVNUM Get current invoice number
TRYAGAIN LA R3,1(,R2) Add one
CS R2,R3,INVNUM Update invoice number
BNZ TRYAGAIN Try again if changed
上面的代码分段载入,并增加发票号,然后使用CS指令更新内存中的计数器,如果号码没有变化,CS就存储新的号码,如果另一个线程也在载入和CS指令执行之间更新INVNUM,如果返回非零代码,会强制这个逻辑转入另一个线程,注意,根据INVNUM的繁忙程度,这个代码可能会循环多次。
除了这个相对简单的例子外,CS可以用于更新控制块和快速低成本链接清单。
CS的主要限制是范围,如果目标地址属私有存储,串行化只能在一个地址空间内工作,除此以外,对于一个公共服务区域中的地址,可以跨整个LPAR应用串行化,但开发人员必须使用ENQ和DEQ宏,或是用耦合设备跨Sysplex锁定资源。
同时还需注意的是,CS只能在所有参与者使用相同规则时才能工作,通过其它指令,如存储,更新将不会串行化,应该不受外界串行控制更新存储。