狀態機在計算機中的應用

當你參加比賽前,教練會問你狀態如何;當你參加考試前,父母會問你狀態如何;當你參加演出前,夥伴會問你狀態如何。若是狀態很差,那麼你在這些活動的表現就可能不盡如人意,相反則可能有出人意料的表現。正則表達式

可見,一我的狀態的好壞會直接影響他的真實表現。可是,今天的狀態不佳,明天的狀態卻有可能很好,可見狀態也是會變化的。人如此,計算機也同樣——計算機的不少思想都來自於人的生活,所以生活中的狀態在計算機中也是遍地開花。緩存

我最先接觸狀態機的概念是在學習編譯原理的課程中。當時以爲狀態機雖然在詞法分析中發揮了神奇的做用,但總以爲抽象不太容易理解。後來在計算機的學習和工做中慢慢了解到狀態機在計算機中還有不少應用,例如正則表達式。網絡

正則表達式使用單個字符串(如圖一)來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。好比[abc]d既能夠匹配ad,也能夠匹配 bdcd^1[3|4|5|7|8][0-9]\d{8}$ 則能夠匹配目前的手機號碼。併發

圖片描述
圖一:正則表達式異步

那麼,正則表達式是如何起做用的呢?這就須要瞭解正則表達式的引擎了。目前主流的引擎分爲 3 類:DFA(肯定的有限狀態機),傳統型 NFA **(非肯定的有限狀態機),POSIX NFA**。編輯器

那什麼是肯定的有限狀態機?數學上的嚴謹定義是肯定的有限狀態機從起始狀態開始,一個字符接一個字符地讀入一個字符串,並根據給定的轉移函數一步一步地轉移至下一個狀態。經過狀態圖,咱們能夠清晰的看出這類狀態機的大體模樣(如圖二)。函數

圖片描述
圖二:有限狀態機學習

簡單來看,當 s1 狀態在輸入 0 的時候會進入 s2 的狀態,而s2的狀態在輸入 0 的時候則會從新回到 s1 的狀態,這種狀態轉移圖正好符合正則表達的內涵。咱們能夠將某個正則表達式生成一張對應的狀態圖,而後根據輸入的字符串來進行一個狀態轉移,若是過濾完該字符串後恰好到達有向圖的結尾,那麼該輸入字符串則匹配了該正則表達式。spa

就拿以前提到的手機號碼舉例,^1[3|4|5|7|8][0-9]\d{8}$對應的有向圖如(圖三),只有在輸入符合條件的手機號碼時,狀態有向圖纔會從最開始狀態走到結束狀態。對於複雜的正則表達,藉助狀態有向圖則能夠達到事半功倍的效果。code

圖片描述
圖三:狀態有向圖

除了在正則表達式上的應用外,狀態機還在網絡協議中發揮了重要的做用。咱們都知道 CDN 中離不開緩存系統,而被咱們熟知的 ATS ( Apache Traffic Server )則是一個由狀態機模型實現的異步事件處理程序。狀態機模型具備很強的描述系統行爲的能力,尤爲是針對具備事件驅動的併發的特徵的問題,用狀態機來建模很是合適。將狀態機做爲一種構建系統的基本模塊來對系統進行分解,將會使不少本來複雜的問題簡單化。因而可知,狀態機模型的引入能夠有效解決協議處理過程的複雜性從而將系統變得簡單和穩定。

曾經有個理論說,你最多經過其中的 6 我的就能夠和世界上任何一位陌生人創建聯繫,果然如此的話,每一個人的認識狀態圖也未免有些簡單吧,不過每次的狀態轉移可不是這麼輕鬆的哦。

另:本文由UPYUN CDN工程師 楊陽 供稿

相關文章
相關標籤/搜索