@zhongdao
2022-03-24T10:10:27.000000Z
字数 1812
阅读 804
未分类
https://zh.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA
https://blog.csdn.net/xinghuanmeiying/article/details/81586954
状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题,后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。
很多协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。
状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个LED等,就有 亮 和 灭两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如LED灯的状态就是两个 亮和 灭。
状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。
四大概念
下面来给出状态机的四大概念。
State ,状态。一个状态机至少要包含两个状态。例如上面灯泡的例子,有 灯泡亮和 灯泡灭两个状态。
Event ,事件。事件就是执行某个操作的触发条件或者口令。对于灯泡,“打开开关”就是一个事件。
Action ,动作。事件发生以后要执行动作。例如事件是“打开开关”,动作是“开灯”。编程的时候,一个 Action 一般就对应一个函数。
Transition ,变换。也就是从一个状态变化为另一个状态。例如“开灯过程”就是一个变换。
机器还可以被描述为定义了一个语言,它包含了这个机器所接受而非拒绝的所有字词;我们称这个语言被这个机器接受。通过定义,FSM接受的语言是正则语言 - 就是说,如果一个语言被某个FSM接受,那么它是正则的(cf. Kleene的定理)。
图改成表:
https://baijiahao.baidu.com/s?id=1666672667730461870&wfr=spider&for=pc
现有一串二进制序列号和为:1000110100111010001111011010101111100010010001110001100111110110000000111111111111, 假如要求我们从这一堆数据检测出里面有多少个1011序列。想类似这种情况,用状态机就可以非常简单的实现了。要想检测1011序列号,那么我们就先要检测到1,接下来就要检测到0,然后又要检测到1,最后要检测到1。也就是说我们要检测到1011,那就必须经过如下5个状态:初始状态(状态0)->检测到1(状态1)-> 检测到10->(状态2)->检测到101(状态3)-> 检测到1011(状态4)->初始状态(状态0).
每个状态必须满足条件后才可进入下一个状态,否则就回到初始状态,在程序中我们只要我们按照这个逻辑来处理就好了。转换关系如下图:
https://zhuanlan.zhihu.com/p/59723017