實際上是這樣的:
CPU快取的速度和記憶體和硬碟的速度不是一個量級的。舉個簡單的例子,假設記憶體速度是高鐵級別的速度,那麼快取速度至少也是火箭的速度(差距只大不小),至於硬碟,即使是固態盤,速度也就馬車吧。
作用不一樣。電腦中儲存資料主要的地方有三個,硬碟,持久化儲存資料,斷電了依然能儲存(其實硬碟也帶有快取);記憶體,動態儲存執行時的資料;CPU快取,因為記憶體速度和CPU處理速度差距太大,快取作為中間層儲存可能立即執行的資料。簡單的說一下一個所謂的“小程式”是如何跑起來的。
首先你雙擊小程式,就把小程式的可執行程式碼從硬碟中載入到記憶體中,(為什麼需要記憶體呢?因為硬碟太慢了,如果沒有記憶體,直接去硬碟中讀取資料,那速度不敢想。)之後將記憶體中的指令和資料根據情況載入到CPU快取中(原因同硬碟到記憶體,因為記憶體太慢了,同時快取分兩種,一種是指令快取,快取指令,一類是資料快取,快取資料),然後CPU執行的時候首先去指令快取中拿指令,再去資料快取中拿需要的資料執行(其實是首先看看需要的資料在不在CPU的暫存器中,不在再去快取中拿)然後執行完成之後將資料丟擲。
那麼說說看CPU快取的作用,如果沒有快取,那麼CPU只有直接去記憶體中去拿資料;CPU是由時鐘脈衝驅動計算的(淺顯的理解,時鐘脈衝頻率也就是我們常說的CPU頻率),那麼就會出現這個CPU計算一條指令花一個時鐘週期,等記憶體資料過來可能花了幾百上千個時鐘週期,嗯。這種感覺,爽翻;如果這個時候有一個快取記憶體(其實快取速度是比CPU速度略慢的),讀取資料一兩個始終週期就搞定,那對整體的速度提升是不是非常非常大?
那麼來說說為什麼快取不做大了,主要有以下幾點:
1)CPU只有這麼大,快取天生決定大不了。
2)“幾百K”(其實一級快取一般128K已經很大了)已經夠用了;原因是快取的資料不多。為什麼呢?因為CPU其實每次處理的資料量不大,基礎型別也就那麼多(舉個很不恰當的例子,我們看著很複雜的資料,到CPU就一直算一些三加二減五一類的資料,快取換過去換過來都是這些東西。而且假設CPU一段時間能處理的資料只有50K,那麼即使放再多資料過來也沒用),而且透過合理的演算法可以把最近可能需要用到的資料提早放入快取中(這個演算法可以說是CPU的邏輯裡面很重要的一個,CPU效率高低很大一方面由這個決定),這樣的話那麼快取中的資料絕大多數都是有用的(其實就是提高快取命中率),那麼大小就無所謂了(因為快取速度很快,更新快取內的資料開銷不大)
3)快取不是越大越好。快取速度比CPU略慢,所以從快取中讀取資料耗時不大。但是查詢資料要時間啊。舉個例子,CPU需要資料A,準備去快取中拿,然後要在快取中找A在哪兒,找到了,把A給CPU(快取命中),沒找到的,告訴記憶體趕快把A給我送過來(快取沒命中,重新整理快取),不論找到的沒找到,找總要花時間,這個時間通常和快取大小正相關。快取過大,那麼反而降低CPU效率,因為每次都要找很久。
所以快取十分重要,想要提高快取的效率,目前來說採用的方案是第一,高效的快取重新整理演算法,能夠大幅度的提高快取命中率;二,多級快取,因為直接和CPU互動的快取不能過大,不然資料查詢時間反而拖累CPU整體效率,所以一級快取不能過大,但是可以採用多級快取,將更多的資料放在後面的快取中,一級快取未命中時直接從二級、三級快取中重新整理,不直接從記憶體中重新整理,提高整體效率。(例如現在Intel的CPU通常是三級快取L1,L2,L3,以i5 8400為例,6個核心的所有快取加起來9M,只有三級快取共享,每個核的1級快取和2級快取其實不大)
綜上所述,CPU的快取就目前的計算機架構來說,必不可少且十分重要。且目前已經夠大了,也不會說被一個“小程式”就消耗完了。
實際上是這樣的:
CPU快取的速度和記憶體和硬碟的速度不是一個量級的。舉個簡單的例子,假設記憶體速度是高鐵級別的速度,那麼快取速度至少也是火箭的速度(差距只大不小),至於硬碟,即使是固態盤,速度也就馬車吧。
作用不一樣。電腦中儲存資料主要的地方有三個,硬碟,持久化儲存資料,斷電了依然能儲存(其實硬碟也帶有快取);記憶體,動態儲存執行時的資料;CPU快取,因為記憶體速度和CPU處理速度差距太大,快取作為中間層儲存可能立即執行的資料。簡單的說一下一個所謂的“小程式”是如何跑起來的。
首先你雙擊小程式,就把小程式的可執行程式碼從硬碟中載入到記憶體中,(為什麼需要記憶體呢?因為硬碟太慢了,如果沒有記憶體,直接去硬碟中讀取資料,那速度不敢想。)之後將記憶體中的指令和資料根據情況載入到CPU快取中(原因同硬碟到記憶體,因為記憶體太慢了,同時快取分兩種,一種是指令快取,快取指令,一類是資料快取,快取資料),然後CPU執行的時候首先去指令快取中拿指令,再去資料快取中拿需要的資料執行(其實是首先看看需要的資料在不在CPU的暫存器中,不在再去快取中拿)然後執行完成之後將資料丟擲。
那麼說說看CPU快取的作用,如果沒有快取,那麼CPU只有直接去記憶體中去拿資料;CPU是由時鐘脈衝驅動計算的(淺顯的理解,時鐘脈衝頻率也就是我們常說的CPU頻率),那麼就會出現這個CPU計算一條指令花一個時鐘週期,等記憶體資料過來可能花了幾百上千個時鐘週期,嗯。這種感覺,爽翻;如果這個時候有一個快取記憶體(其實快取速度是比CPU速度略慢的),讀取資料一兩個始終週期就搞定,那對整體的速度提升是不是非常非常大?
那麼來說說為什麼快取不做大了,主要有以下幾點:
1)CPU只有這麼大,快取天生決定大不了。
2)“幾百K”(其實一級快取一般128K已經很大了)已經夠用了;原因是快取的資料不多。為什麼呢?因為CPU其實每次處理的資料量不大,基礎型別也就那麼多(舉個很不恰當的例子,我們看著很複雜的資料,到CPU就一直算一些三加二減五一類的資料,快取換過去換過來都是這些東西。而且假設CPU一段時間能處理的資料只有50K,那麼即使放再多資料過來也沒用),而且透過合理的演算法可以把最近可能需要用到的資料提早放入快取中(這個演算法可以說是CPU的邏輯裡面很重要的一個,CPU效率高低很大一方面由這個決定),這樣的話那麼快取中的資料絕大多數都是有用的(其實就是提高快取命中率),那麼大小就無所謂了(因為快取速度很快,更新快取內的資料開銷不大)
3)快取不是越大越好。快取速度比CPU略慢,所以從快取中讀取資料耗時不大。但是查詢資料要時間啊。舉個例子,CPU需要資料A,準備去快取中拿,然後要在快取中找A在哪兒,找到了,把A給CPU(快取命中),沒找到的,告訴記憶體趕快把A給我送過來(快取沒命中,重新整理快取),不論找到的沒找到,找總要花時間,這個時間通常和快取大小正相關。快取過大,那麼反而降低CPU效率,因為每次都要找很久。
所以快取十分重要,想要提高快取的效率,目前來說採用的方案是第一,高效的快取重新整理演算法,能夠大幅度的提高快取命中率;二,多級快取,因為直接和CPU互動的快取不能過大,不然資料查詢時間反而拖累CPU整體效率,所以一級快取不能過大,但是可以採用多級快取,將更多的資料放在後面的快取中,一級快取未命中時直接從二級、三級快取中重新整理,不直接從記憶體中重新整理,提高整體效率。(例如現在Intel的CPU通常是三級快取L1,L2,L3,以i5 8400為例,6個核心的所有快取加起來9M,只有三級快取共享,每個核的1級快取和2級快取其實不大)
綜上所述,CPU的快取就目前的計算機架構來說,必不可少且十分重要。且目前已經夠大了,也不會說被一個“小程式”就消耗完了。