【第 1 周】深入理解计算机系统共读心得体会

  1. 所在小组:第三组
  2. 组内昵称:MrTrans
  3. 心得体会

计算机漫游

  • 计算机系统是软硬件组成,软硬件共同工作来运行应用程序,所以懂硬件才能更好的使用软件,才能懂计算机系统。
  • 信息无处不在,但是缺少了上下文就变得毫无意义。ASCII标准表示文本字符,被大多数现代计算机使用。
  • 了解编译系统大有裨益,可以优化程序性能,理解连接出现的错误以及避免安全漏洞。
  • 程序->可执行程序文件,经历预处理,编译器,汇编器和连接器,其中连接器最容易产生bug。
  • 在理解计算机组成中,cpu于内存之间还存在高速缓存l1,2,3,以平衡cpu于内存之间的运行速度差异。
  • 抽象是计算机逐步螺旋上升的哲学理念。文件是io的抽象,虚拟内存是主存和磁盘的抽象,进程则是文件,内存,处理器的抽象。
  • 线程共享内存,优于进程的上下文切换,协程上下文切换更优于线程。
  • 程序运行,虚拟内存为每个进程提供假象,堆向上动态扩展与收缩,栈向下动态扩展与收缩。
  • Amdahl定律,s=1/(1-a)+a/k 最优性能解不是某一单方面的提升,综合公式考虑。
  • cpu超线程技术,也就是同时多线程。降低并发的压力,并行优化。

信息的表示和处理

大多数计算机都使用8位的块或者字节,作为最小的可寻址内存单位,而不是访问内存中单独的位。

重温16进制,10进制,二进制之间的转换。

同一个数值,整型与浮点型表示二进制,有13个位,序列和位会是相同的。

0,1 也能在布尔的思维下成为代数代数运算。& ^ | ~。

^运算 能够在不引入第三个变量,实现两个数字的交换。

位级运算很基础很重要,位移运算设计逻辑与算术运算。整数的表示,uint64_t-> 9223372036854775807

1.所在小组:第二组
2.组内昵称:�
3.心得体会

1. 上下文(context):程序运行时,当所需的外部资源
2. gcc编译器的翻译过程分为:预处理、编译器、汇编器 和 链接器,最终才生成出可执行的目标程序
3. 多层缓存结构设计,主要体现了操作系统缓存处理思想的精髓。我们在实现自己的业务时,也可以借鉴这种分级缓存处理策略,可以避免缓存击穿等问题
4. 系统对资源(I/O设备、磁盘、内存)做了抽象聚合、封装。使得计算机程序,可以更简单、高效的利用这些(文件、虚拟内存、进程)抽象出来的能力
	文件:I/O设备的抽象表示
	虚拟内存:内存和磁盘I/O的抽象表示
	进程:处理器、内存、I/O设备的抽象表示

第二章略读了一遍有点懵懂,有些小问题。我还是需要在第多度几遍

1.所在小组:第六组
2.组内昵称:钟荣荣
3.心得体会:

以前读书做的笔记都是书中内容的摘抄,虽然知道这样效果不好,但是一直没想好用什么形式。曾经也尝试过把知识点用自己的话概括一遍,后面也因难度太大而放弃了。这次要读书会的要求是记录自己的心得体会,发愁了一个星期要怎么写。复盘自己读书的过程发现,读书就是一个恍然大悟的过程,并且在阅读的过程中会不断的联系和验证已学过的知识。我觉得把这些恍然大悟和验证联系的过程记录下来,也称得上是心得体会。以下是正题。
1.关于程序的编译:未读这本书以前,想象中的编译只需要一步直接得到可执行文件,读了书以后才知道程序由源码到可执行文件的几个步骤。由此认识到了解编译过程对编写更好的程序的重要性。
知识的联系:1.阅读go语言学习笔记时常常能看到作者通过执行go build -gcflags “m” 命令得到汇编代码分析代码的执行过程。2.go高级编程中关于汇编语言的的使用

2.关于系统硬件组成,高速缓存和存储设备的层次结构:这一部分除了让我了解到了计算机的各个组成之间的作用之外,灵活运用高速缓存和存储设备的层次结构的可以提高程序的性能,今后的工作中需要优化程序性能的时候需要考虑到这一个优化点。此外,存储设备的层次结构设计的思路或许会对软件架构设计有所启发

