深入理解计算机系统(1)

第一章 计算机系统漫游



计算机的组成

计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。

1.1 信息的表示

信息就是位+上下文,系统中所有的信息:磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。例11011101这一串二进制,在表示整数的时候它表示221,但是如果放在JAVA的class文件当中,它可能代表一个JVM的指令。

1.2 程序的编译

对于一个简单的C语言程序来说,一般要经过预处理器、编译器、汇编器和链接器的处理,才能被翻译成一段可执行的二进制文件。

例:

#include <stdio.h>

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

在这里插入图片描述
在这里,GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。



1.3 计算机系统的硬件组成

硬件分布图


在这里插入图片描述

  1. 总线
    贯穿整个系统的是一组电子管道,称作总线(其实就是传输数据的线路),总线传送的是字,字的大小与系统相关,比如在64位操作系统当中,一个字是8个字节。
  2. I/O设备
    I/O设备是系统与外部联系的通道。I/O设备(键盘、鼠标、显示器等)由控制器(USB控制器)或者适配器(图形适配器,也就是显卡)与I/O总线相连,两者的区别在于一个是主板上的芯片组,一个是主板插槽上的卡。
  3. 主存
    它是计算机中的一个临时存储设备,在处理器执行程序的时候,主存就是临时存放数据的地方。物理上来说,它是由动态随机存取存储器(DRAM)芯片组成的,逻辑上来说,它是一组连续的字节数组,每一个字节都有唯一的地址。
  4. 处理器
    全称中央处理单元(CPU),是解释存储在主存中指令的引擎。处理器的核心是一个程序计数器(PC),它在整个计算机运行的期间都会指向一个主存中的一个内存地址,而地址当中则是一个计算机指令。处理器所做的,就是不停的执行程序计数器所指向的每一条指令,再更新程序计数器,使其指向下一条指令。处理器所做的操作是围绕主存、寄存器文件以及算术/逻辑单元(ALU)进行的,这里面处理器做的最多的动作就是
    加载(从主存将数据复制到寄存器)、
    存储(从寄存器将数据复制到主存)、
    操作(将两个寄存器的内容复制到算术/逻辑单元进行操作,结果会再次复制到寄存器)
    以及跳转(改变程序计数器当中的内容)。

hello程序是如何运行的


以linux系统为例,当我们执行一个简单的打印字符串的C程序时,我们需要在命令行输入./hello以及回车去执行该程序。在整个执行过程中,计算机主要做了三件事。


一、linux的外壳扫描用户输入的字符

当我们在键盘输入./hello时,linux的外壳程序(也就是命令行)会扫描我们输入的字符,将这些字符一一读入到寄存器当中,然后再一一放入主存。换句话说,./hello这几个字符是经过了CPU中的寄存器从而到达了主存。


在这里插入图片描述


二、加载hello文件的代码以及数据到主存


这一过程的触发是在我们按下回车的那一刻,此时系统会将存储在磁盘上的hello文件加载到主存,而此过程会利用一种叫做存储器存取的技术,使得数据不通过寄存器直接到达主存。


在这里插入图片描述


三、根据主存中代码的指令执行程序


在代码以及程序所需要的数据加载到主存后,CPU就开始从main函数的起始位置,依次执行代码中的指令。由于我们的代码只是简单的输出“hello world”这样的字符串,因此系统只是将这个字符串依次加载到寄存器,然后传输到显示器终端显示。


在这里插入图片描述


1.4 高速缓存

系统在数据的传输上花费了大量的时间。为了减少这种数据传输的时间成本,采用一种高速缓存的技术去减少这种时间成本。

高速缓存被置放于处理器当中,
L1高速缓存:容量可以达到数万字节,与处理器中的寄存器文件直接进行数据交换,访问速度几乎和访问寄存器文件一样快。
L2高速缓存:容量为数十万到数百万字节,通过一条特殊的总线连接到处理器。进程访问L2高速缓存的时间要比访问L1高速缓存的时间长5倍,但是这仍然比访问主存的时间快5~10倍。
L3高速缓存:容量更大,仍然比访问主存的时间快。

在这里插入图片描述



1.5 存储设备形成层次结构

当今的计算机系统当中,基本上全部都置入了各种各样的存储设备,这些存储设备呈明显的层次结构,它们的特点是容量越大,速度越慢。因此如果按照容量和速度将它们以图示的方式呈现的话,则看起来就像是一个金字塔,如下所示。

在这里插入图片描述



1.6 操作系统是硬件的管理者

操作系统提供了几个我们熟悉的概念去表示硬件设备,比如进程、虚拟内存、文件。
  • 进程:进程是操作系统对一个正在运行的程序的抽象。操作系统会记录每一个进程的状态,这些状态就称作进程的上下文。这些状态主要包括了PC,寄存器以及主存的当前内容。当操作系统在进程间切换的时候,也会切换相应的上下文,从而保证进程恢复到之前的状态。
  • 线程:在进程当中,又被计算机界的大神们引入了线程的概念,这些线程可以共享进程级的代码与数据,这种共享一般比进程间的共享更加高效。
  • 虚拟内存: 虚拟存储器是一种抽象描述,从物理上讲,它包含了I/O设备以及主存。在逻辑上讲,虚拟存储器被描述为虚拟地址空间。每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。
    1)程序代码和数据:对所有的进程来说,代码是从同一固定地址开始,首先是代码,然后是一些全局变量。
    2)堆:是运行时可以动态扩展的一部分内存区域,它可以由malloc和free这样的标准库函数操作。
    3)共享库:用于存放共享库的代码和数据。
    4)栈:在用户虚拟地址空间的顶部是栈,这部分区域与函数的执行有密切的关系。
    5)内核虚拟内存:地址空间顶部的区域是为内核保留的。内核是操作系统的一部分,内核也可以看做是一个进程,它在计算机运行期间总是在运行着,因此这部分内存区域对用户程序是不可见的,通俗的说就是不能用。
  • 文件:文件是I/O设备逻辑上的概念,它其实就是字节序列,也就是1和0组成的一些信息。因此所有的I/O设备,包括磁盘、键盘、鼠标、显示器都可以看成是文件。
  • 网络:前面说了,所有的I/O设备其实都是文件这一抽象概念的具体表现,那么网络其实也是文件的一种,因为说到底,它也可以被看做是一系列的字节序列。网络适配器的作用就是给计算机输入一堆被传送过来的字节序列,这里面可能包括图片、文字,甚至可能是代码等等。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值