一种基于原子操作的三态控制方法与流程

文档序号:19878629发布日期:2020-02-08 06:43阅读:385来源:国知局
一种基于原子操作的三态控制方法与流程

本发明涉及计算机系统软件编程领域,特别是一种基于原子操作的三态控制方法。



背景技术:

在计算机系统软件中对设备和对象的状态控制,通常是软件设置状态值来体现和判断该设备或对象的工作状态,例如设备的使能和禁用,由于状态值一般是个普通的整数变量,需要锁机制来保证对其访问和修改的有效性。任何锁机制都只有两种状态,即锁定和非锁定两种状态,需要先确定锁为非锁定状态然后将其变更为锁定状态才能去修改状态值。因此状态值的修改需要经过两个过程,且在任意时间锁不一定就处于非锁定状态,可能另外一个线程正在访问导致当前线程需要等待一段时间才能变更锁的状态。而乐观锁和普通锁本质上并没有区别,唯一的区别是乐观锁是由编程者决定以什么方式等待,普通锁机制默认使当前线程挂起或使处理器轮询锁状态的方式进行等待。对于访问不频繁的设备来说,这种机制是简单而有效的,但对于像频繁调度的处理器或频繁写入显示信息的显示屏对象,控制线程和访问线程都有可能等待锁的状态被阻塞而导致性能上的瓶颈。



技术实现要素:

本发明的目的是克服现有技术的上述不足而提供一种基于原子操作的三态控制方法。

本发明的技术方案是:一种基于原子操作的三态控制方法,该方法包括一个整数状态值和一个与之关联的对象,由三个等差的整数a、b、c来表示三种状态。三个整数的间隔为n,n≠0,即a+n=b,b+n=c,若n为正数则a<b<c,若n为负数则a>b>c。关联对象由控制者和访问者进行操作,控制者使用原子加n操作或原子减n操作对状态值进行修改,访问者使用原子比较并交换(cas)操作对状态值进行判断和修改。控制者和访问者根据原子操作的结果判断是否对关联对象进行操作。控制者对关联对象进行控制操作,例如发送命令、发送消息和发送事件等。访问者对关联对象进行访问操作,例如数据读写和处理请求等。

模式一:控制者进行操作而访问者只判断状态,控制者使用原子操作将状态值原子化的加n,若加n后状态值为b则对关联对象进行控制操作,若加n后状态值为c则不需要进行任何操作。访问者使用原子比较并交换(cas)操作判断状态值是否为a,若原状态值为a则将其原子化的替换为b,若原状态值为b则阻塞访问者线程等待控制操作结束。

模式二:控制者进行操作而访问者只判断状态,控制者使用原子操作将状态值原子化的加n,若加n后状态值为c则对关联对象进行控制操作,若加n后状态值为b则不需要进行任何操作。访问者使用原子比较并交换(cas)操作判断状态值是否为a,若原状态值为a则将其原子化的替换为b并阻塞访问者线程等待控制者对关联对象进行控制操作。

模式三:访问者进行操作而控制者只判断状态,访问者使用原子比较并交换(cas)操作判断状态值是否为a,若原状态值为a则将其原子化的替换为b并访问关联对象。控制者使用原子操作将状态值原子化的加n,若加n后状态值为c则阻塞控制者线程等待访问者完成对关联对象的访问,若加n后状态值为b则不需要等待。

模式四:访问者进行操作而控制者只判断状态,访问者使用原子比较并交换(cas)操作判断状态值是否为b,若原状态值为b则将其原子化的替换为c并访问关联对象。控制者使用原子操作将状态值原子化的减n,若减n后状态值为b则阻塞控制者线程等待访问者完成对关联对象的访问,若减n后状态值为a则不需要等待。

本发明与现有技术相比具有如下特点:发明阐述一种使用原子操作实现三态控制的方法,通过控制者和访问者使用原子操作对状态值进行修改并根据结果实现控制者和访问者之间对关联对象操作的约束。不同于一般锁机制保证状态值修改正确性的方式,该方法不需要先确定锁的状态,因锁的状态是不确定的将导致任何线程都有可能被阻塞。而该方法直接根据原子操作的结果来确定一个线程是访问还是不访问,另一个线程是等待还是不等待,不存在锁的不确定性。相较于一般使用锁机制导致两者都有可能被阻塞的实现,该方法更适合于频繁访问的设备或对象。

以下结合附图和具体实施方式对本发明的详细结构作进一步描述。

