《深入理解计算机系统》 01 计算机系统漫游 信息 上下文 编译系统 处理器 高速缓存 存储设备 操作系统 进程 线程 虚拟内存 文件 网络通信 并发和并行

#include <stdio.h>

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

hello.c 程序

1 计算机系统漫游

1.1 信息就是位+上下文

程序的生命周期是从一个源程序(或者说源文件)开始的。源程序就是一个由值0和1组成的位(又称为比特)序列,8个位组织成一组,称为字节
在这里插入图片描述

计算机系统都使用ASCII标准来表示文本字符,就是用一个唯一的单字节大小的整数值来表示每个字符。
hello.c程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应某些字符。hello.c程序的ASCII码表示如下图。
在这里插入图片描述
像hello.c程序只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。
区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

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

从源文件到目标文件的转化是由编译器驱动程序完成的。

linux> gcc -o hello hello.c

GCC编译驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可分为四个阶段完成,如下图。
在这里插入图片描述
预处理阶段。预处理器(cpp)根据字符#开头的命令,修改原始的C程序。hello.c程序中第1行的#include <stdio.h>告诉预处理器读取系统头文件stdio.h的内容,并插入程序文本中。结果就得到一个C程序,通常是以.i作为文件扩展名。
编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。
链接阶段。hello程序调用了printf函数,它是标准C库中的一个函数。printf函数存在于一个名为printf.o的单独预编译好了的目标文件中,这个文件必须合并到hello.o程序中。链接器(ld)就负责处理这种合并。结果得到hello文件,可以被加载到内存中,由系统执行。

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

优化程序性能
理解链接时出现的错误
避免安全漏洞。缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因。

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

hello.c程序被编译系统翻译成了可执行文件hello。想在Unix上运行可执行文件,我们将它的文件名输入到shell的应用程序中:

linux> ./hello
hello.world
linux>

shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。
如果该命令行的第一个单词不是内置的shell命令,那么shell认为它是一个可执行文件的名字,将加载并运行这个文件。如:./hello。

1.4.1 系统的硬件组成

在这里插入图片描述
CPU:中央处理单元
ALU:算术/逻辑单元
PC:程序计数器
USB:通用串行总线
1 总线
贯穿整个系统的是一组电子管道,称为总线。总线被设计成传送定长的字节块,就是字。大多数机器是4个字节(32位),要么是8个字节(64位)。
2 I/O设备
I/O(输入/输出)设备是系统与外部世界的联系的联系通道。用户输入的键盘和鼠标,用户输出的显示器,磁盘。最开始,可执行程序hello就存放在磁盘上。
每个I/O设备都通过一个控制器或适配器与I/O总线相连。他们的功能都是I/O总线和I/O设备之间传递信息。
在这里插入图片描述

3 主存
主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
4 处理器
中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。

1.4.2 运行hello程序

在键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中,如下图**从键盘上读取hello命令**。
在这里插入图片描述

利用直接存储器存取技术,数据可以不通过处理器而直接从磁盘到达主存,如下图**从磁盘加载可执行文件到主存
在这里插入图片描述
目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的机器语言指令。这些指令将“hello word\n”字符串中的字节从主存赋值到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。如下图
将输出字符串从主存储器写到显示器**。
在这里插入图片描述

1.5 高速缓存至关重要

较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。
处理器从寄存器中读数据比从主存中读取几乎要快100倍。
针对这种处理器与主存之间的差异,采用了更小更快的存储设备,称为高速缓存存储器,存放处理器需要的信息。高速缓存存储器,如下图。
在这里插入图片描述

1.6 存储设备形成层次结构

在处理器和一个较大较慢的设备(主存)之间插入一个更小更快的存储设备(高速缓存)的想法是普遍的观念。
存储设备都被组织成了一个存储器层次结构,如下图。
在这里插入图片描述
存储层次结构的主要思想是上层的存储器作为低一层存储器的高速缓存。寄存器文件就是L1的高速缓存,L1是L2的高速缓存。

1.7 操作系统管理硬件

操作系统是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作都必须通过操作系统,如下图。
在这里插入图片描述
操作系统两个基本功能:
(1)防止硬件被失控的应用程序滥用
(2)控制复杂又大不相同的低级硬件设备。
操作系统通过抽象概念(进程、虚拟内存和文件)来实现这两个功能。
操作系统提供的抽象表示,如下图。
在这里插入图片描述
文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程是对处理器、主存和I/O设备的抽象表示。

