第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang 與 Hoare 的 CSP-Language 的主要區(qū)別

Golang 與 Hoare 的 CSP-Language 的主要區(qū)別

Go
瀟湘沐 2021-11-08 16:06:43
看看來自 Tony Hoare 1978 年開創(chuàng)性論文中的例子的聲明:Go 的設(shè)計(jì)深受 Hoare 論文的影響。盡管 Go 與論文中使用的示例語(yǔ)言有很大不同,但這些示例仍然很容易翻譯。除了語(yǔ)法之外,最大的區(qū)別是 Go 將并發(fā)通信的管道明確建模為通道,而 Hoare 語(yǔ)言的進(jìn)程直接向彼此發(fā)送消息,類似于 Erlang。Hoare 在第 7.3 節(jié)中暗示了這種可能性,但有“每個(gè)端口都恰好連接到另一個(gè)進(jìn)程中的另一個(gè)端口”的限制,在這種情況下,這將是一個(gè)主要的語(yǔ)法差異。我糊涂了。Hoare 語(yǔ)言中的進(jìn)程直接相互通信。Go 例程也直接相互通信,但使用通道。那么在golang中有什么影響有限制。真正的區(qū)別是什么?
查看完整描述

3 回答

?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊

答案需要更全面地了解 Hoare 在 CSP 方面的工作。他的工作進(jìn)展可以概括為三個(gè)階段:

  • 基于 Dijkstra 的信號(hào)量,Hoare 開發(fā)了監(jiān)視器。這些在 Java 中使用,除了 Java 的實(shí)現(xiàn)包含一個(gè)錯(cuò)誤(參見 Welch 的文章Wot No Chickens)。不幸的是,Java 忽略了 Hoare 的后期工作。

  • CSP由此而生。最初,CSP 需要從進(jìn)程 A 到進(jìn)程 B 的直接交換。這種集合方法被 Ada 和 Erlang 使用。

  • CSP 于 1985 年完成,當(dāng)時(shí)他的書首次出版。CSP 的最終版本包括 Go 中使用的通道。David May 與牛津大學(xué)的 Hoare 團(tuán)隊(duì)一起開發(fā)了Occam,這是一種有意將 CSP 融入實(shí)用編程語(yǔ)言的語(yǔ)言。CSP 和 Occam 相互影響(例如在The Laws of Occam Programming 中)。多年來,Occam 只在 Transputer 處理器上可用,它的架構(gòu)適合 CSP。最近,Occam 已針對(duì)其他處理器進(jìn)行開發(fā),并且還吸收了 Pi 演算以及其他通用同步原語(yǔ)。

因此,要回答最初的問題,將 Go 與 CSP 和 Occam 進(jìn)行比較可能會(huì)有所幫助。

  1. 通道:CSP、Go 和 Occam 都具有相同的通道語(yǔ)義。此外,Go 可以輕松地將緩沖添加到通道中(Occam 沒有)。

  2. 選擇:CSP 定義了內(nèi)部外部選擇。但是,Go 和 Occam 都有一種選擇:在 Go 中選擇,在 Occam 中選擇ALT。事實(shí)證明,有兩種 CSP 選擇在實(shí)際語(yǔ)言中不太重要。

  3. Occam 的ALT允許條件保護(hù),但 Go 的select不允許(有一個(gè)解決方法:可以將通道別名設(shè)置為nil以模仿相同的行為)。

  4. 移動(dòng)性:Go 允許通過通道發(fā)送通道端(連同其他數(shù)據(jù))。這創(chuàng)建了一個(gè)動(dòng)態(tài)變化的拓?fù)浣Y(jié)構(gòu),超出了 CSP 中的可能性,但 Milner 的 Pi 演算(從他的 CCS 中)被開發(fā)來描述這樣的網(wǎng)絡(luò)。

  5. 進(jìn)程:goroutine 是一個(gè)分叉的進(jìn)程;它在它想要的時(shí)候終止并且它沒有父級(jí)。這不像 CSP / Occam,其中的過程是組合式的。

一個(gè)例子在這里會(huì)有所幫助:首先是奧卡姆(nb 縮進(jìn)很重要)

SEQ

  PAR

    processA()

    processB()

  processC()

其次去


go processA()

go processB()

processC()

在 Occam 案例中,processC 直到 processA 和 processB 都終止后才會(huì)啟動(dòng)。在 Go 中,processA 和 processB 很快分叉,然后 processC 直接運(yùn)行。


