深入理解计算机系统1

505 阅读2分钟

计算机源程序的字符集一般使用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

常做主存.

DRAM读取

二维矩阵排列(降低引脚数量); 但需分两步发送地址, 时间较长