程序局部性原理

存储器系统是一个具备不同容量、成本和访问时间的存储设备。其访问速度由快到慢,依次为CPU急促请你,告诉缓冲存储器(SRAM),主存储器(DRAM),磁盘,通过网络连接的其他存储设备。

每次CPU和主存之间的数据传送都是通过一系列步骤完成的,局部性通常由两种形式,时间局部性和空间局部性。时间局部性指的是:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)

空间局部性指的是:如果一个存储器的位置被引用,那么将来他附件的位置也会被引用。

以下面一个例子来说明:这是一个二维数组的求和。

可以看出,在for循环中,是以行序为主序列对元素进行遍历的,也就是说,先访问第一行的元素,再访问第二行元素。图b是二维数组的实际存储情况,可以看出,在存储器中,也是按照行序为主序进行存储的。在对向量的访问中,如果访问的数序和存储顺序一致,并且是连续访问,那么这种访问具有良好的空间局部性。

实际例子说明:

#include <stdio.h>
#include <time.h>

typedef int (*pFuncb)(int ,int);

#define A_NUM 10000000
#define B_NUM 1000
int A[A_NUM] = {0};
int B[B_NUM] = {0};

void t1(int a,int b)
{
    int i,j;
    for(i = 0; i < A_NUM ; i++)
        for(j = 0; j < B_NUM ;j++)
        B[j]++;
}

void t2(int a,int b)    //t2 花费的时间应该小于t1
{
    int i,j;
    for(i = 0; i < B_NUM ; i++)
        for(j = 0; j < A_NUM ;j++)
        A[j]++;
}

void Show_Run_Time(pFuncb test_func,void *prompt)
{
    clock_t start,end;

    start = clock();
    test_func(1,1);
    end = clock();

    printf(" %s %lf seconds is used!\n",prompt,((double)(end-start))/CLOCKS_PER_SEC);
}

int main()
{
    Show_Run_Time(t1,"t1 function");
    Show_Run_Time(t2,"t2 function");

    return 0;
}

执行结果如下:

可以看出,t2函数执行的时间小于t1,说明函数局部性好的代码执行效率高。

时间: 2024-11-09 00:00:55

程序局部性原理的相关文章

程序局部性原理感悟

局部性原理 程序的局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分.相应地,执行所访问的存储空间也局限于某个内存区域. 局部性原理又表现为:时间局部性和空间局部性. 时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行:如果某数据被访问,则不久之后该数据可能再次被访问. 空间局部性是指一旦程序访问了某个存储单元,则不久之后.其附近的存储单元也将被访问. 这一规律是是普遍事实的总结,更是许多计算机技术的前提假设,比如.NET中托

linux操作系统原理

程序局部性原理: 空间局部性: 时间局部性: NUMA:非一致性内存访问 降低了缓存命中 CPU亲缘性绑定 缓存写的机制:通写,回写 IO设备: 设备控制器(适配器)和设备本身 控制器:集成在主板上的一块芯片或一组芯片 从操作系统接收命令,并完成命令的执行 驱动程序:通常应该由设备生产商, 每个控制器都有少量的用于通信的寄存器,每个寄存器表现为一个I/O端口 所有的寄存器组合称为设备IO地址空间 I/O端口空间   16b  65535 系统启动时注册声请端口 输入,输出的实现: 1)轮询:忙等

硬件基础知识与底层工作原理

1.进入虚拟机(vm)的BOIS,组合键 Ctrl+Atl+Insert2.运算器,控制器,存储器(RAM),输入,输出,北桥,南桥,ROM,缓存,中断,寄存器3.程序局部性原理(时间与空间的局部性)4.机器语言-〉微码(汇编语言)-〉编译器(编译成机器语言)5.高级语言-〉编译--〉机器语言6.API(库),ADI7.硬件架构:ARM系列,X86,安腾,alpha,UltraSparc(sun),Power(IBM),M68k(M68000),PowerPC8.操作系统:Windows,Lin

存储器

一.前言 在分析了处理器调度后,接着分析存储器管理,如何对存储器进行有效的管理,直接影响着存储器的利用率和系统性能.下面,开始存储器管理的学习. 二.存储器的层次结构 2.1 主存储器 主存储器是计算机系统中的一个主要部件,用于保存进程运行时的程序和数据,CPU的控制部件只能从主存储器中取得指令和数据,数据能够从主存储器中读取并将他们装入到寄存器中,或者从寄存器存入到主存储器,CPU与外围设备交换的信息一般也依托于主存储器地址空间.但是,主存储器的访问速度远低于CPU执行指令的速度,于是引入了寄

linux --&gt; 文件系统十问

文件系统十问 参考:http://djt.qq.com/article/view/620 关于Linux文件系统相关的问题: 1.机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的? 2.touch一个新的空文件占用磁盘空间吗? 占用的话占用多少? 3.新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大? 4.你知道文件名是记录在磁盘的什么地方吗? 5.文件名最长多长?受什么制约? 6.文件名太长了会影响系统性能吗?为什么会产生影响? 7.一个目录

CAPI 初探及使用小结(2)

作者注: 限于能力和时间,文中定有不少错误,欢迎指出,邮箱[email protected], 期待讨论.由于绝大部分是原创,即使拷贝也指明了出处(如有遗漏请指出),所以转载请表明出处http://www.cnblogs.com/e-shannon/ http://www.cnblogs.com/e-shannon/p/7495618.html 2 CAPI overview 2.1         背景 2.1.1          行业背景 2013年8月由IBM.Google .NVIDI

【操作系统】存储器管理(四)

一.前言 在分析了处理器调度后,接着分析存储器管理,如何对存储器进行有效的管理,直接影响着存储器的利用率和系统性能.下面,开始存储器管理的学习. 二.存储器的层次结构 2.1 主存储器 主存储器是计算机系统中的一个主要部件,用于保存进程运行时的程序和数据,CPU的控制部件只能从主存储器中取得指令和数据,数据能够从主存储器中读取并将他们装入到寄存器中,或者从寄存器存入到主存储器,CPU与外围设备交换的信息一般也依托于主存储器地址空间.但是,主存储器的访问速度远低于CPU执行指令的速度,于是引入了寄

软考笔记之存储管理

软考随堂笔记 考点1 实存管理 考点2 虚存管理 程序的装入(重定位)(将逻辑地址转换成物理地址) 静态重定位:静态重定位是在虚空间程序执行之前由装配程序完成地址影射工作. 动态重定位:动态重定位是在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换为内存地址. 实存管理 存储管理的任务是存储空间的分配与回收.在现代操作系统中通常有单一连续分配(静态).固定分区分配(静态).可变分区分配(动态)三种分配方式: 单一连续分配(静态):不分区,所有用户空间给某个进程或作业.同一时间只

C#中的Sealed和J#中的Final比较(转载)

Sealed与Final修饰符其实并不是一个语言平台的产物,他们有着各自所属的语言环境,但这两个关键字都是.Net平台中不可或缺的,那么二者用法几何,随本文一探究竟. 一.Sealed sealed 修饰符可以应用于类.实例方法和属性.用于类时,该类被称为密封类,密封类不能被继承:用于方法时,该方法被称为密封方法,密封方法会重写基类中的方法:sealed修饰符应用于方法或属性时,必须始终与override一起使用:结构是隐式密封的,因此它们不能被继承. ● 描述方法: //Error: cann