共享數(shù)據(jù):CSP 并不真正直接關(guān)注數(shù)據(jù)。但有趣的是,Go 和 Occam 在共享數(shù)據(jù)方面存在重要差異。當(dāng)多個(gè) goroutine 共享一組公共數(shù)據(jù)變量時(shí),可能出現(xiàn)競(jìng)爭(zhēng)條件;Go 出色的競(jìng)態(tài)檢測(cè)器有助于消除問題。但 Occam 采取不同的立場(chǎng):在編譯時(shí)阻止共享可變數(shù)據(jù)。


別名:與上述相關(guān),Go 允許多個(gè)指針指向每個(gè)數(shù)據(jù)項(xiàng)。Occam 中不允許使用此類別名,從而減少檢測(cè)競(jìng)爭(zhēng)條件所需的工作量。


后兩點(diǎn)與 Hoare 的 CSP 相關(guān),而更多地與 May 的 Occam 相關(guān)。但它們是相關(guān)的,因?yàn)樗鼈冎苯由婕鞍踩l(fā)編碼。


查看完整回答
反對(duì) 回復(fù) 2021-11-08
?
長(zhǎng)風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

這正是重點(diǎn):在 Hoare 的初始論文(以及 Erlang)中使用的示例語(yǔ)言中,進(jìn)程 A 直接與進(jìn)程 B 對(duì)話,而在 Go 中,goroutine A 與通道 C 對(duì)話,goroutine B 在 Go the channels 中監(jiān)聽通道 CIe是顯式的,而在 Hoare 的語(yǔ)言和 Erlang 中,它們是隱式的。



查看完整回答
反對(duì) 回復(fù) 2021-11-08
?
鳳凰求蠱

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊

最近,我一直在深入研究 Go 的通道,并且在并發(fā)和并行方面工作了很多年,盡管我永遠(yuǎn)無(wú)法自稱了解這方面的一切。

我認(rèn)為您要問的是向頻道發(fā)送消息和直接向彼此發(fā)送消息之間的細(xì)微區(qū)別是什么?如果我理解你,快速回答很簡(jiǎn)單。

發(fā)送到通道為通道兩側(cè)的并行/并發(fā)提供了機(jī)會(huì)。美觀,可擴(kuò)展。

我們生活在一個(gè)并發(fā)的世界。從 A 向 B 發(fā)送一長(zhǎng)串連續(xù)的消息(異步)意味著 B 需要以與 A 發(fā)送消息幾乎相同的速度處理消息,除非有多個(gè) B 實(shí)例有機(jī)會(huì)處理從通道,從而分擔(dān)工作量。

關(guān)于通道的好處是你可以有許多生產(chǎn)者/接收者 go-routines,它們能夠?qū)⑾⑼扑偷疥?duì)列,或者從隊(duì)列中消費(fèi)并相應(yīng)地處理它。

如果你線性地思考,就像一個(gè)單核 CPU,并發(fā)基本上就像有一百萬(wàn)個(gè)工作要做。知道單核 CPU 一次只能做一件事,但同時(shí)也看到它給人的錯(cuò)覺是很多事情同時(shí)發(fā)生。在執(zhí)行某些代碼時(shí),操作系統(tǒng)需要等待一段時(shí)間才能從網(wǎng)絡(luò)、磁盤、鍵盤、鼠標(biāo)等返回某些內(nèi)容,甚至某些進(jìn)程會(huì)休眠一段時(shí)間,這給操作系統(tǒng)提供了做其他事情的機(jī)會(huì)同時(shí)。這一切都發(fā)生得非???,造成了并行的錯(cuò)覺。

另一方面,并行性是不同的,因?yàn)樵撟鳂I(yè)可以在完全不同的 CPU 上運(yùn)行,獨(dú)立于其他 CPU 的運(yùn)行情況,因此不會(huì)在與其他 CPU 相同的約束下運(yùn)行(盡管大多數(shù)操作系統(tǒng)都做得很好)在確保工作負(fù)載均勻分布以在其所有 CPU 上運(yùn)行時(shí) - 也許 CPU 饑渴、不合作的非操作系統(tǒng)生成代碼除外,但即使如此,操作系統(tǒng)也會(huì)馴服它們。

關(guān)鍵是,擁有多核 CPU 意味著更多的并行性和更多的并發(fā)性可以發(fā)生。

想象一下銀行里的一個(gè)隊(duì)列,它扇出到許多可以幫助你的柜員。如果沒有任何出納員為任何客戶提供服務(wù),則一名出納員選擇處理下一個(gè)客戶并變得忙碌,直到他們都變得忙碌為止。每當(dāng)客戶離開柜員時(shí),該柜員就能夠處理隊(duì)列中的下一位客戶。


查看完整回答
反對(duì) 回復(fù) 2021-11-08
  • 3 回答
  • 0 關(guān)注
  • 285 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)