附图说明

附图1为模式一控制者进行操作而访问者只判断状态的示例图;

附图2为模式二控制者进行操作而访问者只判断状态的示例图;

附图3为模式三访问者进行操作而控制者只判断状态的示例图;

附图4为模式四访问者进行操作而控制者只判断状态的示例图。

具体实施方式

如附图1所示:示例中a=0,b=1,c=2,分别表示初始态、中间态和完成态,例如在调度处理器时分别代表未调度、已发送调度中断命令和已完成调度中断;步骤101为控制者线程使用原子加1操作对状态值进行修改,若加1后状态值为1则执行步骤102对关联对象进行控制操作,例如发送中断命令,若加1后状态值为2则执行步骤103不进行操作;步骤104为访问者线程使用原子比较并交换(cas)操作判断状态值是否为0,原状态值为0则原子化的替换为1,原状态值为1则执行步骤105等待控制操作完成;在调度处理器场景中完成调度后由访问者线程将状态值恢复为0。

如附图2所示:示例中a=0,b=1,c=2,分别表示初始态、中间态和完成态,例如在接收键盘输入时分别代表未输入、等待输入和完成输入;步骤201为控制者线程使用原子加1操作对状态值进行修改,若加1后状态值为1则执行步骤202不进行操作,若加1后状态值为2则执行步骤203对关联对象进行控制操作,例如提交按键事件;步骤204为访问者线程使用原子比较并交换(cas)操作判断状态值是否为0,原状态值为0则原子化的替换为1并执行步骤205等待控制者对关联对象进行控制操作;在接收键盘输入场景中由控制者线程将状态值恢复为0,或访问者线程不需要等待时将状态值恢复为0。

如附图3所示:示例中a=0,b=1,c=2,分别表示初始态、运行态和停止态,例如在屏幕显示缓存更新时代表可更新、需要更新和不可更新;步骤301为控制者线程使用原子加1操作对状态值进行修改,若加1后状态值为1则执行步骤302不等待,若加1后状态值为2则执行步骤303等待访问操作完成;步骤304为访问者线程使用原子比较并交换(cas)操作判断状态值是否为0,原状态值为0则原子化的替换为1并执行步骤305对关联对象进行访问操作,例如写屏幕缓存数据;在屏幕显示缓存更新场景中由访问者线程将状态值恢复为0。

如附图4所示:示例中a=0,b=1,c=2,分别表示停止态、初始态和运行态,例如在磁盘设备读写时代表设备已卸载、设备可用和正在读写;步骤401为控制者线程使用原子减1操作对状态值进行修改,若减1后状态值为1则执行步骤402等待访问操作完成,若加1后状态值为0则执行步骤403不等待;步骤404为访问者线程使用原子比较并交换(cas)操作判断状态值是否为1,原状态值为1则原子化的替换为2并执行步骤405对关联对象进行访问操作,例如读写磁盘;在磁盘设备读写场景中完成读写后由访问者线程将状态值恢复为1,若磁盘被控制者线程卸载后将不再恢复。

本发明涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本发明中使用的原子比较并交换(cas)操作在intelx86处理器平台上可以用lockcmpxchg指令实现。原子加和原子减在intelx86处理器平台上可以用lockadd、locksub、lockinc、lockdec和lockxadd指令实现,其中加法指令可以用减法指令和补码替代,同样减法指令也可以用加法指令和补码替代。原子加减操作也可用lockcmpxchg指令和普通加减指令加条件循环来替代,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本发明的范畴。

名词解释

锁机制:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。

独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

cas操作

上面的乐观锁用到的机制就是cas,compareandswap。

cas有3个操作数,内存值v,旧的预期值a,要修改的新值b。当且仅当预期值a和内存值v相同时,将内存值v修改为b,否则什么都不做。

原子操作:是处理器访问内存变量过程中为读、修改、写提供完整性保证的一系列运算操作的统称,是由处理器硬件实现的,例如原子加原子减和原子比较并交换操作。在多处理器系统中当两个处理器同时修改同一个变量时,原子操作可以保证只有在一个处理器完成对变量的修改后另一个处理器才能对变量进行修改,任何锁机制都是基于原子操作实现的。

控制者和访问者:控制者是对关联对象进行控制操作的线程。访问者是对关联对象进行访问操作的线程。

控制操作:发送命令、发送消息和发送事件等向关联对象提交控制的操作。

访问操作:数据读写和处理请求等处理关联对象中数据的操作。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1