范围

书封面-书P34

笔记

1

不同的程序写法往往是致命的,x<y并不能用x-y<0来替代,也不能用-y<-x来替代。(P-XIV)

2 编译器的四个阶段

编译器的四个阶段(P3):

  1. C语言源代码
  2. 预处理器 -> 修改后的C(比如说加了include的头文件)(后缀.i)
  3. 编译器 -> ASM代码(汇编代码)(后缀.s)
  4. 汇编器 -> 可重定位目标程序(二进制程序)(后缀.o)
  5. 链接器 -> 可执行目标程序(二进制程序)(此时链接了需要用到的库)

3 存储器层级结构

存储器层级结构(P10):

注意:

  1. 寄存器是L1的高速缓存!
  2. L3在多核处理器上经常以多核共享高速缓存的形式存在,L1与L2为每核独享
  3. 虚拟内存很大,进程虚拟内存的内容存储在磁盘上主存作为磁盘的高速缓存(P14)

4 进程与线程

(P11-12)

进程并发通过进程间切换实现,此机制称为上下文切换

Linux中,上下文包括程序计数器(PC)、寄存器、以及主存的内容

上下文切换时,操作系统保存当前进程上下文,恢复新进程的上下文,将控制权传递给新进程。

进程可以由多个线程组成

线程运行在进程的上下文中,共享同样的代码和全局数据。

多线程比多进程更容易共享数据,线程一般比进程更高效。

进程并发需要上下文切换,而线程共享上下文。

5 并发与并行

按照系统层次结构中由高到低的顺序强调三个层次(P17-19):

  1. 线程级并发(多处理器多核、超线程环境下多线程同时运行)
  2. 指令级并行(单指令周期执行多条指令,猜测是依靠预测等手段进行的)(超标量处理器,super-scalar)
  3. 单指令、多数据并行(SIMD,向量运算)

6

(P22)

浮点运算是不可结合的!(会因为精度原因造成不同的结果)

e.g. 3.14+(1e20-1e20) != (3.14+1e20)-1e20

7 信息单位

(P27)

  1. Byte: 8
  2. WORD:根据机型而定,32或64,决定了虚拟内存范围(内存的地址为一个WORD)
  3. char:1 Byte(256)
  4. short:2 Byte(65536)
  5. int:4 Byte
  6. long:在64位机器上为8 Byte
  7. p*:32位为4 Byte(32 bit),64位为8 Byte(64 bit)
  8. double:即使在32位环境下也为8 Byte(64 bit)

可以指定int的大小,如:int32_tuint64_t等。

8 大端法和小端法(字节顺序)

(P29)

如:(int, 4Byte) 0x 00 AB CD EF,

小端法(数据小端靠近数据地址):

内存地址 内容
... ...
0x103 00
0x102 AB
0x101 CD
0x100 EF
... ...
0 ...

大端法(数据大端靠近数据地址):

内存地址 内容
0 ...
... ...
0x100 00
0x101 AB
0x102 CD
0x103 EF
... ...

问题

  1. (P12)系统调用(System Call)与键盘上SysRq键之间的关系?
  2. (P13)进程的虚拟地址空间中,堆向高地址扩张,栈向低地址扩张?
  3. (P13)内核虚拟内存不允许通过地址访问,只允许调用内核来访问,为什么还要放在进程虚拟地址空间中?
  4. (P27)uint32_t中的t代表什么?(A:typedef)
  5. (P27)好奇32位环境下double是如何计算的,会不会牺牲性能,为什么会牺牲性能,64位环境下速度会不会更快?64位环境下double会不会和float是同一量级的运行速度?
最后修改:2021 年 09 月 02 日 02 : 10 AM
如果觉得这篇文章对你有用,请随意赞赏~