《深入理解计算机系统》速读提问

一、计算机系统漫游

本章通过运行一个hello程序为例,概述了计算机操作系统的运行过程,讲述了组成计算机系统的硬件和系统软件,讲到了处理器处理一个程序的过程。
这一章中出现了一个我首次听说到的词汇Amdahl定律,该定律的主要思想是,当我们对系统的某个部分加速时,其对整体性能的影响取决于该部分的重要性和加速程度。也就是说要加速整个系统,必须提升系统中大部分的速度。

问题:这个提速是指的硬件性能上的提升,还是操作系统算法上的优化,或是两个都能影响,谁起到的影响作用更大呢?

二、信息的表示和处理

本章重点讲述了计算机中信息的位表示形式,介绍了无符号数,补码这些信息在计算机中的不同存放方式。同时向我们介绍了32位于64位计算机的区别。最后像我们介绍了计算机中的位级运算和算术运算的方法,计算时会出现溢出的原因和其相对应的实例,让我们感受到不同定义类型的不同存储区间和计算时出现溢出计算机的显示情况。

问题:本章让我看到了平时使用的强制类型转换和计算溢出的弊端,会造成很大的误差,那么我们在大型程序编写时可能很难考虑清每一个变量应当定义怎样的数据类型,也不能全都往大了定义,会造成严重的资源浪费,那么我们该怎么正确解决这个呢,想好变量在程序中未来会不会溢出吗?还是定义动态大小呢?

三、程序的机器级表示

本章主要向我们介绍了汇编语言,介绍了计算机系统中的各种寄存器以及每一个寄存器的作用。本章通过一个个我们熟悉的C语言的代码,如赋值,指针,循环,算术运算等常用的C语言指令向我们讲述当它工作在底层,作为和机器直接交流的汇编语言的时候应当是怎么书写的,以此来让我们更加清晰的了解到计算机系统中指令执行的过程以及各个寄存器的不同功能。

问题1:加载有效地址的leaq命令这是首次用到,不过按书中介绍的看来这个命令主要用来进行公式的运算,不过它在使用时是不是真的与地址的计算无关呢?

问题2:上周的测试中在查看sum.o的汇编书写时发现了cltq这样一条汇编语句,查询之后没有找到合理的解释,书中也没介绍这条语句,不知怎么使用?

四、处理器体系结构

本章主要介绍了ISA,讲解了Y86-64指令集,分析了一下它与我们常见的X86-64的不同,然后向我们讲解了处理器的流水线操作以及其中的一些异常处理机制,本章最主要介绍的还是一些汇编语言的书写,在阅读汇编语句的方面还需要一定的功底,了解指令执行的模式也是这一章需要掌握的重点内容。

问题1:对于本章中出现的一些硬件结构的图没有特别看懂?

问题2:流水线冒险的原理分析和处理还需要深入了解,之前没有学习?

五、优化程序性能

本章主要讲解了代码的优化,讲述了编译器如何能生成高效的代码,首先指出了编程的时候的一些不好的习惯造成的内存资源的浪费,加大系统的开销和执行的时间。接着从底层的硬件架构讲起,了解处理器,寄存器,内存的性能以此来讲解怎么进行高效的编程,消除不必要的工作。

问题:本章重要讲述了优化程序性能,展开循环等等,运用优秀的算法降低开销,那么这与Amdahl定律是否相关呢?

六、存储器层次结构

本章介绍基本的存储技术RAM、ROM等,并且讲解了其价格、读写速度等等的一系列差异,告诉了我们计算机系统中对这些存储器的使用,例如CPU高速缓存区主要使用SRAM,硬盘主要采用ROM制作。那么不同的存储技术的使用就会造成整台计算机各个部件之间的读写速度差异,因此本章还像我们介绍了计算机系统平衡速度差异的办法比如映射,组相联高速缓存等方式

问题:第一次接触存储器山的概念依据书中讲述主要是为了记录程序的相应的读吞吐量的,但是还是不大了解其使用的方法,对于其生成的函数图象看不明白?

七、链接

本章主要讲解了程序执行过程中必须经历的重要的一步链接过程,;链接是将各种代码和数据片段收集并组成一个单一文件的过程。链接器处理目标文件时有三种不同的形式:可重定位,可执行,共享。接着介绍了动态链接和静态链接的两种不同的链接方式,链接器的两个主要任务是符号解析和重定位。

问题1:动态链接和静态链接使用上的区别?我们写好程序需要链接时应当如何选择?操作系统中更多的使用哪种方式?为什么?

问题2:对书中介绍的打桩机制不太了解?

八、异常控制流

本章主要讲解的是操作系统出现的异常,以及对应异常的处理方法。异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现,因此处理异常需要硬件和软件紧密合作,而异常并不是简单的出错,而是包含中断、故障、终止和陷阱四种不同类型的异常。在操作系统层内核用ECF提供进程的基本概念,在操作系统与应用程序之间的接口通过进程的发射的信号来进行不同的操作。

问题:书中介绍了30种Linux支持的30种不同类型的信号,这是不是一般说的全部的中断处理信号,还是这是不同的信号,不同的操作系统之间有相似之处吗?

九、虚拟内存

本章介绍了操作系统当中的虚拟内存,它是对主存的一个抽象,主存的空间较小,为了实现不同的进程并行,可以都分配相应大小的内存因此引入虚拟内存概念。书中主要讲解了通过分页的方式管理虚拟内存,并且详细的讲解了页表的映射方式,以及当缺页中断来临时如何进行调度的一些算法。

问题:除了分页还有分段,以及段页式的方法,单单使用分页管理不是会造成寻找浪费时间吗?为何不介绍其他的管理方式呢?还是Linux操作系统就是只使用了分页管理的方式?

十、系统级I/O

本章讲述了主存和外部设备之间复制数据的过程,介绍了一些基于Unix I/O模型的系统级函数,它们允许应用程序打开、关闭、读和写文件。Linux内核使用三个相关的数据结构表示打开的文件。通过一些编程的例子,以及具体的函数使用方法向我们展示相应的I/O操作是如何进行的。

问题:我发现C应用程序中包含着标准的I/O函数和RIO函数,而Unix I/O函数单成一类,那么我在C语言文件中可以使用相应的函数吗?

十一、网络编程

本章简单的介绍了网络编程的大体结构,基于客户端和服务器模型进行编程,并且给出了大量的实例来告诉我们如何进行网络编程,介绍了一些网络编程中才会用到的C语言函数,如connect、bind函数等。

问题:网络编程接触的较少,仅仅接触C#,不过我了解到网络编程中为了安全考虑不去使用指针,为何我在书中的程序中依然看到了指针的调用?

十二、并发编程

并发是操作系统非常重要的一个实现方式,它是在时间上重叠的一组逻辑流组成的,通过进程、I/O多路复用和线程构建的并发程序的机制,在本章中主要介绍了进程、线程的并发操作,以及并发中引发的一些问题,比如死锁的产生。

问题:在我看来并发是操作系统中应当重点了解的内容,为何书中一笔带过?就连银行家算法,读写者问题等经典的并发算法都未提及?

posted @ 2017-11-19 15:51  20179203李鹏举  阅读(220)  评论(2编辑  收藏  举报