想知道如果转换是异步的,那么切换和定义状态的惯例是什么。
例如,假设有三种状态 a , b 和 c 。
a -> b -> c
两个过渡调用 d 和 e 。
d: a -> b
e: b -> c
假设我们处于州 a 状态,然后触发事件 x 以转换到州 b 。
时间表可能如下所示:
a a a a a a a a a x b b b b b b b
. . . . . . . . . . . . . . . . . . . . . . . . . . .
d complete --^
|_________________|
intermediate
area
在该中间区域内,想知道状态是什么,因为系统正在发生变化,因此它可能处于 a 或 b 状态。想知道人们通常如何处理这个问题。
似乎有三种方法可以实现:
答案 0 :(得分:0)
在状态转换期间处于“状态之间”的问题通过强加处理事件的运行到完成(RTC)语义来规避,所有状态机形式(包括UML状态图)普遍承担。 RTC意味着状态机必须始终完成先前事件的处理,然后才能开始处理下一个事件。
RTC限制来自于状态机必须始终运行的事实 从一个稳定状态配置一直到一个不可分割步骤中的另一个稳定状态配置(RTC步骤)。由于事件是与状态机交互的唯一方式,因此无法在“中间”稳定状态配置中观察状态机。
此外,明确区分RTC的概念与线程抢占的概念非常重要(参见例如UML state machine specification)。特别是,RTC 不意味着状态机必须独占CPU,直到RTC步骤完成。在抢先式多任务内核下,RTC步骤可以被在同一CPU上执行的另一个线程抢占。这由底层多任务内核的调度策略决定。当暂停的线程(运行状态机)再次被分配CPU时间时,它从抢占点恢复其事件处理,并最终完成其事件处理。只要抢占和抢占的线程不共享任何资源,就没有并发危险。
最后,注意如何违反RTC语义非常重要(通常是无意中)。第一个常见错误是在状态机和其他并发线程之间共享变量或其他资源。如果在RTC步骤中间抢占,则可以访问(“观察”)这些变量或资源,而它们可能不处于一致状态。
违反RTC语义的另一种常见方式是通过阻塞状态机内部(例如,通过调用时间延迟函数,信号量或其他此类OS原语)。在这种情况下,阻塞(和解除阻塞)是将事件传递给状态机的另一种“后门”方式。问题是,这种“后门”事件在RTC步骤中到达,因此违反了RTC语义。