深入理解计算机系统-计算机系统漫游(一)

一、信息就是位+上下文

#include <stdio.h>

int main()
{
	print("hello, world\n");
	return 0;
}

源程序实际上就是一个由0和1组成的(又称为比特)序列,8个位被组成一组,称为字节,每个字节表示程序中的某些文本字符。

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

hello程序从源文件到可执行目标文件

gcc -o hello hello.c

编译过程不做赘述,最终生成可执行目标程序(二进制)

三、了解编译系统如何工作是大有益处的

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞:例如缓冲区溢出错误

四、处理器读并解释储存在内存中的指令

1.系统的硬件组成

  1. 总线:贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。
  2. I/O设备:系统与外部世界的联系通道,例如:鼠标、键盘、显示器、磁盘…
  3. 主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。物理上来说,是由一组动态随机存取存储器(DRAM)芯片组成。逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。
  4. 处理器:中央处理单元(CPU),是解释(执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令。

ALU:算数/逻辑单元,围绕主存、寄存器文件、ALU的常用操作如下

  1. 加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容
  2. 存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容
  3. 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算数运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容
  4. 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值

2.运行hello程序

  1. 键盘上输入./hello,shell程序将字符逐一读入寄存器,再放到内存中
  2. 点击回车,shell执行一系列指令,加载hello文件,将hello文件中的代码和数据复制到主存,最终输出字符串hello, world\n

五、高速缓存至关重要

由于寄存器、主存、磁盘等设备性能和造价上的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(简称cache),作为暂时的集结区域,存放处理器近期可能会需要的信息。
高速缓存存储器就在寄存器文件旁边,协助寄存器工作。

六、存储设备形成层次结构

存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。

存储设备说明
寄存器CPU寄存器保存来自高速缓存存储器的字
L1高速缓存(SRAM)L1高速缓存保存取自L2高速缓存的高速缓存行
L2高速缓存(SRAM)L2高速缓存保存取自L3高速缓存的高速缓存行
L3高速缓存(SRAM)L3高速缓存保存取自主存的高速缓存行
主存(DRAM)主存保存取自本地磁盘的磁盘块
本地二级存储(本地磁盘)本地磁盘保存取自远程网络服务器上磁盘的文件
远程二级存储分布式文件系统,Web服务器

七、操作系统管理硬件

可以把操作系统看成是应用程序和硬件之间插入的一层软件。所有应用程序对硬件的操作尝试都必须通过操作系统。
应用程序—>操作系统—>处理器主存I/O设备
操作系统有两个基本功能:

  • 防止硬件被失控的应用程序滥用;
  • 向应用程序提供简单一致的机制来控制复杂又通常大不相同的低级硬件设备。

操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。
进程处理器虚拟内存主存文件(I/O设备)

1.进程

进程是操作系统对一个正在运行的程序的一种抽象。
单核的cpu可以并发运行多个进程,实际上是在快速的交替执行各个进程,其实每个时刻都只有一个进程在运行,操作系统实现这种交错执行的机制称为***上下文切换***。

2.线程

一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
由于网络服务器中对并行处理的需求,线程称为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程比进程更加轻量、高效!

3.虚拟内存

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

内核虚拟内存用户代码不可见的内存
用户栈(运行时创建的)
共享库的内存映射区域print函数
运行时堆(在运行时由malloc创建的)
读/写数据从可执行文件加载进来的
只读的代码和数据
  • 程序代码和数据:对所有的进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。
  • 堆:代码和数据区后紧随着的是运行时堆。堆可以在运行时动态地扩展和收缩
  • 共享库:大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域。
  • 栈:位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。
  • 内核虚拟内存:地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容喝着直接调用内核代码定义的函数。相反,它们必须调用内核来执行这些操作。

4.文件

文件就是字节序列,仅此而已。每个I/O设备,包括磁盘、键盘、显示器,甚至是网络,都可以看成是文件。

八、系统之间利用网络通信

从一个单独的系统来看,网络可视为一个I/O设备。当系统从主存复制一串字节到网络适配器时,数据流经过网络大刀另一台机器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。

九、重要主题

1.Amdahl定律

2.并发和并行

并发:一个同时具有多个活动的系统
并行:用并发来使一个系统运行得更快。
并行可以在计算机系统的多个抽象层次上运用。按照系统层次结构中由高到低的顺序重点强调三个层次:

  • 线程级并发:构建在进程这个抽象上,我们能够设计出同时具有多个程序执行的系统,这就导致了并发。
    超线程:有时称为同时多线程,是一项允许一个CPU执行多个控制流的技术。
  • 指令级并行:在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。
    如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量处理器。
  • 单指令、多数据并行:在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式成为单指令、多数据,即SIMD并行。

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

抽象的使用时计算机科学中最为重要的概念质疑。

  • 文件是对I/O设备的抽象
  • 虚拟内存是对程序存储器的抽象
  • 进程是对一个正在运行的程序的抽象
  • 虚拟机,提供对整个计算机的抽象,包括操作系统、处理器和程序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值