状态机

OSPF学习指南

别等时光非礼了梦想. 提交于 2020-02-19 03:18:20
一:OSPF中文开放式最短路径优先的链路状态机路由协议 他是属于IGP动态的协议,适用于大中型网络中。可以通过周期性的向邻居发送hello报文和BFD联动,可以在一台路由器上运行多种OSPF路由进程,为了减少LSA的数量可以把一个AS划分多个不同的Area,一个区域内最好不超过50台路由器,通过LSA报文进行路由信息交互,分5种报文,分别是:hello,dbd链路状态数据库,LSR,LSU.LSACK。进行邻居与邻接关系的建立。 在一个AS中每个路由器ID必须唯一,但同一个路由器的不同进程中的路由器ID可以相同。 根据OSPF协议规定,所有其他区域均必须与骨干区域连接。如下图: 二:LSA类型 LSA是用来交换链路状态信息,从而知道全网的拓扑结构,并进行独立计算路由。 第一类LSA:路由器LSA(router LSA)每个OSPF路由器都会产生路由器LSA, 第二类LSA:网络LSA(network LSA)由DR(指定路由器)或者BDR(备份指定路由器)产生,仅在区域内传播,也仅在广播类型网络中存在。 第三类LSA:网络聚合LSA(network summary LSA)网络汇总LSA,由ABR产生。 第四类LSA:ASBR聚合LSA(ASBR summary LSA )也是由ABR产生。 第五类LSA:自治系统外部LSA(Autonomous systeam external

接口幂等性的解决方案

余生长醉 提交于 2020-02-17 09:00:55
接口幂等性的解决方案 在编程中,幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数指的是那些使用相同参数重复执行也能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。比如说getIdCard()函数和setTrue()函数就是幂等函数。 幂等在我的理解里就是,一个操作不论被执行多少次,产生的效果和返回的结果都是一样的。 一个幂等的操作典型如:把编号为5的记录的A字段设置为0这种操作不管执行多少次都是幂等的。 一个非幂等的操作典型如:把编号为5的记录的A字段增加1这种操作显然就不是幂等的。 幂等的方案 1.查询操作:Select是天然的幂等操作。 查询一次和查询多次,在数据不变的情况下,查询的结果都是一样的。 2.删除操作:删除操作也是幂等的,删除一次和删除多次都是把数据删除。 因为删除操作通常是定向的,比如通过id去删除数据,如果该id在数据库中存在对应记录,则删除该记录;如果该id在数据库中不存在对应记录,也是执行的删除记录操作,只是没有实质性地删除到记录而已,却也不会有其他的副作用。 但是如果删除操作具有返回值的话,可能返回的结果会不一样,比如删除一条记录之后返回这条记录中的某个值,如果删除的数据不存在(已经在第一次的删除请求中被删除了),返回的就是空值了。 3.唯一索引

QP之QEP原理

℡╲_俬逩灬. 提交于 2020-02-10 02:05:12
1.QP简介: 量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的、开源的、基于层次式状态机的、事件驱动的平台。 QP包括事件处理器(QEP)、轻量级的事件驱动框架(QF)、任务调度微内核(QK)和实时跟踪调试器(QS)四个部分。 利用QP可以开发出结构清晰的嵌入式应用程序(使用C或C++语言)。 2.QEP核心思想 QEP的核心思想就是,用一个函数指针指向当前状态函数,使用这个函数指针有条件地执行某状态函数,并根据执行结果执行其它的相应动作。 (1)状态图到C语言的转换 状态图可以很容易地转换到C语言表示,下面举例说明(略去了构造函数和初始化函数)。 例如下面的平面状态机FSM,图中有两个状态:设置状态setting和定时状态timing。 可以转换成C代码如下 两个状态函数声明: static QState Bomb4_setting(Bomb4 *me, QEvent const *e);/*声明设置状态函数*/ static QState Bomb4_timing (Bomb4 *me, QEvent const *e);/*声明计时状态函数*/ 两个状态函数的实现(对事件的处理): QState Bomb4_setting(Bomb4 *me, QEvent const *e) { switch (e->sig) {

QP简介

瘦欲@ 提交于 2020-02-10 02:03:05
QP简介     QP ( Quantum Platform ) 是一个轻量级的、开源的、基于状态机的、事件驱动型应用程序框架。这个框架包括四部分:   事件处理器 (QEP) ;   轻量级的事件驱动框架 (QF) ; 任务调度微内核 (QV 、 QK 、 QXK) ;   实时跟踪调试器 (QS) 。 (1 ) QEP   Quantum Event Processor 是一个通用的,可移植的,可重用的状态机引擎。   QEP 允许你直接把 UML 样式的状态图映射为代码。   QEP 提供了传统的简单平面状态机和层次式状态机。 QEP 可以直接操作事队列和事件分发机制。 (2)QF   QF 是一个 通用的, 事件驱动 的应用框架,是一个实时框架,面向嵌入式系统。   QF 被设计成和 QEP , RTOS 协同工作。   QF 包含了事件队列,活动对象,事件遍历等。 (3)QK   QK 是一个 轻量级 可抢占型实时内核   QK 是一个 极小的,按 RTC 习惯的,执行独立任务的内核。   QK 必须和 QF 版本相匹配。 (4)QS   一个强大的调试工具 QEP (Hierarchical Event Processor )   事件处理器,也可以理解为一个状态机引擎,当有事件需要处理时,调用当前状态的状态函数处理这个事件,并处理调用状态函数的返回值

NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析

怎甘沉沦 提交于 2020-02-07 06:47:43
嵌入式开发中我们要时刻保持代码的高效与整洁 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁 。NBIOT的出现带动了物联网行业的火爆,物联网行业似乎总是离不开NBIOT。但是,我将NBIOT归为AT指令模组一类,这一类模组没有什么高深之处,也没有深度可言。但是想要很好的使用AT指令模组却是一件不简单的事情。想要很灵活的使用AT指令的模组需要用到 状态机。 AT指令类模组包括:nb-iot模组,gprs模组,wifi模组,LoRa串口透传模组等等,设计很多,应用广泛。 二、AT指令类模组总结 AT指令类模组的使用步骤可以分为:模组初始化和模组收发数据。我们翻开模组的手册可以发现,模组的初始化就是一个状态到另一个状态之间的切换, 每一时刻该对象必须处于且只能处于其中一种状态中。 三、状态机原理 状态机的定义网上有很多,我主要说一下状态机的工作原理。 状态机组成:状态(state),事件(event)和动作(action); 四、AT指令模组状态机工作原理 前面说了状态机组成:状态(state),事件(event)和动作(action); AT指令模组状态机原理: 状态:1.发送AT确认模组是否正常;2.配置模组参数;3.发送数据;(暂定三个状态) 动作:1.发送AT确认模组是否正常->通过串口发送AT\r\n,模组正常会返回OK,模组不正常返回非OK数据或者不返回。 2

仿照Unity的Mecanim动画状态机编写的状态机结构

二次信任 提交于 2020-02-06 09:15:53
灵感来源是Unity的Mecanim动画状态机,不过其动画过渡条件只能是简单的变量对比。 所以还有一个灵感来源就是UE4的动画状态机(bilibili up主 谌嘉诚 的从零开始绝地求生单机版教程),其过渡线是使用蓝图实现的多条件过滤。 当然,代码结构的来源是 https://www.jianshu.com/p/55e29a21679a ,其提出了基于有向图的状态机(不确定其是否为第一个提出的,只是我第一个看到的),但是未给出具体实现。 最终,基于以上基石,有了我这个demo: 1. 基于Java 2. 基于事件的状态切换 代码: https://github.com/erikaemma/StateMachine 来源: CSDN 作者: plgkm6 链接: https://blog.csdn.net/plgkm6/article/details/104069606

Lua源码分析 - 数据结构篇 - Mem内存操作

a 夏天 提交于 2020-02-03 04:06:32
原先以为Lua的内存操作也是高大上的,但是仔细研究了一下,突然发现,这块代码绕来绕去,封装来封装去,有一些low low感。 废话少说,直接上原理吧。这部分的代码,我也不画详细的图了。 Mem内存操作 - 核心分配函数 Lua的全局状态机里面,有两行代码,定义了内存分配的基础函数。底层的内存分配函数主要调用了c语言本身的内存分配函数(malloc、free、realloc等)。想要研究linux系统的内存分配器的,可以看我这边文章 《Linux c 开发 - 内存管理器ptmalloc》 先看一下全局状态机里面的定义: /* ** 'global state', shared by all threads of this state ** lua 全局状态机 ** 作用:管理全局数据,全局字符串表、内存管理函数、 GC 把所有对象串联起来的信息、内存等 */ typedef struct global_State { /* 版本号 */ const lua_Number *version; /* pointer to version number */ /* 内存管理 */ lua_Alloc frealloc; /* Lua的全局内存分配器,用户可以替换成自己的 - function to reallocate memory */ void *ud; /*

Unity骨骼动画的总结

人走茶凉 提交于 2020-02-02 05:22:32
欢迎参与讨论,转载请注明出处。 前言 恰逢疫情,在家继续推进Demo,骨骼动画相关的调研算是告一段落了,遂以本文记录相关要点。   首先要明确一点,本文所说的骨骼动画皆是3D模型的骨骼动画,与2D精灵的骨骼动画无关,虽然原理大致相通。 网格、骨骼、绑定 了解过3D相关知识的都知道,模型(Model)是由一个个三角形组成的,而这种三角形的学名则是网格(Mesh)。当然在DCC软件里为了方便创作,会用2个三角形组成四边形作为网格: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38QKdoa9-1580552699378)(https://musoucrow.github.io/images/animation_guide/0.png)]   然后便是骨骼(Skeleton)了,它是驱动模型运动的根本,如下图所示,这是一种彼此之间有父子关系连接在一起的长条状玩意: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqyVrkvM-1580552699379)(https://musoucrow.github.io/images/animation_guide/1.png)]   最后便是让模型跟着骨骼一起运动了,这个骨肉融合的过程称为 绑定 ,具体要做的事便是将某节骨骼与相关的网格建立关系: [外链图片转存失败

分布式初探——分布式事务与两阶段提交协议

删除回忆录丶 提交于 2020-02-01 14:19:24
今天的文章咱们聊的是分布式原理当中的 原子性 ,也称为 分布式事务 。不知道会不会有人觉得奇怪,分布式系统CAP原则当中并没有原子性,这个原子性是从哪里冒出来的? 其实并不奇怪,之前我们在介绍各种一致性原则的时候,虽然没有明确提出来,但是原子性的相关内容已经隐藏在其中了。让我们回顾一下,分布式系统当中的一致性简单可以分为 强一致性和弱一致性 。强一致性很好理解,简单可以理解成 主节点每次更新都通过同步的方式,同步更新所有副本 。而弱一致性则是统称所有不满足强一致性的模型,可以简单理解成 通过异步更新的方式实现的一致性模型 。 想象一下更新的时候,有节点出错的情况。如果是强一致性,很好办,因为我们采用同步更新,所以更新失败的话,主节点立刻就能感知。要么 重试这次的更新 ,要么 回滚放弃 ,或者是 判断该从库是否已经宕机 ,将它 移除资源池 。 如果是异步的更新机制就麻烦了,因为没有一个统筹大局的主库了。 没有节点知道其他节点更新成功了没有 ,如果部分成功了,部分失败了,那么数据的一致性就完全没办法保障了,脏数据到处都是,这个系统也就没法用了。所以必须要保证即使是异步更新,也要做到原子性,要么所有节点一起更新成功,要么一起失败回滚,不允许出现一部分成功了,另一部分没有的情况。 那么怎么解决这个问题呢?这就需要用到 两阶段提交协议 了。 两阶段提交 两阶段提交协议的算法思路其实不难

分布式初探——分布式事务与两阶段提交协议

穿精又带淫゛_ 提交于 2020-02-01 09:22:04
本文始发于个人公众号: TechFlow 今天的文章咱们聊的是分布式原理当中的 原子性 ,也称为 分布式事务 。不知道会不会有人觉得奇怪,分布式系统CAP原则当中并没有原子性,这个原子性是从哪里冒出来的? 其实并不奇怪,之前我们在介绍各种一致性原则的时候,虽然没有明确提出来,但是原子性的相关内容已经隐藏在其中了。让我们回顾一下,分布式系统当中的一致性简单可以分为强一致性和弱一致性。 强一致性 很好理解,简单可以理解成 主节点每次更新都通过同步的方式,同步更新所有副本 。而 弱一致性 则是统称所有不满足强一致性的模型,可以简单理解成 通过异步更新的方式实现的一致性模型 。 想象一下更新的时候,有节点出错的情况。如果是强一致性,很好办,因为我们采用同步更新,所以更新失败的话,主节点立刻就能感知。要么 重试这次的更新 ,要么 回滚放弃 ,或者是 判断该从库是否已经宕机 ,将它 移除资源池 。 如果是异步的更新机制就麻烦了,因为没有一个统筹大局的主库了。 没有节点知道其他节点更新成功了没 有,如果部分成功了,部分失败了,那么数据的一致性就完全没办法保障了,脏数据到处都是,这个系统也就没法用了。所以必须要保证即使是异步更新,也要做到原子性,要么所有节点一起更新成功,要么一起失败回滚,不允许出现一部分成功了,另一部分没有的情况。 那么怎么解决这个问题呢?这就需要用到 两阶段提交协议 了。