1.7.1 进程

进程是操作系统对一个正在进行的程序的一种抽象。
并发运行是一个进程的指令和另一个进程的指令是交错执行的。

1.7.2 线程

一个进程可以由多个线程执行单元组成。
多线程之间比多进程之间更容易共享数据,线程比进程更高效。

1.7.3 虚拟内存

虚拟内存是一个抽象概念,每个进程都在独占地使用主存。
每个进程看到的内存都是一致的,称为虚拟地址空间。
下图是Linux进程的虚拟地址空间
在这里插入图片描述
地址空间最上面的区域是保留给操作系统中的代码和数据的,地址空间的底部区域存放用户进程定义的代码和数据,图中的地址是从下往上增大的。

  • 程序代码和数据。是直接按照可执行目标文件的内容初始化的,例如可执行文件hello。
  • 堆。代码和数据区后紧随着的是运行时堆。当调用C标准库函数时,堆可以在运行时动态地扩展和收缩。
  • 共享库。是一块用来存放C标准数学库的代码和数据的区域。
  • 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用栈来实现函数调用。调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩。
  • 内核虚拟内存。地址空间顶部的区域是为内核保留的。

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

1.7.4 文件

文件就是字节序列。文件的概念很强大,因为它向应用程序提供了一个统一的视图,来看待系统中可能含有的所有的I/O设备。

1.8 系统之间利用网络通信

系统通过和其他系统连接到一起。网络可视为一个I/O设备,如下图。
在这里插入图片描述
当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是说到达本地磁盘。
使用telnet应用在一个远程主机上运行hello程序。
用本地上的telnet客户端连接远程主机上的telnet服务器。在我们登录到远程主机并运行shell后,远端的shell就在等待接收命令。此后在远端运行hello程序五个基本步骤,如下图利用telnet通过网络远程运行hello
在这里插入图片描述

注:Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。

1.9 重要主题

系统是硬件和系统软件相互交织的集合体,他们必须共同协作以达到运行应用程序的最终目的。

1.9.1 Amdahl定律

1.9.2 并发和并行

并发是指一个同时具有多个活动的系统。
并行指的是用并发来使一个系统运行得更快。

1 线程级并发
并发形式允许多个用户同时与系统交互,例如,许多人从一个Web服务器获取页面。还允许一个用户同时从事多个任务,例如,在一个窗口中运行字处理器,同时又播放音乐。
由一个处理器来完成多个任务间切换的配置称为单处理器系统。
当构建多处理器组成的系统时,就得到了一个多处理器系统。
多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。如下图多核处理器的组织结构。4个处理器核集成在一个芯片上
在这里插入图片描述
微处理器有4个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分——一个保存指令,另一个存放数据。这些核共享更高层次的高速缓存,以及到主存的接口。

超线程,又称多线程,是允许一个CPU执行多个控制流的技术。比如,一个线程必须等到某些数据被装载到高速缓存中,那CPU就可以去执行另一个线程。Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统可以并行地执行8个线程。
2 指令级并行
处理器可以同时执行多条指令的属性称为指令级并行。
如果处理器可以达到比一个周期一条指令更快的执行速率,称为超标量处理器。
3 单指令、多数据并行
处理器允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即SIMD并行。

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

计算机系统提供不同层次的抽象表示,来隐藏实际的复杂性
在这里插入图片描述

1.10 小结

计算机系统是由硬件和系统软件组成的。
源程序实际上就是一个由值0和1组成的位(又成为比特)序列,8个位被组织成一组,称为字节。
使用ASCII标准来表示文本字符。
预处理阶段、编译阶段、汇编阶段和链接阶段一起构成编译系统。
总线、I/O设备、主存和处理器是系统的硬件组件。
在层次模型中,层次结构中较高次的存储设备可以作为较低层设备的高速缓存。
操作系统内核是应用程序和硬件结构的媒介。操作系统提供三个基本抽象:文件是对I/O设备的抽象;虚拟内存是对主存和磁盘的抽象;进程是处理器、主存和I/O设备的抽象。
最后,网络提供了计算机系统之间通信的手段。网络就是一种I/O设备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值