深入理解Java內存模型(七)——總結

處理器內存模型

順序一致性內存模型是一個理論參考模型,JMM和處理器內存模型在設計時通常會把順序一致性內存模型作為參照。JMM和處理器內存模型在設計時會對順序一致性模型做一些放松,因為如果完全按照順序一致性模型來實現處理器和JMM,那么很多的處理器和編譯器優化都要被禁止,這對執行性能將會有很大的影響。

根據對不同類型讀/寫操作組合的執行順序的放松,可以把常見處理器的內存模型劃分為下面幾種類型:

  1. 放松程序中寫-讀操作的順序,由此產生了total store ordering內存模型(簡稱為TSO)。
  2. 在前面1的基礎上,繼續放松程序中寫-寫操作的順序,由此產生了partial store order 內存模型(簡稱為PSO)。
  3. 在前面1和2的基礎上,繼續放松程序中讀-寫和讀-讀操作的順序,由此產生了relaxed memory order內存模型(簡稱為RMO)和PowerPC內存模型。

注意,這里處理器對讀/寫操作的放松,是以兩個操作之間不存在數據依賴性為前提的(因為處理器要遵守as-if-serial語義,處理器不會對存在數據依賴性的兩個內存操作做重排序)。

下面的表格展示了常見處理器內存模型的細節特征:

內存模型名稱

對應的處理器

Store-Load 重排序

Store-Store重排序

Load-Load 和Load-Store重排序

可以更早讀取到其它處理器的寫

可以更早讀取到當前處理器的寫

TSO

sparc-TSO

X64

Y

???

Y

PSO

sparc-PSO

Y

Y

??

Y

RMO

ia64

Y

Y

Y

?

Y

PowerPC

PowerPC

Y

Y

Y

Y

Y

在這個表格中,我們可以看到所有處理器內存模型都允許寫-讀重排序,原因在第一章以說明過:

它們都使用了寫緩存區,寫緩存區可能導致寫-讀操作重排序。同時,我們可以看到這些處理器內

存模型都允許更早讀到當前處理器的寫,原因同樣是因為寫緩存區:由于寫緩存區僅對當前處理器

可見,這個特性導致當前處理器可以比其他處理器先看到臨時保存在自己的寫緩存區中的寫。

上面表格中的各種處理器內存模型,從上到下,模型由強變弱。越是追求性能的處理器,內存模型設計的會越弱。因為這些處理器希望內存模型對它們的束縛越少越好,這樣它們就可以做盡可能多的優化來提高性能。

由于常見的處理器內存模型比JMM要弱,java編譯器在生成字節碼時,會在執行指令序列的適當位置插入內存屏障來限制處理器的重排序。同時,由于各種處理器內存模型的強弱并不相同,為了在不同的處理器平臺向程序員展示一個一致的內存模型,JMM在不同的處理器中需要插入的內存屏障的數量和種類也不相同。下圖展示了JMM在不同處理器內存模型中需要插入的內存屏障的示意圖:

如上圖所示,JMM屏蔽了不同處理器內存模型的差異,它在不同的處理器平臺之上為java程序員呈現了一個一致的內存模型。

JMM,處理器內存模型與順序一致性內存模型之間的關系

JMM是一個語言級的內存模型,處理器內存模型是硬件級的內存模型,順序一致性內存模型是一個理論參考模型。下面是語言內存模型,處理器內存模型和順序一致性內存模型的強弱對比示意圖:

從上圖我們可以看出:常見的4種處理器內存模型比常用的3中語言內存模型要弱,處理器內存模型和語言內存模型都比順序一致性內存模型要弱。同處理器內存模型一樣,越是追求執行性能的語言,內存模型設計的會越弱。

JMM的設計

