国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從CPU的視角看 多線程代碼為什么那么難寫!

這篇具有很好參考價值的文章主要介紹了從CPU的視角看 多線程代碼為什么那么難寫!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??當我們提到多線程、并發(fā)的時候,我們就會回想起各種詭異的bug,比如各種線程安全問題甚至是應用崩潰,而且這些詭異的bug還很難復現(xiàn)。我們不禁發(fā)出了靈魂拷問 “為什么代碼測試環(huán)境運行好好的,一上線就不行了?”。 為了解決線程安全的問題,我們的先輩們在編程語言中引入了各種各樣新名詞,就拿我們熟悉的Java為例,不僅java語言自帶了synchronized、volatile、wait、notify… ,jdk中各種工具包也是層出不窮,就比如單一個Lock,就可以有很多種實現(xiàn),甚至很多人都談鎖色變。

??為什么會出現(xiàn)這種情況,我們得先從CPU和主存(RAM)的關(guān)系說起。 上個世紀80年代,PC機興起的時候,CPU的運算速度只有不到1MHz。放現(xiàn)在你桌上的計算器都可以吊打了它了。那時候就是因為CPU運算慢,它對數(shù)據(jù)存取速度的要求也不那么高,頂多也就1微秒(1000ns)取一次數(shù)據(jù),一次訪存100ns對CPU來說也算不上什么。 然而這么多年過去了,CPU一直在沿著摩爾定律的道路一路狂奔,而內(nèi)存訪問延遲的速度卻一直止步不前。(當然存儲也有非常大的發(fā)展,但主要體現(xiàn)在容量方面,而訪問延時自誕生初就沒什么變化)。

??我們來對比下CPU和內(nèi)存過去幾十年之間的發(fā)展速率:
從CPU的視角看 多線程代碼為什么那么難寫!