3.操作系统管理硬件:了解了操作系统的两个基本功能,进程和线程,虚拟内存,文件的基本概念。
知识的联系:kubernetes in action中介绍的实现容器隔离的两种机制和go语言实战中的goroutine。

4.信息的处理与表示:通过了解信息的表示方法,认识到之前的开发项目涉及到金额计算的精度问题的本质原因。

所在小组 :第六组

组内昵称 :undefined

心得体会

第一章:

心得一 :计算机从在于不对的进行资源的抽象:

最简单的就是CPU,包括计算单元,控制单元,存储单元

由于存储单元成本过大,需要不断的增加存储单元,则增加了,内存、磁盘、高速缓存。为了通用性,在存储空间中增加了文件系统用于管理

而针对计算单元,为了更高效的做任务计算,从原有的task抽象成包含资源的进程,再进一步抽象成线程以及后续的协程

控制单元往上对应的这是操作系统。

心得二 :协作是关键,即使计算机系统上面有各种各样的抽象,但是,最终还是由cpu来实现,而性能则是由cpu和各个组件的共同协作来决定的。当然如果是存cpu计算任务,则是更多由cpu自身决定。

第二章:

心得一:整数和浮点数在cpu层面已经有所区分,所以便有了浮点计算、整型计算的速度比较。

  1. 所在小组:第二组
  2. 组内昵称:跃山
  3. 心得体会

操作系统是什么?

计算机系统不仅仅是软件,也不仅仅是硬件,系统是硬件和软件的集合体。而其中,软件指的就是操作系统;这个问题是我刚刚看这本书时比较困惑的一点,因为这本书跟其他OS相关的书的侧重点不太一样。这本书的重点在于软硬件之间的交互,而不止是linux kernel中的组件。

操作系统有两个基本功能:

  1. 防止硬件被滥用。
  2. 想应用程序提供简单一致的机制来控制复杂而不同的低级硬件设备。

操作系统通过进程虚拟内存和文件来实现这两个功能。

amdahl定律?

amdahl定律指的是当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速成都。

与性能优化的木桶原理有异曲同工之妙,系统的总体性能由最弱的组件决定。所以优化系统时,优先优化性能最差的组件。一旦所有组件的吞吐量QPS/TPS/RPSP99/P95/P999等指标都持平后,优先优化权重最高的组件,从而提高整个系统的平均性能。

并发和并行

  1. 线程级并发
  2. 指令级并行
  3. 单指令,多数据并行

计算机系统的抽象

文件是对I/O设备的抽象,虚拟内存是对内存和硬盘的抽象,而进程是对一个正在运行的程序的抽象。

信息存储

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的字符来标识,这个就是内存地址,所有可能地址的集合就是虚拟地址空间


这节里比较有感触的是“寻址和字节顺序”,其他几节除了位运算之外都没看太懂。

大端和小端之前就了解一些,这回又复习了一下。

大端和小端都是计算机硬件存储数据的方式

  1. 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
  2. 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

之所以要区分大端和小端是因为:*计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。*但是,小端对人类太不友好,所以除了计算机内部之外,都使用大端进行存储,比如网络传输和文件存储。

  1. 所在小组:第六组
  2. 组内昵称:蒋权
  3. 心得体会:
  • 阅读了第一章之后,有些概念比之前更了解了,比如说编码 - 在计算机中,所有的数据在 存储 和运算时都要使用 二进制 数表示(因为计算机用 高电平低电平 分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用 二进制数 来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫 编码 ),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII 编码 ,统一规定了上述常用符号用哪些二进制数来表示。

  • 我个人的理解就是,这个编码就是实现计算机系统最基础的部分,最底层就是编码的一套规则在和硬件交互。

  • 最后就是编译的过程,编译的过程其实就是翻译成机器能够执行的二进制目标文件,而底层其实就是一套cpu需要执行的指令集合。

  • 在接下来的第二章,要仔细阅读,不懂得做记号,完全不懂得可以先跳过,后面再去查阅相关资料和请教大佬。最后,希望自己好好努力坚持把本书读完。

  1. 所在小组:第三组
  2. 足内昵称:晴天
  3. 心得体会:

