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

时间:2022-01-19 23:15:28

第一章 计算机漫游

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“使用信号量来实现互斥”。互斥和同步我觉得是一个层次上的概念,互斥是一种特殊的同步,同步是一种更为复杂的互斥,二者没有包含关系。而二级标题是一级标题的展开,在里面有点包含意思,所以这样安排标题是否不妥?