并發數據結構-1.1 并發的數據結構的設計

原文鏈接,譯文鏈接,譯者:董明鑫,校對:周可人

隨著多個處理器共享同一內存的機器在商業上的廣泛使用,并發編程的藝術也產生了巨大的變化。當前的趨勢向著低功耗芯片級多線程(CMT)發展,所以這樣的機器一定會更加廣泛的被使用。

共享內存多處理器是指并發的執行多個線程的系統,這些線程在共享的內存中通過數據結構通訊和同步。這些數據結構的效率對于性能是很關鍵的,而目前熟練掌握為多處理器機器設計高效數據結構這一技術的人并不多。對大多數人來說,設計并發的數據結構比設計單線程的難多了,因為并發執行的線程可能會多種方式地交錯運行他們的指令,每一種方式會帶來不同的,甚至不符合預期的輸出。這就要求設計者改變他們對運算的認識,理解新的設計方法,采用新的編程工具集。此外,設計可擴展的并發數據結構,使得當機器執行越來越多的并發線程時依舊表現良好也是新的挑戰。本文主要介紹設計并發數據結構的相關挑戰,和一些重要的數據結構相關內容的總結。我們的總結絕不是全面的;相反,我們特意選取了一些能說明設計的關鍵問題的流行的數據結構,希望我們提供了足夠的背景和知識,讓有興趣的讀者接觸那些我們沒有提到的內容。

1.1 并發的數據結構的設計

共享內存多處理器的一些特性使得并發數據結構的設計和校驗比相對應的單線程結構難度顯著增加。

acquire(Lock);

oldval = X;????????????????????????????????????????????????????????????????????????????????????? oldval = X;

X = oldval + 1;??????????????????????????????????????????????????????????????????????????????? X = oldval + 1;

return oldval;??????????????????????????????????????????????????????????????????????????????? ?release(Lock);

return oldval;

圖1.1:順序的和基于鎖機制的fetch-and-inc操作代碼片段

難點的根源在于并發:因為線程是在不同的處理器上并發的執行,而且受操作系統的調度決策、缺頁、中斷等等影響,我們必須按照全部異步的想法來思考,以保證不同的線程能夠隨意交錯的運行。這顯著提升了正確設計并發數據結構的復雜度。

為多處理器系統設計并發的數據結構在性能和可擴展性上也有大量的挑戰。在現代的機器上,處理器和內存的布局、數據在內存中的布局、多處理器體系結構中各個元素間的通信負載全都對性能有影響。此外,正確性和性能兩者聯系非常的緊密:算法的改進在提高性能的同時經常使其更加難以設計和檢驗正確的數據結構實現。

下面的例子闡述了影響數據結構設計的各個多處理器特征。假設我們想要實現一個共享的計數器數據結構,用于支持fetch-and-inc操作,即計數器加一然后返回增加前的值。一個普通的順序fetch-and-inc實現的代碼就如圖1.1中左邊部分所展示的那樣。

如果我們允許多個線程并發地調用fetch-and-inc操作,上述實現運行起來并不正確。來看看原因,注意大多數編譯器會把這份源代碼轉換成機器指令:把 X 的值裝進一個寄存器,然后把寄存器中的值加一,然后再把這個寄存器的值存回 X 。假如計數器初始化為 0 ,兩個不同的處理器并發的執行兩個fetch-and-inc操作。然后就有可能兩個操作都從 X 中讀出 0 ,然后都把 1 存回 X 并且返回 0 。這顯然是不正確的:兩個操作中有一個應該返回 1 。

如上所述,兩個fetch-and-inc操作不正確的交錯結果導致了不正確的行為。一個自然并且普通的方法來阻止這樣的交錯就是用互斥鎖(也被叫做 mutex 或者 lock)。鎖是一個在任意時間點,都是不被(其他線程)獲取,只被一個線程所獲取的構造。如果一個線程 t1 希望獲取已經被另一個線程 t2 所獲取到的鎖,那么 t1 必須等到 t2 釋放這個鎖。

如圖 1.1 右半部分所示,我們能通過鎖機制得到一個正確的順序實現。我們通過阻止所有的交錯來預防壞的交錯。這樣很容易得到一個正確的共享計數器,然而這種簡單是有代價的:鎖機制引發了許多關于性能和軟件工程上的問題。


文章轉自?并發編程網-ifeve.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541340.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

printstream_Java PrintStream close()方法與示例