正如章节标题,漫游计算机系统,第一章从宏观角度讲解了程序从输入到输出的过程中到底发生了什么。有意思的是,作者从程序员的角度,简单明了地说明源程序的编译,以及系统和硬件之间的交互过程。

  • 源程序文件 hello.c 被翻译为可执行的目标文件 hello 经历4个阶段,分别是 预处理 -> 编译器 -> 汇编器 -> 链接器
  • 可执行文件 hello 被存储在磁盘中,当需要时可被读取并加载到主存

为什么需要了解编译系统如何工作?

要执行程序 hello 并将其输出到shell,绕不开硬件。系统硬件的组成有:

  • 总线是贯穿系统中的电子管道(类似于人体中的血管),携带信息字节在各个部件中传递信息。因系统而异(比如32位或者64位),总线被设计成传送定长的字节块,传输4个字节或者8个字节。(这是不是意味着同等配置下,单位时间内传输的字节数越多,处理速率越快?)
  • 主存 是一个临时存储设备,在处理执行程序时,用来存放程序和程序处理的数据。
  • 处理器(CPU)是解释或执行存储在主存中的指令引擎。其核心是一个大小为一个字的存储设备,称为程序计算器。在任何时刻,PC 都指向主存中的某条机器语言指令。从系统通电开始,处理器不断执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。看上去像一个简单的指令执行模型。(所以单核CPU并发只是模拟出来的,通过快速在进程中快速切换实现,本质上CPU只能执行一条命令)

程序被加载时,指令从磁盘复制到主存;当处理器运行程序时,指令又从主存复制到处理器,而 复制就是开销 。 针对处理器与主存之间的差异,使用高速缓存存储器的局部性(作为暂时的集结区域,存放处理器近期会需要的信息)来提高程序的性能。

理解3个抽象,文件是I/O设备的抽象,虚拟内存是对程序存储器的抽象,而进程是对一个正在进行的程序的抽象。

  1. 所在小组:第六组
  2. 组内昵称:慎思明辨笃行
  3. 心得体会

第一章 计算机系统漫游

基本概念:
    信息就是位+上下文:字符编码
    程序翻译的不同阶段:预处理阶段、编译阶段、汇编阶段、链接阶段
    系统硬件的组成:总线、I/O设备、主存、处理器
    高速缓存:了解是在cpu上进行设置的
    进程、线程、虚拟内存、文件
    系统间的通信方式:网络

重要章节:amdahl定律(阿姆达尔定律)
    核心要了解公式各参数含义
    系统性能提升,主要决定是并行处理的地方
    通过本定律,了解程序优化的重点方向

在并行计算中用多处理器的应用加速受限于程序所需的串行时间百分比。譬如说,你的程序50%是串行的,其他一半可以并行,那么,最大的加速比就是2。不管你用多少处理器并行,这个加速比不可能提高。在这种情况下,改进串行算法可能比多核处理器并行更有效。

阿姆达尔定律的问题出在它的前提过于理想化。因为并行算法通常能处理比串行算法更大规模的问题,即使算法仍然存在着串行部分,但由于问题规模的不断扩大,往往会导致算法中串行部分所占比例的持续减少。

并发:
    线程级并发
    指令集并行
    单指令、多数据并行

第二章 信息表示与处理

本章最大收获:充分理解不同数据类型存储方式,在不同系统存储方式也不同;了解存储结构,在实际应用中,要避免溢出问题。

计算机语言是0、1,如何让编程人员看懂,信息的表示就之至关重要,比如对虚拟内存进行编码标识。

信息存储:8进制、16进制

第四组第一周总结列表

  1. 所在小组:第七组
  2. 组内昵称:Max
  3. 心得体会

第一章和第二章

CS:APP 学习过程记录

编译系统流程

the-compilation-system.png

编译的过程记录在 基本编译操作

大端小端

我们现在常用的 PC (Intel 或者 AMD)是小端形式存放的二进制.

