CSAPP第一章
源文件变为可执行文件的过程
hello.c通过预处理器变为hello.i再通过编译器变为hello.s在通过汇编器变为hello.o,最后再和其他的比如printf.o文件通过链接器生成可执行文件hello.out。
- 预处理器:根据以带#的命令来修改原来的程序,比如#include告诉编译器读取系统头文件的内容,#define来进行替换
- 编译器:将c语言转换为汇编语言
- 汇编器:把汇编语言翻译成机器语言,把这些指令打包成可重定位目标程序。
- 链接器:把多个.o文件生成一个hello.out文件,可以被加载到内存中。
系统的硬件组成
总线
贯穿整个系统的一组管道。携带信息在各个部件之间传递,通常传递的信息为定长的。大小为一个字。
i/o设备
系统与外界联系的通道,一般代码人的io设备有键盘鼠标还有显示器,磁盘。
io设备一般通过控制器(io设备本身的芯片组)和适配器(插在主板插槽上的一张卡)与io总线相连
主存
一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据
处理器(cpu)
基本上分为三个部分:PC(程序计数器),register(寄存器),ALU(算术逻辑单元)
PC:在任何时候,PC都指向主存中每条机器语言指令(含有该条指令的地址)。
register:是一个小的存储设备,单个字长。读取寄存器的速度比读取主存快100倍。磁盘比内存慢1000w倍
ALU:计算数据和地址值。
helloworld.c的执行情况
当我们在shell输入./hello.out之后,shell将字符逐个读入寄存器,然后放入内存中暂存,然后当我们按下回车之后,shell就知道了我们已经结束了命令的输入,然后shell执行一系列指令来加载hello.out,这些指令将hello.out的代码和数据从磁盘复制到主存。
利用DMA技术,数据可以不通过cpu而直接从磁盘加载到内存
当hello.out的代码和数据被加载到主存,处理器就开始执行hello.out 的main程序的机器指令,这些指令将hello world 字符串从主存复制到寄存器,再从寄存器复制到显示设备,最终显示再屏幕上
操作系统管理硬件
实际上上述的shell和hello.out 都没有直接访问硬件,而是依靠操作系统提供的服务
操作系统可以理解为硬件和应用程序的一个中间层软件。
在操作系统中:
文件是对io设备的抽象。
虚拟内存是对主存和磁盘io的抽象。
进程是对处理器,主存,io设备的抽象
内核时操作系统代码常贮主存的部分,当应用进程需要操作系统的某些操作时,比如读写文件,他就执行一条特殊的系统调用。将控制权限交给内核,然后内核执行完就返回应用程序。
阿姆达尔定律:要想加速整个系统,必须提升全部系统相当大的部分的速度。
提高计算能力的方法
线程级并发
指令级并行
单指令多数据并行
多核处理器
每个处理器都有多个cpu核心,每个CPU核心都有自己的L1cache和L2cache,这些CPU核心共享L3cache
超线程
在cpu内部程序计数器和寄存器文件这样的硬件都有多个备份,常规单线程处理器在执行线程切换时候大约需要两万个时钟周期。
容量:
寄存器文件:100-1000B
L1cache:10-100KB
L2cache:0.1-10MB
L3cache:10-100MB
内存:1-100G
磁盘:1-1000TB
速度:
和容量成反比
磁盘的速度比内存大1000W倍,寄存器比内存快100倍

浙公网安备 33010602011771号