當兩個CPU核心要求讀寫同一記憶體位址時,其後果是未定義行為嗎?

時間 2021-12-20 19:02:38

1樓:楊華

結果可以預期

多核cpu中,其實記憶體只有乙個,同時申請會對指令進行排序。

具體實現涉及多級cache的coherence問題會比較複雜,不過可以先抽象掉。fyi

2樓:Zijie He

不會,如果正好只有兩個處理器指令寬度的記憶體寫同時發生,那只有乙個會生效,另乙個會被改寫或者忽略。但是兩個處理器可能都有一段時間認為自己寫入的資料生效了。這涉及到兩個問題,1)快取,處理器不會直接寫入快取,除非使用memory barrier。

2)out-of-order execution,處理器會重排指令以提高執行效率,而只需要保證在當預處理器上read-after-write正確,即當預處理器寫入的記憶體位址在之後的讀取時獲得的是上次寫入的值。

這在單核處理器上並沒有什麼問題,但多核的時候會出現比如下面的錯誤boola=

false

;boolb=

false

;void

thread1

()assert(a

);}void

thread2

()除非在thread1使用memory_order_acquire,在thread2使用memory_order_acq_rel。

這是處理器保證的資料同步性,高階別語言可以實現各種額外的安全特性。

至於處理器快取同步到記憶體的時候,乙個處理器核心會使用完整的匯流排寬度,所以不存在兩個核心「同時」訪問一塊記憶體的可能。

3樓:find goo

看下硬體電路就知道

記憶體有個頻率,每個訪問都是在頻率許可時間內。

也就是訪問記憶體是離散時間的,不是無限可分的連續性。

記憶體和cpu通訊是雙通道,四通道。

也就是對單個記憶體讀取和寫入在電路實現上,實際上是序列的。

也正是因為這種序列訪問,對cpu是很慢,所以cpu都搞了多級快取,快取越大,理論上速度越快,快取有個調算演算法。

由於作業系統的時間片輪換切換程序上下文,可以用臨界區機制來保護併發資料出現的問題。

如果出現死鎖,可以使用銀行家演算法,來解除死鎖。

硬體電路下是序列讀取的,有記憶體頻率時間週期限制。否則需要兩個記憶體電路伸到cpu供內部讀取。

這個記憶體頻率和坐地鐵差不多,不管你cpu有多快,有多少記憶體需要讀取或修改,但只有等到地鐵車到達時,你才能登車讀取或寫入資料。

過了時間片,就要等下一班。

所以cpu一直在等記憶體(快取沒有就要讀記憶體)。

不然DDR5高頻率的記憶體,也不會賣那麼貴了。

高頻率記憶體同樣的條件下能降低cpu的等待時間。

4樓:

這問題有意思:

首先,不要學了個ub,就到處拿著ub去套。CPU本質上就是個物理電路,它的一切行為都是由物理定律保證的,不可能有什麼ub——哪怕CPU有設計失誤,那也是bug,而不是ub。

然後,大多數主流的CPU不會直接對記憶體進行訪問操作(極低端的微控制器還有,但那些不可能有多核),都必須是把記憶體資料載入到快取中進行訪問和操作的。所以,你的問題實際上就轉換為另乙個業內更標準的問題表述:快取一致性問題。

接著,多CPU為了解決這個快取一致性問題,會使用MESI或類似機制(具體自己搜自己學)。這些機制保證了必然只有乙個CPU的cache是有效的,其他的則必須放棄cache中的資料並且重新從記憶體中載入。

最後,LOCK的問題則完全不同。LOCK是明確需要鎖匯流排或者cache line的,很多還預設帶有mb的含義。所以,如果連彙編層面的LOCK都保證不了邏輯語義的話,那沒有任何上層軟體可以保證得了。

5樓:Weasley Frank

不是未定義行為,只不過考慮到快取和並行可能你讀的值不是你想要的而已。