保存一个比较大的整数的二进制时, 假设该整数是: 4142. 这个数的十六进制是: 0x102e. 大端小端的区别就是二进制表示这个整数. 高位的数是按照人的自觉那样, 高位在前低位在后表示(大端). 还是低位在前高位在后(小端).

大端: 该整数的表示顺序是 10 2e 小端: 该整数的表示顺序是 2e 10

关于操作系统

操作系统的主要作用:

  1. 防止软件对硬件的滥用
  2. 提供统一和简单的机制来使用硬件

操作系统上的软件与硬件(即从软件的角度, 如果要访问这些硬件, 这些硬件相当于什么):

  • I/O 设备: 文件
  • 主存和 I/O 设备: 虚拟内存地址
  • 处理器和主存和 I/O 设备: 进程

虚拟内存

操作系统提供的内存和 I/O 设备的抽象. 让进程以为自己独占了整个主存(虚拟地址空间). 主要的思路是: 将进程的虚拟内存存放到硬盘. 然后通过主存作为缓存. 操作系统通过复杂的交互. 实现虚拟地址空间内的虚拟地址到真实的物理地址的转换.

缓存与抽象

关于缓存:

an-example-of-a-memory-hierarchy

作用: 上级设备更快成本更高. 容量也比较小. 缓存的目的是通过总线将数据从低速设备复制到高速设备. 从而加速数据的读写.

PS: 互联网通信也可以被看作是 I/O 设备.

关于抽象(操作系统的层面):

abstractions-provided-by-an-operation-system abstractions-provided-by-an-operation-system-2

作用: 在操作系统上通过抽象来隐藏硬件的复杂度. 从而实现统一且简单的使用硬件的方法.

CPU

multi-core-processor-organization

进程与线程

进程有自己独立的上下文(内存地址空间中的数据). 线程共享了进程的上下文

  • TODO: 为何线程可以提高性能

并行与并发

  • TODO: 不是很理解. 粗浅的理解: 并行是同时的. 有两套物理资源同时做两件事. 并发是交替执行的. 只有一套物理资源. 交替的做两件事
什么是超线程技术
  • TODO: 不是很理解. 粗浅的理解: 通过提供特定硬件(两份). 从而让一个CPU核心有选择性的将两个可以同时执行的进程进行同时的执行.

类型的作用

二进制往往是以字节为单位的. 类型是通过编译器来确定多个字节的二进制共同表示一个数据.

有符号数与无符号数

通过将特定类型的最高为作为符号位来表示正负. 比如 1000,0000 中的最高为的 1 表示的就是负数. 其值是 -1 * 最高为的值 + 其他位的值 . 这种表示负数的方式叫做补码.

乘法除法实现

  • TODO:
  • 乘法的思路是什么?
  • 除法的思路是什么?

算术与溢出

  • TODO:
  • 加法算术溢出
  • 乘法算术溢出
  • 除法算术溢出

浮点数

在有限的二进制位内, 通过浮动的二进制小数点的位置, 尽可能表示一个精确的小数(精度层面). 见: CMU视频-P4第 06:51 时的解释

一些技巧

如何记住十六进制到十进制的关系

记住 A C F 对应的十进制的值. B 等于 A 加 1. D 等于 C 加 1. E 等于 F 减 1.

如何记住 ASCII 中数字零到九的十六进制编码

0-9 的 ASCII 十六进制刚好是 0x30-0x39

题解

  • TODO: 编辑并运行题目和代码
  1. 所在小组:第七组
  2. 组内昵称:hayden
  3. 心得体会
  • 抽象在计算机系统中的重要性编码过程中高质量的抽象能提高代码的可扩展性和灵活性,在计算机系统中,操作系统通过提供不同层级的抽象来简化了上层应用程序编码的难度。通过抽象来隐藏了系统实现的复杂性,对外提供了一直的接口。就像我们开车一样,不管什么品牌的汽车,驾驶打开差别不大,汽车内部不管怎么改造,对外提供的操作不会改变。
    • 文件是I/O设备的抽象。
    • 虚拟内存是对主存和磁盘的抽象。
    • 进程是处理器、主存和I/O总体的抽象。通过抽象我们能理解操作系统的作用是什么?操作系统是将硬件与软件的协作抽象出一个个接口,通过抽象开发者能更好的在操作系统上开发出应用程序,无需关系操作系统内部硬件与软件如何协作,深入了解操作系统需要了解底层的实现,了解操作系统是如何来进行抽象的,如何让硬件软件来进行协调工作。
  1. 所在小组:第七组
  2. 组内昵称:KAI
  3. 心得体会

