深入理解计算机系统 家庭作业答案
(完整)计算机操作系统第八章作业及答案

(完整)计算机操作系统第八章作业及答案编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)计算机操作系统第八章作业及答案)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)计算机操作系统第八章作业及答案的全部内容。
1、目前常用的外存有哪几种组织方式?(1)连续组织方式。
为每一个文件分配一组位置相邻接的盘块,由此形成的文件物理结构是顺序式的文件结构.(2)链接组织方式。
为每个文件分配一组位置离散的盘块,通过给每个盘块设置一个指针,将属于同一个文件的盘块链接在一起,链接的顺序和文件的逻辑页的顺序一致。
由此形成的文件物理结构是链接文件。
(3) 索引组织方式。
为每个文件分配一组位置离散的盘块,为每个文件建立一个物理结构的索引表,记录分配给该文件的物理盘块,以及这些盘块和文件逻辑页顺序的对应关系。
由此形成的文件物理结构是索引文件。
10、为了快速访问,又易于更新,当数据为以下形式时,应选择何种文件组织方式: (1)不经常更新,经常随机访问:顺序文件结构。
(2)经常更新,经常按一定顺序访问:显式链接文件结构。
(3) 经常更新,经常随机访问:索引文件结构。
14有一计算机系统利用P277图8—19所示的位示图来管理空闲盘块。
盘块的大小为1K。
现要为某文件分配两个盘块,试说明盘块的具体分配过程。
(1) 顺序检索位示图,找到第一个空闲块,它的i=3,j=3;(2)计算第一个盘块的编号:b=16*(3—1)+3=35(3) 将第35号盘块分配给申请的文件,将位示图中的第3行第3列单元置0.(4) 顺序检索位示图,找到下一个空闲块,它的i=4,j=7;(5) 计算第一个盘块的编号:b=16*(4—1)+7=55(6)将第55号盘块分配给申请的文件,将位示图中的第4行第7列单元置0。
计算机体系结构(深入理解计算机系统)样卷

19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
(b) The box below shows the format of a physical address. Indicate (by labeling the diagram) the fields that would be used to determine the following: PPO The physical page offset PPN The physical page number
(a) ( ) Brian Kernighan and Dennis Ritchie who worked in the Bell Laboratories describe the programming language C in their very famous books, which is known as “K&R”.
(f) ( ) Both threads and processes share their codes and data in Unix/Linux programs.
(g) ( ) The most commonly used hardware description languages are Verilog, having a syntax similar to the Ada language, and VHDL, having a syntax similar to C language.
1
2
3
TLB Tag PPN Valid
03 B 1 07 6 0 28 3 1 01 F 0 31 0 1 12 3 0 07 E 1 0B 1 1 2A A 0 11 1 0 1F 8 1 07 5 1 07 3 1 3F F 0 10 D 0 32 0 0
计算机操作系统作业参考答案

第一章作业1.1. 设计现代OS的主要目标是什么?方便性,有效性,可扩充性和开放性.1.2. OS的作用可表现为哪几个方面?a. OS作为用户与计算机硬件系统之间的接口;b. OS作为计算机系统资源的管理者;c. OS实现了对计算机资源的抽象.第二章作业2.2. 试画出下面4条语句的前趋图:S1: a:=x+y;S2: b:=z+1;S3: c:=a-b;S4: w:=c+1;其中,语句S3必须在语句S1和语句S2都执行后才能执行,这样语句 S4也只能在c赋值后才能执行。
对应的前驱图如右所示:2.6.a. 动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只是一组有序指令的集合,是静态实体。
b. 并发性是进程的重要特征,同时也是OS的重要特征。
引入进程的目的正是为了使其程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。
c. 独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。
而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。
第三章作业3.2. 为什么进程在进入临界区之前应先执行“进入区”代码?而在退出前又要执行“退出区”代码?2. 如何利用Test-and-set指令来实现互斥?它有何缺点?为了实现多个进程对临界资源的互斥访问,必须在临界区之前加一段用于检查临界资源是否正在被访问的代码,如未被访问,该进程可进入临界区对此临界资源进行访问;如正被访问,则该进程不能进入临界区访问临界资源。
在退出临界区后,执行恢复访问标志的代码为“退出区”,而在退出前执行“退出区”代码主要是为了使其它进程能再访问此临界资源。
3.4. 如何利用Test-and-set指令来实现互斥?它有何缺点?Test-and-set指令是一种借助于一条硬件指令,即测试并建立指令TS (Test-and-set)来实现互斥的方法。
(完整版)计算机系统结构课后习题答案