??可以看出,在過去40年里, CPU的運算速度增量了上千倍,而內(nèi)存的訪問延時卻沒有太大的變化。 我們就拿當今最先進CPU和內(nèi)存舉例,目前商用的CPU主頻基本都是3GHz左右的(其實十多年前基本上就這個水平了),算下來CPU每做一次運算僅需0.3ns(納秒)。而當前最先進的內(nèi)存,訪問延遲是100ns左右的,中間相差300倍。如果把CPU比作一個打工人的話,那么他的工作狀態(tài)就會是干一天活然后休一年,這休息的一年里等著內(nèi)存里的數(shù)據(jù)過來(真是令人羨慕?。?/p>

??其實CPU的設計者早就意識到了這點,如果CPU真是干1休300的話,未免也太不高效了。在說具體解決方案前,我這里先額外說下內(nèi)存,很多人會好奇為什么主存(RAM)的訪問速度一直上不來? 這個準確來說其實只是DRAM內(nèi)存的速度上不了。存儲芯片的實現(xiàn)方式有兩種,分別是DRAM和SRAM,SRAM的速度其實也一直盡可能跟著CPU在跑的。那為什么不用SRAM來制造內(nèi)存?這個也很簡單,就是因為它存儲密度低而且巨貴(相對于DRAM),所以出于成本考量現(xiàn)在內(nèi)存條都是采用DRAM的技術(shù)制造的。

??SRAM容量小成本高,但速度快,DRAM容量大成本低,但速度慢。這倆能不能搭配使用,取長補短?結(jié)論是肯定的,在計算機科學里有個”局部性原理“,這個原理是計算機科學領(lǐng)域所有優(yōu)化的基石。我這里就單從數(shù)據(jù)訪問的局部性來說,某個位置的數(shù)據(jù)被訪問,那么相鄰于這個位置的數(shù)據(jù)更容易被訪問。那么利用這點,我們是不是可以把當前最可能被用到的小部分數(shù)據(jù)存儲在SRAM里,而其他的部分繼續(xù)保留在DRAM中,用很小的一塊SRAM來當DRAM的緩存,基于這個思路,于是CPU芯片里就有了Cache,CPU的設計者們覺得一層緩存不夠,那就給緩存再加一層緩存,于是大家就看到現(xiàn)在的CPU里有了所謂的什么L1 Cache、L2 Cache, L3 Cache。

??存儲示意圖如下,真實CPU如右圖(Intel I7某型號實物圖):
從CPU的視角看 多線程代碼為什么那么難寫!

??多級緩存的出現(xiàn),極大程度解決了主存訪問速度和CPU運算速度的矛盾,但這種設計也帶來了一個新的問題。CPU運算時不直接和主存做數(shù)據(jù)交互,而是和L1 Cache交互,L1 cache 又是和L2 Cache交互…… 那么一定意味著同一份數(shù)據(jù)被緩存了多份,各層存儲之間的數(shù)據(jù)一致性如何保證? 如果是單線程還好,畢竟查詢同一時間只會在一個核心上運行。但當多線程需要操作同一份數(shù)據(jù)時,數(shù)據(jù)一致性的問題就凸顯出來了,如下圖,我們舉個例子。
從CPU的視角看 多線程代碼為什么那么難寫!
??在上圖中3個CPU核心各自的Cache分別持有了不同的a0值(先忽略E和I標記),實際上只有Cache0里才持有正確的數(shù)值。這時候,如果CPU1或者CPU2需要拿著Cache中a0值去執(zhí)行某些操作,那結(jié)果可想而知。如果想保證程序在多線程環(huán)境下正確運行,就首先得保證Cache里的數(shù)據(jù)能在"恰當"的時間失效,并且有效的數(shù)據(jù)也能被及時回寫到主存里。

??然而CPU是不知道當前時刻下哪些數(shù)據(jù)該失效、哪些該回寫、哪些又是可以接著使用的。這個時候其實CPU的設計者也很犯難,如果數(shù)據(jù)頻繁失效,CPU每次獲取必須從主存里獲取數(shù)據(jù),CPU實際運算能力將回到幾十年前的水平。如果一直不給不失效,就會出現(xiàn)數(shù)據(jù)不一致導致的問題。于是CPU的設計者不干了:”這個問題我處理不了,我給你們提供一些可以保證數(shù)據(jù)一致性的匯編指令,你們自己去處理”。 于是大家就在intel、arm的開發(fā)手冊上看到了像xchg、lock、flush……之類的匯編指令,C/C++語言和操作系統(tǒng)的開發(fā)者將這些封裝成了volatile、atomic……以及各種系統(tǒng)調(diào)用,JVM和JDK的開發(fā)者又把這些封裝了我在文首說的那一堆關(guān)鍵詞。 于是CPU的設計者為了提升性能導致數(shù)據(jù)一致性的問題,最終還是推給了上層開發(fā)者自己去解決。

??作為上層的開發(fā)者們(比如我們)就得判斷,在多線程環(huán)境下那些數(shù)據(jù)操作必須是原子操作的,這個時候必須使用Unsafe.compareAndSwap()來操作。還有那些數(shù)據(jù)是不能被CPU Cache緩存的,這個時候就得加volatile關(guān)鍵詞。極端情況下,你可以所有的操作搞成原子操作、所有的變量都聲明成volatile,雖然這樣的確可以保證線程安全,但也會因為主存訪問延時的問題,顯著降低代碼運行的速度。這個時候局部性原理又發(fā)揮出其神奇的價值,在實際情況下,絕大多數(shù)場景都是線程安全的,我們只需要保證某些關(guān)鍵操作的線程安全性即可。舉個簡單的例子,我們在任務向多線程分發(fā)的時候,只需要保證一個任務同時只被分發(fā)給一個線程即可,而不需要保證整個任務執(zhí)行的過程都是完全線程安全的。

??作為Java開發(fā)者,Java和JDK的開發(fā)者們已經(jīng)幫我們在很多場景下封裝好了這些工具,比如我們就拿ReentrantLock實現(xiàn)一個多線程計數(shù)器的例子來看。
從CPU的視角看 多線程代碼為什么那么難寫!

??其中increment() 本身不是一個線程安全的方法,如果多個線程并發(fā)去調(diào)用,仍然會出現(xiàn)count值增長不準確的問題。但在lock的加持下,我們能保證increment()方法同時只能有一個線程在執(zhí)行。想象下,如果我們把上述代碼中的counter()方法換成一些更復雜的方法,而完全不需要在方法中去考慮線程安全的問題,這不就實現(xiàn)了僅在關(guān)鍵操作上保證準確性就能保證全局的線程安全嗎!而當我們?nèi)ド罹縧ock的實現(xiàn)時,就會發(fā)現(xiàn)它底層也只是在tryAcquire中使用CAS設置了state值。
從CPU的視角看 多線程代碼為什么那么難寫!
??在多線程編程中,加鎖或加同步其實是最簡單的,但是在什么時候什么地方加鎖卻是一件非常復雜的事情。你需要考慮鎖的粒度的問題,粒度太大可能影響性能,粒度過小可能導致線程安全的問題。還需要考慮到加鎖順序的問題,加鎖順序不當可能會導致死鎖。還要考慮數(shù)據(jù)同步的問題,同步的數(shù)據(jù)越多,CPU Cache帶來的性能提升也就越少……

