Fork me on GitHub

计算机系统概述

计算机系统基本组成与基本功能

冯·诺依曼结构主要思想

  1. 计算机应由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成

  2. 各个部件的功能:

    • 存储器:不仅能存放数据,而且能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
    • 控制器:应能够自动取出指令来执行;
    • 运算器:应能进行加/减/乘/出四种基本算术运算,并且也能进行一些逻辑运算和附加运算;
    • 操作人员可以通过输入设备输出设备和主机进行通信;
  3. 内部以二进制表示指令和数据。每条指令由操作码地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。

  4. 采用“存储程序”工作方式。

现代计算机结构模型及工作原理

工作原理图

计算机执行程序,和它的内部结构是紧密关联的。

计算机是如何工作的

把计算机执行程序比做你妈在厨房做菜~

  • 做菜前

    原材料(数据)和菜谱(指令)都按序放在厨房(CPU)外的架子(存储器)上,每个架子都有编号(存储单元地址)。

    菜谱的内容:原料位置、做法、做好的菜放哪等。
    例如:把10、11号架子上的原料一起炒,并装入3号盘。

    然后,你告诉你妈:从第5个架子上(起始PC=5)指定菜谱开始做

  • 开始做菜

    第一步:从5号架子上取菜谱(根据PC取指令

    第二步:看菜谱(指令译码

    第三步:从架子上或盘中取原材料(取操作数

    第四步:根据菜谱规定洗、切、炒等具体操作(执行指令

    第五步:装盘或者直接送桌(回写结果

    第六步:算出下一菜谱所在架子编号6=5+1(修改PC的值

    继续做下一道菜(执行下一条指令

  • 程序执行前

    数据和指令事先放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC。

  • 开始执行程序

    第一步:根据PC取指令

    第二部:指令译码

    第三步:取操作数

    第四步:指令执行

    第五步:回写结果

    第六步:修改PC的值

    继续执行下一条指令

指令和数据

  • 程序启动之前,指令和数据都存放在存储器中,形式上没有差别,都是0/1序列。

  • 采用“ 存储程序 ”工作方式:

    • 程序由指令组成,程序被启动后,计算机只能自动取出一条一条指令执行,在执行过程中无需人的干预。
  • 指令中需给出的信息:

    • 操作性质(操作码)
    • 源操作数1或/和源操作数2 (立即数、寄存器编号、存储地址
    • 目的操作数地址(寄存器编号、存储地址
    • 存储地址的描述与操作数的数据结构有关!

程序开发和执行过程

从机器语言到高级语言

最早的程序开发过程

用机器语言编写程序,并记录在纸带或卡片上。

输入:按钮、开关

输出:指示灯等

所有的信息都是0/1序列!

其执行速度快,但是书写、阅读及其困难。

汇编语言开发程序

  • 汇编语言程序由汇编指令构成,汇编指令是用助记符和标号来表示的指令。

    • 助记符表示操作码
    • 标号表示位置
    • 用助记符表示寄存器
  • 指令:

    • 包含操作码和操作数或其地址码(机器指令用二进制表示,汇编指令用符号表示)。
    • 只能描述:
      • 取(或存一个数)
      • 两个数加(或减、乘、除、与、或等)
      • 根据运算结果判断是否转移执行

通过汇编程序用来把汇编程序写的程序转化成机器语言写的程序。

优点

  • 不会因为增减指令而需要修改其他指令
  • 不需记忆指令编码,编写方便
  • 可读性比机器语言强

缺点

  • 程序会很长:需要描述的细节太多,程序会很长很长。
  • 不可移植:在不同结构的机器上就不能运行。

结论:机器语言和汇编语言都是面向机器结构的语言,与机器的结构相关。用汇编语言比机器语言好,但是,还是很麻烦。

高级语言开发程序

  • 随着技术的发展,出现了许多高级编程语言

    • 它们与具体机器结构无关
    • 面向算法描述,比机器级语言描述能力强得多
    • 有“ 面向过程 ”和“ 面向对象 ”等语言之分
    • 处理逻辑分为三种结构:顺序结构、选择结构、循环结构
    • 最终要将高级语言转化为机器语言,有两种转换方式:

      • 编译程序(Complier):将高级语言源程序转换为机器级目标程序(机器语言或者汇编语言),执行时只要启动目标程序即可。
      • 解释程序(Interpreter):将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件。

hello world

hello.c程序的转换处理过程

1
2
3
4
5
6
// hello.c
#include <stdio.h>
int main() {
printf("hello world\n");
}

hello.c的ascii文本表示
hello.c的ascii
源程序中其实存放的是程序的ascii文本表示。显然计算机是不能执行hello.c。

以下是gcc+Linux平台中的处理过程:

处理过程

源程序hello.c(文本)——预处理(cpp)——>源程序hello.i(文本)——编译(cc1)——> 汇编语言程序hello.s(文本)——汇编(as)——>可重定位目标程序hello.o(二进制)——print.o连接(Id)——>可执行目标程序hello(二进制)

hello程序的数据流动过程

数据流动过程

数据经常在各存储部件间传递,现代计算机大多采用“缓存技术”。

所有过程都是在CPU执行指令所产生的控制信号的作用下进行的。

开发和运行程序需要什么支撑?

  • 最早的程序开发很简单

    • 直接输入指令和数据,启动后把第一条指令地址送PC开始执行
  • 用高级语言开发需要复杂的支撑环境

    • 编辑器编写源程序(语言处理系统)
    • 一套翻译转换软件处理各类源程序(语言处理系统)
      • 编译方式:预处理程序、编译器、汇编器、连接器
      • 解释方式:解释程序
    • 需要一个可以执行程序的界面(环境)——人机接口(操作系统)
      • GUI:图形用户界面
      • CUI:命令行用户界面

支撑程序开发和运行的环境由系统软件提供,最重要的系统软件是操作系统语言处理系统

计算机系统层次结构

早期计算机系统的层次

早期

现代(传统)计算机系统的层次

现代

计算机系统抽象层次的转换

转换

计算机系统的不同用户

用户

undefined