例如core 0寫入暫存器的值尚未寫回到記憶體,core 1讀取記憶體中的值不會得到core 0的值。這就是為什麼要有記憶體屏障和volatile變數……

6樓:wyf

首先假設你的cpu沒有cache

那麼在物理上來看,兩個cpu同時通過匯流排去訪問記憶體控制器。具體效果還是得看仲裁結果。

再說,你很難保證兩個cpu在同乙個核心時鐘發起讀取。

7樓:potato

你問的是硬體,設計良好無bug的多核cpu,不會出現你擔心的問題。每個核芯發出讀寫請求時,會產生乙個匯流排鎖訊號,這時僅有這個核芯與硬體打交道,注意我提的是硬體。當前cpu技術比以前又有大提公升,對讀cpu自身cache又有優化。

具體的可以參看intel的。

軟體層面上,作業系統對硬體鎖提供抽象,方便大家使用。一般地,設計錯誤應用的死鎖,只傳遞到系統層級。

8樓:Rick Weng

我讀你的程式就是一行行順序讀,CPU0先發生,然後CPU1後發生。在紙面分析程式的時候,行為是確定的。

在硬體實現上,讀寫風險是存在的也是有各種解決方案的。但是現代硬體也複雜了,買誰家的產品都是買了幾萬個bug。所以不知道你的問題是理論上還是現實中。

如果兩個執行緒同時發invalidate到snoop filter之類的,取決於架構和微架構。如果沒有架構要求,微架構的結果很可能偏袒一方;所以好的架構要考慮到QoS/Starvation,比如要求現實中做Round robin。

9樓:囧囧

多個核心訪問同乙個位址時,實質上是多個核心通過同乙個Memory Controller操作儲存器,連線核心和Memory Controller的匯流排上存在硬體的仲裁機制。多個核心同時操作同乙個儲存器晶元時,誰能搶到匯流排,取決於仲裁規則。

多個處理器的快取一致性問題取決於處理器設計。

有的處理器啥都不管,要求程式設計師自行解決快取一致性,這種處理器一般被叫做膠水多核,屬於陰間設計,被大家唾棄,現在很少有廠商這麼搞了。

正常的設計同樣是通過專用硬體模組來確保多個處理器的快取一致性,比如許多Arm處理器使用乙個叫Arm CoreLink CCI-400的玩意,詳細資料可在Arm官網找到。

雙核CPU兩個核心溫差較大

nfs king 首先,這是正常現象。而要解釋為何正常,就說來話長了。要搞懂這個問題,先要知道溫度感測器原理。CPU內部的溫度感測器,實際上原本並不是用來讓使用者知道實際溫度的,感測器也不會直接匯報確切溫度值。以前的老CPU,內部是沒有溫度感測器的,而是在主機板CPU插槽中間放置一顆溫度探頭。這樣的...

是不是同乙個家庭有兩個女兒,當母親的都喜歡老大

絲竹輕音 怎麼說呢 我自己有兩個女兒,當然,他們現在年紀還小。我試著把她們放到你們的境況裡想了想,感覺你媽媽可能有以下考慮。1.你姐姐生了三個女兒,如果是婆家重男輕女,想必在婆家過的並不舒坦,並且,生過三個孩子的人身體真的會差很多,所以她心疼是肯定的。2.你跟著她一起住,平時如果有問題可以相互照應,...

兩個女人先後和同乙個男人發生了關係這兩個女人還能做朋友了嗎?

Christ 意 看當事人在不在意吧,如果做朋友彼此內心都沒有疙瘩,那友誼可以繼續 如果任意一方心裡放不下,有陰影 不如相忘於江湖吧,對於彼此都好.人生這麼長,願意付出真心,總會有朋友的.何必執著於這乙個朋友,搞得食之無味棄之可惜的狀態.多難受啊 黑遠智 之所以提出這個事實,是因為過程中似乎A始終顯...