從JMM設計者的角度來說,在設計JMM時,需要考慮兩個關鍵因素:

  • 程序員對內存模型的使用。程序員希望內存模型易于理解,易于編程。程序員希望基于一個強內存模型來編寫代碼。
  • 編譯器和處理器對內存模型的實現。編譯器和處理器希望內存模型對它們的束縛越少越好,這樣它們就可以做盡可能多的優化來提高性能。編譯器和處理器希望實現一個弱內存模型。

由于這兩個因素互相矛盾,所以JSR-133專家組在設計JMM時的核心目標就是找到一個好的平衡點:一方面要為程序員提供足夠強的內存可見性保證;另一方面,對編譯器和處理器的限制要盡可能的放松。下面讓我們看看JSR-133是如何實現這一目標的。

為了具體說明,請看前面提到過的計算圓面積的示例代碼:

double pi  = 3.14;    //A
double r   = 1.0;     //B
double area = pi * r * r; //C

上面計算圓的面積的示例代碼存在三個happens- before關系:

  1. A happens- before B;
  2. B happens- before C;
  3. A happens- before C;

由于A happens- before B,happens- before的定義會要求:A操作執行的結果要對B可見,且A操作的執行順序排在B操作之前。 但是從程序語義的角度來說,對A和B做重排序即不會改變程序的執行結果,也還能提高程序的執行性能(允許這種重排序減少了對編譯器和處理器優化的束縛)。也就是說,上面這3個happens- before關系中,雖然2和3是必需要的,但1是不必要的。因此,JMM把happens- before要求禁止的重排序分為了下面兩類:

  • 會改變程序執行結果的重排序。
  • 不會改變程序執行結果的重排序。

JMM對這兩種不同性質的重排序,采取了不同的策略:

  • 對于會改變程序執行結果的重排序,JMM要求編譯器和處理器必須禁止這種重排序。
  • 對于不會改變程序執行結果的重排序,JMM對編譯器和處理器不作要求(JMM允許這種重排序)。

下面是JMM的設計示意圖:

從上圖可以看出兩點:

  • JMM向程序員提供的happens- before規則能滿足程序員的需求。JMM的happens- before規則不但簡單易懂,而且也向程序員提供了足夠強的內存可見性保證(有些內存可見性保證其實并不一定真實存在,比如上面的A happens- before B)。
  • JMM對編譯器和處理器的束縛已經盡可能的少。從上面的分析我們可以看出,JMM其實是在遵循一個基本原則:只要不改變程序的執行結果(指的是單線程程序和正確同步的多線程程序),編譯器和處理器怎么優化都行。比如,如果編譯器經過細致的分析后,認定一個鎖只會被單個線程訪問,那么這個鎖可以被消除。再比如,如果編譯器經過細致的分析后,認定一個volatile變量僅僅只會被單個線程訪問,那么編譯器可以把這個volatile變量當作一個普通變量來對待。這些優化既不會改變程序的執行結果,又能提高程序的執行效率。

JMM的內存可見性保證

Java程序的內存可見性保證按程序類型可以分為下列三類:

  1. 單線程程序。單線程程序不會出現內存可見性問題。編譯器,runtime和處理器會共同確保單線程程序的執行結果與該程序在順序一致性模型中的執行結果相同。
  2. 正確同步的多線程程序。正確同步的多線程程序的執行將具有順序一致性(程序的執行結果與該程序在順序一致性內存模型中的執行結果相同)。這是JMM關注的重點,JMM通過限制編譯器和處理器的重排序來為程序員提供內存可見性保證。
  3. 未同步/未正確同步的多線程程序。JMM為它們提供了最小安全性保障:線程執行時讀取到的值,要么是之前某個線程寫入的值,要么是默認值(0,null,false)。

下圖展示了這三類程序在JMM中與在順序一致性內存模型中的執行結果的異同:

只要多線程程序是正確同步的,JMM保證該程序在任意的處理器平臺上的執行結果,與該程序在順序一致性內存模型中的執行結果一致。

JSR-133對舊內存模型的修補

