深入理解计算机系统笔记(一)

信息就是位+上下文

  • 程序 就是一个 由值0和1组成的 位序列

    位:”位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。

    字节:8个位被组织成一组,称为字节。 每个字节表示程序中某个文本字符。1个字节可以储存1个英文字母或者半个汉字。

    字:”字”由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。在32位操作系统当中,一个字是4个字节,字是计算机进行数据处理和运算的单位。

    每条语句被转化为一系列的低级机器语言指令, 按照可执行目标程序的格式打包, 以二进制磁盘文件的形式存放。

    系统中的所有的信息 (包括磁盘文件,内存中的程序,内存中的用户数据以及 网络上传输的数据,都是一串位bit 表示),区别不同数据对象的唯一方法,就是我们读到这些数据对象时的上下文。在不同的上下文中,一个相同的 字节序列 可能表示 一个整数,浮点数 ,字符串,或者机器指令。

  • 源程序 -> 可执行目标文件
    经过 预处理器、编译器、汇编器、链接器 (四者构成了编译系统)

1 预处理阶段:预处理器(cpp)根据以字符 # 开头的命令,修改原始的 C 程序。
2 编译阶段:编译器(cc1)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
3 汇编阶段:汇编器(as)将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件 hello.o (二进制文件)中。
4 链接阶段: 链接标准c库中的函数,比如printf,然后合并。

程序的运行

输入命令 -> CPU里的寄存器读入 -> copy到主存 shell编译代码
磁盘(可执行目标文件) -> copy到主存 -> copy到寄存器(CPU执行)
磁盘(结果) -> 主存(结果) -> copy到寄存器 -> copy到显示设备

为了提高程序性能,1 采用高速缓存存储器,作为暂时的集结区域,用来存放处理器近期可能会需要的信息。2 多线程

操作系统

应用程序和硬件之间插入的一层软件
操作系统的两个基本功能:

  ①、防止硬件被失控的应用程序滥用。

  ②、向应用程序提供简单一致的机制来控制复杂而又大相径庭的低级硬件设备。

  • 进程
    一个 CPU 看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换(上下文切换)来实现的。

  • 线程
    一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,并共享同样的代码和全局数
    据。

  • 虚拟存储器
    其基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
    为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。
    虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。(从最低的地址开始,逐步向上)
    程序代码和数据 堆 共享库 栈 内核虚拟存储器

  • 文件
    文件 就是 字节序列
    文本文件
    以ASCII码方式(也称文本方式)存储的文件,后面基于 utf-8 编码的文本文件,utf-8是能够向后兼容ASCII,即相同的ASCII文本文件和UTF-8文本文件完全一致。它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。(程序就是文本文件)
    二进制文件
    是基于值编码的文件,你可以根据具体应用,指定某个值(可以看作是自定义编码)。

    物理层上讲数据都是二进制存储的,逻辑层上讲就会出现“文本文件”和“二进制文件”的不同解析方式。这就是他们最本质的区别。

  • 并发
    指一个同时具有多个活动的系统

  • 并行
    用并发来使一个系统运行得更快
    并行可以在计算机系统的多个抽象层次上运用
    重点强调的三个层次:线程级并发、指令级并行、单指令/多数据并行

  • 三个抽象
    文件是对 I/O 设备的抽象,虚拟存储器是对主存和磁盘I/O设备的抽象,而进程是对处理器、主存和I/O设备的抽象。
    在处理器里,指令集架构提供了对实际处理器硬件的抽象。

  • 总线
    贯穿整个系统的一组电子管道

  • 主存
    计算机的一个临时存储设备 由一组动态随机存储存储器组成 是一个线性的字节数组 每一个字节都有唯一的地址

  • 处理器(CPU)
    是解释(或执行)存储在主存中的指令的引擎。处理器的核心是一个字长的存储设备(或寄存器),简称程序计数器(PC),在任何时刻,它都会指向主存中的某条机器指令(即含有该条指令的地址)。从系统通电到断点,处理器一直在不断的执行程序计数器所指向指令,再更新程序计数器,使其指向下一条指令。处理器所做的操作是围绕主存、寄存器文件以及算术/逻辑单元(ALU)进行的,寄存器文件是一个小的存储设备,由一些1字长的寄存器组成,每个寄存器都有唯一的名字。ALU则计算新的数据和地址值。

CPU 在指令的要求下会做如下操作:

    ①、加载:把一个字节或者一个字从主存复制到寄存器,以覆盖寄存器原来的内容

    ②、存储:把一个字节或者一个字从寄存器复制到主存的某个位置,以覆盖这个位置上原来的内容

    ③、操作:把两个寄存器的内容复制到 ALU,ALU 对这两个字做算术操作,并把结果存放到一个寄存器中,以覆盖寄存器原来的内容

    ④、跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的内容。

系统之间利用网络通信

从一个单独的系统来看,网络可视为一个 I/O 设备
主存 -> 网络适配器 -> 网络 -> 另一台机器

分享到:
Disqus 加载中...

如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理