人妻出轨合集500篇最新
  • 首页
  • 4hu44四虎www在线影院麻豆
  • 波多野结衣在线视频
  • 国产成人亚洲综合无码精品
  • sesese在线观看a片
  • sesese在线观看a片

    日本真人强奷动态图试看30秒 字節面:什么是偽分享?

    发布日期:2022-05-19 02:16    点击次数:143

    日本真人强奷动态图试看30秒 字節面:什么是偽分享?

     日本真人强奷动态图试看30秒日本真人强奷动态图试看30秒

    本文轉載自微信公眾號「小林coding」,作家小林coding 。轉載本文請聯系小林coding公眾號。

    天下好,我是小林。

    周末的時候,有個讀者跟我說,面試字節的時候被問到:「什么是偽分享?又該若何幸免偽分享的問題?」

    這個其實是检修 CPU 緩存的問題,我之前的圖解系統也有提到過。

    今天,我再跟天下講一下。

    正文 CPU 若何讀寫數據的?

    先來認識 CPU 的架構,只须清爽了 CPU 的 架構,才能更好地清爽 CPU 是若何讀寫數據的,對于現代 CPU 的架構圖如下:

    不错看到,一個 CPU 里频繁會有多個 CPU 中枢,比如上圖中的 1 號和 2 號 CPU 中枢,况兼每個 CPU 中枢都有我方的 L1 Cache 和 L2 Cache,而 L1 Cache 频繁分為 dCache(數據緩存) 和 iCache(辅导緩存)日本真人强奷动态图试看30秒,L3 Cache 則是多個中枢分享的,這便是 CPU 典型的緩存層次。

    上头提到的都是 CPU 內部的 Cache,放眼外部的話,還會有內存和硬盤,這些存儲設備共同構成了金字塔存儲層次。如下圖所示:

    從上圖也不错看到,從上往下,存儲設備的容量會越大,而訪問速率會越慢。至于每個存儲設備的訪問延時,你不错看下圖的表格:

    你不错看到, CPU 訪問 L1 Cache 速率比訪問內存快 100 倍,這便是為什么 CPU 里會有 L1~L3 Cache 的原因,地方便是把 Cache 作為 CPU 與內存之間的緩存層,以減少對內存的訪問頻率。

    CPU 從內存中讀取數據到 Cache 的時候,并不是一個字節一個字節讀取,而是一塊一塊的时势來讀取數據的,這一塊一塊的數據被稱為 CPU Line(緩存行),是以 CPU Line 是 CPU 從內存讀取數據到 Cache 的單位。

    至于 CPU Line 大小,在 Linux 系統不错用底下的时势检验到,你不错看我服務器的 L1 Cache Line 大小是 64 字節,也就意味著 L1 Cache 一次載入數據的大小是 64 字節。

    日本真人强奷动态图试看30秒

    那么對數組的加載, CPU 就會加載數組内部連續的多個數據到 Cache 里,因此我們應該按照物理內存地址散播的順序去訪問元素,這樣訪問數組元素的時候,Cache 射中率就會很高,于是就能減少從內存讀取數據的頻率, 從而可提高门径的性能。

    然则,在我們不使用數組,而是使用單獨的變量的時候,則會有 Cache 偽分享的問題,Cache 偽分享問題上是一個性能殺手,我們應該要規避它。

    接下來,就來望望 Cache 偽分享是什么?又若何幸免這個問題?

    現在假設有一個雙中枢的 CPU,這兩個 CPU 中枢并行運行著兩個不同的線程,它們同時從內存中讀取兩個不同的數據,分別是類型為 long 的變量 A 和 B,這個兩個數據的地址在物理內存上是連續的,若是 Cahce Line 的大小是 64 字節,况兼變量 A 在 Cahce Line 的開頭位置,那么這兩個數據是位于吞并個 Cache Line 中, 娇小娇小与黑人tu又因為 CPU Line 是 CPU 從內存讀取數據到 Cache 的單位,是以這兩個數據會被同時讀入到了兩個 CPU 中枢中各自 Cache 中。

    我們來思考一個問題,若是這兩個不同中枢的線程分別修改不同的數據,比如 1 號 CPU 中枢的線程只修改了 變量 A,或 2 號 CPU 中枢的線程的線程只修改了變量 B,會發生什么呢?

    分析偽分享的問題

    現在我們結合保證多核緩存一致的 MESI 協議,來說明這一整個的過程,若是你還不清亮 MESI 協議,你不错看我這篇著述「10 張圖打開 CPU 緩存一致性的大門」。

    容器是一种新的虚拟化技术,每一个容器都是一个逻辑上独立的网络环境。Linux 上提供了软件虚拟出来的二层交换机 Bridge 可以解决同一个宿主机上多个容器之间互连的问题日本真人强奷动态图试看30秒,但这是不够的。二层交换无法解决容器和宿主机外部网络的互通。

    不幸的是,您永远无法预测您的系统何时可能崩溃或被感染,并且您会丢失整个数据。这就是磁盘镜像备份及恢复软件起作用的地方。

    主要原因是 Ingress 资源对象不能很好的满足网络需求,很多场景下 Ingress 控制器都需要通过定义 annotations 或者 crd 来进行功能扩展,这对于使用标准和支持是非常不利的,新推出的 Gateway API 旨在通过可扩展的面向角色的接口来增强服务网络。

    1、亮度、音量、摄像头隐私、摄像头开关和飞行模式的弹出式控制条采用基于Win11设计规范的新UI,微软表示还会持续优化体验;

    嗯,这取决于你有什么选择,以及你想选择的是什么。不管你是想给孩子还是学校老师用,都有不少选择。

    根据介绍,Anaconda 长期以来一直是基于 GTK 的;但作为对其进行现代化改造的一部分,该团队计划使用现有的 Cockpit 技术将新 UI 重写为基于 Web 浏览器的 UI。

    51CTO和华为官方合作共建的鸿蒙技术社区

    日本真人强奷动态图试看30秒

    ①. 最開始變量 A 和 B 都還不在 Cache 内部,假設 1 號中枢綁定了線程 A,2 號中枢綁定了線程 B,線程 A 只會讀寫變量 A,線程 B 只會讀寫變量 B。

    ②. 1 號中枢讀取變量 A,由于 CPU 從內存讀取數據到 Cache 的單位是 Cache Line,sesese在线观看a片也适值變量 A 和 變量 B 的數據歸屬于吞并個 Cache Line,是以 A 和 B 的數據都會被加載到 Cache,并將此 Cache Line 標記為「獨占」狀態。

    ③. 接著,2 號中枢開始從內存里讀取變量 B,同樣的亦然讀取 Cache Line 大小的數據到 Cache 中,此 Cache Line 中的數據也包含了變量 A 和 變量 B,此時 1 號和 2 號中枢的 Cache Line 狀態變為「分享」狀態。

    ④. 1 號中枢需要修改變量 A,發現此 Cache Line 的狀態是「分享」狀態,是以先需要通過總線發送音信給 2 號中枢,告知 2 號中枢把 Cache 中對應的 Cache Line 標記為「已失效」狀態,然后 1 號中枢對應的 Cache Line 狀態變成「已修改」狀態,况兼修改變量 A。

    日本真人强奷动态图试看30秒

    ⑤. 之后,2 號中枢需要修改變量 B,此時 2 號中枢的 Cache 中對應的 Cache Line 是已失效狀態,另外由于 1 號中枢的 Cache 也有此换取的數據,且狀態為「已修改」狀態,是以要先把 1 號中枢的 Cache 對應的 Cache Line 寫回到內存,然后 2 號中枢再從內存讀取 Cache Line 大小的數據到 Cache 中,临了把變量 B 修改到 2 號中枢的 Cache 中,并將狀態標記為「已修改」狀態。

    是以,不错發現若是 1 號和 2 號 CPU 中枢這樣持續轮流的分別修改變量 A 和 B,就會重復 ④ 和 ⑤ 這兩個步驟,Cache 并沒有起到緩存的后果,雖然變量 A 和 B 之間其實并沒有任何的關系,然则因為同時歸屬于一個 Cache Line ,這個 Cache Line 中的任性數據被修改后,都會相互影響,從而出現 ④ 和 ⑤ 這兩個步驟。

    因此,這種因為多個線程同時讀寫吞并個 Cache Line 的不同變量時,而導致 CPU Cache 失效的現象稱為偽分享(False Sharing)。

    幸免偽分享的步调

    因此,對于多個線程分享的熱點數據,即經常會修改的數據,應該幸免這些數據剛好在吞并個 Cache Line 中,否則就會出現為偽分享的問題。

    接下來,望望在實際項目中是用什么时势來幸免偽分享的問題的。

    在 Linux 內核中存在 __cacheline_aligned_in_smp 宏定義,是用于解決偽分享的問題。

    日本真人强奷动态图试看30秒

    從上头的宏定義,我們不错看到:

    若是在多核(MP)系統里,該宏定義是 __cacheline_aligned,也便是 Cache Line 的大小; 而若是在單核系統里,該宏定義是空的;

    因此,針對在吞并個 Cache Line 中的分享的數據,若是在多核之間競爭比較嚴重,為了缜密偽分享現象的發生,不错收受上头的宏定義使得變量在 Cache Line 里是對齊的。

    舉個例子,有底下這個結構體:

    結構體里的兩個成員變量 a 和 b 在物理內存地址上是連續的,于是它們可能會位于吞并個 Cache Line 中,如下圖:

    是以,為了缜密前边提到的 Cache 偽分享問題,我們不错使用上头介紹的宏定義,將 b 的地址設置為 Cache Line 對齊地址,如下:

    這樣 a 和 b 變量就不會在吞并個 Cache Line 中了,如下圖:

    是以,幸免 Cache 偽分享實際上是用空間換時間的思惟,浪費一部分 Cache 空間,從而換來性能的晋升。

    我們再來看一個應用層面的規避决策,有一個 Java 并發框架 Disruptor 使用「字節填充 + 繼承」的时势,來幸免偽分享的問題。

    Disruptor 中有一個 RingBuffer 類會經常被多個線程使用,代碼如下:

    你可能會覺得 RingBufferPad 類里 7 個 long 類型的名字很奇怪,但事實上,它們雖然看起來毫無作用,但卻對性能的晋升空到了至關穷苦的作用。

    我們都清亮,CPU Cache 從內存讀取數據的單位是 CPU Line,一般 64 位 CPU 的 CPU Line 的大小是 64 個字節,一個 long 類型的數據是 8 個字節,是以 CPU 一下會加載 8 個 long 類型的數據。

    根據 JVM 對象繼承關系中父類成員和子類成員,內存地址是連續陈设布局的,因此 RingBufferPad 中的 7 個 long 類型數據作為 Cache Line 前置填充,而 RingBuffer 中的 7 個 long 類型數據則作為 Cache Line 后置填充,這 14 個 long 變量沒有任何實際用途,更不會對它們進行讀寫操作。

    另外,RingBufferFelds 内部定義的這些變量都是 final 修飾的,意味著第一次加載之后不會再修改, 又由于「前后」各填充了 7 個不會被讀寫的 long 類型變量,是以無論若何加載 Cache Line,這整個 Cache Line 里都沒有會發生更新操作的數據,于是只须數據被頻繁地讀取訪問,就当然沒有數據被換出 Cache 的可能,也因此不會產生偽分享的問題。

     



    Powered by 人妻出轨合集500篇最新 @2013-2022 RSS地图 HTML地图