JSR-133對JDK5之前的舊內存模型的修補主要有兩個:

  • 增強volatile的內存語義。舊內存模型允許volatile變量與普通變量重排序。JSR-133嚴格限制volatile變量與普通變量的重排序,使volatile的寫-讀和鎖的釋放-獲取具有相同的內存語義。
  • 增強final的內存語義。在舊內存模型中,多次讀取同一個final變量的值可能會不相同。為此,JSR-133為final增加了兩個重排序規則。現在,final具有了初始化安全性。

參考文獻

  1. Computer Architecture: A Quantitative Approach, 4th Edition
  2. Shared memory consistency models: A tutorial
  3. Intel? Itanium? Architecture Software Developer’s Manual Volume 2: System Architecture
  4. Concurrent Programming on Windows
  5. JSR 133 (Java Memory Model) FAQ
  6. The JSR-133 Cookbook for Compiler Writers
  7. Java theory and practice: Fixing the Java Memory Model, Part 2

?

?

?

?

來源:http://www.infoq.com/cn/articles/java-memory-model-7?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk

轉載于:https://www.cnblogs.com/94julia/archive/2013/05/30/3107686.html

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

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

相關文章

沉浸式ui設計_有助于沉浸的視頻游戲UI —武器輪

沉浸式ui設計Many action-adventure games rely on the feeling of thrills via bullets, fire, grenade, more bullets, and gigantic booms. The way to enable all these is to offer a massive arsenal, from machetes to assault rifles all the way till bazookas.許多動…

HDU 3068 最長回文

Manacher算法練筆&#xff0c;O(n)求最長回文子串。 參考資料&#xff1a;http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 http://www.felix021.com/blog/read.php?2040 后綴數組和拓展KMP也可以求&#xff0c;不過時間復雜度都是O(nlogn)。 1 #include <cstd…

ux設計師薪水_客戶現在也是UX設計師

ux設計師薪水Some of you probably know by now, I’m not too fond of the monster the UX industry has become. It’s overblown, overcomplicated and often dishonest towards the clients. It’s also in itself undefined. (where is the E in Experience?)你們中的某些…

說說godaddy

俗稱狗他爹&#xff0c;是全世界最大的一級域名注冊和服務商&#xff0c;中國只有國家是一級&#xff0c;萬網等都是2級&#xff0c;如果你的域名是在萬網注冊的&#xff0c;那你就out啦&#xff0c;因為有諸多使用的限制&#xff0c;比如我之前為了試試萬網的域名&#xff0c;…

分步表單_角色創建分步指南

分步表單The first thing most of us designers are taught is the concept of personas and the necessity of them when it comes to UX and product design. However, knowing is different from applying and it can be difficult to know where to begin when we’re aske…

svg配合css3動畫_帶有Adobe Illustrator,HTML和CSS的任何網站的SVG動畫

svg配合css3動畫A top trend in web design for 2020 is the increased use of SVG animations on web pages and in logo design. In this article, we will implement a simple and straight forward method to create relatively complex animation. We will use Adobe Illu…

【原創-長文】openstack 版本D安裝配置及本次安裝中遇到的問題

openstack配置 一、硬件及操作系統要求 硬件&#xff1a;IBM服務器R410 兩臺、網線、顯示器、鍵盤若干&#xff0c;100M光纖&#xff08;硬性要求&#xff09; 操作系統&#xff1a;兩臺服務器均安裝Ubuntu server 12.04 LTS 二、安裝步驟&#xff08;server-1與server-2公共部…

基于pt100溫度計仿真_基于8pt網格的設計系統

基于pt100溫度計仿真重點 (Top highlight)This article is the 2nd in a two part series — to the previous chapter in which I demonstrate how to establish an 8pt grid.本文是該系列文章的第二部分 &#xff0c;這是上一章 的第二部分 &#xff0c;在上一章中&#xff0…

GL ERROR - after deleteUnusedTextures() glError (0x502)

