计算机源程序的字符集一般使用ASCII码, 每个码占一个字节
C语言的编译过程可分为以下四个阶段:
- 预处理: 预处理器将.c文件中的引入的.h文件等读取并写入文件中, 形成.i文件
- 编译: 编译器将.i文件翻译为汇编语言的.s文件
- 汇编: 汇编器将.s汇编文件翻译为机器二进制指令, .o文件
- 链接: 连接器将程序中用到的.h文件对应的.o文件链接, 并生成最终的可执行目标文件
CPU读取数据是直接读取CPU的寄存器, 其容量很小. 如果可执行文件位于磁盘上, 则CPU每次取指令会将大量时间浪费在内存复制上
因此, 现代计算机通过层次结构的存储设备, 来解决CPU与存储的速度不匹配问题:
虚拟内存
虚拟空间为进程提供假象, 仿佛自己独占整个主存.
Linux中, 每个进程的虚拟地址空间采取下面的布局方式, 从底(地址小)向上依次是:
-
程序代码和数据
程序代码直接通过可执行文件初始化. 通常只读的程序和数据在下, 需要读/写的数据在上, 这部分内容初始化后大小不变
-
堆
堆在运行时动态扩展和收缩, 向上
-
共享库
存放C标准库数学库等的程序数据和代码, 同样大小不变
-
栈
用来实现函数调用, 在运行时向下动态扩展/收缩
-
内核虚拟内存
操作系统内核的代码和数据(CPU上下文?), 应用程序无法访问
线程数据存在哪里?
并发
线程并发:
多核处理器每核可执行一个线程/超线程(每核2个线程, 单周期决定执行哪个线程. 而线程切换需要20000个时钟周期)
指令并发:
Pipelining/super-scalar处理器(比1时钟周期1条更快)
单指令多数据并行:
将单指令拆分为为多条指令并行执行, 可做视频处理等
静态SRAM
双稳态, 只有有电就可保持其值, 有干扰也会恢复为稳定值
速度快, 价格高, 常做CPU高速缓存, 体积小
动态SRAM
对干扰敏感, 在10-100ms时间会失去电荷, 但可保持很多时钟周期(ns), 因此需周期性重刷
DRAM
常做主存.
二维矩阵排列(降低引脚数量); 但需分两步发送地址, 时间较长