所在小组:第三组
组内昵称:MrTrans
心得体会
计算机漫游
计算机系统是软硬件组成,软硬件共同工作来运行应用程序,所以懂硬件才能更好的使用软件,才能懂计算机系统。
信息无处不在,但是缺少了上下文就变得毫无意义。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层面已经有所区分,所以便有了浮点计算、整型计算的速度比较。
所在小组:第二组
组内昵称:跃山
心得体会
操作系统是什么?
计算机系统不仅仅是软件,也不仅仅是硬件,系统是硬件和软件的集合体 。而其中,软件指的就是操作系统;这个问题是我刚刚看这本书时比较困惑的一点,因为这本书跟其他OS相关的书的侧重点不太一样。这本书的重点在于软硬件之间的交互 ,而不止是linux kernel中的组件。
操作系统有两个基本功能:
防止硬件被滥用。
想应用程序提供简单一致的机制来控制复杂而不同的低级硬件设备。
操作系统通过进程
,虚拟内存和文件
来实现这两个功能。
amdahl定律?
amdahl定律
指的是当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速成都。
与性能优化的木桶原理
有异曲同工之妙,系统的总体性能由最弱的组件决定。所以优化系统时,优先优化性能最差的组件。一旦所有组件的吞吐量
,QPS
/TPS
/RPS
,P99
/P95
/P999
等指标都持平后,优先优化权重最高的组件,从而提高整个系统的平均性能。
并发和并行
线程级并发
指令级并行
单指令,多数据并行
计算机系统的抽象
文件
是对I/O设备
的抽象,虚拟内存
是对内存和硬盘
的抽象,而进程
是对一个正在运行的程序
的抽象。
信息存储
机器级程序将内存视为一个非常大的字节数组,称为虚拟内存
。内存的每个字节都由一个唯一的字符来标识,这个就是内存地址
,所有可能地址的集合就是虚拟地址空间
。
这节里比较有感触的是“寻址和字节顺序”
,其他几节除了位运算之外都没看太懂。
大端和小端之前就了解一些,这回又复习了一下。
大端和小端都是计算机硬件存储数据 的方式
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
之所以要区分大端和小端是因为:*计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。*但是,小端对人类太不友好,所以除了计算机内部之外,都使用大端进行存储,比如网络传输和文件存储。
所在小组:第三组
足内昵称:晴天
心得体会:
正如章节标题,漫游计算机系统,第一章从宏观角度讲解了程序从输入到输出的过程中到底发生了什么。有意思的是,作者从程序员的角度,简单明了地说明源程序的编译,以及系统和硬件之间的交互过程。
源程序文件 hello.c 被翻译为可执行的目标文件 hello 经历4个阶段,分别是 预处理 -> 编译器 -> 汇编器 -> 链接器
可执行文件 hello 被存储在磁盘中,当需要时可被读取并加载到主存
为什么需要了解编译系统如何工作?
要执行程序 hello 并将其输出到shell,绕不开硬件。系统硬件的组成有:
总线是贯穿系统中的电子管道(类似于人体中的血管),携带信息字节在各个部件中传递信息。因系统而异(比如32位或者64位),总线被设计成传送定长的字节块,传输4个字节或者8个字节。(这是不是意味着同等配置下,单位时间内传输的字节数越多,处理速率越快?)
主存 是一个临时存储设备,在处理执行程序时,用来存放程序和程序处理的数据。
处理器(CPU)是解释或执行存储在主存中的指令引擎。其核心是一个大小为一个字的存储设备,称为程序计算器。在任何时刻,PC 都指向主存中的某条机器语言指令。从系统通电开始,处理器不断执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。看上去像一个简单的指令执行模型。(所以单核CPU并发只是模拟出来的,通过快速在进程中快速切换实现,本质上CPU只能执行一条命令)
程序被加载时,指令从磁盘复制到主存;当处理器运行程序时,指令又从主存复制到处理器,而 复制就是开销 。 针对处理器与主存之间的差异,使用高速缓存存储器的局部性(作为暂时的集结区域,存放处理器近期会需要的信息)来提高程序的性能。
理解3个抽象,文件是I/O设备的抽象,虚拟内存是对程序存储器的抽象,而进程是对一个正在进行的程序的抽象。
zsy619
2020 年9 月 20 日 12:27
49
所在小组:第六组
组内昵称:慎思明辨笃行
心得体会
第一章 计算机系统漫游
基本概念:
信息就是位+上下文:字符编码
程序翻译的不同阶段:预处理阶段、编译阶段、汇编阶段、链接阶段
系统硬件的组成:总线、I/O设备、主存、处理器
高速缓存:了解是在cpu上进行设置的
进程、线程、虚拟内存、文件
系统间的通信方式:网络
重要章节:amdahl定律(阿姆达尔定律)
核心要了解公式各参数含义
系统性能提升,主要决定是并行处理的地方
通过本定律,了解程序优化的重点方向
在并行计算中用多处理器的应用加速受限于程序所需的串行时间百分比。譬如说,你的程序50%是串行的,其他一半可以并行,那么,最大的加速比就是2。不管你用多少处理器并行,这个加速比不可能提高。在这种情况下,改进串行算法可能比多核处理器并行更有效。
阿姆达尔定律的问题出在它的前提过于理想化。因为并行算法通常能处理比串行算法更大规模的问题,即使算法仍然存在着串行部分,但由于问题规模的不断扩大,往往会导致算法中串行部分所占比例的持续减少。
并发:
线程级并发
指令集并行
单指令、多数据并行
第二章 信息表示与处理
本章最大收获:充分理解不同数据类型存储方式,在不同系统存储方式也不同;了解存储结构,在实际应用中,要避免溢出问题。
计算机语言是0、1,如何让编程人员看懂,信息的表示就之至关重要,比如对虚拟内存进行编码标识。
信息存储:8进制、16进制
KAI
2020 年9 月 20 日 13:03
51
所在小组:第七组
组内昵称:Max
心得体会
第一章和第二章
CS:APP 学习过程记录
编译系统流程
编译的过程记录在 基本编译操作
大端小端
我们现在常用的 PC (Intel 或者 AMD)是小端形式存放的二进制.
保存一个比较大的整数的二进制时, 假设该整数是: 4142. 这个数的十六进制是: 0x102e. 大端小端的区别就是二进制表示这个整数. 高位的数是按照人的自觉那样, 高位在前低位在后表示(大端). 还是低位在前高位在后(小端).
大端: 该整数的表示顺序是 10 2e
小端: 该整数的表示顺序是 2e 10
关于操作系统
操作系统的主要作用:
防止软件对硬件的滥用
提供统一和简单的机制来使用硬件
操作系统上的软件与硬件(即从软件的角度, 如果要访问这些硬件, 这些硬件相当于什么):
I/O 设备: 文件
主存和 I/O 设备: 虚拟内存地址
处理器和主存和 I/O 设备: 进程
虚拟内存
操作系统提供的内存和 I/O 设备的抽象. 让进程以为自己独占了整个主存(虚拟地址空间). 主要的思路是: 将进程的虚拟内存存放到硬盘. 然后通过主存作为缓存. 操作系统通过复杂的交互. 实现虚拟地址空间内的虚拟地址到真实的物理地址的转换.
缓存与抽象
关于缓存:
作用: 上级设备更快成本更高. 容量也比较小. 缓存的目的是通过总线将数据从低速设备复制到高速设备. 从而加速数据的读写.
PS: 互联网通信也可以被看作是 I/O 设备.
关于抽象(操作系统的层面):
作用: 在操作系统上通过抽象来隐藏硬件的复杂度. 从而实现统一且简单的使用硬件的方法.
CPU
进程与线程
进程有自己独立的上下文(内存地址空间中的数据). 线程共享了进程的上下文
并行与并发
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
题解
KAI
2020 年9 月 20 日 13:14
55
所在小组:第七组
组内昵称:陈盛华
新的体会
第一章
了解计算机系统的整体架构
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的高速缓存。
总结:信息的传输速度和存储大小存在不同,高层模块的传输速度快,但存储的信息也较小,反之同理。
第二章
第二章在看第一遍,也先写第一遍的总结,后面整章读完再写一次
we8105
2020 年9 月 20 日 13:46
58
所在小组:第二组
组内昵称:cobb
心得体会
第一章:
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.84 10的19字节。
3.机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象的方式为小端法,机器选择在内存中按照从最高有效字节到最低有效字节的顺序存储对象的方式为大端法。
4.布尔代数:非、与、或、异或。
个人感受:
前1,2章都是全局的简单介绍,不够深入。后面会深入讲解,然后习题都没有时间做,后面会补上(希望能快点跟上大家的步伐)。