热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

状态机在计算机中的应用

当你参加比赛前,教练会问你状态如何;当你参加考试前,父母会问你状态如何;当你参加演出前,伙伴会问你状态如何。如

当你参加比赛前,教练会问你状态如何;当你参加考试前,父母会问你状态如何;当你参加演出前,伙伴会问你状态如何。如果状态不好,那么你在这些活动的表现就可能不尽如人意,相反则可能有出人意料的表现。

可见,一个人状态的好坏会直接影响他的真实表现。但是,今天的状态不佳,明天的状态却有可能很好,可见状态也是会变化的。人如此,计算机也一样——计算机的很多思想都来自于人的生活,因此生活中的状态在计算机中也是遍地开花。

我最早接触状态机的概念是在学习编译原理的课程中。当时觉得状态机虽然在词法分析中发挥了神奇的作用,但总觉得抽象不太容易理解。后来在计算机的学习和工作中慢慢了解到状态机在计算机中还有很多应用,例如正则表达式。

正则表达式使用单个字符串(如图一)来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。比如[abc]d既可以匹配ad,也可以匹配 bd ,cd^1[3|4|5|7|8][0-9]\d{8}$ 则可以匹配目前的手机号码。

图片描述
图一:正则表达式

那么,正则表达式是如何起作用的呢?这就需要了解正则表达式的引擎了。目前主流的引擎分为 3 类:DFA(确定的有限状态机),传统型 NFA **(非确定的有限状态机),POSIX NFA**。

那什么是确定的有限状态机?数学上的严谨定义是确定的有限状态机从起始状态开始,一个字符接一个字符地读入一个字符串,并根据给定的转移函数一步一步地转移至下一个状态。通过状态图,我们可以清晰的看出这类状态机的大致模样(如图二)。

图片描述
图二:有限状态机

简单来看,当 s1 状态在输入 0 的时候会进入 s2 的状态,而s2的状态在输入 0 的时候则会重新回到 s1 的状态,这种状态转移图正好符合正则表达的内涵。我们可以将某个正则表达式生成一张对应的状态图,然后根据输入的字符串来进行一个状态转移,如果过滤完该字符串后刚好到达有向图的结尾,那么该输入字符串则匹配了该正则表达式。

就拿之前提到的手机号码举例,^1[3|4|5|7|8][0-9]\d{8}$对应的有向图如(图三),只有在输入符合条件的手机号码时,状态有向图才会从最开始状态走到结束状态。对于复杂的正则表达,借助状态有向图则可以达到事半功倍的效果。

图片描述
图三:状态有向图

除了在正则表达式上的应用外,状态机还在网络协议中发挥了重要的作用。我们都知道 CDN 中离不开缓存系统,而被我们熟知的 ATS ( Apache Traffic Server )则是一个由状态机模型实现的异步事件处理程序。状态机模型具有很强的描述系统行为的能力,尤其是针对具有事件驱动的并发的特征的问题,用状态机来建模非常合适。将状态机作为一种构建系统的基本模块来对系统进行分解,将会使很多原本复杂的问题简单化。由此可见,状态机模型的引入可以有效解决协议处理过程的复杂性从而将系统变得简单和稳定。

曾经有个理论说,你最多通过其中的 6 个人就可以和世界上任何一位陌生人建立联系,果真如此的话,每个人的认识状态图也未免有些简单吧,不过每次的状态转移可不是这么轻松的哦。

另:本文由UPYUN CDN工程师 杨阳 供稿



推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • .htaccess文件 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
author-avatar
波波无敌1989_424
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有