如何理解「不要通過共享記憶體來通訊,而應該通過通訊來共享記憶體」?
使用共享記憶體的話在多執行緒的場景下為了處理競態,需要加鎖,使用起來比較麻煩。另外使用過多的鎖,容易使得程式的**邏輯堅澀難懂,並且容易使程式死鎖,死鎖了以後排查問題相當困難,特別是很多鎖同時存在的時候。
共享記憶體會涉及到多個執行緒同時訪問修改資料的情況,那得保證資料的安全性,可見性,那就會加鎖,加鎖會讓並行變為序列,cpu也忙於執行緒搶鎖。不如換一種方式,把資料複製乙份,每個執行緒有自己的,只要乙個執行緒幹完一件事其他執行緒不用去搶鎖了,這就是一種通訊方式,把共享的以通知方式交給執行緒,實現併發。
其實如果從分布式的角度來理解,就會比較明了了。
打比方,ab兩個程序共同對同乙個訊息佇列進行操作,那麼,如果使用共享記憶體的話,是不是這兩個程序就必須侷限在同乙個物理機上,那麼通訊的意義就大大縮小了。
如果在設計的時候,對於訊息佇列,只提供讀寫介面,而對於內部的實現你完全不用去在意,看起來訊息佇列就像是共享記憶體一樣了。然而你的訊息佇列可以利用socket進行通訊。
所以,上述這句話,不要用共享記憶體實現通訊是指不要讓程式一開始就侷限在單機上,而是利用通訊,也就是封裝內部實現,提供介面的方式來進行相應的操作。
並行方法總結:
1、按並行分類
(1)阻塞(非並行):
(2)批次並行:
multiprocessing.process() #只能一批一批地新增程序,同一批次內並行
(3)非同步:
非同步執行指的是一批子程序並行執行,且子程序完成乙個,就新開始乙個,而不必等待同一批其他程序完成。包括:
PHP程序通訊基礎之訊號量與共享記憶體通訊
由於程序之間誰先執行並不確定,這取決於核心的程序排程演算法,其中比較複雜。由此有可能多程序在相同的時間內同時訪問共享記憶體,從而造成不可預料的錯誤。訊號量這個名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。semaphore 英 sem f r vt.發出訊號,打旗語 類似於指揮官的作用。下...
程序間通訊 訊息佇列與共享記憶體與訊號量
訊息佇列 訊息佇列是訊息的鏈結表 存放在核心中並由訊息佇列識別符號標識。訊息佇列 同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。訊號量 可以被多個程序共享...
程序通訊 共享記憶體
定義 共享記憶體,就是通過核心操作,在記憶體上開闢一塊供多個程序共同訪問的記憶體塊。這塊記憶體塊的建立和 銷毀是由核心來控制 當然,也可以在程序內部呼叫系統庫函式來建立和銷毀,類似於訊息機制和訊號 量機制 在這個記憶體塊上,程序可以像操作記憶體一樣操作共享區記憶體。作用 第乙個,就是提供程序間大資訊...