ram是什么意思 ram是什么( 五 )


除了多線程切換,避免CPU閑置浪費,還有一點 。
我先問一個問題 。
//@author :www.yaoxiaowen.comint main(){ //我們執行任務的代碼 return 0;}對于一個應用/進程而言,它都應該有一個入口 。(雖然不一定需要我們直接寫main函數) 。入口函數內部就是我們的任務代碼,任務代碼執行完了這個應用/進程也就結束了 。這個很好理解,比如測試工程師寫的一個測試case 。跑完了這個任務就結束了 。
但是 有些程序,比如一個 app,你打開了這個app 。不做任何操作 。這個界面會一直存在,也不會消失 。思考一下這是為什么 。因為這個app進程肯定也要有一個main入口 。main里面的任務代碼執行完了,就應該結束了 。而一個程序的代碼/指令數目肯定是有限的 。但該app在我們不主動退出情況下,卻不會主動結束 。
所以這個app進程的入口main來講,其實是這樣的 。
//@author :www.yaoxiaowen.comint main(){ boolean flag = true; while (flag){ //我們執行任務的代碼 } return 0;}并且不僅如此,在一個程序內部,也有大量的for,while等循環語句 。
那么當我們把這些相關的代碼指令送到了主存,或者更高一級的緩存時,那么CPU在執行這些指令時,存取速度自然快了很多 。
在執行一個程序時,啟動階段比較慢,因為需要從磁盤讀取數據 。(而CPU在這個階段也沒閑置浪費,它會進行線程切換執行其他任務) 。但是數據被送往內存之后,它執行起來就會快多了,并且伴隨著執行過程,還可能越來越快,因為這些數據,有可能被一級一級的向上送,從L4,送到L3,再送到L2,L1
so,上述那個問題的答案,已經解釋的比較清楚了吧 。
局部性原理(Principle of locality)locality對于硬件和軟件系統的設計和性能都有著重要的影響 。對于我們理解存儲器的層次結構也必不可缺 。
程序傾向于引用臨近于與其他最近引用過的數據項的數據項 ?;蛘咦罱眠^的數據項本身 。這種傾向性,我們稱之為局部性原理 。它通常有以下兩種形式:
時間局部性(temporal locality):被引用過一次的存儲器位置的內容在未來會被多次引用 。空間局部性(spatial locality):如果一個存儲器位置的內容被引用,那么它附近的位置也很大概率會被引用 。一般而言,有良好局部性的程序比局部性差的程序運行的更快 。現代計算機系統的各個層次,從硬件到操作系統、再到應用程序,它們的設計都利用了局部性 。
當然,光說理論的東西比較玄乎 。我們來看實際的例子 。
//@author www.yaoxiaowen.comint sum1(int array[N]){ int i, sum = 0; for(i = 0; i < N; i++) sum += array[i]; return sum;}在這個程序中,變量sum,i在每次循環迭代時被引用一次,因此對sum和i來說,有較好的時間局部性 。
對變量array來說,它是一個int類型數組,循環時按順序訪問array,因為一個C數組在內存中是占用連續的內存空間 。因而的較好的空間局部性,
再來看一個例子:
//@author www.yaoxiaowen.comint sum2(int array[M][N]){ int i, j, sum = 0; for(i = 0; i < M; i++){ for(j = 0; j < N; j++) sum += array[j][i]; }return sum;}這是一個空間局部性很差的程序 。
假設這個數組是array[3][4],因為C數組在內存中是按行順序來存放的 。所以sum2對每個數組元素的訪問順序成了這樣:0,4,8,1,5,9…… 7,11 。所以它的空間局部性很差 。
但是幸運的是,一般情況下軟件編程天然就是符合局部性原理的 。比如程序的循環結構 。
假設CPU需要讀取一個值,int var,而var在L4主存上,那么該值會被依次向上送,L4->L3->L2,但是這個傳遞的過程并不是單純的只傳遞var四個字節的內容,而是把var所在的內存塊(block),依次向上傳遞,為什么要傳遞block?因為根據局部性原理,我們認為,與var值相鄰的值,未來也會被引用 。
存儲器的層次結構,數據進行傳送時,是以block(塊)為單位傳送的 。在整個層次結構上,越往上,block越小而已 。
存儲器層次結構中的緩存
洋洋灑灑的扯了那么多,我相對于所謂的 存儲器層次結構讀者應該有一個基本的認識,有些地方介紹的 不夠嚴謹,但是本文的目的也就是讓大家理解基本思想 。
歸根到底,它就是一個緩存(caching)的思想,并且其實不復雜,
我們做app開發時,對于app中活動頁面等,都是后臺發給我們圖片url,我們下載后才顯示在app上,這時我們總要使用 Glide,Picasso 等圖片緩存框架來把下載好的圖片緩存在手機本地存儲上 。這樣下次打開app時,如果這個圖片鏈接沒有改變,我們就直接拿手機本地緩存的圖片來進行顯示,而不用再從服務器上下載了 。如果圖片鏈接改變了,則重新下載 。為什么要這么做?因為從服務器上下載比較慢,而手機本地存儲(ROM)中讀取就會快很多 。

推薦閱讀