寫在前面的話
加入實驗室已經有大半年的時間了,科研上一直沒有取得什么重大突破。除去自身的實力問題之外,最大的問題恐怕就是對於自己或導師提出的一個問題往往不知道從何入手去研究,如何快速的了解相關工作的現狀。相信這個導致我進步緩慢而且不斷走彎路的主要原因。
寫下這篇博客,出發點是為了能夠記錄自己在學習AST時的一些總結和感想,分享給以后的自己和實驗室的小伙伴們。
看論文的方法
首先,對於一個剛進實驗室的我來說如何找一個相關領域的優質論文是一件很棘手的事。因此,暫且把我現在找論文的一些心得記錄下來,大神勿噴謝謝!
首先給出ccf推薦排名 http://www.ccf.org.cn/sites/ccf/paiming.jsp
在這個鏈接中有個領域的權威會議和期刊並且給出了在dblp【http://dblp.uni-trier.de/db/】上的鏈接,由於google學術需要翻牆所以上述兩個網站基本是我搜索論文的主要途徑。
搜索論文的三要素:引用,被引用,作者
可以從一篇論文的相關工作出發,他引用的尋找權威會議的論文
可以從一篇論文的相關工作出發,尋找他被引用數多的引用論文
尋找一個領域的權威作者,搜索這個作者的相關論文
除去這幾點之外,平時也需要廣撒網沒事看看相關領域會議論文的摘要,一篇一篇看這樣也能對他們在做什么有一些了解。
AST(地址空間轉換)的預備知識
從下文開始我會結合一些論文介紹一些ast的預備知識,相關論文會以引用的方式出現:
需要入門ast第一個要看的必定是老板的論文[1,2],好在中英文版都有。不過有略微的區別,需要對照的看。
AST的有什么用?
AST的應用領域可以說是比較廣泛的,一個重要的領域就是協同編輯[支持多個用戶在不同的計算機終端同時協同處理共享文檔]:Demo和若干產品 collabedit 石墨 google drive One drive等等。AST是用來處理並發操作沖突的一個算法,那為什么會產生並發操作呢?
圖1
各個站點的操作執行序列
站點1:操作1 -> 操作3 -> 操作2
站點2:操作2 -> 操作1 -> 操作3
站點3:操作3 -> 操作1 -> 操作2
圖1所示的三個操作為並發操作,當並發操作發生的時候若不加以算法控制會導致各個站點上執行效果完全不一致。
操作間的關系
在分布式系統中沒有辦法保證各個站點的時鍾精確一致,因此不能通過時鍾確定操作的先后關系,因此Lamport提出了操作之間的邏輯關系[3],他提出的操作間的邏輯順序在協同編輯研究領域被廣泛采用。
定義1:因果關系"->" 假設操作a和操作b,於是操作滿足關系a->b當且僅當 (1)他們來自於同一個站點且a的發生時間在b之前。(2)他們來自於不同站點且a在站點b的執行時間在b操作產生之前。(3)存在一個操作x使得a -> x && x -> b。
滿足因果關系的前兩種圖示:第三種情況規定了操作因果關系的可傳遞性。
圖2
定義2: 並發關系"||" 假設操作a和操作b,操作滿足a||b,當且僅當不存在a->b也不存在b->a。如圖2所示。
存儲結構,操作,時間戳
AST的基本存儲結構為線性結構,AST需要管理的是一系列操作的集合,然后將這些操作確定一個全序關系(就是兩兩之間可比較的)。這樣不管操作在每個站點的到達順序是怎么樣的,他都會按照一定的順序執行並且使得每個站點得到的文本狀態最終一致。
站點1:操作1 -> 操作3 -> 操作2 站點1:操作1 -> 操作2 -> 操作3
站點2:操作2 -> 操作1 -> 操作3 -->> AST 站點2:操作1 -> 操作2 -> 操作3
站點3:操作3 -> 操作1 -> 操作2 站點3:操作1 -> 操作2 -> 操作3
提到給操作排序那么我們會想到給操作附加一個信息按照這個信息來進行排序,這個信息我們稱為時間戳。由於每個站點的物理時鍾是不可能精確統一時間的,因此Eillis.[4]最早將向量時間戳引入了協同編輯領域。
狀態向量(時間戳):N表示協同編輯站點的個數,每個站點都有一個唯一的ID,然后對於這些ID從1-N編號,站點j的狀態向量是一個N維的向量,其中第i個分量表示站點i上的操作在站點j上被執行了幾個。
操作發生后各站點時間戳的變化
狀態向量的大小關系
兩個狀態向量a,b 若a=b則a和b的每個分量都相等。
若a<b則a中每個分量都小於等於b中的對應分量,且至少有一個分量小於對應分量。
若a>b則a中至少有一個分量大於b中的對應分量。
舉個例子 :(0,0,0) < (1,0,1) < (1,1,1) = (1,1,1)
操作的傳輸
定義3:對於文檔的所有操作都可以拆分成兩個基本操作
Insert[c, pos]:在 pos 與 pos + 1 的位置上插入字符c
Delete[c, pos]:在 pos 位置上刪除可見字符c
定義[op, ts]為操作的傳輸結構,其中op表示上述兩種操作之一,而ts表示狀態向量時間戳。
操作的結構化傳輸
地址空間轉換的介紹
在協同編輯算法中,操作被分為兩種:本地操作和遠程操作。為了保證良好的用戶體驗,操作產生或者被接收會直接在站點上執行,然而為了保證每個站點副本內容的一致操作必須有序的執行。綜合考慮兩點矛盾就產生了,如果遠程操作到達的順序和產生的順序相反那么后到來的操作如何執行呢?AST的解決方案很簡單,回到操作產生時的文本狀態執行該操作,相應的就是在執行一個遠程操作之前先消除應該在該操作之后執行的操作對於文本的影響,在操作執行完之后再恢復那些操作的影響。
地址空間結構
地址空間由若干節點組成,每個節點除了字母信息外還有一個有效位(在回溯操作中需要用到),節點上包含對於這個字母的插入和刪除操作。操作節點的內容和操作的傳輸結構類似,包含基本操作和狀態向量(時間戳)兩部分。地址空間結構如下圖所示:
地址空間結構圖(黃色為無效節點)
操作的划分
接着,我們來討論哪些操作的集合才是文本執行時的狀態呢?試想當一個用戶操作A在一個站點1上被執行的時候,所有的操作可以被分成三部分:
定義4:因果先序 在站點1上已經執行的操作{X}稱因果先序操作 X->A
並發操作 對於任意站點i(i≠1)操作A到達站點i之前產生的操作中還未到達站點1的操作{X}稱並發操作 X||A
因果后序 對於任意站點i(i≠1)操作A到達該站點后產生的操作和站點1在操作A之后產生的操作{X}稱因果后序操作 A->X
所謂的文本執行時狀態指的是因果先序操作集合,因此在地址空間回溯的時候僅僅保留因果先序操作集合。
性質1:一個操作可以在站點上執行當且僅當以下兩種情況:
(1)操作是該站點的本地操作
(2)操作是遠程操作且操作的因果先序操作已經在當前站點上全部執行。
回溯算法介紹
性質1是操作的前提條件,在滿足性質1的情況下提出回溯操作的算法框架,其中SV表示需要回溯到的時間戳:
AST回溯算法步驟
算法解釋:對於每個操作節點進行掃描,通過時間戳的比較判斷此操作節點是否為當前操作的因果先序操作,若不是則將該操作節點值為無效。回溯算法的目的是回到操作產生時的文本狀態,也就是僅僅保留因果先序操作。
操作邏輯關系在狀態向量(時間戳)上的體現
通過時間向量的比較我們可以確定操作之間的邏輯關系,提出如下性質:
性質2:定義操作A和操作B分別產生於站點1和站點2他們的時間戳分別為SVa和SVb。
A->B 因果先序 則有SVa<SVb
A||B 並發關系 則有SVa>SVb && SVb>SVa
A<-B 因果后序 則有SVb<SVa
控制算法介紹
當一個來自與R站點的操作O到來時操作的時間戳為SVo,且性質1已經被滿足,則當前時間戳為SVS時站點S的控制算法過程如下所示:
AST控制算法步驟
算法解釋:首先回溯到操作產生時的文本狀態(第一行),然后執行操作加入時間戳(第二、三行),接着更新當前站點時間戳(第四行),最后回溯站點至當前文本狀態(第五行)。
操作執行算法
下面來討論一個操作具體的執行步驟。
操作O是一個刪除操作,則僅需在地址空間中找到操作的相應位置(從左至右對有效節點計數),將操作附着到這個節點上。
操作O是一個插入操作,現在地址空間中找到操作的相應位置(從左至右對有效節點計數),建立一個新的字符節點,初始化節點的標記並把它插入到插入范圍中的一個確定位置。
對於插入操作存在一個問題:根據插入操作的位置僅僅能夠確認插入的位置位於兩個有效節點之間,但並不能夠知道具體位置(兩個有效節點之間可能存在若干個無效節點)。
對於這個問題AST是通過range-scan算法來確定操作的具體插入位置,range-scan的原理在於通過定義TOrder函數來確定操作兩兩之間的全序關系(操作兩兩之間可以直接比較)。TOrder函數的定義如下:
定義5:考慮連個元素CNa和CNb,他對應的操作分別產生至站點a和站點b,並且時間戳分別為SVa和SVb。有TOrder(CNa)<TOrder(CNb)當且僅當:
(1)sum(SVa)<sum(SVb)
(2)sum(SVa)=sum(SVb)且a<b
TOrder是一個全序關系且是傳遞的,也就是說任意兩個節點之間是可比較的。在這個基礎上提出了range-scan算法,CNa和CNb是算法的執行范圍,是兩個相鄰的有效節點,CNnew是將要插入的節點,P表示一個位置:
AST的range-scan算法步驟
算法解釋:range-scan算法可能是初學者最容易弄不懂的地方了,接下來詳細解釋一下他的執行過程。首先在兩個有效節點之間的無效節點分為兩類:因果先序操作節點(算法12-17行)和並發關系操作節點(算法4-11行)。算法的初始化將p賦值為空,將掃描指針CNscan賦值為第一個無效節點。外層循環依次掃描每個無效節點直到遇到有效節點CNb停止並返回位置P。對於因果先序操作節點規定新節點一定插入在其左側,對於並發關系操作節點則按照TOrder函數比較插入在合適的位置。
至此整個AST算法就介紹完了。
聲明
算法步驟圖摘自[5],部分關於算法細節的說明參考了[1,5,6]。
轉發請注明來源 http://www.cnblogs.com/shu-xiaohao/p/5358455.html
參考文獻
[1] 顧寧, 楊江明, 張琦煒. 協同組編輯中基於地址空間轉換的一致性維護方法[J]. 計算機學報, 2007, 30(5):763-774.
[2] Gu N, Yang J, Zhang Q. Consistency maintenance based on the mark & retrace technique in groupware systems[C]// Proceedings of the 2005 International ACM SIGGROUP Conference on Supporting Group Work, GROUP 2005, Sanibel Island, Florida, USA, November 6-9, 2005. 2005:264-273.
[3] L. Lamport. Time, clocks, and the ordering of events in a distributed system. Commun, 7:558–565, 1978.
[4] Ellis C A, Gibbs S J. Concurrency control in groupware systems[J]. Acm Sigmod Record, 1989, 18(2):399-407.
[5] 楊江明. 協同組編輯環境中的數據一致性維護方法[D]. 復旦大學, 2007.
[6] 張琦煒. 大規模協同環境下的實時組編輯技術研究[D]. 復旦大學, 2007.