相较之前概念理解的狭隘,此次理解更加准确了些。

Chapter 1:

接受的新概念:

  1. 虚拟内存:系统虚拟地址内存,目的让所有的进程看到的内存是一致的。且该部分保留给 OS 的代码和数据,对用户代码来讲,该部分是禁止访问,不可见的。
  2. Amdahi 定律:系统优化的衡量计算公式。抛弃以前的百分比方式,而是用更为直观的方式定义。

S = 1 / [(1-a) + a/k]

旧理论的扩充:

  1. 之前理解的编译系统工作流程大体是:源文件 → 汇编 → 可执行文件。当前理解的版本为:源程序(文本) → 经过预处理器处理后的源程序(文本) → 汇编程序(文本) → 可重定位目标程序(二进制) → 可执行的目标程序(二进制)

  2. 之前记得和某猿讨论,为什么 “线程超过了 CPU 核心的数量,再增加线程数系统会更慢,而非更快?”,当时只是回答了上下文切换需要时间。但是自身也没去刨根究底,什么是上下文?为什么要涉及到上下文切换。该书1.7节读完,才明白为何。明白,进程切换,也是要切换上下文的。线程切换也是需要切换的。切换的时候,首先要保存当前进程/线程的上下文,进而恢复新的进程 / 线程的上下文。因此当超过阈值时,切换锁消耗的时间,也会拖慢系统运行速度。

  3. 关于文件的理解,之前一直以为只是各式各样的文件,并不觉得 I/O设备,网络是文件。哇!涨知识了。

Chapter 2:

  1. 关于该章节,多数涉及计算,编码,以及数据类型的详解。
  2. 写程序的时候,应该注意数据类型转换带来的影响,避免运行过程中产生的莫名其妙的误差。
  3. 对数据溢出有了更为明确的理解。
  4. 关于寻址方式,以及计算,可以参考考研书籍上面的解释以及习题吧。

小结:

好的点

  1. 工期紧张的情况,任务按规定期限内完成了。
  2. 通篇阅读完,感觉知识点增加了,了解的更加全面了一些。
  3. 体会到了,技术发展是慢慢优化,演化而来的。而不是一直都那么完美!

不好的点,要修正的地方

  1. 时间原因,该画图的地方,只是标准了一下,后续要补的图。
  2. 有些点,还是浅尝辄止了,只能整本书读完,再返回来看一遍,看看能否找到答案。
  3. 书本的课后习题有些还没来得及做[已纳入国庆消灭习题计划,不信我做不完]。
  1. 所在小组:第七组
  2. 组内昵称:jinmiaoluo
  3. 见: https://github.com/jinmiaoluo/blog/tree/main/example-8-reading-notes/csapp/chapter-1-and-chapter-2
  1. 所在小组:第七组
  2. 组内昵称:陈盛华
  3. 新的体会
    第一章
  • 了解计算机系统的整体架构
    cpu(高速缓存存储器,寄存器文件,ALU运算器由算术逻辑单元)
    |(总线)
    I/O桥
    |(总线)
    主存储器(内存)
    |(总线)
    硬盘

    总结:一个计算机系统一次运算是从硬盘获取数据开始,数据经过总线传输到内存,再从内存中选出数据传输到CPU中进行运算,得到的结果会缓存到寄存器,等待下一轮的数据计算。

  • 通过第一章的1.1信息就是位+上下文,回忆了以太坊虚拟机EVM指令集的基本运算
    输入:PUSH,SLOAD(从合约存储器取值到内存中)等
    处理:ADD、MUL、SUB等
    输出:POP、SSTORE(保存合约存储器中)

     注意:模拟代码在脑中运行的过程中,需要注意两件事,第一件事是不同编译版本,相同的运算指令占用的栈空间有所不同,很容易在这里出现疑惑。第二件事是栈内上下文的切换需要特别注意,栈内频繁的跳转容易让思考混乱。
    
  • Amdahl定律

     一个系统的速度快慢,是由最大部分的速度决定的。
    
      公式:S=1/((1-a)+a/k)    //a是部分占系统整体的百分比,k是部分更新后,单一这一部分的提速倍数。S代表系统整体提速倍速。
    
     例子:部分为整个系统的60%,k提升了无穷大倍数。计算S得到2.5倍,整体的提速仅为2.5倍。
    
     总结:要补充自己的短板,这个是制约自己成长的很大因素,在专业模块做好专业的事情,其余的生活和家庭还是需要更多的知识、学习和实践。
    
  • 缓存模块
    L0:寄存器
    L1、L2、L3:CPU的高速缓存
    L4:内存
    L5:硬盘
    L6:NAS、分布式文件系统、web服务器

     原则:上一层是下一层的高速缓存。
    
     L0是L1的高速缓存,L2是L3的高速缓存,L3是L4的高速缓存,  L5是L6的高速缓存。
    
     总结:信息的传输速度和存储大小存在不同,高层模块的传输速度快,但存储的信息也较小,反之同理。
    

