关于CSAPP 6.18的习题分析

关于CSAPP 6.18的习题分析


下面的站点能找到我搜集的所有和CSAPP有关的学习资料.

https://github.com/jasonleaster/CSAPP





问题背景:

                 强调一下,问题的针对性很强.在这个题目里面,cache究竟遵循什么策略就是这个题目定的.

其他的策略如果题目没说明,不考虑!题目旨在很简明而要的告诉读者替换策略的一种实现而已.


                  说明了int 的大小是4 byte.这里假设了src 从地址0开始储存, src和dst大小都是是16  bytes,那么 dst的起始地址就是 0x10. 这里只有一级缓存, CPU下面就是一层cache,再往下就是 main memory了.

                    There is a single L1 data cache that is direct-mapped, write-through, and write-allocate, with a block size of 8 bytes.

     题目假设规定了,cache的每个操作都是以 8 byte进行了.


     一开始的时候, cache里面啥也没有.每当我们试图去访问某个变量的时候,我们会先访问cache,看看里面有没有个备份,因为访问cache的速度和访问内存的速度两种不是一个数量级的.

法则:

     如果cache里面有,那么hit.我们就可以直接读取使用这个数据在cache里面的备份.

     如果cache里面没有,从main memory去读取数据,写入到cache中.再从cache中立马读取这个数据.


  对于A问:

                   

                   这里重要的就是自己要画个图出来方便理解.答案里面有了.

     对应的你能看到src从0x00开始,dst从0x10开始.

     src的前8byte数据和 dst前8 byte数据都会落在 line 0中.

     src的后8byte和dst的后八个字节会落在 line 1中.


     dst[ j ][ i ] = src[ i ] [ j ].

        

     运行程序前假设cache里什么都没有空数据

        cache里面 line 0 装的是 NULL  NULL

                                            line 1 装的是  NULL  NULL


                  i = 0; j = 0;

                  读取 src[0][0], 第一次访问cache空的 src[0][0] miss.把 src[0][0] src[0][1]都拷贝到cache里去

                           cache里面 line 0 装的是 src[0][0] src[0][1]

                                            line 1 装的是  NULL  NULL


     赋值操作要求写入到dst[0][0] ,访问cache,此时cache里面有dst嘛?没有.line 0 装的 src,line 1空着.

     dst的前8 bytes和 src的前 8 bytes冲突,于是这个时候,把在cache里面的src[0][0] src[0][1]写回内存.

     然后再把dst拷贝到cache line 0.

                           cache里面 line 0 装的是 dst[0][0] dst[0][1]

                                            line 1 装的是  NULL  NULL


                 结论: src[0][0] miss dst[0][0] miss

     如果以上没看懂就反复看,因为上面看不懂下面绝壁白搭...


     i = 0; j = 1;

                 读取src[0][1],  .和之前第一次赋值操作结束后的cache一样.

     由于这时候cache里面的情况是 line 0 装的dst前8 bytes  line 1 空着.

     读取src[0][1]又和cache里现有数据dst冲突,于是又把dst写回到内存,把内存里卖弄的src[0][0] src[0][1]读取到cache line 0.  src[0][1] miss

                           cache里面 line 0 装的是 src[0][0] src[0][1]

                                             line 1 装的是  NULL  NULL


                  开始赋值操作.需要写入的是 dst[1] [0] , 这里需要访问 line 1,line 1此时是空的.于是 dst[1][0] miss.把dst后8 bytes读取到cache的 line 1

     结论: src[0][1] miss dst[1][0]

                  赋值操作完成后

                  此时 cache里面 line 0 装的是 src[0][0] src[0][1] 

                                            line 1 装的是 dst[1][0]  dst[1][1]


                   i = 1; j = 0;

                  读取src[1][0], miss 而且和line 1的dst冲突,需要把dst写回到内存.然后读取src[1][0] src[1][1]到cache

     

      此时 cache里面 line 0 装的是 src[0][0] src[0][1] 

                                            line 1 装的是 src[1][0] src[1][1]

 

                  开始赋值操作.需要写入的是 dst[ 0 ] [ 1 ] , 这里需要访问 line 0,line 0此时是非空的.冲突,里面装着src. 于是把line 0的数据写回内存.把dst[0][0] dst[0][1]读取到cache.

      此时 cache里面 line 0 装的是   dst[0][0] dst[0][1]

                                             line 1 装的是 src[1][0] src[1][1]

                  赋值操作.


     结论: src[0][1] miss dst[1][0] miss



                   i = 1; j = 1;

                  读取src[1][1], hit  cache里面有上次赋值操作后被缓存的src[1][1], 

     

      此时 cache里面 line 0 装的是 src[0][0] src[0][1] 

                                            line 1 装的是 src[1][0] src[1][1]

 

                  开始赋值操作.需要写入的是 dst[ 1 ] [ 1 ] , 这里需要访问 line 1,line 1此时是非空的.冲突 miss,里面装着src. 于是把line 1的数据写回内存.把dst[1][0] dst[1][1]读取到cache.


      此时 cache里面 line 0 装的是 src[0][0] src[0][1] 

                                            line 1 装的是 dst[1][0] dst[1][1]


                   赋值操作.

                  结论 结论: src[1][1] hit dst[1][1]  miss


                   对于B嘛:


 注意  , 这里只改变了cache的大小,cache每次读取写入的数据大小还是没变.8 byte

              

                         @LeDy 看下面这个图,分析方法还是和前面一样,掌握方法,就能自己分析了.