printstreamPrintStream類close()方法 (PrintStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close the underlying output stream. close()方法用于關閉基礎輸出流。 close() meth…

oracle底層執行順序,select語句結構與執行順序-Oracle

select語句結構與執行順序select語句的結構與執行順序,下面的序號代表執行順序8 SELECT (9)DISTINCT11 1 ROM 3   JOIN 2   ON 4 WHERE 5 GROUP BY 6 WITH {CUBE | ROLLUP}7 HAVING 10 ORDER BY 補…

HDU 4923 Room and Moor(瞎搞題)

瞎搞題啊。找出1 1 0 0這樣的序列,然后存起來,這樣的情況下最好的選擇是1的個數除以這段的總和。然后從前向后掃一遍。變掃邊進行合并。每次合并。合并的是他的前驅。這樣到最后從t-1找出的那條鏈就是最后滿足條件的數的大小。Room and Moor Time Limit:…

java define_Java Long類的define()方法與示例

java define長類解碼()方法 (Long class decode() method) decode() method is available in java.lang package. 在java.lang包中提供了define ()方法 。 decode() method is used to decode the given String value into a Long value. encode()方法用于將給定的String值解碼…

linux修改文件用戶組,linux命令 修改文件、文件夾所屬用戶、用戶組

最近學習hadoop,在替換配置文件的時候,發現老是報錯,沒有權限替換。我們知道如何改變文件的用戶組與擁有者了,那么,什么時候要使用chown或chgrp呢?或許你會覺得奇怪吧?是的,確實有時…

Kotlin 開篇

Kotlin 是一個基于 JVM 的新的編程語言,由 JetBrains 開發官網地址:http://kotlinlang.org。JetBrains,作為目前廣受歡迎的 Java IDE IntelliJ 的提供商,在 Apache 許可下已經開源其Kotlin 編程語言。開源地址:https:/…

inputstream示例_Java InputStream close()方法與示例

inputstream示例InputStream類close()方法 (InputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this InputStream and free all system resources linked with this stream…

linux下的文件系統,Linux根文件系統(“/”文件系統)下的目錄介紹

Linux下的文件存儲與Windows完全不同,Windows將系統文件存儲在系統盤(比如說C:\下)Linux根本沒有盤符到概念只有一個根文件系/,各個磁盤分區掛載在/media/下(或者/mnt/下)/下到如/etc,/proc,/bin,/dev,lib等很是讓用慣了Windows的用戶不解,下…

greenlet 詳解

greenlet初體驗回到頂部Greenlet是python的一個C擴展,來源于Stackless python,旨在提供可自行調度的‘微線程’, 即協程。generator實現的協程在yield value時只能將value返回給調用者(caller)。 而在greenlet中,target.switch&am…

Java Calendar toString()方法與示例

日歷類toString()方法 (Calendar Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is used to string denotations of the calendar object. toString()方法用于對日歷對象的符號進行字…

linux虛擬機怎么看var文件,一種獲取Linux虛擬機內部日志的方法

一種獲取Linux虛擬機內部日志的方法【技術領域】[0001]本發明涉及云計算管理技術領域,特別是指一種獲取Linux虛擬機內部日志的方法。【背景技術】[0002]在云計算環境下,虛擬機被廣泛使用,對于虛擬機的維護要求越來越高,當虛擬機出…

詳細圖解mongodb 3.4.1 win7x64安裝

原文:http://www.cnblogs.com/yucongblog/p/6895983.html 詳細圖解,記錄 win7 64 安裝mongo數據庫的過程。安裝的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4.1-signed。 我下載的源文件:mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed我…

java calendar_Java Calendar complete()方法與示例

java calendarCalendar類的complete()方法 (Calendar Class complete() method) complete() method is available in java.util package. complete()方法在java.util包中可用。 complete() method is used to fills in any non-set fields in the calendar fields. complete()方…

LXD 2.0 系列(十二):調試,及給 LXD 做貢獻

介紹 終于要結束了!這個大約一年前開始的這系列文章的最后一篇博文。 LXD 入門安裝與配置你的第一個 LXD 容器資源控制鏡像管理遠程主機及容器遷移LXD 中的 DockerLXD 中的 LXD實時遷移LXD 和 JujuLXD 和 OpenStack調試,及給 LXD 做貢獻如果你從一開始就…

linux用ping命令測試網速,linux下面使用命令測試網速

大家都知道在speedtest是市面上最準確最全面的測速工具,但在linux命令行不能直接使用,所以我們就借助腳本調用speedtest的接口來利用他測試網速。1.下載speedtest-cli腳本:下載地址:https://raw.githubusercontent.com/sivel/spee…

Java ArrayList isEmpty()方法與示例

ArrayList類isEmpty()方法 (ArrayList Class isEmpty() method) isEmpty() method is available in java.util package. isEmpty()方法在java.util包中可用。 isEmpty() method is used to check whether this Arraylist is "empty" or "not empty". isEmp…

linux家用系統版本,查看linux系統版本

篇一:linux下如何查看系統和內核版本linux下如何查看系統和內核版本 1. 查看內核版本命令:1) [rootq1test01 ~]# cat /proc/versionLinux version 2.6.9-22.ELsmp (bhcompilecrowe.devel.redhat.com) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1…

python中locked_Python鎖類| 帶示例的locked()方法

python中lockedPython Lock.locked()方法 (Python Lock.locked() Method) locked() is an inbuilt method of the Lock class of the threading module in Python. Locked()是Python中線程模塊的Lock類的內置方法。 This method returns True if the lock is acquired by a th…

rocksdb ubuntu c++源碼編譯測試

2019獨角獸企業重金招聘Python工程師標準>>> 環境: ubuntu16.4 需要安裝 snappy gflage bz2 zstd 以及g 其中zstd是facebook開放源代碼里的壓縮的庫 git clone https://github.com/facebook/rocksdb.git cd rocksdb make static_lib 成功生成 librocksd…

vs生成linux服務器程序,從Visual Studio到Linux上調試C++代碼

從Visual Studio到Linux上調試C代碼04/30/20155 分鐘可看完本文內容[原文發表時間] 2015/4/29 10:00 PM正如您可能已經聽說的那樣,Visual Studio 2015新推出了對Android開發的GDB支持。有趣的是,因為這項功能依賴GDB調試,我們完全可能稍加改動…