第二章

第二章在看第一遍,也先写第一遍的总结,后面整章读完再写一次

  • 信息存储

    1. 计算机存储的都是二进制数据,为了给人展示更多的数据,所以压缩成十六进制。
    2. 根据32位和64位系统不同,long、无符号long和char都是4个字节和8个字节,其他类型字节数都相同。
  • 寻址的字节顺序
    例子:int类型x变量,内存地址在0x110,int有4个字节大小,内存0x100,0x101,0x102,0x103,

    左边高位:0x100,右边低位:0x103

    • 小端法:低位开始存储对象【0x103,0x102,0x101,0x100】

    • 大端法:高位开始存储对象【0x100,0x101,0x102,0x103】

      总结:小端法是比较普遍的方法,如intel机器使用的一般都是小端法,但是需要注意的是,网络传输使用的一般是大端法。

  1. 所在小组:第一组
  2. 组内昵称:蔡源彬
  3. 心得体会
  • 第一章中讲到计算机的存储设备形成了一个层次结构,从上至下分别是寄存器,L1/L2/L3高速缓存,主存(DRAM),本地二级存储,远程二级存储。上层的设备的访问速度快,但是存储空间小,价格贵,下层设备的访问速度慢,但是存储空间大,价格便宜。这一部分知识我在一个数据库课上也有看到:以主存为分界线,主存以上(包括主存)是易失性存储(volatile),意思是如果把机器的电源断开,数据将丢失。主存以下的存储设备是非易失性存储(non-volatile),不需要提供持续的电源来保存数据。易失性存储支持快速随机访问( Random access),字节可寻址,而非易失性存储则是块/页可寻址,意思是程序如果想读取一个值,必须先加载4KB大小的想读取的值所在的页/块进入内存才行,非易失性存储善于循序访问( Sequential access),可以同一时间读取多块数据。通常来讲,易失性存储统称内存(memory),非易失性存储统称磁盘(disk)。位于磁盘的数据的访问速度是如此之慢,以至于优化磁盘数据的访问速度变得至关重要,是实现一个数据库需要关心的一点。

  • 第二章涉及到比较多的数据运算,需要静下心来,多看几遍才能掌握。

  • 阅读总结:
    个人比较懒,感觉坚持下来对于自己来说也是一件不容易的事情,目前对于自己这一小阶段的总结是不满意的,希望接下来能按时按质完成任务。

  1. 所在小组:第二组
  2. 组内昵称:cobb
  3. 心得体会