第1章计算机系统结构的基本概念1.1 解释下列术语层次机构:按照计算机语言从低级到高级的次序,把计算机系统按功能划分成多级层次结构,每一层以一种不同的语言为特征。
这些层次依次为:微程序机器级,传统机器语言机器级,汇编语言机器级,高级语言机器级,应用语言机器级等。
虚拟机:用软件实现的机器。
翻译:先用转换程序把高一级机器上的程序转换为低一级机器上等效的程序,然后再在这低一级机器上运行,实现程序的功能。
解释:对于高一级机器上的程序中的每一条语句或指令,都是转去执行低一级机器上的一段等效程序。
执行完后,再去高一级机器取下一条语句或指令,再进行解释执行,如此反复,直到解释执行完整个程序。
计算机系统结构:传统机器程序员所看到的计算机属性,即概念性结构与功能特性。
在计算机技术中,把这种本来存在的事物或属性,但从某种角度看又好像不存在的概念称为透明性。
计算机组成:计算机系统结构的逻辑实现,包含物理机器级中的数据流和控制流的组成以及逻辑设计等。
计算机实现:计算机组成的物理实现,包括处理机、主存等部件的物理结构,器件的集成度和速度,模块、插件、底板的划分与连接,信号传输,电源、冷却及整机装配技术等。
系统加速比:对系统中某部分进行改进时,改进后系统性能提高的倍数。
Amdahl定律:当对一个系统中的某个部件进行改进后,所能获得的整个系统性能的提高,受限于该部件的执行时间占总执行时间的百分比。
程序的局部性原理:程序执行时所访问的存储器地址不是随机分布的,而是相对地簇聚。
包括时间局部性和空间局部性。
CPI:每条指令执行的平均时钟周期数。
测试程序套件:由各种不同的真实应用程序构成的一组测试程序,用来测试计算机在各个方面的处理性能。
存储程序计算机:冯·诺依曼结构计算机。
其基本点是指令驱动。
程序预先存放在计算机存储器中,机器一旦启动,就能按照程序指定的逻辑顺序执行这些程序,自动完成由程序所描述的处理工作。
系列机:由同一厂家生产的具有相同系统结构、但具有不同组成和实现的一系列不同型号的计算机。
计算机系统原理13015习题答案

习题解答第1章计算机系统概述1. 给出以下概念的解释说明1. 中央处理器(CPU)通常把控制部件、运算部件和各类寄存器互联组成的电路称为中央处理器(Central Processing Unit,CPU),简称处理器。
2. 算术逻辑部件(ALU)用来进行算术逻辑运算的部件,即算术逻辑部件(Arithmetic Logic Unit)。
3. 通用寄存器临时存放从主存取来的数据或运算的结果。
4. 程序计数器(PC)在执行当前指令的过程中,自动计算出下一条指令的地址并送到PC(Program Counter,PC)中保存。
5. 指令寄存器(IR)从主存取来的指令需要临时保存在指令寄存器(Instruction Register,IR)。
6. 控制器用于自动逐条取出指令并进行译码的部件,即控制元件(Control Unit,CU),也称控制器。
7. 主存储器用来存放指令和数据。
8. 总线CPU为了从主存取指令和存取数据,需要通过传输介质和主存相连,通常把连接不同部件进行信息传输的介质称为总线。
9. 主存地址寄存器(MAR)CPU送到地址线的主存地址应先存放在主存地址寄存器(Memory Address Register, MAR)中。
10. 主存数据寄存器(MDR)CPU发送到或从数据线取来的信息存放在主存数据寄存器(Memory Data Register,MDR)中。
11. 机器指令计算机能理解和执行的程序称为机器代码或机器语言程序,其中的每条指令都由0和1组成,称为机器指令。
12. 存储程序13. 指令操作码操作码字段指出指令的操作类型,如取数、存数、加、减、传送、跳转等。
14. 高级程序设计语言高级程序设计语言简称高级编程语言,是指面向算法设计的、较接近于日常英语书面语言的程序设计语言,如BASIC、C/C++、Java等。
15. 汇编语言通过用简短的英文符号和机器指令建立对应关系,以方便程序员编写和阅读程序。
《计算机系统及技术》阶段作业及答案(2)

