計算機中的記憶體模型

2021-09-28 21:06:14 字數 1308 閱讀 4375

計算機在執行程式時,每條指令都是在cpu中執行的,而執行指令過程中,勢必涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在主存(物理記憶體)當中的,這時就存在乙個問題,由於cpu執行速度很快,而從記憶體讀取資料和向記憶體寫入資料的過程跟cpu執行指令的速度比起來要慢的多,因此如果任何時候對資料的操作都要通過和記憶體的互動來進行,會大大降低指令執行的速度。因此在cpu裡面就有了快取記憶體。

當程式在執行過程中,會將運算需要的資料從主存複製乙份到cpu的快取記憶體當中,那麼cpu進行計算時就可以直接從它的快取記憶體讀取資料和向其中寫入資料,當運算結束之後,再將快取記憶體中的資料重新整理到主存當中。

舉例,比如執行下方**時:

i = i + 1;

當執行緒執行這個語句時,會先從主存當中讀取i的值,然後複製乙份到快取記憶體當中,然後cpu執行指令對i進行加1操作,然後將資料寫入快取記憶體,最後將快取記憶體中i最新的值重新整理到主存當中。

這個**在單執行緒中執行是沒有任何問題的,但是在多執行緒中執行就會有問題了。

初始時,兩個執行緒分別讀取i的值存入各自所在的cpu的快取記憶體當中,然後執行緒1進行加1操作,然後把i的最新值1寫入到記憶體。此時執行緒2的快取記憶體當中i的值還是0,進行加1操作之後,i的值為1,然後執行緒2把i的值寫入記憶體。

最終結果i的值是1,而不是2。這就是著名的快取一致性問題。通常稱這種被多個執行緒訪問的變數為共享變數。

通常有兩種解決方案:

1)通過在匯流排加lock#鎖的方式

2)通過快取一致性協議

(這兩種解決方案都是硬體層面上提供的)

1.因為cpu與其他部件進行通訊都是通過匯流排來進行的,所以對匯流排加鎖的話,也就能阻塞cpu對其他部件(如記憶體)的訪問,從而使得同一時間內只有乙個cpu能使用這個變數的值。如上面 i = i + 1 的例子,只有當前cpu執行完畢後,其他cpu才能從記憶體中取到變數,然後進行相應操作。這樣一來就解決了快取一致性的問題。

因為在匯流排鎖住期間,其他cpu無法訪問記憶體,所以會導致效率低下。

2.為了解決效率問題,所以出快取一致性,最出名的就是intel 的mesi協議,mesi協議保證了每個快取中使用的共享變數的副本是一致的。它核心的思想是:當cpu寫資料時,如果發現操作的變數是共享變數,即在其他cpu中也存在該變數的副本,會發出訊號通知其他cpu將該變數的快取行置為無效狀態,因此當其他cpu需要讀取這個變數時,發現自己快取中快取該變數的快取行是無效的,那麼它就會從記憶體重新讀取。

計算機中的記憶體

問題解答 1 有十個位址訊號引腳的記憶體ic 積體電路 可以指定的位址範圍是多少?1.用二進位制數表示的話是0000000000 1111111111 0 1023 2.因此位址訊號引腳是十個時表示2 10 1024個位址 2 高階程式語言中的資料型別表示的是多少?1.佔據記憶體區域的大小和儲存在該...

計算機中的定址

電腦的位數通常是指cpu的處理位數,這個不是靠位址匯流排來決定的,這個位數指的是cpu 通用暫存器的資料寬度,即cpu一次運算可以處理的資料bit長度。前面所說的是記憶體空間足夠的情況,下面用過一道軟考題目解釋記憶體空間 定址範圍的情況 某計算機字長32位,儲存容量8mb。按字編址,其定址範圍為 0...

計算機中的單位

關於字的概念,今天才發現自己一直沒有弄清楚.原來,對於字長為16位的計算機,儲存器中兩個連續位元組被稱為字 word 乙個字有16個位元 四個連續的位元組被稱為雙字 doubleword 雙字有32個位元。如果計算機的字長為32位,則乙個字有4個位元組,即32個二進位制,雙字的長度相應的為64個二進...