笔记:深入理解计算机系统(二)

ShadowC

| 本文阅读量: -

计算机基础补完计划 - 自学计算机科学相关课程。此部分为深入理解计算机系统及相关视频课程的学习笔记。

1. Preliminaries

image-20210621193812484

CPU和内存之前有较大的带宽,所有组件通过总线相连。

数据会从内存复制到寄存器和指令缓存,经过处理后,数据再从寄存器复制到内存的对应位置。

计算机的性能不止取决于CPU的时钟频率,同时也受到数据和指令加载的速度限制,因此有两个提高性能的思路,一是增加带宽,提高一次读取的数据量,二是在CPU中设置缓存。

数据用二进制表示时,在电子元件层面也很容易表示,例如按照时钟频率,0-0.5v认为是0,2.8-3.3v认为是1,这样可以在有噪声和不精确(inaccurate)的介质中可靠传输。

2. Representing information as bits and bytes

从二进制比特编码为数据(整数如何表示)

八位比特编为一个字节,取值0-255,可以被表示为2位十六进制数。

[进制转换、十六进制的相关内容,略]

内存如何组织(如何寻址数据)

内存中的每个字节都有一个地址,从000··0FFF··F,取决于所用机器的字长,如32位系统或64位系统。机器的字长也决定了系统内存的最大容量(32位 -> 4G)

程序中的数据组织,放置在内存的实际位置,取决于编译器和运行时系统(Runtime system)

面向字的内存组织(Word-Oriented Memory Organization),不同字长的所有体系,均有统一的策略(Uniform poicy),即将字的第一个字节所在的位置定义为其地址。

3. Organizing and addressing data in memory

[指针相关内容:指针,地址,指针存在特定地址,指针指向的地址]

一个地址储存的数据到底是指针还是数字,取决于如何解释它(Interpret)。

多字节的字中,字节的顺序如何对应?大端对齐(Big-endian)和小端对齐(little-endian)

0x12345678

大端对齐 0x100 0x101 0x102 0x103
12 34 56 78
小端对齐 0x100 0x101 0x102 0x103
78 56 34 12

X86架构使用了小端对齐的方式。考虑到字长的变化后,小端对齐更利于迁移(可以直接在短的字长后面加0,而不需要移动原有数据的位置。

4. Manipulating data in memory using C

[C语言中指针的定义、使用,略]

C语言中的*意为反引用(Dereference),表明该变量不被直接使用,而是使用其指向的内存地址。

[C语言中数组与指针的关系,略]

// 简单的指针与数组知识点测试
int big_array[128];

int *array_ptr;
array_ptr = big_array;
array_ptr = &big_array[0];
array_ptr = &big_array[3];
array_ptr = &big_array[0] + 3;
array_ptr = big_array + 3;
*array_ptr = *array_ptr + 1;
array_ptr = &big_array[130];

数组就是指向数组内第一个元素的指针,所以数组的第一个元素就是数组名指向的位置ptr[i] == (ptr + 0),这也是数组索引从0开始的原因。

[C语言的字符串表示,略]

5. Boolean algebra and bit-level manipulations

De Morgan’s Law: $$ \sim(A | B) = \sim A & \sim B $$ [布尔类型操作,数字作为布尔序列参与计算(位运算)]

bitwise complement <==> Logic Operation

// 防空指针
p && *p++;

用位向量(Bit vectors)来表示集合(Sets)

011010012 -> {1,2,4,7}

因此可以用位运算来进行集合操作。