代码改变世界

CSAPP:第一章学习笔记:斗之气1段

2019-03-19 11:07  剑动情缥缈  阅读(275)  评论(0编辑  收藏  举报

一、信息就是位+上下文:系统中的所有信息(包括磁盘文件、内存中的程序、网络上传送的数据),都是由一串比特表示,根据上下文对这些比特表示进行翻译。

二、C程序编译过程

  1.源码结构

  

// test.c
#include <stdio.h>
#include "mymath.h"// 自定义头文件
int main(){
    int a = 2;
    int b = 3;
    int sum = add(a, b); 
    printf("a=%d, b=%d, a+b=%d\n", a, b, sum);
}
// mymath.h
#ifndef MYMATH_H
#define MYMATH_H
int add(int a, int b);
int sub(int a, int b);
#endif
// mymath.c
#include<mymath.h>
int add(int a, int b){
    return a+b;
}
int sub(int a, int b){
    return a-b;
}

  2.编译流程

   

  a.预处理:进行宏替换、include文件展开等工作

  命令:gcc -E -I./inc test.c -o test.i

  观察:对include内容进行展开,从几行程序扩展成为800+行程序,如将#include<mymath.h>这行代码展开为mymath.h文件中的具体内容,仍然为C语言程序

  

  b.编译:将预处理后的程序编译为汇编代码

  命令:gcc -S -I./inc test.c -o test.s

  结果:

  

  c.汇编:将汇编代码翻译为机器码,每一个源文件均会生成一个.o文件(可重定位目标文件)

  命令:gcc -c test.s -o test.o

  d.链接:多个目标文.o以及所需的库文件(.so等)链接成最终的可执行文件

  命令:ld -o test.out test.o inc/mymath.o  ...libraries...

  可替换命令:gcc -o test.out test.o inc/mymath.o

  静态链接与动态链接:

  • 静态链接:函数代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。
  • 动态链接:链接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的信息,在可执行程序被执行时,动态链接库(.so)的全部内容将被影射到运行时相应进程的虚拟地址空间。动态链接程序将根据可执行程序中记录的信息找到对应的函数代码。

  

 三、典型系统硬件组成

  1.PC:程序计数器指向主存中某条机器指令(包含该指令的地址)

  2.寄存器:每个寄存器都有固定的名字

  3.CPU在PC指向指令的要求下可能执行加载、存储、操作、跳转等操作

  4.处理器是指令集架构的简单实现

  

四、cache

  1.局部性原理:程序具有访问局部区域里的数据和代码的趋势,通过在缓存中存放经常访问的数据,大部分内存操作都能在cache中完成

  2.L1缓存访问速度与寄存器几乎一样快,比L2高5倍,L2比主存快5-10倍

  

五、进程切换

  1.上下文切换:进程所需的所有状态信息进行切换,需要通过系统调用

  

六、虚拟内存

  1.虚拟内存:为每个进程提供抽象,即每个进程都在独占的使用主存,每个进程看到的内存是一致的,称为虚拟内存空间

  2.基本思想:把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存

  

七、并发

  1.线程级并发

  超线程:一个CPU执行多个控制流

  

  2.指令级并行:每个时钟周期执行多条指令(指令流水线)

  3.SIMD:单指令、多数据

参考:

  https://www.cnblogs.com/CarpenterLee/p/5994681.html