??從上面CPU的發(fā)展變化我們可以看到,現(xiàn)代CPU的本質(zhì)其實也是一個分布式系統(tǒng),很多時候仍需要編程者手動去解決數(shù)據(jù)不一致性的問題。當然隨著編程語言的發(fā)展,這些底層相關(guān)的東西也逐漸對普通程序員變得更透明化,我們是不是可以預想,未來是不是會有一門高性能、并且完全不需要程序員關(guān)注數(shù)據(jù)一致性的編程語言出現(xiàn)?

??最后上面計數(shù)器代碼給大家留一個思考題: 代碼中的counter變量聲明是否需要加volatile關(guān)鍵字?文章來源地址http://www.zghlxwxcb.cn/news/detail-430545.html

到了這里,關(guān)于從CPU的視角看 多線程代碼為什么那么難寫!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • ElasticSearch(七):ES查詢速度為什么那么快

    ElasticSearch(七):ES查詢速度為什么那么快

    介紹給大家一個開源SpringCloud項目。整合了大部分開源中間件,詳情信息可以查看文檔: spring cloud開源組件開發(fā) 另外自己以后博客所講解的代碼內(nèi)容,都會我的Git上同步(GitHub同步)GIT地址 ES使用的數(shù)據(jù)結(jié)構(gòu)是倒排索引,在對搜索內(nèi)容進行分詞的時候,會根據(jù)搜索內(nèi)容分詞結(jié)

    2023年04月08日
    瀏覽(31)
  • CentOS軟件那么老為什么大家還要用它?

    作為一個專業(yè)的服務器系統(tǒng),RHEL 系統(tǒng)理論上每一個軟件包都有 RedHat 內(nèi)部的人員負責維護,這個維護包括長期(和系統(tǒng)生命周期一樣長)的開發(fā)、更新、測試、運維等。也就是說你能從 RHEL 系統(tǒng)源上獲得的每一個軟件包,出現(xiàn)問題都可以找 RedHat 負責。所以 RHEL 不可能無限制

    2024年02月01日
    瀏覽(40)
  • 軟文發(fā)稿平臺那么多,為什么選擇媒介盒子

    軟文發(fā)稿平臺那么多,為什么選擇媒介盒子

    近年來隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的企業(yè)開始注重軟文營銷,品牌軟文推廣對企業(yè)來說是至關(guān)重要的,也有許多企業(yè)選擇和軟文發(fā)稿平臺合作來增強品牌曝光,提升宣傳效果,那么為什么會有這么多企業(yè)選擇媒介盒子合作呢,接下來就由小編告訴大家。 一、 傳統(tǒng)軟文

    2024年02月09日
    瀏覽(19)
  • ElasticSearch第七講:ES查詢速度為什么那么快

    ElasticSearch第七講:ES查詢速度為什么那么快

    介紹給大家一個開源SpringCloud項目。整合了大部分開源中間件,詳情信息可以查看文檔: spring cloud開源組件開發(fā) 另外自己以后博客所講解的代碼內(nèi)容,都會我的Git上同步(GitHub同步)GIT地址 ES使用的數(shù)據(jù)結(jié)構(gòu)是倒排索引,在對搜索內(nèi)容進行分詞的時候,會根據(jù)搜索內(nèi)容分詞結(jié)

    2023年04月19日
    瀏覽(24)
  • ElasticSearch第七講 ES查詢速度為什么那么快

    ElasticSearch第七講 ES查詢速度為什么那么快

    介紹給大家一個開源SpringCloud項目。整合了大部分開源中間件,詳情信息可以查看文檔: spring cloud開源組件開發(fā) 另外自己以后博客所講解的代碼內(nèi)容,都會我的Git上同步(GitHub同步)GIT地址 ES使用的數(shù)據(jù)結(jié)構(gòu)是倒排索引,在對搜索內(nèi)容進行分詞的時候,會根據(jù)搜索內(nèi)容分詞結(jié)

    2023年04月25日
    瀏覽(31)
  • 【AI學習】Transformer的Token嵌入表示為什么那么長

    【AI學習】Transformer的Token嵌入表示為什么那么長

    有朋友問,BERT等大模型的參數(shù)量怎么計算的?這個問題,李沐在BERT那篇論文中講過,主要包括幾部分。1、詞嵌入:token數(shù)量乘以token表示的向量長度,就是 V H;2、注意力計算沒有參數(shù),只計算多頭注意力的投影矩陣,三個輸入的權(quán)重矩陣,每個矩陣參數(shù)= H (H/頭數(shù)) 頭數(shù)

    2024年04月25日
    瀏覽(24)
  • 為什么在馬云成功前就有那么多影像留下來?

    為什么在馬云成功前就有那么多影像留下來?

    馬云創(chuàng)業(yè)的各個階段, 都有意無意得到媒體的推波助瀾 ,不光是影像,還留下了很多相關(guān)的文字報道。站在當時的角度,馬云或許并不總是以一種成功人士的身份出現(xiàn),但即便如此,他做事情也足夠新潮、足夠前衛(wèi)、或者足夠具有正能量。媒體對于類似的人或事,一向有著

    2024年02月01日
    瀏覽(32)
  • 不是說嵌入式是風口嗎,那為什么工作還那么難找?

    不是說嵌入式是風口嗎,那為什么工作還那么難找?

    最近確實有很多媒體、機構(gòu)渲染嵌入式可以拿高薪 ,這在行業(yè)內(nèi)也是事實,但前提是你有足夠的競爭力,真的懂嵌入式。 時至今日,能做嵌入式程序開發(fā)的人其實相當常見,尤其是隨著樹莓派、Arduino等開發(fā)板的普及,甚至軟件工程師也可以轉(zhuǎn)向嵌入式開發(fā)。 然而,真正能夠

    2024年02月12日
    瀏覽(31)
  • 云服務器那么安全穩(wěn)定,為什么大廠還要自建機房

    云服務器那么安全穩(wěn)定,為什么大廠還要自建機房

    一般來說選擇自建機房或者是云服務商要考慮的幾個問題 成本 安全性 管理 通常來說自建機房,需要自己考慮很多問題,比如 電費 網(wǎng)絡 Raid 可靠性 安全性 還要計算運維的成本 似乎從哪個角度來說,自建機房都是不大劃算的。 但是為什么還有一些公司要自建機房呢? 首先

    2023年04月08日
    瀏覽(29)
  • Windows 程序開機自啟動速度優(yōu)化,為什么騰訊會議自啟動速度那么高?

    Windows 程序開機自啟動速度優(yōu)化,為什么騰訊會議自啟動速度那么高?

    目錄 一、問題的說明和定義 二、問題的分析 1.問題初步分析 2.詳細的分析: 2.1Windows常見的自啟動方式 2.2Windows常見的自啟動方式的細節(jié)分析 三、問題的解決方案 1、為什么騰訊會議Rooms那么快 2.我們是否可以跟騰訊會議一樣快 這兩天有個優(yōu)化項需要做個技術(shù)調(diào)研,就是我們

    2024年02月02日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包