《计算机系统及技术》阶段作业(二)一、多项选择题(共2道小题,共20.0分)1、下列活动中,你认为哪些是面向性能的?(ACE )A、一个自动往返系统的设计(通常用在机场两个航站楼之间)。
B、用于预测台风路径的模型的设计。
C、一个用于提取和维护万维网上存储的文档目录的Web搜索数据库的设计。
D、一个用于测试理论的国家经济模型的设计。
E、一个用于监视病人生命体征的程序的设计。
2、下面是一个完整的打印二叉树的Python函数。
这里,将该函数命名为PrintTree, 然后再调用PrintTree来打印左子树和右子树。
请问下面哪个图可以按字母顺序打印出来?(ABC )def PrintTree (Tree):if (Tree != None):PrintTree(Tree.Left)print(Tree.Value)PrintTree(Tree.Right)A. B. C.A、AB、BC、C二、单项选择题(共8道小题,共80.0分)1、下面的算法中,共执行了多少次while循环?(D)Count=0While (Count !=5):Count=Count+2A、1B、2C、5D、无数遍2、下面的算法时间效率分析结论中,效率最高的是哪个?(B)A、Θ(n2)B、Θ(log2n)C、Θ(n3)D、Θ(n)3、假定搜索树是一个二叉树,达到目标需要8个产生式。
如果该树是以广度优先的方式构建的,那么当达到目标状态时,树中最多的节点数是多少?(A)A、511B、16C、64D、10234、下面的树表示一个竞赛游戏中可能的移动,选手X当前可在移动A和移动B中选择其一。
选手X移动后,选手Y跟着选择移动,然后由选手X来移动最后一步。
树的叶子节点标记为W、L或T, 分别代表选手X最后是赢、输还是平局。
选手X应选择移动A还是移动B?(B)A、选择AB、选择B5、在单向链表中要删除一个数据项,那么正确的操作应该是:(A)A、用被删除项的指针来覆盖其前面一项(离头指针更近)的指针域B、用被删除项的指针来覆盖其后面一项(离头指针更远)的指针域C、用其前面一项(离头指针更近)的指针来覆盖被删除项的指针域D、用其后面一项(离头指针更远)的指针来覆盖被删除项的指针域6、设计一个数据抽象,使得满足后存入的数据可以方便的首先取出,那么这个数据抽象应该是:(D)A、队列B、列表C、链表D、堆栈7、算法是定义一个可终止过程的一组无歧义、可执行步骤的有序集合。
计算机系统结构课后习题答案(第2版)
习题一1、解释下列术语计算机系统的外特性:通常所讲的计算机系统结构的外特性是指机器语言程序员或编译程序编写者所看到的外特性,即由他们所看到的计算机的基本属性(概念性结构和功能特性)。
计算机系统的内特性:计算机系统的设计人员所看到的基本属性,本质上是为了将有关软件人员的基本属性加以逻辑实现的基本属性。
模拟:模拟方法是指用软件方法在一台现有的计算机上实现另一台计算机的指令系统。
可移植性:在新型号机出台后,原来开发的软件仍能继续在升级换代的新型号机器上使用,这就要求软件具有可兼容性,即可移植性。
可兼容性是指一个软件可不经修改或只需少量修改,便可由一台机器移植到另一台机器上运行,即同一软件可应用于不同环境。
Amdahl定律:系统中对于某一部件采用某种更快的执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频度或占总执行时间的比例。
虚拟机(Virtual Machine):指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
6、7、假定求浮点数平方根的操作在某台机器上的一个基准测试程序中占总执行时间的20%,为了增强该操作的性能,可采用两种不同的方法:一种是增加专门的硬件,可使求浮点数平方根操作的速度提高为原来的20倍;另一种方法是提高所有浮点运算指令的速度,使其为原来的2倍,而浮点运算指令的执行时间在总执行时间中占30%。
试比较这两种方法哪一种更好些。
答:增加硬件的方法的加速比Sp1=1.23, 另一种方法的加速比Sp2=1.176,经计算可知Sp1=方法更好些。
Sp2>Sp2第一种9、假设高速缓存Cache的工作速度为主存的5倍,且Cache被访问命中的概率T=为90%,则采用Cache能使整个存储系统获得多高的加速比?答:加速比,其中tm=5tc,代入公式、得到加速比S=3.33。
11、Flynn分类法的依据是什么,它与按“并行级”和“流水级”的分类方法有什么不同?答:Flynn分类法的依据是指令流和数据流多倍性概念进行分类的。
计算机试题简答题及答案
计算机试题简答题及答案一、简答题1. 请简述计算机系统由哪些基本部分组成,并解释各部分的功能。
答案:计算机系统主要由硬件系统和软件系统两部分组成。
硬件系统包括中央处理器(CPU)、存储器、输入设备和输出设备等,负责执行程序指令、处理数据、存储信息和与用户交互。
软件系统包括操作系统、应用程序和支持软件等,负责管理和协调硬件资源,提供用户界面,执行特定任务。
2. 什么是计算机网络?计算机网络的基本功能有哪些?答案:计算机网络是由多个计算机设备通过通信线路连接起来,实现资源共享和信息交换的系统。
计算机网络的基本功能包括数据传输、资源共享、分布式处理和提高系统的可靠性。
3. 请解释什么是数据库管理系统,并列举其主要功能。
答案:数据库管理系统(DBMS)是一种软件,用于创建和管理数据库。
其主要功能包括数据定义、数据操纵、数据存储、数据恢复、数据安全和数据完整性维护。
4. 什么是操作系统?请简述其主要功能。
答案:操作系统是计算机系统中负责管理和协调硬件与软件资源的软件,它提供了用户与计算机硬件之间的接口。
操作系统的主要功能包括进程管理、内存管理、文件系统管理、设备管理、用户界面和系统安全。
5. 请简述计算机病毒的特点及其对计算机系统的影响。
答案:计算机病毒是一种恶意软件,它能够自我复制并传播到其他计算机系统。
病毒的特点包括隐蔽性、破坏性和传染性。
对计算机系统的影响包括数据丢失、系统性能下降、安全漏洞和潜在的经济损失。
二、结束语以上简答题涵盖了计算机系统的基础知识,旨在帮助学生理解和掌握计算机的基本组成、网络、数据库管理系统、操作系统以及计算机病毒等概念。
通过这些问题的回答,学生可以加深对计算机科学领域的理解,并为进一步的学习和实践打下坚实的基础。
计算机组成原理和系统结构课后答案
计算机组成原理和系统结构课后答案1.1概述数字计算机的发展经过了哪几个代?各代的基本特征是什么?略。
1.2你学习计算机知识后,准备做哪方面的应用?略。
1.3抓举一个你所熟识的计算机应用例子。
略。
1.4计算机通常存有哪些分类方法?你比较介绍的存有哪些类型的计算机?略。
1.5计算机硬件系统的主要指标存有哪些?答:机器字长、存储容量、运算速度、可配置外设等。
答:计算机硬件系统的主要指标有:机器字长、存储容量、运算速度等。
1.6什么就是机器字长?它对计算机性能存有哪些影响?答:指cpu一次能处理的数据位数。
它影响着计算机的运算速度,硬件成本、指令系统功能,数据处理精度等。
1.7什么就是存储容量?什么就是主存?什么就是辅存?答:存储容量指的是存储器可以存放数据的数量(如字节数)。
1它包括主存容量和辅存容量。
主存所指的就是cpu能通过地址线轻易出访的存储器。
例如内存等。
辅存所指的就是cpu无法轻易出访,必须通过i/oUSB和地址变换等方法就可以出访的存储器,例如硬盘,u盘等。
1.8根据下列题目的描述,找出最匹配的词或短语,每个词或短语就可以采用一次。
(1)为个人使用而设计的计算机,通常有图形显示器、键盘和鼠标。
(2)计算机中的核心部件,它执行程序中的指令。
它具有加法、测试和掌控其他部件的功能。
(3)计算机的一个组成部分,运行态的程序和相关数据置于其中。
(4)处理器中根据程序的指令指示运算器、存储器和i/o设备做什么的部件。
(5)嵌入在其他设备中的计算机,运行设计好的应用程序实现适当功能。
(6)在一个芯片中集成几十万到上百万个晶体管的工艺。
(7)管理计算机中的资源以便程序在其中运行的程序。
(8)将高级语言翻译成机器语言的程序。
2(9)将指令从助记符号的形式翻译成二进制码的程序。
(10)计算机硬件与其底层软件的特定连接纽带。
供选择的词或短语:1、汇编器2、嵌入式系统3、中央处理器(cpu)4、编译器5、操作系统6、控制器7、机器指令8、台式机或个人计算机9、主存储器10、vlsi请问:(1)8,(2)3,(3)9,(4)6,(5)2,(6)10,(7)5,(8)4,(9)1,(10)7计算机系统有哪些部分组成?硬件由哪些构成?答:计算机系统硬件系统和软件系统组成。
计算机系统结构课后习题答案
第1章计算机系统结构的基本概念1.1 解释下列术语层次机构:按照计算机语言从低级到高级的次序.把计算机系统按功能划分成多级层次结构.每一层以一种不同的语言为特征。
这些层次依次为:微程序机器级.传统机器语言机器级.汇编语言机器级.高级语言机器级.应用语言机器级等。
虚拟机:用软件实现的机器。
翻译:先用转换程序把高一级机器上的程序转换为低一级机器上等效的程序.然后再在这低一级机器上运行.实现程序的功能。
解释:对于高一级机器上的程序中的每一条语句或指令.都是转去执行低一级机器上的一段等效程序。
执行完后.再去高一级机器取下一条语句或指令.再进行解释执行.如此反复.直到解释执行完整个程序。
计算机系统结构:传统机器程序员所看到的计算机属性.即概念性结构与功能特性。
在计算机技术中.把这种本来存在的事物或属性.但从某种角度看又好像不存在的概念称为透明性。
计算机组成:计算机系统结构的逻辑实现.包含物理机器级中的数据流和控制流的组成以及逻辑设计等。
计算机实现:计算机组成的物理实现.包括处理机、主存等部件的物理结构.器件的集成度和速度.模块、插件、底板的划分与连接.信号传输.电源、冷却及整机装配技术等。
系统加速比:对系统中某部分进行改进时.改进后系统性能提高的倍数。
Amdahl定律:当对一个系统中的某个部件进行改进后.所能获得的整个系统性能的提高.受限于该部件的执行时间占总执行时间的百分比。
程序的局部性原理:程序执行时所访问的存储器地址不是随机分布的.而是相对地簇聚。
包括时间局部性和空间局部性。
CPI:每条指令执行的平均时钟周期数。
测试程序套件:由各种不同的真实应用程序构成的一组测试程序.用来测试计算机在各个方面的处理性能。
存储程序计算机:冯·诺依曼结构计算机。
其基本点是指令驱动。
程序预先存放在计算机存储器中.机器一旦启动.就能按照程序指定的逻辑顺序执行这些程序.自动完成由程序所描述的处理工作。
系列机:由同一厂家生产的具有相同系统结构、但具有不同组成和实现的一系列不同型号的计算机。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2) a-b <= abs(a) + abs(b) <= abs(TMax) + abs(TMin)=(2^w - 1)所以,a,b异号,t,b同号即可判定为溢出。
int tsub_ovf(int x, int y){int w = sizeof(int)<<3;int t = x - y;x>>=(w-1);y>>=(w-1);t>>=(w-1);return(x != y) && (y == t);}顺便整理一下汇编中CF,OF的设定规则(个人总结,如有不对之处,欢迎指正)。
t = a + b;CF: (unsigned t) < (unsigned a) 进位标志OF: (a<0 == b<0) && (t<0 != a<0)t = a - b;CF: (a<0 && b>=0) || ((a<0 == b<0) && t<0) 退位标志OF: (a<0 != b<0) && (b<0 == t<0)汇编中,无符号和有符号运算对条件码(标志位)的设定应该是相同的,但是对于无符号比较和有符号比较,其返回值是根据不同的标志位进行的。
详情可以参考第三章节。
根据2-18,不难推导, (x'*y')_h = (x*y)_h + x(w-1)*y + y(w-1)*x。
unsigned unsigned_high_prod(unsigned x, unsigned y){int w = sizeof(int)<<3;A. false,float只能精确表示最高位1和最低位的1的位数之差小于24的整数。
所以当x==TMAX时,用float就无法精确表示,但double是可以精确表示所有32位整数的。
B. false,当x+y越界时,左边不会越界,而右边会越界。
C. true,double可以精确表示所有正负2^53以内的所有整数。
所以三个数相加可以精确表示。
D. false,double无法精确表示2^64以内所有的数,所以该表达式很有可能不会相等。
虽然举例子会比较复杂,但可以考虑比较大的值。
E. false,0/为NaN,(非0)/为正负inf。
同号inf相减为NaN,异号inf相减也为被减数的inf。
float的k=8, n=23。
bias = 2^7 - 1 = 127。
最小的正非规格化数为2^(1-bias-n) = 2^-149。
最小的规格化数为2^(0-bias)*2 = 2^-126。
最大的规格化数(二的幂)为2^(2^8-2 - bias) = 2^127。
因此按各种情况把区间分为[TMin, -148] [-149, -125] [-126, 127] [128, TMax]。
float fpwr2(int x){/* Result exponent and fraction */unsigned exp, frac;unsigned u;if(x < -149) {/* Too small. Return */exp = 0;frac = 0;} else if(x < -126) {/* Denormalized result */exp = 0;frac = 1<<(x+149);} else if(x < 128) {/* Normalized result. */exp = x + 127;在汇编中,没懂word_sum 15: ret $4以及diff 12: subl $4, %esp的意义何在。
可能是为了清除那个result的返回地址。
void good_echo(){char c;int x = 0;while( x=getchar(), x!='\n'&& x!=EOF){putchar(x);}}版本二:使用fgetsvoid good_echo(){const int BufferSize = 10;char s[BufferSize];int i;while(fgets(s, BufferSize, stdin)!=NULL){for(i=0;s[i];++i)putchar(s[i]);if(i<BufferSize-1) break;}return;}两种方法对于EOF好像没效果,就是输入一定字符后不按回车直接按EOF,没能正确输出。
网上查到的资料说,getchar在输入字符后,如果直接按EOF,并不能退出,只能导致新一轮的输入。
需要在最开始输入的时候按,即按了回车之后按。
而fgets就不知道了,不按回车,就不添加0。
深入理解计算机系统(第二版) 家庭作业第五章A.关键路径是%xmm1更新路径上的加法。
B. CPE下界是浮点加法的延迟。
C. 两个load操作的吞吐量界限。
(我觉得是)D. 因为乘法不在关键路径上,乘法也是流水线执行的,其限制因素为吞吐量界限。
整个程序的限制因素为最后的浮点数加法的延迟,这个延迟对float和double都是。
书上之前说关键路径,现在其实可以再仔细分析一下(以下属于个人分析):把执行指令写出了就明了了。
以整数为例:相同底色表示这些指令在一个循环内执行,以及同一个循环内的初始值:高速m C B E S t s b 缓存1322048441282372 2322048451213002 3322048812562183 4322048812822813 5322048321642165 6322048324162345高速m C B E S t s b 缓存13281921615121994 2324096442562282 3324096481282372 4322048324162245Address_end = (tag<<5) | (set<<2) | 3;行1行2组00x0120-0x0123-组10x08A4-0x08A70x0704-0x0707组2--组3-0x064C-0x064F组40x18F0-0x18F30x00B0-0x00B3组50x0E34-0x0E37-组60x1238-0x123B-组7-0x1BDC-0x1BDF11109876543210CT CT CT CT CT CT CT CT CI CI CO COB.操作地址命中?读出的值读0x409No-写0x40A Yes-读0x833Yes0xD01211109876543210 CT CT CT CT CT CT CT CT CI CI CI CO CO1211109876543210 0011100011000 B.参数值块偏移CO0x00索引CI0x6标记CT0x38命中?Yes返回值0xFA1211109876543210 1011011101100B.参数值块偏移CO0x00索引CI0x3标记CT0xB7命中?No返回值-对于写分配的高速缓存,每次写不命中时,需要读取数据到高速缓存中。
该高速缓存只有2个组,对于相同的i,j,src[i][j]和dst[i][j]对应相同的组。
src[0] src[2] 对应组0;src[1] src[3] 对于组1。
dst同src。
dst数组列0列1列2列3行0m h m h行1m m h m行2m h m h行3m m h msrc数组列0列1列2列3行0m m m m行1m m m m行2m m m m行3m m m mdst数组列0列1列2列3行0m h h h行1m h h h行2m h h h行3m h h hsrc数组列0列1列2列3行0m h h h行1m h h h行2m h h h行3m h h h函数N=64N=60sumAsumB1sumC程序清单:unsigned calc_address(unsigned head, int i, int j, int N) {return head + i*N*4+ j*4;}unsigned calc_line(unsigned add, int block_size, const int line){return(add/ block_size) % line;}int isHit(unsigned cache[], unsigned r, unsigned a, int block_size){a = a / block_size * block_size;unsigned tmp = cache[r];cache[r] = a;return tmp == a;}void testA(int block_size, const int line, unsigned add, const int N) {unsigned cache[line];memset(cache, -1, sizeof(cache));int hit = 0, miss = 0;for(int i=0; i<N; ++i)for(int j=0; j<N; ++j){unsigned address = calc_address(add, i, j, N);unsigned r = calc_line(address, block_size, line);hit += isHit(cache, r, address, block_size);}miss = N*N - hit;cout << "sumA "<< hit << " "<< miss << endl;cout << (double)miss/(N*N) << endl;}void testB(int block_size, const int line, unsigned add, const int N) {unsigned cache[line];memset(cache, -1, sizeof(cache));int hit = 0, miss = 0;for(int j=0; j<N; ++j)for(int i=0; i<N; ++i){unsigned address = calc_address(add, i, j, N);unsigned r = calc_line(address, block_size, line);hit += isHit(cache, r, address, block_size);}miss = N*N - hit;cout << "sumB "<< hit << " "<< miss << endl;cout << (double)miss/(N*N) << endl;}void testC(int block_size, const int line, unsigned add, const int N) {unsigned cache[line];memset(cache, -1, sizeof(cache));int hit = 0, miss = 0;for(int j=0; j<N; j+=2)for(int i=0; i<N; i+=2){unsigned a, r;a = calc_address(add, i, j, N);r = calc_line(a, block_size, line);hit += isHit(cache, r, a, block_size);a = calc_address(add, i+1, j, N);r = calc_line(a, block_size, line);hit += isHit(cache, r, a, block_size);a = calc_address(add, i, j+1, N);r = calc_line(a, block_size, line);hit += isHit(cache, r, a, block_size);a = calc_address(add, i+1, j+1, N);r = calc_line(a, block_size, line);hit += isHit(cache, r, a, block_size);}miss = N*N - hit;cout << "sumC "<< hit << " "<< miss << endl;cout << (double)miss/(N*N) << endl;}void testHit(){const unsigned start_address = 0x08000000;const int cache_size = 4*1024;const int block_size = 16;int line = cache_size / block_size;int N = 64;cout << N << endl;testA(block_size, line, start_address, N);testB(block_size, line, start_address, N);testC(block_size, line, start_address, N);cout << "-----"<< endl;N = 60;cout << N << endl;testA(block_size, line, start_address, N);testB(block_size, line, start_address, N);testC(block_size, line, start_address, N);}可能的想法是,将两层循环都进行二展开,这样至少可以:dst[j*dim+i] = src[i*dim+j];dst[(j+1)*dim+i] = src[i*dim+j+1];dst[j*dim+i+1] = src[(i+1)*dim+j];dst[(j+1)*dim+i+1] = src[(i+1)*dim+j+1];只要不是遇到缓存抖动,不命中率最多就是50%,还是会比较低的。