日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序局部性原理的一些思考

發(fā)布時間:2025/4/16 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序局部性原理的一些思考 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天OS課上老師提到影響缺頁次數(shù)的因素中有一個是 程序的局部性越好,越不容易缺頁,并舉了個關于雙重for循環(huán)順序的選擇問題作為例子。
我回去也查詢資料研究了一下這個問題。

何為程序的局部性(locality)

程序的局部性原理是指程序在執(zhí)行時呈現(xiàn)出局部性規(guī)律,即在一段時間內,整個程序的執(zhí)行僅限于程序中的某一部分。相應地,執(zhí)行所訪問的存儲空間也局限于某個內存區(qū)域。也就是說,程序傾向于引用鄰近于其他最近引用過得數(shù)據(jù)項,或者最近引用過的數(shù)據(jù)項本身。我的理解就是:通過利用“緩存”來提高程序運行效率

程序的局部性又通常有兩種不同的形式:時間局部性(temporal locality)空間局部性(spatial locality).

時間局部性:被引用過一次的存儲器位置在未來會被多次引用

空間局部性:如果一個存儲器的位置被引用,那么將來他附近的位置也會被引用。也就是說靠近當前正在被訪問內存的內存內容很快也會被訪問。

理論分析

先以一維數(shù)組為例,考慮對程序數(shù)據(jù)引用的局部性。

借用《深入理解計算機系統(tǒng)》書中的例子進行分析

sumvec函數(shù)中數(shù)組v的元素是被順序讀取的,一個接一個,按照它們存儲在存儲器中的順序。(假設地址從0開始).因此對于變量V,函數(shù)有很好的空間的局部性。因此這個函數(shù)有良好的局部性。

向上面例子中按順序、連續(xù)的對v的引用,稱為步長為1的引用模式(相對于元素大小)。同理,在一個連續(xù)的向量中,每隔k個元素對向量進行訪問,稱為步長為k的引用。一般來說,隨著步長的增加,空間局部性會下降。

再考慮二維數(shù)組

圖中函數(shù)是對一個二維數(shù)組求和(M=2,N=3)。雙重嵌套循環(huán)按照行優(yōu)先的順序讀取數(shù)組的元素。因此函數(shù)具有良好的空間局部性,因為它按照數(shù)組被存儲的行優(yōu)先順序來訪問這個數(shù)組,因此得到的是一個步長為1的引用模式和良好的空間局部性。從而使得程序運行效率得到提高。

但我們更換讀取順序的時候,交換i和j的循環(huán)。如下圖所示

這時候發(fā)生了巨大的變化!函數(shù)的空間局部性變得很差,因為他按照列順序來掃描數(shù)組,而不是按照行順序。因為C數(shù)組在存儲器中是按照行順序的,結果這里就得到的是步長為N的引用模式。從而使得程序效率降低。

代碼實例測試

實例

#include <stdio.h> #include <stdlib.h> #include <time.h> int main() {int a[500][500];int i,j;clock_t start, finish;double duration;start = clock();for (int k = 0; k < 1000; k++)//循環(huán)放大時間{for(i=0; i<500; i++){for(j=0; j<500; j++){a[i][j]=i;}}}finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration );start = clock();for (int k = 0; k < 1000; k++)//循環(huán)放大時間{for(j=0; j<500; j++){for(i=0; i<500; i++){a[i][j]=i;}}}finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration) ;return 0; }

運行結果1

可以發(fā)現(xiàn)當行列數(shù)相同的時候,按照行順序掃面的效率要高一些。也符合之前的理論分析.

運行結果2

當我把數(shù)組定義改為a[10][10000]的時候,測試結果如下,依舊為行順序掃描效率較高。

運行結果3

數(shù)組改為a[10000][10]后,測試結果如下,依舊為行順序掃描效率較高。

小結

通過對雙重循環(huán)不同循環(huán)順序的效率分析,初步理解了局部性原理。也就是說現(xiàn)代的計算機體系的存儲技術至少都用了局部存儲思想,即CPU提取內存的一個位置的數(shù)據(jù)放到cache中的同時,也會把其附近的數(shù)據(jù)也提取到cache中,如果內存以行優(yōu)先存儲方式(注意這個前提!),則提取Array[0][0]位置的數(shù)據(jù)的同時,則也會順便把"Array[0][1], Array[0][2],tArray[0][3], Array[0][4]..."等數(shù)據(jù)提取出來存放在緩存中。這樣在后邊連續(xù)的幾次循環(huán)中均可以命中緩存,從而減少緩存失效,提高程序的運行效率。

參考資料

維基百科

計算機體系結構與程序性能

《深入理解計算機系統(tǒng)》

轉載于:https://www.cnblogs.com/glczero/p/4478274.html

總結

以上是生活随笔為你收集整理的程序局部性原理的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。