范围
书封面-书P34
笔记
1
不同的程序写法往往是致命的,x<y并不能用x-y<0来替代,也不能用-y<-x来替代。(P-XIV)
2 编译器的四个阶段
编译器的四个阶段(P3):
- C语言源代码
- 预处理器 -> 修改后的C(比如说加了include的头文件)(后缀.i)
- 编译器 -> ASM代码(汇编代码)(后缀.s)
- 汇编器 -> 可重定位目标程序(二进制程序)(后缀.o)
- 链接器 -> 可执行目标程序(二进制程序)(此时链接了需要用到的库)
3 存储器层级结构
存储器层级结构(P10):
注意:
- 寄存器是L1的高速缓存!
- L3在多核处理器上经常以多核共享高速缓存的形式存在,L1与L2为每核独享
- 虚拟内存很大,进程虚拟内存的内容存储在磁盘上,主存作为磁盘的高速缓存(P14)
4 进程与线程
(P11-12)
进程并发通过进程间切换实现,此机制称为上下文切换。
Linux中,上下文包括程序计数器(PC)、寄存器、以及主存的内容
上下文切换时,操作系统保存当前进程上下文,恢复新进程的上下文,将控制权传递给新进程。
进程可以由多个线程组成
线程运行在进程的上下文中,共享同样的代码和全局数据。
多线程比多进程更容易共享数据,线程一般比进程更高效。
进程并发需要上下文切换,而线程共享上下文。
5 并发与并行
按照系统层次结构中由高到低的顺序强调三个层次(P17-19):
- 线程级并发(多处理器多核、超线程环境下多线程同时运行)
- 指令级并行(单指令周期执行多条指令,猜测是依靠预测等手段进行的)(超标量处理器,super-scalar)
- 单指令、多数据并行(SIMD,向量运算)
6
(P22)
浮点运算是不可结合的!(会因为精度原因造成不同的结果)
e.g. 3.14+(1e20-1e20) != (3.14+1e20)-1e20
7 信息单位
(P27)
Byte
: 8WORD
:根据机型而定,32或64,决定了虚拟内存范围(内存的地址为一个WORD)char
:1 Byte(256)short
:2 Byte(65536)int
:4 Bytelong
:在64位机器上为8 Bytep*
:32位为4 Byte(32 bit),64位为8 Byte(64 bit)double
:即使在32位环境下也为8 Byte(64 bit)
可以指定int的大小,如:int32_t
与uint64_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 |
... | ... |
问题
- (P12)系统调用(System Call)与键盘上SysRq键之间的关系?
- (P13)进程的虚拟地址空间中,堆向高地址扩张,栈向低地址扩张?
- (P13)内核虚拟内存不允许通过地址访问,只允许调用内核来访问,为什么还要放在进程虚拟地址空间中?
- (P27)
uint32_t
中的t
代表什么?(A:typedef) - (P27)好奇32位环境下
double
是如何计算的,会不会牺牲性能,为什么会牺牲性能,64位环境下速度会不会更快?64位环境下double会不会和float是同一量级的运行速度?