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倍

posted @ 2021-04-11 19:21  陌天森  阅读(101)  评论(0)    收藏  举报