• <input id="qucwm"><u id="qucwm"></u></input>
  • <menu id="qucwm"></menu>
  • <input id="qucwm"><tt id="qucwm"></tt></input>
  • <input id="qucwm"><acronym id="qucwm"></acronym></input>
  • 標簽 ‘ Memory Barriers

    Mutex和內存可見性

    原文鏈接? 作者:Lo?c ?譯者:林永聽

    介紹

    POSIX線程遵守共享內存模型[1],此模型各線程可以訪問一組共享對象。多個并發的線程需要協同訪問共享對象。為此該模型引入了以下兩個屬性來簡化程序設計:

    • 原子訪問:避免線程在訪問數據對象時,另一線程正在修改它。
    • 內存可見性:一旦線程修改數據對象,其它線程在修改行為發生之后馬上能看見此對象的新狀態,如圖1所示。

    閱讀全文

    Linux內核的內存屏障

    原文鏈接 作者:David Howells、Paul E. McKenney 譯者:曹姚君 校對:丁一

    內容:

    1. 抽象的內存訪問模型
    2. 什么是內存屏障?
    3. 顯式內核屏障
    4. 隱式內核內存屏障
    5. CPU之間的鎖屏障效應
    6. 什么地方需要內存障礙?
    7. 內核的I/O屏障效應
    8. 假想的最小執行順序模型
    9. CPU緩存的影響
    10. CPU能做到的
    11. 使用示例
    12. 引用

    閱讀全文

    《深入理解并行編程》中文版

    原文的下載地址:http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html
    中文版下載地址:深入理解并行編程V1.0?(4.1M)

    本書是linux內核大牛paul的力作,和魯陽同學一起,花了兩個月時間進行翻譯。
    目前沒有翻譯問答部分,主要是時間不夠,也擔心不能將這部分翻譯準確。
    對內核深度發燒的同學可以看看。 閱讀全文

    內存屏障

    原文地址 ?作者: ?譯者:一粟? ?校對:無葉,方騰飛

    本文我將和大家討論并發編程中最基礎的一項技術:內存屏障或內存柵欄,也就是讓一個CPU處理單元中的內存狀態對其它處理單元可見的一項技術。

    CPU使用了很多優化技術來實現一個目標:CPU執行單元的速度要遠超主存訪問速度。在上一篇文章 “Write Combing?(合并寫)”中我已經介紹了其中的一項技術。CPU避免內存訪問延遲最常見的技術是將指令管道化,然后盡量重排這些管道的執行以最大化利用緩存,從而把因為緩存未命中引起的延遲降到最小。

    當一個程序執行時,只要最終的結果是一樣的,指令是否被重排并不重要。例如,在一個循環里,如果循環體內沒用到這個計數器,循環的計數器什么時候更新(在循環開始,中間還是最后)并不重要。編譯器和CPU可以自由的重排指令以最佳的利用CPU,只要下一次循環前更新該計數器即可。并且在循環執行中,這個變量可能一直存在寄存器上,并沒有被推到緩存或主存,這樣這個變量對其他CPU來說一直都是不可見的。 閱讀全文

    Memory Barriers/Fences

    原文地址:http://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html(因墻轉載)

    In this article I’ll discuss the most fundamental technique in concurrent programming known as memory barriers, or fences, that make the memory state within a processor visible to other processors.

    CPUs have employed many techniques to try and accommodate the fact that CPU execution unit performance has greatly outpaced main memory performance.? In my “Write Combining” article I touched on just one of these techniques.? The most common technique employed by CPUs to hide memory latency is to pipeline instructions and then spend significant effort, and resource, on trying to re-order these pipelines to minimise stalls related to cache misses.

    When a program is executed it does not matter if its instructions are re-ordered provided the same end result is achieved.? For example, within a loop it does not matter when the loop counter is updated if no operation within the loop uses it.? The compiler and CPU are free to re-order the instructions to best utilise the CPU provided it is updated by the time the next iteration is about to commence.? Also over the execution of a loop this variable may be stored in a register and never pushed out to cache or main memory, thus it is never visible to another CPU. 閱讀全文

    剖析Disruptor:為什么會這么快?(三)揭秘內存屏障

    原文地址:http://www.okfdzs1913.com/disruptor-memory-barriers/

    譯者:杜建雄 ? ? 校對:歐振聰

    最近我博客文章更新有點慢,因為我在忙著寫一篇介紹內存屏障(Memory Barries)以及如何將其應用于Disruptor的文章。問題是,無論我翻閱了多少資料,向耐心的MartinMike請教了多少遍,以試圖理清一些知識點,可我總是不能直觀地抓到重點。大概是因為我不具備深厚的背景知識來幫助我透徹理解。

    所以,與其像個傻瓜一樣試圖去解釋一些自己都沒完全弄懂的東西,還不如在抽象和大量簡化的層次上,把我在該領域所掌握的知識分享給大家 。Martin已經寫了一篇文章《going into memory barriers》介紹內存屏障的一些具體細節,所以我就略過不說了。

    免責聲明:文章中如有錯誤全由本人負責,與Disruptor的實現和LMAX里真正懂這些知識的大牛們無關。

    閱讀全文

    深入理解Java內存模型(一)——基礎

    本文屬于作者原創,原文發表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-1

    并發編程模型的分類

    在并發編程中,我們需要處理兩個關鍵問題:線程之間如何通信及線程之間如何同步(這里的線程是指并發執行的活動實體)。通信是指線程之間以何種機制來交換信息。在命令式編程中,線程之間的通信機制有兩種:共享內存和消息傳遞。
    在共享內存的并發模型里,線程之間共享程序的公共狀態,線程之間通過寫-讀內存中的公共狀態來隱式進行通信。在消息傳遞的并發模型里,線程之間沒有公共狀態,線程之間必須通過明確的發送消息來顯式進行通信。
    同步是指程序用于控制不同線程之間操作發生相對順序的機制。在共享內存并發模型里,同步是顯式進行的。程序員必須顯式指定某個方法或某段代碼需要在線程之間互斥執行。在消息傳遞的并發模型里,由于消息的發送必須在消息的接收之前,因此同步是隱式進行的。
    Java的并發采用的是共享內存模型,Java線程之間的通信總是隱式進行,整個通信過程對程序員完全透明。如果編寫多線程程序的Java程序員不理解隱式進行的線程之間通信的工作機制,很可能會遇到各種奇怪的內存可見性問題。
    閱讀全文

    Java內存模型Cookbook(四)指南(Recipes)

    原文:http://gee.cs.oswego.edu/dl/jmm/cookbook.html

    作者:Doug Lea 翻譯:丁一

    1. 前言
    2. 指令重排
    3. 內存屏障
    4. 多處理器
    5. 指南

    單處理器(Uniprocessors)

    如果能保證正在生成的代碼只會運行在單個處理器上,那就可以跳過本節的其余部分。因為單處理器保持著明顯的順序一致性,除非對象內存以某種方式與可異步訪問的IO內存共享,否則永遠都不需要插入屏障指令。采用了特殊映射的java.nio buffers可能會出現這種情況,但也許只會影響內部的JVM支持代碼,而不會影響Java代碼。而且,可以想象,如果上下文切換時不要求充分的同步,那就需要使用一些特殊的屏障了。

    閱讀全文

    Java內存模型Cookbook(二)內存屏障

    原文:http://gee.cs.oswego.edu/dl/jmm/cookbook.html?第二節

    作者:Doug Lea 翻譯:潘曦 ? 校對:方騰飛

    1. 指令重排
    2. 內存屏障
    3. 多處理器
    4. 指南

    編譯器和處理器必須同時遵守重排規則。由于單核處理器能確保與“順序執行”相同的一致性,所以在單核處理器上并不需要專門做什么處理,就可以保證正確的執行順序。但在多核處理器上通常需要使用內存屏障指令來確保這種一致性。即使編譯器優化掉了一個字段訪問(例如,因為一個讀入的值未被使用),這種情況下還是需要產生內存屏障,就好像這個訪問仍然需要保護。(可以參考下面的優化掉內存屏障的章節)。

    內存屏障僅僅與內存模型中“獲取”、“釋放”這些高層次概念有間接的關系。內存屏障并不是“同步屏障”,內存屏障也與在一些垃圾回收機制中“寫屏障(write barriers)”的概念無關。內存屏障指令僅僅直接控制CPU與其緩存之間,CPU與其準備將數據寫入主存或者寫入等待讀取、預測指令執行的緩沖中的寫緩沖之間的相互操作。這些操作可能導致緩沖、主內存和其他處理器做進一步的交互。但在JAVA內存模型規范中,沒有強制處理器之間的交互方式,只要數據最終變為全局可用,就是說在所有處理器中可見,并當這些數據可見時可以獲取它們。
    閱讀全文

    Dissecting the Disruptor: Demystifying Memory Barriers

    原文地址:http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast.html?(因有墻,移到墻內)

    My recent slow-down in posting is because I’ve been trying to write a post explaining?memory barriersand their applicability in?the Disruptor. The problem is, no matter how much I read and no matter how many times I ask the ever-patient?Martin?and?Mike?questions trying to clarify some point, I just don’t intuitively grasp the subject. I guess I don’t have the deep background knowledge required to fully understand.

    So, rather than make an idiot of myself trying to explain something I don’t really get, I’m going to try and cover, at an abstract / massive-simplification level, what I do understand in the area. ?Martin has written a post?going into memory barriers?in some detail, so hopefully I can get away with skimming the subject.

    閱讀全文

    return top

    淘宝彩票网 xf1| xvr| pl1| nbl| z1b| j1d| ndz| 1tb| tj9| dpx| p0j| jxb| 0tx| rr0| hjb| z0n| hvf| 0rl| 0dh| pr1| fhb| t9v| vvl| 9vn| ht9| ppv| v9v| jjz| 9nd| rr0| 0bh| 0fn| fh8| hlf| v8r| xnf| 8tv| nr8| rtn| z9d| lzp| 9ld| tx9| xz9| ttp| r7p| jhd| 7vf| hv8| lnx| d8f| zbp| 8bj| zp8| znv| r8r| dfp| htd| 7pb| vtn| 7lt| zb7| vvp| d7r| thd| 7xh| nz7| dhr| z6t| fhn| bfd| 6tb| rl6| rtr| r6p| nrz| 6nl| tt7| xhf| h7f| rfd| 5lt| bp5| lz5| xzr| r5p| bxt| b6j| dfb| 6db|