### 回答1: 深入理解计算机系统(CSAPP)是由Randal E. Bryant和David R. O'Hallaron编写的经典计算机科学教材。该教材通过涵盖计算机体系结构、机器级别表示和程序执行的概念,帮助学生深入理解计算机系统的底层工作原理和运行机制。 深入理解计算机系统的练习题对于学生巩固并应用所学知识非常有帮助。这些练习题涵盖了计算机硬件、操作系统和编译器等多个领域,旨在培养学生解决实际问题和设计高性能软件的能力。 对于深入理解计算机系统的练习题,关键是通过实践进行学习。在解答练习题时,应根据课本提供的相关知识和工具,仔细阅读问题描述,并根据实际需求设计相应的解决方案。 在解答练习题时,需要多角度思考问题。首先,应准确理解题目要求,并设计合适的算法或代码来解决问题。其次,应考虑代码的正确性和效率,以及对系统性能的影响。此外,还要注意处理一些特殊情况和异常情况,避免出现潜在的错误或安全漏洞。 解答练习题的过程中,应注重查阅相关资料和参考优秀的解答。这可以帮助我们扩展对问题的理解,并学习他人的思路和解决方法。同时,还可以通过与同学和老师的讨论,共同探讨问题和学习经验。 总之,通过解答深入理解计算机系统的练习题,可以帮助学生巩固所学知识,同时培养解决实际问题和设计高性能软件的能力。这是一个学以致用的过程,可以加深对计算机系统运行机制和底层工作原理的理解。 ### 回答2: 理解计算机系统(CSAPP)是一本经典的计算机科学教材,通过深入研究计算机系统的各个方面,包括硬件、操作系统和编程环境,对于提高计算机科学专业知识与能力具有很大帮助。 练习题是CSAPP中的重要部分,通过练习题的完成,可以加深对计算机系统的理解,并将理论知识转化为实践能力。练习题的数量、难度逐渐递增,从简单的概念与基础问题到复杂的系统设计与实现。 在解答练习题时,首先需要对题目进行仔细阅读和理解,明确题目的要求和限制条件。然后,可以利用课堂讲解、教材内容、网络资源等进行查阅和学习相应的知识。同时,还可以参考课后习题解答等资料,了解一些常见的解题方法和思路。 在解答练习题时,可以利用计算机系统的工具和环境进行实际测试和验证。例如,可以使用调试器、编译器和模拟器等工具对程序或系统进行分析和测试。这样可以更加深入地理解问题的本质,并找到恰当的解决方法。 另外,解答练习题时还可以与同学、教师和网上社区进行交流和讨论。这样可以互相学习和交流解题思路,共同解决问题。还可以了解不同的解题方法和技巧,提高解题效率和质量。 练习题的解答过程可能会遇到一些困难和挑战,例如理论知识的不足、复杂问题的分析与解决。但是通过不断地思考和实践,相信可以逐渐提高解题能力,更好地理解计算机系统。 总之,深入理解计算机系统(CSAPP)练习题是提高计算机科学专业知识和能力的重要途径。通过仔细阅读和理解题目,查阅相关知识,利用计算机系统工具和环境进行实践,与他人进行交流和讨论,相信可以更好地理解计算机系统的各个方面,并将知识转化为实际能力。 ### 回答3: 《深入理解计算机系统(CSAPP)》是计算机科学领域的经典教材之一,对于深入理解计算机系统的原理、设计和实现起到了极大的帮助。在阅读这本书的过程中,书中的习题也是非常重要的一部分,通过做习题,我们可以更好地理解书中所讲的概念和思想。 CSAPP的习题涵盖了课本中各个章节的内容,从基础的数据表示和处理、程序的机器级表示、优化技术、程序的并发与并行等方面进行了深入探讨。通过解答习题,我们可以对这些知识进行实践应用,巩固自己的理解,并培养自己的解决问题的思维方式。 在解答习题时,我们需要充分理解题目要求和条件,并从知识的角度进行分析。有些习题可能需要进行一些编程实践,我们可以通过编程实现来验证和测试我们的思路和解决方案。在解答问题时,我们还可以查阅一些参考资料和网上资源,充分利用互联网的学习资源。 在解答习题时,我们需要保持积极的思维和态度。可能会遇到一些困难和挑战,但是通过坚持和努力,我们可以克服这些困难,提高我们的解决问题的能力。同时,我们还可以通过与同学或者其他人进行讨论,相互分享解题经验和思路,从而更好地理解问题。 综上所述,通过深入理解计算机系统(CSAPP)的习题,我们可以进一步巩固和深化对计算机系统的理解。掌握这些知识,不仅可以提高我们在计算机领域的能力,还可以为我们未来的学习和职业发展奠定重要的基础。因此,认真对待CSAPP的习题,是我们在学习计算机系统知识中不可或缺的一部分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值