併發神器CSP的前世今生

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"本文轉自“雨夜隨筆”公衆號,歡迎關注。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"程序架構的研究在上世紀七八十年代還處於原始階段,當時的大部分研究都在研究如何編寫順序代碼,而現在所熟知的goto語句那時也正在被討論,還沒有正式引入。而面向對象的範式正在悄悄的變成編程的基石。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一切都顯得風平浪靜,好像一切都在隨着預想的慢慢發展。這時"},{"type":"text","marks":[{"type":"strong"}],"text":"Charles"},{"type":"text","text":" "},{"type":"text","marks":[{"type":"strong"}],"text":"Antony"},{"type":"text","text":" "},{"type":"text","marks":[{"type":"strong"}],"text":"Richard"},{"type":"text","text":" "},{"type":"text","marks":[{"type":"strong"}],"text":"Hoare (簡稱Tony Hoare)"},{"type":"text","text":"發現了一個問題,那就是併發沒有得到太多的關注,於是他開始着手解決這個問題。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"Tony Hoare"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c7/c74ffbaf965c73baabd3919dcbf5530c.jpeg","alt":"image","title":"image","style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說起"},{"type":"text","marks":[{"type":"strong"}],"text":"Tony Hoare"},{"type":"text","text":",初聽比較陌生。但是他的另一項研究很多程序員不會陌生,那就是排序算法中的"},{"type":"text","marks":[{"type":"strong"}],"text":"快速排序算法(Quick Sort)"},{"type":"text","text":"。而這個聞名於世的算法是他26歲時發明的,當然除了這些,Tony Hoare在程序設計語言的定義、設計、數據結構、算法和操作系統等許多方面都有很多影響深遠的成果。並因爲“對程序設計語言的定義和設計方面的基礎性貢獻”在1980年獲得圖靈獎。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Hoare在發明快速排序後的第二年,接到了新的任務,爲公司的新機器設計一個新的高級語言,而當時他正好搞到一份Algol 60報告的複印件,並參加了Dijkstra(學算法的時候大部分人都聽過Dijkstra算法,沒錯,就是這個人發明的)等人劇本的Algol 60培訓班。當時Hoare學着學着就想,不如直接把Algol 60在公司的新機器上進行實現。於是Hoare把這個想法提交給公司,在公司同意後,開始設計和實現Algol 60的一個自己版本。Hoare在一開始就制定了明確的目標,即系統要安全可靠,生成的目標碼要簡潔,工作區數據要緊湊,過程和函數的人口和出口要清晰、嚴密等,還明確了整個編譯過程採用一次掃描等原則。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而這次實現不僅十分順利,並且大受歡迎,在世界各國開發的Algol 60版本中效率、可靠性和方便性都非常出色。因此得到了國際學術界的重視。國際信息處理聯盟於是任命霍爾爲2.1工作組(Working Group 2.1)的負責人,這個工作組的任務是維護和發展Algol。霍爾果然不負衆望,主持設計了Algol X以繼承與發展Algol 60。正是在Algol X的設計中,霍爾發明了"},{"type":"text","marks":[{"type":"strong"}],"text":"CASE語句"},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Hoare還有很多重要的研究和成果。而我們今天要說的CSP理論就是其中非常重要的一點。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"CSP"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2c/2c146f4433df559951445db9e5b69c66.png","alt":"image.png","title":"image.png","style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Hoare在發現併發操作沒有引起過多的關注後,開始着手進行解決。終於在1978年,Hoare在ACM中發表了經典的“"},{"type":"text","marks":[{"type":"strong"}],"text":"Communicating Sequential Processes"},{"type":"text","text":"”論文。在這篇論文中,Hoare認爲輸入和輸出是兩個被忽略的編程原語,尤其在併發代碼中。於是Hoare在CSP論文中展示瞭如何應用通信來建模輸入和輸出,並提供瞭如何用CSP來解決一些併發問題,比如尋找10000以內的素數。通過這種方式最終達到“在進程間正確的通信”。當然這個思想在當時是非常超前的,事實上,1978年的論文中,CSP只是一個用來展示通信順序進程的能力的一個簡單的編程語言。連Hoare本身都覺得這個想法過於超前而有些不切實際,他直接在論文中悲觀的寫道:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"Thus the concepts and notations introduced in this paper (although described in the next section in the form of a programming language fragment) should not be regarded as suitable for use as a programming language, either for abstract or for concrete programming. They are at best only a partial solution to the problems tackled."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文介紹的概念和符號應該不被認爲適合作爲一種編程語言,無論是抽象的還是具體的編程。他們最多隻是一種解決問題的方式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Hoare擔心自己所展示的技術對於未來的併發編程的研究並沒有任何作用,這種技術或許沒有語言能夠按照他的想法來實現。但是接下來的6年裏,關於CSP的想法被提煉成對併發系統進行數學建模的方法--進程微積分。並提供了代數規則來對系統進行變化來分析它們的併發和效率。而這正式將CSP的想法投入到併發編程的實踐中。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"Go語言"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/fd/fdbfde52926c4baaaf595157091372f8.jpeg","alt":"image","title":"image","style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在CSP提出後,有些語言嘗試將Hoare提出的輸入和輸出作爲原語納入到自己的語言體系中,比如OCCAM併發處理語言。和傳統的加鎖方式不同,CSP理論中不允許進程對其他進程的變量賦值,進程之間只能通過通信原語來實現數據交換和協作。但是這些語言都沒能真正地爲這些原語提供支持。大多數流行語言都支持共享和內存訪問同步到CSP的消息傳遞樣式。而採用CSP理論的語言也有,但是基本都沒有得到廣泛的採用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"直到Go語言出現,正式將CSP的原則納入到核心原則,並提供了通信的原語支持channel。正因爲如此,併發被認爲是Go語言的優勢之一。並讓Go語言在分佈式系統、雲原生系統和系統中間件中迅速佔領了市場。而其他語言基於共享內存的併發模型,在大型和複雜系統中變得很難正確使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然Go還有其侷限性,因爲CSP的理解成本問題,Go同時也支持傳統的加鎖方式,也支持共享內存的方式。不過Go已經向其他語言證明CSP的可行性和優越處。並且提出了經典的CSP核心概念:"}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"Do not communicate by sharing memory; instead, share memory by communicating."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"“不要以共享內存的方式來通信,相反,要通過通信來共享內存。”"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而由於Go語言的推廣和效果,使得CSP的概念變得流行起來,目前很多語言在嘗試將CSP納入到語言體系中並提供對Hoare提出原語的支持。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c9/c939a3a0dd5faddfd4735ad855b3f940.jpeg","alt":null,"title":"歡迎關注","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"https://mp.weixin.qq.com/s?__biz=Mzg4MTIwMTkxNQ==&mid=2247483984&idx=1&sn=fcb9059af0683f376c0e5217eb34948d&chksm=cf68c5c4f81f4cd20ea522e5a74aac33bc41bc80e637297d247fbe03d340b5efb154b270ed79&scene=126&sessionid=1598237124&key=8723f2e63c89806b326e12d15b3035df06d4e5417a59f8e122596b47e313a1114c3fb61710f299a02486636efbb1fdc79595ed216330c39c417366566330e3b6b828c727b23e4f04c45b2cc846c2dba3ceceaddbbd5f307aaa079e5a8aa9a03b312fe8127775596fa1a00abe78f5115f19dd9794190089d10fb2107bfe661520&ascene=1&uin=NTkyMjg4NQ%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AQi0GXuW4X8tGiEPZLGcpsU%3D&pass_ticket=yNZPWKpTbcA3%2FE%2B88J6cWPMPQdU940sRHRL4IUkzBPg%3D","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"參考鏈接"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"計算機科學名人堂:Charles Antony Richard Hoare:"},{"type":"link","attrs":{"href":"http://wap.sciencenet.cn/blog-1225851-839515.html","title":null},"content":[{"type":"text","text":"http://wap.sciencenet.cn/blog-1225851-839515.html"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Go語言CSP:通信順序進程簡述:"},{"type":"link","attrs":{"href":"https://tsov.net/uupee/17044/","title":null},"content":[{"type":"text","text":"https://tsov.net/uupee/17044/"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"CSP 1978論文:"},{"type":"link","attrs":{"href":"https://spinroot.com/courses/summer/Papers/hoare_1978.pdf?__cf_chl_captcha_tk__=637000f92bddaa467d97d4404b8c86d40e787bda-1590473325-0-AfwfleSjOLTLNc9NlYQOaERH30eugvvD_pZCpJQp1BuLY7h8FMzdU-1g6gibzt0oPufEBr6ny7EMfaDuavQM9RoUnT5c1kqmUsycipyMJOPCp7-be5mLk7qFSZZm0dWcHb2HuOTkKQpAdCMgqSC4mBSfZ8UvZWjJ3v6kFE6MfP3BnQBtubXk88o3Twg3k8pd8W7xECjsYgSeyLB3xxq9y4-cpagfl0piK4i9QA00A2-Vm5usNU_WVevL5u-tepVkPdZpm8WQITYmKVeU_dTsBWv7Gpal-a1qATffyGGhAweQWYoDSpoO6uj8get5D_7cGe6jkzJEXaq04kHOABe9Us9BKs6qNOV7lE-Xdk7q1EKV","title":null},"content":[{"type":"text","text":"https://spinroot.com/courses/summer/Papers/hoare_1978.pdf?__cf_chl_captcha_tk__=637000f92bddaa467d97d4404b8c86d40e787bda-1590473325-0-AfwfleSjOLTLNc9NlYQOaERH30eugvvD_pZCpJQp1BuLY7h8FMzdU-1g6gibzt0oPufEBr6ny7EMfaDuavQM9RoUnT5c1kqmUsycipyMJOPCp7-be5mLk7qFSZZm0dWcHb2HuOTkKQpAdCMgqSC4mBSfZ8UvZWjJ3v6kFE6MfP3BnQBtubXk88o3Twg3k8pd8W7xECjsYgSeyLB3xxq9y4-cpagfl0piK4i9QA00A2-Vm5usNU_WVevL5u-tepVkPdZpm8WQITYmKVeU_dTsBWv7Gpal-a1qATffyGGhAweQWYoDSpoO6uj8get5D_7cGe6jkzJEXaq04kHOABe9Us9BKs6qNOV7lE-Xdk7q1EKV"}]}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章