速读《深入理解计算机系统(第三版)》问题及解决

第一章 计算机漫游

P13:用户栈和运行时堆有什么区别?数据结构中经常说堆栈,这里的堆和栈一样吗?和操作系统的堆、栈有什么区别?

参考:堆和栈的区别(内存和数据结构)

操作系统:

  • 栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。
  • 堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,与数据结构中的堆是两回事,分配方式类似于链表

    数据结构:

  • 堆:一棵倒过来的树
  • 栈:一种先进后出的数据结构。

第二章 信息的表示和处理

P31:C格式化指令“%.2x”表明整数必须用至少两个数字的十六进制格式输出。之前学过“%7.2f”,点后的2指的是小数点后两位,那么“.2x”中的点代表什么?

点号,用语分隔字段宽度和精度。所以2表示精度。对于字符串,它指定打印的字符的最大个数;对于e、E或f转换,它指定打印的小数点后的数字位数;对于g或G转换,它指定打印的有效数字位数;对于整

型数,它指定打印的数字位数(必要时可填充位0以达到要求的宽度)。也就是如果是0x6,则输出06。但"%2x"输出仍是6,2是宽度,6的前面有一个空格(C 格式化输出问题 %2x与%x,有什么区别)。

第三章 程序的机器表示

P117:之前学习系统调用时知道,系统调用传入参数按顺序赋值给ebx、ecx、edx、esi、edi、ebp,虽然这里不是系统调用,但是为什么x放在%rdi,y放在%rsi,dest放在%rdx?

参考64位和32位的寄存器和汇编的比较

  • 32位使用栈帧来作为传递的参数的保存位置,64位用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。
  • 64位没有栈帧的指针,32位用ebp作为栈帧指针,64位的rbp作为通用寄存器使用

第四章 处理器体系结构

P284:时刻240时钟上升之前,A中的I2已经到达第一个流水线寄存器的输入,I1在阶段B中的值已经到达第二个流水线寄存器的输入。A中的I2不是该到B中了吗?怎么会跑到第一个流水线寄存器中?

首先得先知道流水线寄存器是什么东西,看的比较粗,漏掉了前面的一句话“ABC是三个阶段,在各个阶段之间放上流水线寄存器”。回看后知道了第一个流水线寄存器在A和B之间,所以A中的I2准备到B,在240时钟上升之前到达A和B之间的第一个流水线寄存器的输入,时钟一上升,I2就跑到这个寄存器里,成为它的输出。

第五章 优化程序性能

P392:小结中提到没有任何编译器能用一个好的算法或数据结构代替低效率的算法或数据结构,那么如何选择好的算法或数据结构,程序员怎么才知道自己选择的就是最优?

其实我想了想还是一个经验的问题,写多了见多了自然就知道了。其次对各个算法的时间空间复杂度还需了解。

第六章 存储器层次结构

P404:如果断电,DRAM和SRAM会丢失他们的信息,那我们在关闭电脑时,数据保存到哪了呢?

经过搜索我知道了外存储器在断电后能保存数据,所以计算机电源关闭后,所有数据保存在硬盘中。开机后,想用硬盘上的信息,请装入内存。

第七章 链接

P485:这里提到程序的入口点是_start函数的地址,我们学的入口点不是Entry point address吗?二者有什么联系?

参考为什么 __start 是处理器执行的第一条指令?--entry=__start 在链接时重新指定了程序入口点为 __start。

第八章 异常控制流

P504和P526:本章先讲了中断、陷阱、故障、终止,发生后找到异常表中的异常处理号,再找到异常处理程序。而在后面又讲了信号。这两个地方都提到被零除,那发生此情况时到底是产生异常还是发出信号?

首先信号和中断的比较 + 中断和异常的比较给出了异常和函数产生信号的方式以及进程的处理过程图:

然后要把CPU和操作系统的行为分开。CPU一条指令一条指令地译码执行,当它执行到被零除错误指令时,就跳转到异常向量。操作系统负责管理所有用户的程序,如果程序要求执行一个除零错,CPU跳到异常向量了,操作系统跳转到信号处理程序。

第九章 虚拟内存

本章讲的是虚拟内存,还有一个概念是逻辑地址,虚拟地址和逻辑地址有什么区别?

参考LINUX 逻辑地址、线性地址、物理地址和虚拟地址,文章说的非常详细了,不再赘述。

第十章 系统级I/O

P624:“open函数返回的描述符总是在进程中当前没有打开的最小描述符”,这句中的描述符是什么?

文件描述符是一个整型的数据,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,所有对文件的操作都通过文件描述符实现。程序刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时打开一个新的文件,它的文件描述符会是3。返回文件描述符fd,所以在关闭该文件的时候就是close(fd)。FILE结构体里包含一个文件描述符和一个I/O缓冲区。

第十一章 网络编程

P654:在介绍connect函数时知道了客户端通过调用connect函数来建立和服务器的链接,在这之间,connect函数会阻塞,那么如何解决阻塞问题?

参考connect()函数处阻塞时间过长,如何解决?,里面的代码看的不太明白,大概意思就是设置非阻塞方式连接或另起线程。

第十二章 并发编程

本章12.5标题是“用信号量同步线程”,下属小标题为12.5.3“使用信号量来实现互斥”。互斥和同步我觉得是一个层次上的概念,互斥是一种特殊的同步,同步是一种更为复杂的互斥,二者没有包含关系。而二级标题是一级标题的展开,在里面有点包含意思,所以这样安排标题是否不妥?

