计算机系统概述 - 深入理解计算机系统第三版笔记

从一个简单的hello.c 程序说起。

本文讨论的就是 执行hello 程序时,系统发生了什么以及 为什么会这样。

#include  <stdio.h>

int main()
{

    printf(“hello, world\n”);
    return 0;
}

1. 1  信息就是  位  + 上下文

1.2  程序被 其他程序 翻译成不同的 格式

 

说明:

汇编语言是非常有用的,因为它为不同高级语言的不同编译器 提供了 通用的输出语言。

例如, C编译器和 Fortran 编译器产生的输出文件 用的是一样的 汇编语言。

 

链接 阶段:  printf 函数存在于 一个名为 printf.o 的单独的预编译好了的 目标文件中,

1.3  了解编译系统如何工作的  好处/意义

优化程序性能:

       编译器将 程序 转化为 汇编代码, 通过查看汇编代码 ,可以看出 效率是否高效。从而可以调整 代码 或编译参数 ,来重新生成 汇编代码。和之前反复对比找出程序最高效的写法。

 

理解链接时 出现的错误。

避免安全漏洞。 例如 避免 缓冲区溢出。

1.4  处理器读并 解释存储存在 内存中的指令。

> ./hello

1.4.1  系统硬件组成 概述

  1. 总线

 (一组电子管道)

通常 总线被设计成 传送定长的 字(word) 。大多数机器 要么是 4个字节,要么是 8个字节。

 

  1. I/0 设备

是系统与外部世界的联系通道。图中 有四个I/O设备 : 鼠标,键盘,显示器,磁盘

每个I/O 设备都通过一个控制器 或适配器与 I/O总线相连。

控制器 是 I/O 设备本身,或者 主板上的 芯片组。

适配器 则 是 插在 主板插槽上的 卡

  1. 主存 (内存)

 

物理上来说,主存是由一组 动态随机存取存储器(DRAM)芯片组成的。

逻辑上来说,存储器 是一个线性的字节数组,每个字节都有其唯一的地址,地址从0开始。

  1. 处理器 (CPU)

有一个 程序计数器(PC) 大小 是 一个 字

在任何时刻, PC都指向  主存 中的 某条机器指令。

 

处理器从 程序计数器  指向的 内存处 读取 指令,执行该指令,然后 更新 PC ,使其指向下一条指令。注意这里“下一条指令” 并不一定和内存中 刚刚执行的指令 相邻。

 

 

 

寄存器: 大小 一个 字, 每个寄存器都有唯一的名字

寄存器文件(register file) : 由一些 寄存器组成 。

算术/逻辑单元 (ALU):  

 

cpu 都有哪些简单的操作?

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

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

操作: 把两个寄存器的内容复制到ALU ,ALU对这两个字 做 算术运算,并将结果存放到一个寄存器中。

跳转: 更新 PC 中原来的值。

1.4.2  运行hello 程序 从硬件角度看发生了什么? 概述

一旦目标文件 hello 中的代码和数据  被加载到 主存, 处理器就开始执行 hello 程序的main 程序中的机器语言指令。这些指令将 “hello, world\n”  字符串中的字节 从 主存 复制到 寄存器文件, 再从寄存器文件 中 复制到 显示设备, 最终显示在屏幕上。 步骤如下图:

 

刚开始字符串 “hello,world\n” 在磁盘上, 然后被复制到主存上, 最后从 主存复制到 显示设备。

 

1.5  高速缓存 存储器

由于从处理器 的寄存器读取数据 与从主存中读取的数据 速度 之间存在差异, 所以就有了 高速缓存存储器(cache memory)

 

总结: 意识到高速缓存存储器的 存在 ,就能够利用 高速缓存 将程序的 性能提高一个数量级。

 

1.6  存储设备 形成层次结构

1.7  操作系统(OS)  管理硬件。

1.7.1 进程

操作系统 保持跟踪进程运行所需的所有状态信息。 这种状态,也就是上下文,包括许多信息,  如 PC  和 寄存器文件 的当前值, 主存的内容。

 

注意, 内核 不是 一个独立的进程。相反,它是 系统管理全部进程 的 所有代码和 数据结构的 集合。

1.7.2 线程

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

1.7.3  虚拟内存

虚拟内存 /虚拟地址空间。  是一个 抽象概念,它为每个进程提供了 一个假象,即每个进程都在独立地使用主存。每个进程看到的内存是一致的。

程序代码和数据

共享库

栈   : 用来实现函数调用。 每次调用一个函数时, 栈就会增长; 从一个函数返回时,栈就会收缩。

内核虚拟内存。地址空间顶部的区域是为内核保留的。应用程序必须调用内核来执行这些操作。

1.7.4 文件

每个I/O 设备,包括 磁盘,键盘, 显示器,甚至网络, 都可以看成是 文件。

1.8  利用 网络 通信

 

 

1.9.1  Amdahl 定律

加速比  S = Told /  Tnew  为:

 

S  =   1/  (  (1- a) +  a/k  )

 

当 K趋向于 ∞ 的时候, 这部分花费的时间 可以忽略不计。

S∞  =  1/ (1-a )

 

1.9.2 并发和并行

  1. 线程级 并发

 

多核处理器 和 超线程(hyperthreading)

 

多核处理器

超线程/ 同时多线程(simultaneous  multi-threading) 是一项允许一个cpu 执行多个控制流的技术。这种的 CPU 某些硬件有多个备份,比如程序计数器 和 寄存器文件, 而其他的 硬件部分只有一份,比如执行浮点算术运算的单元。

 

常规的处理器 需要 大约 20000 个时钟周期 做 不同的线程间的 转换,而超线程的 处理器 可以在单个周期的基础上 决定要执行哪一个线程。

 

 

假如 一个线程必须等到某些数据被装载到高速缓存中,那cpu就可以继续去执行另一个线程。举例来说,Intel Core i7处理器可以让每个核执行两个线程,所以一个 4核的系统实际上可以并行地执行8个线程。

 

  1. 指令级并行

 

最近的处理器 可以保持每个时钟周期2-4 条指令的执行速率。 其实每条指令从开始到结束需要长的多的时间,大约20个 或者更多周期, 但是处理器使用了非常多的 聪明技巧来同时处理多达100条的指令。

 

超标量处理器(super scalar)  : 处理器可以达到比 一个周期 一条指令 更快的执行速率。

         大多数现代处理器都支持超标量操作。

 

  1. 单指令,多数据 并行

 

许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,  即 单指令,多数据, 即 SIMD并行。例如较新几代的inter 和 AMD 处理器 都具有 并行地对8对单精度浮点数做加法的指令。

 

提供这些SIMD指令多是为了提高处理影像、声音和视频数据 应用的执行速度。

 

1.9.3 计算机系统中抽象的重要性

 

指令集架构: 提高了对实际处理器硬件的抽象。使用这个抽象,机器程序代码程序表现的就好像运行在一个 一次只执行一条指令的处理器上。底层的硬件远比抽象描述的要复杂精细,它并行地执行多条指令。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值