第一章:
1.gcc编译器于东程序读取源程序文件,并把它翻译成一个可执行目标文件。翻译过程分为四个阶段:1)预处理阶段、2)编译阶段、3)、汇编阶段、4)链接阶段。
2.系统的硬件组成:1)总线、2)I/O设备、3)主存、4)处理器。
程序运行流程:1)shell程序将字符读入寄存器,再存放到内存中,2)指令将hello目标文件中的代码和数据从磁盘复制到内存,3)处理器执行hello程序的main程序中的机器语言指令。
3.存储器层次结构:L0寄存器、L1高速缓存、L2高速缓存、L3高速缓存(SRAM)、主存(DRAM)、本地二级存储(本地磁盘)、远程二级存储。
4.进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好象在独占的使用硬件。
5.并发和并行。1)线程级并发、2)指令级并行、3)单指令多数据并行。
第二章
1.二进制,十进制,十六进制表示法相互之间的转换
2.字数据大小,32位字长限制虚拟地址空间为410的9字节。65位字长限制虚拟地址空间为1.8410的19字节。
3.机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象的方式为小端法,机器选择在内存中按照从最高有效字节到最低有效字节的顺序存储对象的方式为大端法。
4.布尔代数:非、与、或、异或。

个人感受:
前1,2章都是全局的简单介绍,不够深入。后面会深入讲解,然后习题都没有时间做,后面会补上(希望能快点跟上大家的步伐)。

  1. 所在小组:第三组
  2. 组内昵称:uucloud
  3. 心得体会

第一章 计算机系统漫游

  • c的编译系统由 预处理器编译器汇编器链接器 构成。预处理器会修改原程序,比如将include的文件插入程序文本;预编译器将文本翻译成汇编;汇编器将汇编翻译成机器语言指令,生成叫做可重定位目标程序relocatable object program的格式(就是.o);链接器将库函数中预编译好的目标文件合并到.o文件生成可执行文件。
  • 总线有 系统总线、内存总线、I/O总线。
  • 利用直接存储器存取(DMA),数据可以不通过CPU,可以直接从磁盘到内存。
  • L1几乎和访问寄存器一样快,L2比L1慢5倍,但仍然比访问内存快5~10倍。他们都是SRAM。
  • 进程、虚拟内存、文件是操作系统对硬件设备的抽象,文件是对I/O设备的抽象,虚拟内存是对主存和磁盘I/O设备的抽象,进程是对处理器,主存和I/O设备的抽象。
  • 有人说Amdahl是木桶效应,但是根据他的定义来看,这个定律更适合用抓大放小来形容。比如一个应用有两个接口,一个耗时特别长但是调用频率很低,一个耗时很短但是频率很高,这时优化耗时很长的接口可能没什么意义,因为他的初始耗时占比太低了,即使优化到极致也很难带来整体的提高。
  • SIMD并行是一种单指令,多数据并行的并行方式。他允许一条指令产生多个可并发执行的操作。有编译器会自动提取,也可以显式的使用特殊向量来编程。感觉这个并行特性对视频编解码的作用会非常大。

第二章 信息的表示和处理

  • 依赖默认的字数据大小会带来可移植性的问题,这种依赖的情况可以用int32_t或者int64_t,准确指出来。
  • 没在工作里遇到需要关注大小端的,不过前一段时间有看到一篇文章,作者debug proto消息的时候,需要知道varint是小端存储。 https://mp.weixin.qq.com/s/D-hip9Slg-n9-zxI8ygHYg
  • 在c中强制类型转换是很危险的,必须完全清楚类型的底层存储形式。对于像Go这种强类型的语言,是不太需要关心这个的,但是如果使用了unsafe.pointer这样的类型…
  1. 所在小组:第5组
  2. 组内昵称:蒋亮亮
  3. 心得体会:
  • 缓存设计思想
    主存->高速缓存->寄存器 主要三级存储,速度依次提升,容量依次减小,按照特定规律装载或者替换热点数据。同样思路可以用在系统设计,比如文件->数据库->redis->进程内存等四级存储,除了装载热点数据规律与上述思路稍有区别外,整体设计思想几乎一致。
  • 抽象思想
    计算机系统在我看来最迷人的一点就是抽象。在不同层次的抽象,同样一段数据或者一个对象,每一层都尤其精简的抽象模型,掩盖了实质的复杂。比如简单的一个数据地址,在进程看来就是一个全局唯一的地址没有特定含义,被系统抽象成了一个虚拟内存地址,但是寻址过程中对于每一层级的设备来说,地址每位数字都有特定的物理意义,比如前面几位可能指的是不同的映射表地址、缓存块基址、段地址等等。同样类似的有文件和进程的抽象。