最近用百度提供的javascript API開發地圖時&#xff0c;html頁面在手機瀏覽器中拖動地圖時會出現GL ERROR - after deleteUnusedTextures() glError (0x502)的異常&#xff0c;看了下國外論壇異常的說法&#xff0c;經調試&#xff0c;找出解決辦法&#xff0c;異常原因還是和布…

利用 k8s 建立軟件商店_為企業建立應用商店

利用 k8s 建立軟件商店It’s June 2019. I’m sitting in a conference room in Research Triangle Park in North Carolina. At the end of the table are the two executives that have been tapped to lead a new endeavor on behalf of IBM’s $34 billion acquisition of …

[轉]gcc生成動態庫靜態庫

http://blog.csdn.net/hzn407487204/article/details/5323254轉載于:https://www.cnblogs.com/hengli/archive/2013/06/07/3125354.html

蘋果復興_類型復興的故事:來自Type West的經驗教訓

蘋果復興Last Fall, I began the 去年秋天&#xff0c;我開始 在舊金山的Type West program at the Letterform檔案庫中Letterform Archive in San Francisco. For those of you who don’t know, the Letterform Archive is creative heaven — a type nerd’s letter art co…

C#調用ATL COM

作者&#xff1a;朱金燦 來源&#xff1a;http://blog.csdn.net/clever101 簡單介紹C#程序如何調用ATL編寫的COM組件。 首先新建一個ATL工程&#xff0c;具體如下&#xff1a; 1. 填寫工程名稱和路徑&#xff0c;如下圖&#xff1a; 2. 選擇工程的服務器類型為動態鏈接庫&a…

浪潮世科和浪潮軟件什么關系_社交圖形浪潮

浪潮世科和浪潮軟件什么關系Nowadays, the cornucopia of graphics seems like a given. However, it was not so long ago that infographics were scarce and lived in closed ecosystems. The majority of graphics were published in newspapers, magazines, or books, and…

PHP圖形圖像的典型應用 --常用圖像的應用(驗證碼)

php生成動態的驗證碼&#xff0c;是php防止惡意登陸或者注冊等常規手段-廢話不多說&#xff0c;直接看例子。&#xff08;只是一個簡單的應用&#xff0c;如果要安全或者更復雜的&#xff0c;請期待我以后的文章&#xff09; PHP生成驗證碼核心文件 (checks.php): <?php/*成…

接口練習

前臺代碼&#xff1a; <form id"form1" runat"server"> <div> 見面時間:<asp:TextBox ID"MeetTime" runat"server"></asp:TextBox><br /> 見面地點:<asp:TextBox ID"MeetAddr…

寫saas創業的書_我在SaaS創業公司擔任UX設計師的第一個月中學到的三件事

寫saas創業的書I recently transitioned from being a copywriter at an ad agency to a UX Designer at a SaaS startup. To add more multidisciplinary skills into the mix, I graduated with a Bachelor in Accountancy.我最近從一名廣告代理商的撰稿人過渡到了SaaS初創公…

ui項目答辯中學到了什么_我在UI設計9年中學到的12件事

ui項目答辯中學到了什么重點 (Top highlight)I know these can seem a bit clich but I will try to explain everything from my own experience.我知道這些內容似乎有些陳詞濫調&#xff0c;但我會嘗試根據自己的經驗來解釋所有內容。 第一名 (No.1 Never assume) The first…

linux下命令行的使用:使用sed命令操作文件

用該命令sed刪除文件test.txt中包含某個字符串abc的行: sed /adc/d test.txt >result.txt 在文件test.txt中刪除從開頭到含有某個字符串abc的行 sed 1,/abc/d test.txt >result.txt 獲取文件test.txt中包含字符串abc的行 cat test.txt |grep "abc" > resul…

ux的重要性_UX中清晰的重要性

ux的重要性重點 (Top highlight)Times, since the very first occurrences of web design in the 90’s, have changed a lot design-wise. The particular technology and its applications got more stable. Human-computer interaction (HCI) was deeply researched, design…