时间: 2024-08-30 13:28:18

速读《深入理解计算机系统(第三版)》问题及解决的相关文章

深入理解计算机系统(第三版) csapp 第六章部分答案

6.23 平均旋转时间: T avg rotation = 1/2*T max rotation = 1/2*(60s/15000RPM)*1000ms/s≈2ms 平均传送时间: T avg transfer = 1/RPM * (1/(平均扇区数/磁道))*60s/1min = 1/15000RPM * (1/800)*1000ms/s≈0.00008ms 总的预计访问时间: T access = Tave seek + T avg rotation + T avg transfer  ≈

大小端字节序的来历(摘自《深入理解计算机系统 第三版》)

术语“little endian(小端)”和“big endian(大端)”出自Jonathan Swift的<格列佛游记>(Gulliver's Trabels)一书,其中交战的两个派别无法就应该从哪一端(小端还是大端)打开一个半熟的鸡蛋打成一致.就像鸡蛋的问题一样,选择何种字节顺序没有技术上的理由,因此争论沦为关于社会政治论题的争论. 一下是Jonathan Swift在1726年关于大小端之争历史的描述: “......下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去

深入理解C#第三版部分内容

 最近,粗略的读了<深入理解C#(第三版)>这本技术书,书中介绍了C#不同版本之间的不同以及新的功能. 现在将部分摘录的内容贴在下面,以备查阅. C#语言特性: 1.C#2.0 C#2的主要特性是泛型.可空类型.匿名方法及其他有关委托的增强和迭代模块.此外还包含一些小特性:分部类型.静态类.包含不同访问修饰符的属性的取值方法和赋值方法.命名空间别称.pragma指令以及固定大小的缓冲器. 2.C#3.0 C#3为LINQ而生,尽管很多特性在其他地方也很有用.自动属性.数组和局部变量的隐式类型.

深入理解计算机系统(第二版)----之一

第一部分:程序结构和执行 第1章:计算机系统漫游 第2章:信息的表示和处理 第3章:程序的机器级表示 第4章:处理器体系结构 第5章:优化程序性能 第6章:存储器层次结构 第二部分:在系统上运行程序 第7章:链接 第8章:异常控制流 第9章:虚拟存储器 第三部分:程序间的交互和通信 第10章:系统级I/O 第11章:网络编程 第12章:并发编程 ===第一章:计算机系统漫游================================================== 计算机系统的实现方式虽

深入理解计算机系统(第二版)----之三:程序的机器级表示

计算机执行机器代码,用字节编码低级的操作,包括处理数据.管理存储器.读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令.然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码. 本章,近距离观察机器代码和汇编代码. 机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特

读Javascript高级程序设计第三版第六章面向对象设计--创建对象

虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,age,job){ 2         var o=new Object(); 3         o.name=name; 4         o.age=age; 5         o.job=job; 6         o.sayName=function(){ 7            

深入理解计算机系统【三】

机器级表示.今天断断续续看了2小时,粗读了这章一半的内容. 计算机底层是01:但可读性不好,所以有了汇编语言.但汇编语言可读性也很差,所以又有了编译器,形成了各种贴近人类语言的Java.C之类的. 还一直以为自己干的是把人语言翻译成计算机呢,原来也是个中间层. 为什么要理解汇编?我想到了平常工作时的需求理解.现场的需求先和现场实施说,实施再找我们这边的设计,最后才到我们开发这里.这样子的需求往往就失真了许多.做出来的效果往往就不是很好,我一般都会采用开发完后多次发现场验证的方式来解决. 汇编在计

深入理解计算机系统 第三章大略和第五章大略

这2章总结的很少,主要是觉得没那么重要. 1.2个操作数的指令,第二个操作数通常是目的操作数:movb a b,move a to b,而add a b,b+=a,指令分为指令类,如mov类:movb,movw,movl,b指一个字节,w表示2个字节,l表示4个字节 movs类(扩展填符号),movz类(扩展填0) 寄存器:这里只说ia32体系的那8个32位寄存器,存数值和指针,都以%e开头,特殊地,最后两个:%esp是栈指针,%ebp是帧指针 指令可以独立地读取或写入前4个寄存器的2个低位字节

深入理解计算机系统(第二版)----之二:信息的表示和处理

二值信号容易被表示.存储和传输,比如穿孔卡上的有洞无洞,导线上的高低电压,对二值信号进行存储和执行的计算机的电子电路非常简单和可靠.制造商能够在一个单独的硅片上集成数百万甚至数十亿个这样的电路.单独的位没有意义,用一个二进制数字系统,能够用位组来编码负数,通过使用标准的字符码,能够对文档中的字母和符号进行编码. 2.1 信息存储 8位的块,即字节,是最小的可寻址的存储器单位,机器级程序把存储器视为一个非常大的字节数组,称为虚拟存储器,存储器的每个字节都由唯一的数字来标识,称为它的地址,所有可能地

【C# in depth 第三版】温故而知新(1) (转)

声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7192354.html 前言 关于这本书(<深入理解C# 第三版>)的详细情况以及好坏,自行搜索即可,我就不啰里啰嗦的,此文责在备份,意在记录一下第二次阅读当中发现原先囫囵吞枣之处,也为了记忆深刻吧.对这里还有一本<Clr via C# 第四版>也准备二次阅读,关于精度细读章节,知乎传送门( 赵姐夫的回答 ): https://www.zhihu.com/question/2728336