使用CS指令在大型机上实现串行化

日期: 2010-06-22 作者:Robert Crawford翻译:黄永兵 来源:TechTarget中国 英文

大型机提供了许多串行化服务,最常见的就是使用入队(ENQ)和出队(DEQ)宏,除此之外,也还有低成本的对比和交换(CS)指令可用。   CS指令的格式如下:   CS  R1,R2,D1   R1和R2是寄存器,D1是内存引用,这个指令执行时,R1中的内容与D1位置的内容进行比较,如果它们相等,R2就存入到D1中,并将状态码置为0;如果不相等,状态码置为1,并将D1的内容载入到R1中。   这个指令特殊之处在于所有处理器可以串行访问D1,因此确保一次最多只能有一个程序更新D1。   我们以控制下一个发票号码的计数器为例,访问这个计数器时必须是串行的,只有这样应用程序才能产生连续的,不重复的发票……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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只能在所有参与者使用相同规则时才能工作,通过其它指令,如存储,更新将不会串行化,应该不受外界串行控制更新存储。

作者

Robert Crawford
Robert Crawford

数据中心专家