avatar
文章
51
标签
75
分类
31

Archives
Tags
Categories
Link
About
Hiyoung'blog
搜索
Archives
Tags
Categories
Link
About

Hiyoung'blog

操作系统-计算机系统概述
发表于2023-07-15|更新于2025-05-21|计算机基础操作系统

简介

操作系统系列其一,主要是针对中国大陆考研所要求的内容对操作系统的知识体系进行总结和梳理,对于重点内容会使用黑体加粗,本篇内容主要包含以下几点:

  • 操作系统的基本概念
  • 操作系统发展历程
  • 程序运行环境
  • 操作系统结构
  • 操作系统引导
  • 虚拟机

    大纲

  • 操作系统的基本概念
    • 操作系统的特征
    • 操作系统接口
  • 操作系统的发展历程
    • 批处理阶段
    • 分时操作系统
    • 实时操作系统
  • 操作系统的运行环境
    • 处理器的运行模式$\star$
    • 中断和异常
  • 操作系统结构
  • 操作系统引导
  • 虚拟机
  • 典型例题

    操作系统的基本概念

    操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的内核与基石。

操作系统的特征

  1. 并发
    并发:两个或者多个事件在同一个时间间隔内发生。这些事件在宏观上是同时发生的,在微观上是交替发生的。操作系统的并发是通过分时实现的
    并行:是指两个或者多个事件在同一时刻发生
  2. 共享
    资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用
    1. 互斥共享方式:系统中的某些资源,可以提供给多个进程使用,但在同一时间段内,只允许一个进程访问
    2. 同时共享方式:系统中的某些资源,允许一个时间段内,多个进程”同时”对该资源进行访问
  3. 虚拟
    把一个物理上的实体变为若干个逻辑上的对应物。
  4. 异步
    在多道程序环境下,运行多个程序并发执行,但是由于资源有限,进程的执行并不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性
    只有具有并发性才可能导致异步性

操作系统作为接口

  1. 命令接口
    1. 联机命令接口又称交互式命令接口。例如Linux的terminal终端
    2. 脱机命令接口又称批处理命令接口。例如Windows的bat批处理
  2. 程序接口
    程序接口是一组系统调用(System call),也称广义命令。操作系统提供给应用程序的接口就是系统调用。

操作系统的发展历程

手工操作阶段(无操作系统)

缺点:人机速度矛盾

  1. 用户独占全机,资源利用率低
  2. CPU等待手工操作,CPU利用不充分

批处理阶段(开始出现操作系统)

  1. 单道批处理系统
    • 优点:缓解人机速度矛盾
    • 缺点:资源利用率低
  2. 多道批处理系统
    多道程序系统是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行 (系统由一个程序转而运行另一个程序时需要使用中断机构中断正在运行的程序) 。两个或两个以上程序在计算机系统中同处于开始和结束之间的状态。其技术运行的特征:多道、宏观上并行、微观上串行。

    • 优点:多道程序并发执行,资源利用率高
    • 缺点:没有人机交互功能

分时操作系统

  1. 优点:提供人机交互功能
  2. 缺点:不能优先处理紧急任务

实时操作系统

优点:能优先处理紧急任务

操作系统的运行环境

处理器的运行模式$\star$

在计算机系统中,CPU通常执行两种不同性质的程序:

  1. 操作系统的内核程序
  2. 用户自编的应用程序

其中,内核程序是应用程序的管理者。因此,内核程序需要执行一些特权指令,而应用程序不可以执行这些指令

  1. 特权指令:不允许用户直接使用的指令,如I/O指令、置中断指令、存取用于内存保护的寄存器等的指令
  2. 非特权指令:是用户可以直接使用的指令,它不能直接访问系统中的软硬件资源,仅能访问用户的地址空间

在具体实现上,可以将CPU的运行模式划分为用户态和核心态(或内核态、管态)。(通过修改PSW中的标志位)
应用程序运行在用户态,操作系统内核程序运行在核心态。应用程序向操作系统请求服务时通过访管指令,从而产生中断事件将操作系统转换为核心态。

内核是计算机上配置的底层软件,大多数操作系统的内核包括四个方面:

  1. 时钟管理
    时钟的第一功能是计时,其次,通过时钟中断管理可以实现进程的切换。
  2. 中断机制
  3. 原语
    原语是一些可被调用的公用小程序,它们具有以下特点:
    1. 处于操作系统的最底层,是最接近硬件的部分
    2. 原语的运行具有原子性,其操作只能一气呵成的完成(不可中断)
    3. 运行时间较短,且调用频繁
  4. 系统控制的数据结构及处理
    常见的操作一般有以下三种:
    1. 进程管理:进程状态管理、调度和分派、创建和撤销进程控制块(PCB)
    2. 存储器管理:存储器的空间分配和回收、内存信息保护程序等
    3. 设备管理:缓冲区管理、设备分配和回收等

中断和异常

定义

  • 中断:也称外中断,是指来自CPU执行指令外部的事件(与当前执行的指令无关)
    如设备发出的I/O结束中断、时钟中断,表示一个固定的时间片已到
  • 异常:也称内中断,是指来自CPU执行指令内部的事件(与当前执行的指令有关)
    如程序的非法操作码、地址越界、运算溢出。
    异常不能被屏蔽,一旦出现,就应该立即处理

操作系统-概述-1

分类

  • 外中断可分为可屏蔽中断和不可屏蔽中断

  • 异常可分为故障、自陷和终止

    • 故障:通常是由指令执行引起的异常,如非法操作码、缺页故障、除数为0、运算溢出等
    • 自陷:是一种事先安排的“异常”事件,用于在用户态下调用操作系统内核程序(要先传递需要内核执行的参数,再进入自陷)
    • 终止:是指出现了使得CPU无法继续执行的硬件故障

中断和异常的处理过程

不同的中断信号(通过“中断向量表”查询)需要用不同的中断处理程序(一定是内核程序,要在内核态运行)来处理

系统调用

系统调用,是指用户在程序中调用操作系统所提供的一些子功能,系统调用可视为特殊的公共子程序。
应用程序可以通过系统调用来请求获得操作系统内核的服务

tips:程序运行由用户态转到核心态,会用到访管指令。因为访管指令是在用户态使用的,所以它不可能是特权指令

操作系统-概述-2

操作系统结构

分层法

  1. 优点:
    • 便于系统的调试和验证,简化了系统的设计和实现
    • 易拓展和维护
  2. 缺点:
    • 合理定义各层比较困难
    • 效率较差

操作系统-概述-3

模块化

模块化是将操作系统按功能划分为具有一定独立性的模块。内核=主模块+可加载的内核模块

  1. 优点:
    • 提高了操作系统设计的正确性、可维护性和可理解性
    • 增强了操作系统的可适应性
    • 加速了操作系统的开发过程
    • 如何模块可直接调用其他模块,效率高
  2. 缺点:
    • 模块的接口规定很难满足对接口的实际需求

操作系统-概述-4

宏内核

  1. 优点:
    • 高性能
  2. 缺点:
    • 内核代码庞大,难以维护

微内核

  1. 优点:
    • 方便维护
  2. 缺点:
    • CPU状态切换频繁(核心态和用户态之间切换)性能差

操作系统-概述-5

外核

总结

操作系统-概述-6

操作系统引导

操作系统-概述-7

  1. CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
  2. 将磁盘的第一块——主引导记录 读入内存,执行磁盘引导程序,扫描分区表
  3. 从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
  4. 从根目录下找到完整的操作系统初始化程序(即 启动管理器)并执行,完成“开机”的一系列动作

虚拟机

虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(Virtual Machine, VM),每个虚拟机器都可以独立运行一个操作系统
同义术语:虚拟机管理程序/虚拟机监控程序/Virtual Machine Monitor/Hypervisor

操作系统-概述-8

操作系统-概述-9

典型例题

待补充


参考文献:
《王道考研-操作系统复习指导》
《Computer Systems A Programer’s Perspective Third Edition》
中文维基百科

操作系统系统概述
计算机组成原理-总线及I/O
发表于2023-07-02|更新于2025-05-21|计算机基础计算机组成原理

简介

计算机组成原理系列其五,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容是计算机的总线及I/O介绍,主要包含以下几点:

  • 总线的基本概念
  • 总线事物和定时
  • I/O接口
  • I/O方式

大纲

  • 总线
    • 分类$\star$
      • 片内总线
      • 系统总线
    • 总线结构$\star$
    • 总线的性能指标$\star$
    • 例题
  • 总线事物与定时
    • 总线事物
    • 总线定时
  • I/O接口
    • 基本结构$\star$
    • I/O接口的类型
    • I/O端口及其编址方式$\star$
  • I/O方式
    • 程序查询方式
      • 程序查询方式-例题
    • 程序中断方式$\star$
      • 程序中断工作流程
      • 多重中断
      • 中断屏蔽技术
      • 程序中断方式-例题
    • DMA方式
      • 特点
      • DMA的传送方式$\star$
      • DMA的传送过程$\star$
      • DMA和中断方式的区别$\star$

总线

总线是一组能为多个部件分时共享的公共信息传输路线。(一个总线包含多根信号线)
总线的特点:分时和共享

  • 分时:同一时刻只允许有一个部件向总线发送信息
  • 共享:总线上可以挂接多个部件,各个部件之间互相交换的信息都可以通过这组线路分时共享,多个部件可同时从总线上接收相同的信息

分类

  1. 按数据格式
    1. 串行
    2. 并行
  2. 按功能
    1. 片内总线
    2. 系统总线
    3. 通信总线
    4. I/O总线
  3. 按时序控制
    1. 异步
    2. 同步

片内总线

片内总线是芯片内部的总线,是CPU芯片内部寄存器与寄存器之间、寄存器与ALU之间的公共连接线

系统总线

系统总线是计算机系统内各功能部件(CPU、主存、I/O接口)之间互相连接的总线。按传输信息内容的不同可分为三类:数据总线、地址总线和控制总线

  1. 数据总线(DB):传输各功能部件之间的数据信息,它是双向传输总线,其位数与机器字长、存储字长有关
  2. 地址总线(AB):用来指出数据总线上的源数据或目的数据所在的主存单元会I/O端口的地址,它是单向传输总线,其位数与主存地址空间的大小及设备数量有关
  3. 控制总线(CB):传输的控制信息,包括CPU送出的控制命令和主存(或外设)返回CPU的反馈信息

总线结构

  1. 单总线结构:使用一条单一的系统总线来连接CPU、内存和I/O设备
  2. 双总线结构:一条主存总线、主存和通道之间传送数据;一条I/O总线,用于多个外部设备与通道之间传送数据
  3. 三总线结构:内存总线、I/O总线和DMA总线

计组-总线和IO-1

总线的性能指标

  1. 总线传输周期(总线周期)。指一次总线操作所需的时间,包括申请阶段(总线仲裁)、寻址阶段、传输阶段和结束阶段。总线传输周期通常由若干总线时钟周期构成。

  2. 总线时钟周期。即机器的时钟周期。计算机有一个统一的时钟,以控制整个计算机的各个部件,总线也要受此时钟的控制。

  3. 总线工作频率。总线上各种操作的频率,为总线周期的倒数。实际上指1秒内传送几次数据。若总线周期=N个时钟周期,则总线的工作频率 =$\frac{时钟频率}{N}$。

  4. 总线时钟频率。即机器的时钟频率,它为时钟周期的倒数。

  5. 总线宽度。又称总线位宽,它是总线上能同时传输的数据位数,通常指数据总线的根数,如32根称为32位总线。

  6. 总线带宽。可理解为总线的最大数据传输率,即单位时间内总线上最多可传输数据的位数,通常用每秒传送信息的字节数来衡量,单位可用字节/秒(B/s)表示。${总线带宽} = {总线工作频率}\times \frac{总线宽度}{8}$。
    注意:总线带宽和总线宽度应加以区别。

  7. 总线复用。总线复用是指一种信号线在不同的时间传输不同的信息,因此可以使用较少的线传输更多的信息,从而节省空间和成本。

  8. 信号线数。地址总线、数据总线和控制总线3种总线数的总和称为信号线数。其中,总线的最主要性能指标为总线宽度、总线(工作)频率、总线带宽
    总线带宽是指总线本身所能达到的最高传输速度,它是衡量总线性能的重要指标。

三者关系:$总线带宽={总线宽度}\times{总线频率}$。
例如,总线工作频率为 22MHz,总线宽度为16位,则总线带宽 = $22\times{(\frac{16}{8})}= 44MB/s$。

例题

  1. 计组-总线和IO-2

    解:总线工作频率为1333MHz,即1秒内可以传送1333M次数据。总线宽度为64位即单条总线工作一次可以传送8Byte。因此总带宽为$3\times8\times1333MB/s \approx 32GB/s$

  2. 计组-总线和IO-3

    每个时钟周期传送2次,故$每秒传送次数 = 时钟频率 \times 2 = 2.4G \times 2/s$
    $总线带宽 = 每秒传送次数\times 2B \times 2 = 2.4G \times 2 \times 2B \times2/s = 19.2GB/s$
    公式中的“$\times 2B$”是因为每次传送16bit数据;“$\times 2$”是因为采用点对点的双全工总线

总线事物与定时

总线事物

  • 总线裁决:决定哪个主控设备使用总线。

  • 寻址阶段:主控设备送出要访问设备的地址,同时送出有关命令(读或写等),启动从设备。

  • 数据传输阶段:主、从设备间进行数据交换。

  • 结束阶段:有关信息在总线上撤销,让出总线使用权。

总线定时

  1. 同步定时方式
    所谓同步定时方式,是指系统采用一个统一的时钟信号来协调发送和接收双方的传送定时关系。时钟产生相等的时间间隔,每个间隔构成一个总线周期。在一个总线周期中,发送方和接收方可以进行一次数据传送。适用于总线长度较短及总线所接部件的存取时间比较接近的系统。

    优点∶传送速度快;总线控制逻辑简单。
    缺点∶可靠性较差。

  2. 异步定时方式
    在异步定时方式中,没有统一的时钟,也没有固定的时间间隔,完全依靠传送双方相互制约的握手信号 来实现定时控制。通常,把交换信息的两个部件或设备分为主设备和从设备,主设备提出交换信息的”请求”信号,经接口传送到从设备;从设备接到主设备的请求后,通过接口向主设备发出”回答”信号。

    优点∶总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间 可靠地进行信息交换,自动适应时间的配合。
    缺点∶比同步控制方式稍复杂一些,速度比同步定时方式慢。

计组-总线和IO-4

  1. 不互锁方式:主设备发出”请求”信号后,不必等到接到从设备的”回答”信号,而是经过一段时间便撤销”请求”信号。
  2. 半互锁方式:主设备发出”请求”信号后,必须在接到从设备的”回答”信号后,才撤销”请求”信号,有互锁的关系。
  3. 全互锁方式:主设备发出”请求”信号后,必须在从设备”回答”后才撤销”请求”信号;从设备发出”回答”信号后,必须在获知主设备”请求”信号已撤销后,再撤销其”回答”信号。

I/O接口

I/O接口是主机和外设之间的交接界面,通过接口可以实现主机和外设之间的信息交换

基本结构

计组-总线和IO-5

  • 主机侧(内部接口):与系统总线相连,实质上是与主存、CPU相连
  • 设备侧(外部接口):通过接口电缆与外设相连,外部接口数据传输可能是串行方式。因此I/O接口要有串并行转换功能
  • 数据线:读写数据、状态字(命令字)、控制字、中断类型号
  • 状态/控制寄存器:状态和设备寄存器在使用时间上是错开的,因此可以将二者合而为一
  • 地址线:指明I/O端口
  • 控制线:读/写I/O端口信号、中断请求信号

I/O接口的类型

  1. 按数据传送方式可分为
  • 并行接口:一个字节或一个字所有位同时传送。
  • 串行接口:一位一位地传送。

注:这里所说的数据传送方式指的是外设和接口一侧的传送方式,而在主机和接口一侧,数据总是并行传送的。接口要完成数据格式转换。

  1. 按主机访问I/O设备的控制方式可分为
  • 程序查询接口
  • 中断接口
  • DMA接口
  1. 按功能选择的灵活性可分为
  • 可编程接口
  • 不可编程接口

I/O端口及其编址方式

I/O端口是指接口电路中可以被CPU直接访问的寄存器

  1. 统一编址
    把I/O端口当做存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口,又称存储器映射方式。靠不同的地址码区分内存和I/O设备,I/O地址要求相对固定在地址的某部分

    如系统总线中地址线共10根,则可以访问的存储单元
    个数为2!”= 1024个,假设要给10个I/O端口编址:

    1. 0~9表示I/O地址,10~1023为主存单元地址
    2. 0~1013表示主存单元地址,1014~1023为IO地址
    3. 10~19表示I/O地址,0~9、20~1023为主存单元地址
    • 优点:不需要专门的输入/输出指令,所有访存指令都可直接访问端口,程序设计灵活性高端口有较大的编址空间读写控制逻辑电路简单
    • 缺点:端口占用了主存地址空间,使主存地址空间变小外设寻址时间长(地址位数多,地址译码速度慢)
  1. 独立编址
    I/O端口地址与存储器地址无关,独立编址CPU需要设置专门的输入/输出指令访问端口,又称I/O映射方式。
    靠不同的指令区分内存和I/O设备

    • 优点:使用专用I/O指令,程序编制清晰I/O端口地址位数少,地址译码速度快I/O端口的地址不占用主存地址空间
    • 缺点:I/O指令类型少,一般只能对端口进行传送操作,程序设计灵活性差需要CPU提供存储器读/写、I/O设备读/写两组控制信号,增加了控制逻辑电路的复杂性

I/O方式

输入、输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,常用的I/O方式有

  • 程序查询
  • 程序中断
  • DMA方式

计组-总线和IO-6

程序查询方式

信息交换完全由CPU执行程序实现

  • 独占查询:CPU 100%时间都在查询I/O状态,完全串行
  • 定时查询:确保数据不丢失的情况下,每隔一段时间CPU查询一次I/O状态

  • 主要特点:CPU有“踏步”等待现象,CPU与I/O串行工作

  • 优点:接口设计简单、设备量少。

  • 缺点:CPU在信息传送过程中要花费很多时间用于查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低

程序查询方式-例题

计组-总线和IO-7

程序中断方式

程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序

计组-总线和IO-8

程序中断工作流程

工作流程:

  1. 中断请求
    中断源向CPU发送中断请求信号。
  2. 中断响应判优
    响应中断的条件。
    中断判优:多个中断源同时提出请求时通过中断判优逻辑响应一个中断源。
    优先级设置:
    1. 硬件故障中断属于最高级,其次是软件中断;
    2. 非屏蔽中断优于可屏蔽中断;
    3. DMA请求优于I/O设备传送的中断请求
    4. 高速设备优于低速设备;
    5. 输入设备优于输出设备;
    6. 实时设备优于普通设备
  3. CPU响应中断条件

    1. 中断源有中断请求
    2. CPU允许中断及开中断(异常和不可屏蔽中断不受此限制)
    3. 一条指令执行完(异常不受此限制)
  4. 中断响应过程
    CPU响应中断后,经过某些操作,转去执行中断服务程序。这些操作是由硬件之间实现的,称为中断隐指令。(中断隐指令不是指令系统的一条真正的指令,只是一种虚拟的说法,本质上是硬件的一系列自动操作)。
    中断隐指令的操作:

    1. 关中断。[关中断的目的:实现原子操作(操作必须一次性完成不可以中断)]
      在中断服务程序中,为了保护中断现场(即CPU主要寄存器中的内容)期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。
    2. 保存断点。
      为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来。可以存入堆栈,也可以存入指定单元。
    3. 引出中断服务程序。
      引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器(PC),有两种方法实现中断源:硬件向量法和软件查询法
      硬件向量法:
      • 每个中断都有一个唯一的类型号,每个中断类型号都对应一个中断服务程序,每个中断服务程序都有一个入口地址,即中断向量。
      • 由硬件产生向量地址,再由向量地址找到入口地址。
      • 向量地址由系统固定不可改变,但其对应的中断服务程序入口地址可以改变
        计组-总线和IO-9
  5. 中断处理过程
    计组-总线和IO-10

多重中断

  • 单重中断:执行中断服务程序时不响应新的中断请求。
  • 多重中断:又称中断嵌套,执行中断服务程序时可响应新的中断请求

计组-总线和IO-11

计组-总线和IO-12

中断屏蔽技术

中断屏蔽技术主要用于多重中断,CPU要具备多重中断的功能,须满足下列条件。

  • 在中断服务程序中提前设置开中断指令。
  • 优先级别高的中断源有权中断优先级别低的中断源。
    每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。

例题:
计组-总线和IO-13

程序中断方式-例题

计组-总线和IO-14

计组-总线和IO-15

计组-总线和IO-16

DMA方式

DMA方式是一种完全由硬件进行成组信息传送的控制方式,具有程序中断方式的优点,即在数据准备阶段,CPU和外设并行工作。
主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。

特点

  1. 它使主存与CPU的固定联系脱钩,主存既可被CPU访问,又可被外设访问。
  2. 在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现。
  3. 主存中要开辟专用缓冲区,及时供给和接收外设的数据。
  4. DMA传送速度快,CPU和外设并行工作,提高了系统效率。
  5. DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。

DMA的传送方式

使用的是三总线结构
周期窃取的是存储周期
计组-总线和IO-17

DMA的传送过程

DMA 的数据传送过程分为预处理、数据传送和后处理了个阶段:

  1. 预处理。
    由CPU完成一些必要的准备工作。
    • 首先,CPU执行几条I/O指令,用以测试I/O设备状态,初始化DMA控制器中的有关寄存器、设置传送方向、启动该设备等。
    • 然后,CPU继续执行原来的程序,直到I/O设备准备好发送的数据(输入情况)或接收的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(有时将这两个过程统称为DMA请求)用以传输数据。
  2. 数据传送。
    DMA 的数据传输可以以单字节(或字)为基本单位,也可以以数据块为基本单位。对于以数据块为单位的传送(如硬盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现的。需要指出的是,这一循环也是由DMA控制器(而非通过CPU执行程序)实现的,即数据传送阶段完全由DMA(硬件)控制。
  3. 后处理。
    DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括校验送入主存的数据是否正确、测试传送过程中是否出错(错误则转诊断程序)及决定是否继续使用DMA传送其他数据等。

计组-总线和IO-18

DMA和中断方式的区别

中断 DMA
数据传送 程序控制 程序的切换->保存和恢复现场 硬件控制 CPU只需进行预处理和后处理
中断请求 传送数据 后处理
响应 指令执行周期结束后响应中断 每个机器周期结束均可,总线空闲时即可响应DMA请求
场景 CPU控制,低速设备 DMA控制器控制,高速设备
优先级 优先级低于DMA 优先级高于中断
异常处理 能处理异常事件 仅传送数据

典型例题

待补充


参考文献:
《王道考研-计算机组成原理复习指导》
《Computer Systems A Programer’s Perspective Third Edition》

计组总线I/O
Hexo常用命令
发表于2023-07-01|更新于2025-11-04|前端网站建设

记录一下平常会用到的一些Hexo指令,在指定文件夹下Git Bash here输入命令即可

基本命令

init

建立一个新的网站。如果没有设定folder 的话,Hexo 会在目前的资料夹建立网站

1
hexo init [folder] 

New

建立一篇新的文章。如果没有设定layout的话,则会使用_config.yml中的default_layout设定代替

1
hexo new [layout] "title" 

Generate

产生静态档案

1
hexo generate 

生成静态档案即部署网站
1
hexo d -g 

|选项| 描述|
|:—-:|:—-:|
|-d,—deploy| 产生完成即部署网站|
|-w,—watch| 监看档案变更|

Server

启动本地预览,默认地址是http://localhost:4000/

1
hexo server

|选项| 描述|
|:—-:|:—-:|
|-p,—port| 自选端口|
|-s,—static| 只使用静态档案|
|-l,—log| 启动记录器,或覆盖记录格式|

Clean

清除缓存数据( db.json) 和已产生的静态档案( public)。

1
hexo clean

Version

显示版本资讯。

1
hexo version

Debug

在终端中显示除错讯息并储存记录档到debug.log

1
hexo --debug

Plugins

查看所有你安装的hexo插件

1
npm ls -dept 0 

或者
1
npm list

卸载某个插件

1
npm uninstall 插件名

再删除相关配置和文件:

  • 删除主题或Hexo配置中的插件配置
  • 删除node_modules 目录下对应的插件文件

修改文章默认layout

在下列文件中可以修改新建文章的layout(文章开头的Front-matter内容)

1
scaffolds\post.md

Hexo
Markdown实用技巧
发表于2023-06-30|更新于2025-05-21|前端网站建设

记录一下可能会用到非Markdown基础语法包含的实用技巧
官方的速查表(https://markdown.com.cn/cheat-sheet.html#%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95)

Markdown实现页内跳转

跳转到的地方

比较通用的一个方法是使用html标签实现

  1. 定义一个锚(id):<span id="jump">跳转到的地方</span>
  2. 使用markdown语法:[点击跳转](#jump)

点击跳转

Markdown中的表格

处理使用markdown原生格式的表格使用html的表格更方便

  1. markdown原生格式

    1
    2
    3
    4
    | 左对齐 | 右对齐 | 居中对齐 |
    | :-----| ----: | :----: |
    | 单元格 | 单元格 | 单元格 |
    | 单元格 | 单元格 | 单元格 |
  2. html实现

  • tr:tr 是 table row 的缩写,表示表格的一行。
  • td:td 是 table data 的缩写,表示表格的数据单元格。
  • th:th 是 table header的缩写,表示表格的表头单元格
  • align:设置内容左、右对齐或居中
  • colspan:用于合并单元格
>
$A_1$ $A_2$ ... $A_n$ 判断测试字段 后继地址字段
操作控制 顺序控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<table>
<tr>
<td align="center">$A_1$</td>
<td align="center">$A_2$</td>
<td align="center">...</td>
<td align="center">$A_n$</td>
<td align="center">判断测试字段</td>
<td align="center">后继地址字段</td>
</tr>
<tr>
<td colspan="4" align="center">操作控制</td>
<td colspan="2" align="center">顺序控制</td>>
</tr>
</table>
Markdown
计算机组成原理-CPU
发表于2023-06-24|更新于2025-05-21|计算机基础计算机组成原理

简介

计算机组成原理系列其四,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容是计算机的CPU相关内容介绍,主要包含以下几点:

  • CPU的功能和基本结构
  • 指令的执行过程
  • CPU内的数据通路
  • 控制器的功能和原理
  • 指令流水线
  • 多处理器

大纲

  • CPU的基本结构
    • 运算器
    • 控制器
  • 指令的执行过程
    • 指令周期
    • 指令周期的数据流
    • 指令的执行方案
  • CPU内的数据通路
    • 基本结构
    • 例题分析
  • 控制器
    • 微程序控制器
      • 基本概念
      • 编码方式
      • 地址形成方式
      • 格式
  • 指令流水线
    • 定义
    • 基本实现
    • 冒险和处理
      • 结构冒险
      • 数据冒险
      • 控制冒险
    • 流水线的性能指标
    • 高级流水线技术
  • 多处理器概念
    • SISD、SIMD、MIMD
    • 硬件多线程
    • 多核处理器

CPU的基本结构

CPU主要由运算器和控制器两大部分组成

Tips:CPU内部的寄存器大致分为两类:

  1. 用户可见的寄存器:通用寄存器组、PSW、PC等
  2. 用户不可见寄存器:MAR、MDR、IR等

运算器

运算器是计算机对数据进行加工处理的中心,其主要有:

  • 算术逻辑单元(ALU):进行算术、逻辑运算
  • 程序状态寄存器(PSW):保留计算机中算术逻辑运算或指令的结果产生的各种状态信息,如溢出标志(OF)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中这些位参与并决定微操作的形成
  • 暂存寄存器
  • 通用寄存器组
  • 累加寄存器(ACC)
  • 移位器
  • 计数器(CT)

控制器

控制器的基本功能是执行指令,每条指令的执行由控制器发出的一组微操作实现,其主要部件有:

  • 程序计数器(PC):指出将要执行的指令在主存中的地址(即指令的地址)
  • 指令寄存器(IR):存放当前正在执行的指令
  • 存储器地址寄存器(MAR):存放要访问的主存单元的地址
  • 存储器数据寄存器(MDR):存放向主存写入信息或从主存读出的信息
  • 指令译码器
  • 时序系统
  • 微操作信号发生器

指令的执行过程

在了解指令的执行之前要先明确指令执行过程中的不同周期的含义

  1. 时钟周期:也称节拍或T周期,它是CPU中最小最基本的时间单位,是处理操作的最基本单位
  2. 机器周期:也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。
  3. 指令周期:CPU每取出一条指令并执行这条指令,都要完成一系列的操作,这一系列操作所需要的时间通常叫做一个指令周期。
  4. 存取周期:存储器进行一次读或写操作所需的时间称为存储器的访问时间(或读/写时间),而连续启动两次独立的读或写操作所需的最短时间,称为存取周期(或存储周期)。机器周期通常由存取周期确定

指令周期常常用若干个CPU周期数来表示,机器周期时间又包含若干个时钟周期。
每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。

指令周期

通常一个指令周期包含取指、间址、执行、中断四个周期,但不是所有指令都包含这四个周期,有些指令可能没有间址周期。

指令周期
取指周期 间址周期 执行周期 中断周期

以上四个工作周期都有CPU访存操作,但是访存的目的不同。
取指周期:取指令
间址周期:取有效地址
执行周期:取操作数
中断周期:保存程序断点

为了区别不同的工作周期,会在CPU中设置4个标志触发器FE、IND、EX和INT分别对应取指、间址、执行、中断周期。

冯·诺伊曼机中指令和数据均以二进制形式存储在存储器中,CPU根据指令周期的不同阶段区分它们

指令周期的数据流

可以参考网络或书本视频,这里不详细说明

指令执行方案

  1. 单指令周期:所以指令都选用相同的执行时间,指令之间串行执行
  2. 多指令周期:不同的指令采用不同的执行步骤,指令之间串行执行
  3. 流水线方案:指令间可以并行执行

CPU内的数据通路

本节会在大题中考察,最好结合视频和实际例题学习
数据在功能部件之间传送的路径称为数据通路,也包括了数据通路上流经的部件,如ALU、通用寄存器、状态寄存器等。

数据通路的功能是实现CPU内部的运算器与寄存器及寄存器之间的数据交换。数据通路由控制部件控制。

数据流向有三种方向

  1. 寄存器之间

  2. 流入ALU中计算

  3. 内存与CPU之间

    数据通路的基本结构

  4. CPU内部单总线结构:将所有寄存器的输入端和输出端都连接到一条总线上
  5. CPU内部多总线结构:将所有寄存器的输入端和输出端都连接到多条总线上
  6. 专用数据通路:根据指令执行过程中的数据和地址流动方向安排连接线路,避免使用共享总线

例题分析

计组-CPU-1

分析:
对主存来说MemR表示要进行读操作,MemW进行写操作。
指令$ADD (R_0),R_1$:
$(R_0)$是目的操作数,$(R_0)$加括号表示寄存器中保存的是操作数在主存中的地址,需要进行一次间接寻址在主存中找到所需的操作数。
$R_1$是源操作数,操作数就保存在寄存器$R_1$中
对于ADD指令,执行完的数据要保存再到$(R_0)$中

  1. 分析指令功能和指令周期
    功能:$((R_0))+(R_1)->(R_0)$
    指令周期:取指周期、间址周期、执行周期
  2. 各阶段指令流程

取指周期:公共操作

时序 微操作 有效控制信号 具体功能
1 (PC)->MAR PCout,MARin 将PC经内部总线送至MAR
2 M(MAR)->MDR MemR,MARout,MDRinE 主存通过数据总线将MAR所指单元内容发送至MDR
3 (MDR)->IR MDRout,IRin 将MDR的内容发生到IR
4 指令译码 - 操作字开始控制CU
5 (PC)+1->PC - 当PC+1有效时,使PC内容+1

间址周期:完成取数操作,被加数在主存中,加数已经放在寄存器$R_1$中

时序 微操作 有效控制信号 具体功能
1 $(R_0)$->MAR R0out,MARin 将$R_0$中地址(形式地址)送至存储器地址寄存器
2 M(MAR)->MDR MemR,MARout,MDRinE 主存通过数据总线将MAR所指单元的内容(有效地址)送至MDR中
3 (MDR)->Y MDRout,Yin 将MDR中数据通过数据总线送至Y

执行周期:在ALU中完成加法操作,并将结果返回主存中(也就是($(R_0)$))

时序 微操作 有效控制信号 具体功能
1 $(R_1)$+Y->Z R1out,ALUin,CU向ALU发ADD信号 $R_1$的内容和Y相加,结果送至Z寄存器
2 (Z)->MDR Zout,MDRin 将运算结果送至MDR
3 (MDR)->M(MAR) MemW,MDRoutE,MARout 将数据写入内存

控制器的功能和工作原理

计组-CPU-2

上图是计算机硬件系统的五大功能部件及其连接关系。它们通过数据总线、地址总线和控制总线连接在一起

控制器是计算机系统的指挥中心,其主要功能有:

  1. 从主存中取去一条指令,并指出下一条指令在主存中的位置
  2. 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作
  3. 指挥并控制CPU、主存、输入和输出设备之间的数据流动方向

硬布线控制器

硬布线控制器是将控制部件做成产生专门固定时序控制信号的逻辑电路
简单了解即可

微程序控制器

微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化为一段微程序并存入一个专门的存储器(控制存储器),微操作控制信号由微指令产生

微程序设计思想就是将每条机器指令编成一个微程序,每个微程序包含若干个微指令,每条微指令对应一个或多个微操作命令

基本概念

  • 指令:对程序执行步骤的描述
  • 微指令:对指令执行步骤的描述

  • 程序:是由多条指令序列组成,而一条指令由多个微指令组成

  • 微程序:由微指令序列组成,每一种指令对应一个微程序,即微程序和(机器)指令是一一对应的

  • 微命令和微操作:一条机器指令可以分解成一个微操作序列,这些微操作是计算机中最基本、不可再分解的操作。微命令是微操作的控制信号,微操作是微命令的执行过程

  • 微指令和微周期:微指令是若干微命令的集合。存放微指令的控制存储器的单元地址称为微地址(每条微指令都对应一条存储地址)。微周期是指执行一条微指令所需的时间,通常为一个时钟周期。

  • 主存储器与控制存储器:主存储器即主存(RAM、内存)用于存放程序和数据,在CPU外。控制存储器(CM)用于存放微程序,在CPU内部,用ROM实现

  • 程序和微程序:程序是指令的有序集合用于完成特定的功能;微程序是微指令是有序集合,一条指令的功能由一段微程序实现(指令是对微指令功能的“封装”)

  • 对于用户而言,计算机系统中的微程序的结构和功能是透明的,无需知道。

  • 一条指令一般用取指、间址、执行和中断周期组成,其中取指、间址、中断周期的微程序是共用的,一般只有执行周期的微程序不同。

    • 如果某指令系统有N条机器指令,则控制存储器(CM)中微程序个数至少是N+1个(间址和中断可以没有)
  • 注意区别以下寄存器

    • 地址寄存器(MAR):用于存放主存的读、写地址
    • 微地址寄存器(CMAR):用于存放控制存储器的读、写微指令的地址
    • 指令寄存器(IR):存放从主存中读出的指令
    • 微指令寄存器(CMDR):存放从控制存储器中读出的微指令

微指令的编码方式

微指令的编码方式即微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。

  1. 直接编码(直接控制)方式
    直接编码无需译码,微指令的微命令字段中每位都代表一个微命令。
    N个微命令对应N位操作字段
  2. 字段直接编码方式
    将为直流电微命令字段分成若干小字段,每个字段独立编码,每种编码代表一个微命令且各字段编码含义单独定义,与其他字段无关
    分段原则:
    1. 互斥性微命令分在同一字段内,相容性微命令分在不同字段内
    2. 每个小段内包含的信息位不能太多
    3. 每个小段还有留出一个状态,表示本字段不发出任何微命令。类如,某字段的长度为三位时,最多只能表示7个互斥的微命令。
  3. 字段间接编码方式
    一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,因此称为字段间接编码,又称隐式编码
  4. 例题

    1. 计组-CPU-3
      答:分别包含7、3、12、5和6个微命令,则需要3、2、4、3、和3比特位,共15位

    2. 计组-CPU-4
      答:共有32条指令,每个微程序平均由4条微指令组成,则对应的微指令为$32\times4=128$条,公共微指令2两条,则整个系统的微指令条数为130条,则至少要8个比特位($2^7=128$ < 130 < $2^8=256$)

      微指令的地址形成方式

  5. 直接由微指令的下地址字段指出
    微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,又称为断定方式
  6. 增量计数器法
    (CMAR)+1->CMAR,适用于后继微指令的地址连续的情况
  7. 根据机器指令的操作码形成
    当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成

微指令的格式

微指令的格式与微指令的编码方式有关,有两种

  1. 水平型微指令
    从编码方式看,直接编码、字段直接编码、字段间接编码和混合编码都属于水平型编码。一条水平型微指令定义并执行几种并行的基本操作
    优点:微程序短,执行速度快
    缺点:微指令长,编写程序较麻烦

    >
    $A_1$ $A_2$ ... $A_n$ 判断测试字段 后继地址字段
    操作控制 顺序控制
  2. 垂直型微指令
    在微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能。一条垂直型微指令只能定义并执行一种基本操作
    优点:微指令短、简单、便于编写微程序
    缺点:微程序长、执行速度慢、工作效率低

    >
    $\mu OP$ $Rd$ Rs
    微操作码 目的地址 源地址
  3. 混合型微指令
    在垂直型的基础上增加一些不太复杂的并行操作

指令流水线

提高指令运行效率可以采用指令流水线的方式,可以从两方面提高处理机的并行性

  1. 时间上的并行性:即流水线技术
  2. 空间上的并行性:超标量处理机

指令流水线的定义

将一条指令的执行过程分解为若干阶段,每个阶段由相应的功能部件完成。

计组-CPU-5

流水线的基本实现

建议观看相应视频加以学习。

计组-CPU-6

  • 流水线的数据通路
    • IF段包括程序计数器(PC)、指令存储器、下条指令地址的计算逻辑
    • ID段包括操作控制器、取操作数逻辑、立即数符号拓展模块
    • EX段包括算术逻辑单元(ALU)、分支地址计算模块、
    • MEM段主要包括数据存储读写模块
    • WB段主要包括寄存器写入控制模块
  • 每个流水段后面都需要增加一个流水寄存器,用于锁存本段处理完成的数据和控制信号(即锁存器或缓冲寄存器,目的是便于统一每一段时间使其统一)

流水线的冒险和处理

结构冒险——“互斥”

由于多条指令在同一时刻争用同一硬件资源形成的冲突,也称资源冲突
解决办法:

  1. 前一指令访存时,使后续指令暂停一个时钟周期
  2. 增加硬件资源,设置单独的数据存储器和指令存储器

$\star$ 数据冒险——“同步问题”

在一个指令中,下一条指令会用到当前指令计算出的结果,此时这两条指令就会产生数据冲突

  1. RAW(read after write):又称先写后读相关性。
    比如下面指令序列,如果第二条指令,在第一条指令写x5之前,第二条指令先读x5,就会引起逻辑错误。
    1
    2
    add x5, x4, x6
    add x4, x5, x2
  2. WAW(write after write):又称先写后写相关性。
    比如下面指令序列,如果第二条指令,在第一条指令写x5之前,第二条指令先写x5寄存器,就会引起逻辑错误。

    1
    2
    add x5, x4, x6
    add x5, x3, x2
  3. WAR(write after read):又称先读后写相关性。
    比如下面的指令序列,第一条指令会读取x4,第二条指令会写x4。在流水线中,如果第二条指令比第一条指令先写x4,则第一条指令就会读出错误的值。

    1
    2
    add x5, x4, x6
    add x4, x3, x2

解决办法:

  1. 将后续指令暂停一到几个时钟周期
  2. 设置专用数据通路
  3. 编译器对指令编译优化,调整指令顺序

    控制冒险

    又称分支冒险,指令流水时,处理器遇到分支指令,如执行转移、调用或返回时,会修改PC值,会造成断流,不能在流水开始阶段就判断出分支结果。
    解决办法:
  4. 对转移指令进行分支预测
  5. 预先加载成功与不成功两个控制流方向上的目标指令
  6. 提高分支预测成功率

流水线的性能指标

流水线的吞吐率(TP)

在单位时间内流水线所完成的任务数量,公式:
$TP=\frac{n}{T_k}$
n是任务数,$T_K$是处理完n个任务所用的总时间

设k为流水线段数,$\bigtriangleup t$为时钟周期,在输入流水线的任务连续的理想情况下,一条k段流水线能在k+n-1个时钟周期内完成n个任务。
此时流水线的吞吐率为:$TP=\frac{n}{(k+n-1) \ast (\bigtriangleup t)}$,当$n \rightarrow \infty$,得最大吞吐率${TP_{max}}=\frac{1}{\bigtriangleup t}$

流水线的加速比(S)

完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比,称为流水线的加速比。公式:
$S=\frac{T0}{T_k}$
${T_0}$表示不使用流水线时的执行时间;${T_k}$表示使用流水线的总时间。
对于一条k段流水线,当连续输入任务数$n \rightarrow \infty$,得最大加速比${S
{max}=k}$

流水线的效率(E)

流水线的设备利用率称为流水线的效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积,与n个任务所用的时间及k个流水段所围成的时空区总面积之比。因此,流水线的效率包含了时间和空间两个因素。
$E=\frac{n个任务占用k时空区域的有效面积}{n个任务所用的时间与k个流水段所围成的时刻区域总面积}=\frac{T0}{k\ast{T_k}}$
当$n\rightarrow \infty,E
{max}=1$

高级流水线技术

  1. 超标量流水线技术(多发技术,在空间上)
    也称为动态多发射技术。每个时钟周期内可并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件。
    超标量计算机不能调整指令的执行顺序(但有些CPU可以,支持乱序执行),因此通过编译优化技术,把可并行执行的指令搭配起来,挖掘更多的指令并行性。

  2. 超流水线技术(在时间上)
    在一个时钟周期内再分段,在一个时钟周期内一个功能部件使用多次。不能调整指令的执行顺序,靠编译程序解决优化问题。

  3. 超长指令字
    由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件

多处理器的基本概念

SISD、SIMD、MIMD的基本概念

单指令流单数据流SISD

  1. 特性:
    各指令序列只能并发、不能并行,每条指令处理一两个数据
    不是数据级并行技术

  2. 硬件组成:
    一个处理器+一个主存储器
    若采用指令流水线,需设置多个功能部件,采用多模块交叉存储器

单指令流多数据流SIMD

  1. 特性:
    各指令序列只能并发、不能并行,但每条指令可同时处理很多个具有相同特征的数据,是一种数据级并行技术

  2. 硬件组成:
    一个指令控制部件(CU)+多个处理单元/执行单元(如ALU)+多个局部存储器+一个主存储器
    每个执行单元有各自的寄存器组、局部存储器、地址寄存器
    不同执行单元执行同一条指令,处理不同的数据

多指令流单数据流MISD

多条指令并行执行,处理同一个数据。现实中不存在这种计算机

多指令流多数据流MIMD

  1. 特性:
    各指令序列并行执行,分别处理多个不同的数据
    是—种线程级并行、甚至是线程级以上并行技术

硬件多线程基本概念

计组-CPU-7

多核处理器基本概念

计组-CPU-8

典型例题

待补充


参考文献:
《王道考研-计算机组成原理复习指导》
《Computer Systems A Programer’s Perspective Third Edition》

计组CPU
计算机组成原理-指令系统
发表于2023-05-27|更新于2025-05-21|计算机基础计算机组成原理

简介

计算机组成原理系列其三,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容是计算机的指令系统介绍,主要包含以下几点:

  • 指令格式的基本内容
  • 指令格式
  • 寻址方式
  • 汇编基础
  • CISC和RISC的基本概念

大纲

  • 指令系统
    • 指令系统简述
    • 指令的基本格式
    • 定长与变长指令字结构
      • 定长操作码指令格式
      • 拓展操作码指令格式
    • 寻址方式(重点)
      • 指令寻址
      • 数据寻址
    • 汇编基础
      • 基础知识
      • 常用指令
    • CISC和RISC
    • 典型例题

指令系统简述

指令是指示计算机执行某些操作的命令。一台计算机的所有指令的集合构成该机器的指令集。指令集体系结构(ISA)规定了:指令格式、数据类型和格式、操作数的存放方式、存储空间的大小和编址方式、寻址方式etc.

指令的基本格式

Tips:几种字长的区别
机器字长:CPU一次能处理数据的位数,通常与CPU的寄存器位数有关。
存储字长:存储器中一个存储单元(存储地址)所存储的二进制代码的位数,即存储器中的MDR的位数。
指令字长:计算机指令字的位数。
数据字长:计算机数据存储所占用的位数。
其中:
机器字长、存储字长:一般不变,固定长度
指令字长:长度可能会改变

一条指令就是机器语言的一个语句,是一段有意义的二进制代码。一条指令通常包括操作码和地址码两部分

操作码字段 地址码字段

操作码是识别指令、了解指令功能以及区分操作数地址内容的组成和使用方法等信息。
地址码给出被操作的信息(指令或数据)的地址。
指令的长度是指一条指令中所包含二进制代码的位数,指令的长度与机器字长没有固定的关系,不过主存一般按照字节编址,所有指令字长多为字节的整数倍。

定长与变长指令字结构

在一个指令系统中,若所有指令的长度都相等,则称为定长指令字结构、若各种指令的长度随指令功能而异,则称为变长指令字结构
根据操作数地址码的数目不同可以分为

  1. 零地址指令:如停机指令、空操作指令、关中断指令etc.
  2. 一地址指令:如加1、减1、求反、求补etc.
  3. 二地址指令:如算术和逻辑运算指令,需要给出源操作数和目的操作数
  4. 三地址指令
  5. 四地址指令

定长操作码指令格式

定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般n位操作码字段的定长指令系统最大能表示$2^n$条指令

拓展操作码指令格式

即定长指令字结构+可变长操作码,拓展操作码使得操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码
例如:
在下图中,指令字长为16位,其中4位作为基本操作码字段OP,另有3个4位长的地址字段$A_1、A_2、A_3$。若4位基本操作码全用于三地址指令,则有16条。下图中所示的三地址指令为15条,1111留作拓展操作码用(即1111 0000-1110 XXXX XXXX 为二地址指令),二地址指令为15条;(同理 1111 1111 0000-1110 XXXX 为一地址指令),一地址指令为15条;(1111 1111 1111 0000-1110 为零地址指令)有16条。
计组-指令系统-1

除上方拓展方法外,还有其他多种拓展方法比如:
[0000-1110 XXXX XXXX XXXX]:表示三地址指令,有15条
[1111 0000-1011 XXXX XXXX]:表示二地址指令,这里取12条,留2条拓展
[1111 1100-1110|1111 0000-1111|0000-1101 XXXX]:表示一地址指令,这里取62条,留2条拓展
[1111 1111 1110-1111 0000-1111]:表示零地址,这里有32条

设地址长度为n,上一层留出m种状态,下一层可拓展出$m\times2^n$种状态

下面来看一道例题可能会更明显一些:
计组-指令系统-2

计组-指令系统-3

寻址方式(重点)

寻址方式是指寻找指令或操作数的有效地址的方式,分为指令寻址和数据寻址两大类
指令中的地址码字段并不代表操作数的真是地址,这种称为形式地址(A)。
形式地址结合寻址方式,可以找到操作数在存储器中的真实地址,称为有效地址(EA)
注意,(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。例如,EA=(A)意思是有效地址是地址A中的数值

指令寻址

寻找下一条将要执行的指令地址称为指令寻址
指令寻址有两种:顺序寻址和跳跃寻址

  1. 顺序寻址
    通过程序计数器PC+1(这里的“1”是指一个指令字长),自动形成下一条指令的地址。{PC + “1” -> PC}
  2. 跳跃寻址
    通过转移类指令实现,下一条指令不是由PC自动给出,而是由本条指令给出下条指令地址的计算方式。跳跃的结果是当前指令修改PC指,所以下一条指令仍然通过PC给出。跳跃寻址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量)

数据寻址

寻找本条指令的数据地址称为数据寻址
数据寻址可分为三大类具体十种寻址方式,下图包含前九种还有一个堆栈寻址
其中基址寻址、变址寻址和相对寻址称为偏移寻址
计组-指令系统-4

数据寻址的方式较多,为了区别不同方式,会在指令字中设置一个字段,用来指明属于那种寻址方式。

操作码字段 寻址方式位 形式地址A

寻址方式位结合形式地址A求出操作数的真实地址,称为有效地址EA

隐含寻址

隐含寻址是不明显地给出操作数地址,而是在指令中隐含操作数地址。
例如,单地址的指令只显式的给出第一操作数地址,而规定累加器(ACC)作为第二操作数地址

计组-指令系统-5

立即(数)寻址

立即寻址形式地址段给出的不是操作数地址,而是操作数本身,有称为立即数,使用补码表示
计组-指令系统-6

直接寻址

直接寻址中的形式地址A就是操作数的真实地址EA,即EA=A。
这与立即寻址不同,注意区别
计组-指令系统-7

间接寻址

间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作的真实地址,而是操作数有效地址EA所在的存储单元的地址,也就是是操作数地址的地址,即EA=(A)。
间接寻址可以是一次,也可以是多次
计组-指令系统-8

寄存器寻址

寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即$EA = R_i$,其操作数在由$R_i$所指的寄存器内
计组-指令系统-9

寄存器间接寻址

相对的,寄存器间接寻址是指在寄存器$R_i$中给出的是操作数所在的主存单元的地址,即$EA = (R_i)$
计组-指令系统-10

相对寻址

相对寻址是把PC的内容加上形式地址A而形成的操作数的有效地址,即EA = (PC)+A,其中A是相对于当前PC指的偏移量,可正可负,由补码表示。

可以理解为是以PC所指的地址作为“起点”,A为偏移量。

相对寻址广泛应用于转移指令
计组-指令系统-11

基址寻址

基址寻址是指将CPU中基址寄存器(BR)的内容加上形式地址A,即EA = (BR)+A。其中BR既可以用专用的寄存器,也可以采用通用寄存器。

基址寄存器是面向操作系统的,其内容只能由操作系统或者程序决定,程序员无法修改其内容,但可以选择使用哪一个BR。

有利于多道程序设计,并可以用于编写浮动程序。
计组-指令系统-12

变址寻址

变址寻址是指有效地址EA是形式地址A和变址寄存器IX内容之和,即EA = (IX)+A

IX是面向程序员的,在程序执行中,IX中的内容可以由程序员改变(作为偏移量),而形式地址A不变(作为基地址)。

这有利于处理循环程序和数组问题。
计组-指令系统-13

堆栈寻址

堆栈是存储器中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址是由一个特定的寄存器给出,该寄存器称为堆栈指针(SP)
堆栈分为硬堆栈和软堆栈。
硬堆栈:又称寄存器堆栈
软堆栈:从主存中划出一段区域作为堆栈
在使用堆栈的系统中,大部分指令表面上都表现为无操作数指令形式,因为操作数地址隐含使用了SP。一般来说,在读/写一个堆栈的一个单元前后都会自动地完成对SP内容的增量或减量操作。

记栈顶元素为$M(sp)$
栈顶在小地址方向:
出栈:$M
(sp) \rightarrow ACC$,$(SP)+1 \rightarrow SP$
入栈:$(SP)-1 \rightarrow SP$,$(X) \rightarrow M_(sp)$

栈顶在小地址方向:
出栈:$M(sp) \rightarrow ACC$,$(SP)-1 \rightarrow SP$
入栈:$(SP)+1 \rightarrow SP$,$(X) \rightarrow M
(sp)$

汇编基础

这里只简单说明一些考研可能会涉及到的汇编知识,只要求在考试中能结合高级语言代码看懂汇编即可,不会要求写出汇编代码

基础知识

  1. 常用的有两种汇编格式:AT&T和Intel格式,AT&T是Unix和Linux使用的格式,Intel格式即x86格式。
  2. 注意,x86格式中第一个为目的操作数,第二个为源操作数,方式从右向左
  3. x86中主要的寄存器
    计组-指令系统-14
  4. 两者差别:点我查看
    计组-指令系统-15

常用指令

偷懒了,具体指令意思可以参考网络上的内容点我查看,下面只列出一些书中出现的命令。

  1. 数据传送指令
    1. mov(move):将第二个操作数内容复制到第一个中
    2. push
    3. pop
  2. 算术和逻辑运算指令
    1. add/sub
    2. inc/dec(increase/decrease):操作数自增1、自减1
    3. imul/mul(multiply):带符号整数乘法
    4. idiv/div(divide):带符号整数除法
    5. and/or/xor:与、或、异或
    6. not
    7. neg(negative)
    8. shr/shl:shr逻辑右移、shl逻辑左移
  3. 控制流指令
    1. jmp
    2. jcondition
    3. cmp/test
    4. call/ret

CISC和RISC

CISC的英文全称是complex instruction set computer,既复杂指令系统。RISC的英文全称是reduced instruction set computer,既精简指令系统。CISC兼容性性强,指令繁多,长度可变,由微程序实现。而RISC则指令少,使用频率接近,主要是依靠硬件实现(通用寄存器、硬布线逻辑控制)。

CISC与RISC的具体区别以表格的形式呈现,如下图:

指令系统类型 指令 寻址方式 实现方式 其他
CISC(复杂指令系统) 数量多,使用频率差别大,可变长格式 支持多种寻址方式 微程序控制技术 研制周期长
RISC(精简指令系统) 数量少,使用频率接近,定长格式,大部分为单周期指令,操作寄存器,只有Load/Store操作内存 支持方式少 增加了通用寄存器;硬布线逻辑控制为主;适合采用流水线 优化编译,有效支持高级语言

典型例题

待补充


参考文献:
《王道考研-计算机组成原理复习指导》
《Computer Systems A Programer’s Perspective Third Edition》
CISC与RISC的区别

计组指令系统
计算机组成原理-存储系统
发表于2023-04-27|更新于2025-05-21|计算机基础计算机组成原理

简介

计算机组成原理系列其二,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容是计算机内部和外部的存储介绍,主要包含以下几点:

  • 存储器的分类与层次化的存储器基本结构
  • 主存与外(辅)存
  • 主存的拓展和外存的结构
  • Cache
  • 虚拟内存

大纲

  • 存储系统
    • 存储器概述
      • 多种角度进行分类
      • 存储器的性能指标
      • 多层次的存储系统
    • 主存储器(主存)
      • SRAM和DRAM简介
      • DRAM的工作原理
        • DRAM的刷新
        • DRAM的地址引脚复用
      • ROM
        • 特点
        • 类型
      • 多模块存储器
        • 单体多字存储器和双端口RAM
        • 多体并行存储器
          • 高位交叉编址(顺序方式)
          • 低位交叉编址(交叉方式)
          • 两者的性能分析
    • 主存储器和CPU的连接
      • 连接原理
      • 主存的容量扩展
        • 位扩展法
        • 字扩展法
        • 字位同时扩展法
    • 外部存储器
      • 磁盘存储器(机械硬盘)
        • 磁盘的组成
        • 磁盘的性能指标
      • 磁盘阵列和固态硬盘
    • 高速缓冲存储器(Cache)(重难点)
      • Cache的工作原理
        • Cache的命中率
      • Cache和主存的映射方式
        • 直接映射
        • 全相联映射
        • 组相联映射
      • Cache中主存块的替换算法
        • 近期最少使用(LRU)算法
      • Cache的写策略
        • Cache写命中
          • 全写法
          • 写回法
        • Cache写不命中
          • 写分配法
          • 非写分配法
    • 虚拟内存
    • 典型例题

存储器概述

计算机中的存储器可以按照多种角度进行分类

  1. 按照层次分类
    • 主存:我们通常称为内存,CPU可以直接随机的对其访问,上联CPU和Cache,下联辅存
    • 辅存:我们通常称为硬盘,用来存放需要永久保存的数据,计算机中的绝大多数数据都保存在辅存中,运行时调入内存和CPU计算
    • 高速缓冲存储器:简称Cache,位于CPU和内存之间,是为了解决CPU和内存之间的速度不匹配问题
  2. 按照存储介质分类
    • 磁表面:磁盘、磁带、
    • 半导体存储器:RAM和ROM
    • 光存储器:光盘
  3. 按照存取方式分类
    • RAM(Random-access memory):顾名思义,RAM的任何一个存储单元都可以随机存取,可以视为一个巨大的数组,其存取时间和存储单元的物理位置无关,缺点是具有易失性(断电后信息会丢失)
    • ROM(Read-only memory):虽然名字叫Read-noly但现代的ROM可以进行多次读写,“只读”的概念没有保留,但其仍保留了非易失性(断电后信息不会丢失)
    • DAM(串行访问存储器):对存储单元进行读、写操作时,需要按照其物理地址的先后顺序寻址,如磁带、磁盘、光盘等
  4. 按信息的可保存性分类
    • RAM
    • ROM

存储器的性能指标

  1. 存储容量 = 存储字数 $\times$ 字长(如$ 1M \times 8位 =\rangle 地址位: 1 \times {10}^{20}个\ 数据位: 8bit$ ),存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量

    在题目中常会遇到,某计算机存储器按字节编址,主存的地址空间大小为64MB,翻译过来就是地址位有$64M = 2^{26}$,即地址位为26位,按照字节编址其数据位就是 $1Byte = 2^{3}$,3位

  2. 存储速度:$数据传输率 = \frac{数据的宽度}{存取周期}$

    1. 存取时间($ T_a $):从启动一次存储器操作到完成该操作所经历的时间,分为读出和写入时间
    2. 存取周期($ T_m $):是连续两次独立访问存储器操作之间所需的最小时间间隙

Tips:$T_a \neq T_m$,通常来说,存取周期大于存取时间,因为在完成一次存取操作后,任何一个存储器都需要一个恢复时间
计组-存储系统-1

多层次的存储系统

一图总结:
计组-存储系统-2

Tips: 在Cache——主存层和主存——辅存层中,上一层的内容都只是下一层的一个副本,Cache(或主存)中的内容只是主存(或辅存)中内容的一部分

主存储器

SRAM和DRAM简介

RAM(随机存储器)分为SRAM(Static RAM)和DRAM(Dynamic RAM)两种,他们都具有易失性,其主要区别是是否需要刷新。SRAM常用来制作Cache,DRAM常用来制作内存。SRAM没什么考点,考试的重点是二者的区别

计组-存储系统-3

两者的区别

DRAM的工作原理

DRAM是利用存储元电路中栅极电容上的电荷来储存信息的,其具有集成度高、容量大、价格低、功耗低等优点,但其速度较SRAM慢,是破坏性读出。因此需要它需要进行刷新来保证其存储的信息不丢失

DRAM的刷新

DRAM上电容的电荷一般只能维持1~2ms,即使不断电也其信息也会消失,每隔一段时间必须刷新一次,通常取2ms,称为一个刷新周期。常用的刷新方式有以下三种:

  • 集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读/写操作。集中刷新的时间不能进行读/写操作,故称为“死时间”或访存“死区”
  • 分散刷新:对每行存储单元的刷新分散到每个存取周期内完成。其中,把机器的存取周期$T_c$分成两段,前半段$T_m$用来读\写或维持信息,后半段$T_r$用来刷新。优点是没有停止读/写的死时间,缺点是存取周期长了
  • 异步刷新:既可以缩短“死时间”,又充分利用最大刷新间隔为2ms的特点,具体操作为:在2ms内对128行各刷新一遍。将刷新周期除以行数,得到两次刷新操作之间时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求

计组-存储系统-5

DRAM芯片的栅极电容

计组-存储系统-4

DRAM的刷新

地址引脚复用

(考试常考,需记住)DRAM芯片容量较大,地址位数较多,为了减少芯片的地址引脚数,通常采用地址引脚复用技术,行地址和列地址通过相同的引脚分前后两次输入,这样就可以减少一半的地址引脚

计组-存储系统-6

ROM

特点

  1. 结构简单,位密度比可读写存储器高
  2. 具有非易失性

ROM的类型

考试只需记住各个类型的名称即可,无需细究

  • MROM(Mask ROM,掩模式只读存储器)
    • MROM的主要优点是存储内容固定,掉电后信息仍然存在,可靠性高。缺点是信息一次写入(制造)后就不能修改
  • PROM(Programmable ROM,可编程只读存储器)
    • 仅只能编写一次,第一次写入的信息就被永久性地保存起来
  • EPROM(Erasable Programmable ROM,可编程可擦除只读存储器)
    • 用户可以自己写入信息,且可以多次修改,但修改的次数有限
  • Flash(Flash Memory,快擦除读写存储器)
    • 可以长期保存信息,也可以在线进行快速擦除和重写
  • SSD(Soild State Drives,固态硬盘)

双端口RAM和多模块存储器

多模块存储器是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率。常用的有单体多字存储器和多体并行存储器

单体多字存储器和双端口RAM

仅做简单了解,这里不详细说明,考试重点在多体并行存储器

多体并行存储器

多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,也具有独立的读写控制电路、地址寄存器和数据寄存器。其目的是为了解决一个存期周期中恢复时间较长问题,分为高位交叉编址和低位交叉编址

计组-存储系统-8

图1-1 二者对比
高位交叉编址(顺序方式)

高位交叉编址的实际效果相当于单纯的扩容,并没有解决存储周期恢复时间较长的问题。通过分析其地址存储方式可知,它是在一条存储器上顺序分布的,在连续取址时每个存储器还是需要时间来恢复,不能多条存储器并行操作

  1. 高位地址表示体号,低位地址为体内地址
  2. 一个体内的地址是连续的,只需要一个地址寄存器,也有利于存储器的扩充
  3. 多模块串行,性能无提升

计组-存储系统-7

低位交叉编址(交叉方式)

低位交叉编址的低位地址表示体号,高位表示体内地址,每个模块按“模M”交叉编址,模块号 = 单元地址 % M。

  1. 低位地址表示体号,高位地址表示体内地址(这种编址方法又称模M编址,M等于模块数)
  2. 相邻地址位于不同存储体中,每个存储体都需要寄存器
  3. 多模块并行,可以实现对存储器的流水线式访问,性能提升

计组-存储系统-9

性能分析

设存储周期为T,总线传送周期为r,交叉模数为m。
为了实现流水线方式存取,每通过r时间延迟后启动下一个模块,应满足:
$T = m \ast r$
交叉存储器要求其 $模块数 \geq m $,以保证启动某模块后经过$m \ast r$时间后再次启动该模块时,它上次存取操作已经完成。

  • 对于高位多体交叉,连续读取n个字的时间:$t_2 = n \ast T$

计组-存储系统-11

  • 对于低位多体交叉,连续并行读取n个字的时间:$ t_1 = T + (n - 1) \ast r$

计组-存储系统-10

主存储器和CPU的连接

连接原理

  1. 主存储器通过数据总线(CPU使用MDR与主存通过数据总线交互)、地址总线(CPU使用MAR向主存发送地址)、控制总线(包括片选线、读控制线、写控制线)与CPU连接
  2. 数据总线的$位数\times工作频率$与数据传输率成正比
  3. 地址总线的位数决定了可寻址的最大内存空间
  4. 控制总线指出了总线周期的类型和本次输入\输出的操作完成时刻

计组-存储系统-12

主存的容量扩展

因为单个存储芯片的容量有限,所以需要在字(扩展地址位)和位(扩展数据位)两个方法对其进行扩容来满足实际需求。通常有位扩展法、字扩展法和字位同时扩展法来扩展主存容量

位扩展法

CPU的数据线数与存储芯片的数据位数不一定相等,需要对其进行位扩展,即使用多个存储器对字长进行扩充,增加存储字长

计组-存储系统-13

Tips:CS位片选线,WE为读写控制线

字扩展法

字扩展是指增加存储器中的字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线并联,而由片选信号来区分各地址的范围
如下图,用4片$16K\times8$位的RAM芯片组成$64K\times8$ 位的存储器。4片RAM芯片的数据线$D0\sim D_7$和WE都分别连在一起。将$A{15} A{14}$用作片选信号,$A{15} A{14} = 00$ 时,译码器输出端0有效,选中最左边的1号芯片$A{15} A_{14} = 01$时,译码器输出端1有效,选中2号芯片,以此类推(在同一时间内只能有一个芯片被选中)。各芯片的地址分配如下:

第一片,最低地址:0000000000000000;最高地址:0011111111111111
第二片,最低地址:0100000000000000;最高地址:0111111111111111
第三片,最低地址:1000000000000000;最高地址:1011111111111111
第四片,最低地址:1100000000000000;最高地址:1111111111111111

注意:仅采用宇扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号CS或来用译码器设计连接到相应的芯片

计组-存储系统-14

字位同时扩展法

计组-存储系统-15

$2/4译码器$:有两条线可生成两个片选信号,即可控制四个芯片,同理还有$3/8译码器$

外部存储器

磁盘存储器(机械硬盘)

磁盘的组成

计组-存储系统-16

计组-存储系统-17

计组-存储系统-18

磁盘的性能指标(重点)

  1. 主机对磁盘的读写是以扇区为单位
  2. 每个磁道存储的数据量相同,越靠近内侧的磁道存储密度越大
  3. 磁盘的容量
    1. 非格式化容量:指理论上可以保存的数据量大小,由道密度和位密度计算
    2. 格式化容量,是指按照某种特定的记录格式所能存储信息的总量,格式化的容量要比非格式化的容量要小(会保留一部分容量备用)
  4. 平均存取时间(重点)
    1. 寻道时间:磁头移动到目的磁道的时间
    2. 旋转延迟时间:磁头定位到要读写扇区的时间
    3. 传输时间:传输数据所花费的时间

      Tips:由于寻道和查找扇区的距离远近不一,所以寻道时间和旋转延迟时间通常取平均值

      1. 平均旋转延迟时间:存取一个扇区的平均旋转延迟时间取旋转半周磁道的时间
      2. 平均寻道时间:取磁头从盘面最内圈转到最外圈的时间的一半
      3. 传输时间:$\frac{需要读取的数据量}{数据传输的速率}$

磁盘阵列和固态硬盘

  1. 磁盘阵列(了解)
    计组-存储系统-19
  2. SSD
    数据的读写以页为单位,擦除以块为单位。只有在一页所属的块整个被擦除后,才能写这一页
    在反复的写后,SSD的闪存块会磨损,SSD页会磨损,寿命有限
    计组-存储系统-20
    一个页相当于一个扇区,一个块相当于一个磁道

高速缓冲存储器(Cache)

Cache作为本章的重点和难点,其核心问题主要分为三点:

  1. Cache和主存的映射方式
  2. Cache中主存块的替换算法
  3. Cache的写策略
    下面将重点从这三个方面来理解Cache在计算机中的工作方式和为什么需要Cache

Cache的工作原理

之所以要在CPU和主存之间增加一层Cache正是为了解决CPU和主存之间速度不匹配的问题,正如外存和主存一样,Cache中的内容是主存中的一个副本。因为计算机的程序访问具有局部性原理,所以我们可以在CPU和主存之间增加Cacha层来提高计算机的整体运行速度

Cache的命中率

CPU欲访问的信息已在Cache中的比率称为Cache的命中率。
设一个程序执行期间,Cache的总命中次数为$N_c$,访问主存的总次数为$N_m$,则命中率H为:$H = \frac{N_c}{N_c+N_m}$

设$t_c$为命中时的Cache访问时间,$t_m$为未命中时的访问时间,$1-H$表示未命中率,则Cache-主存系统的平均访问时间$T_a$为:$T_a=H\ast{t_c}+(1-H){t_m}$(此命中率为CPU对Cache和主存同时访问)
若为,先访问Cache再访问主存则时间为:$t=H\ast{t_c}+(1-H)({t_c+t_m})$

Cache和主存的映射方式

主存与Cache之间以“块”为单位进行数据交换(注:在操作系统中将主存中的“块”称为“页/页面”,Cache中的“块”称为“行”,在这里统一称为块,便于描述)
地址映射是指把主存的地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。地址映射的方式主要有以下三种:

  1. 直接映射
  2. 全相联映射
  3. 组相联映射

直接映射

直接映射是主存中的每一块只能装入Cache中的唯一位置。若该位置已有内容,则产生冲突,需要将原来的块替换出去。直接映射实现简单,即使Cache中有许多地址空缺也不能占用,但这使得直接映射的块冲突概论最高,空间利用率最低
直接映射关系可以定义为:Cache行号 = 主存块号 % Cache总行数

计组-存储系统-21


重点说明:在映射这一章中最任意糊涂的就是映射的地址结构,首先看直接映射的地址结构,它由三部分组成,分别是标记、Cacha行号和块内地址:

  • 主存块号
    • 标记
    • Cacha行号
  • 主存的块内地址
    • 块内地址

根据上面的层次结构我们可以看出,一个Cache行由两个大部分组成(主存块号、块内地址,时刻记住Cache中的内容是主存的一个副本),其中主存块号又被分为标记和Cache行号。

  1. 这里的Cache行号是怎么来的? 其实它来源于直接映射的定义,因为对主存块号进行取模操作即对主存块号$ % 2^c $相当于留下最后c位二进制数。换句话说,若Cache共有$ 2^c $行,那么主存块号的低c位即为对应的Cache行号
  2. 这里可能会迷惑为什么低c位就是对应的Cache行号,其实对于取模操作,用二进制来表示的话就是取低c就可以直接得到,思维不要局限在十进制上
  3. CPU给出的访存地址是指访问主存的地址,CPU根据给出的访存地址的低c位(也就是Cacha行号)来在Cache中定位它,如果在Cache中该行有数据,然后再比较标记位且Cache行的有效位为1,则表示Cache中的这一行就是要找的访存地址(即Cache命中)

例题:
计组-存储系统-22

计组-存储系统-23

解析:
计组-存储系统-24

如果以上内容还没有看懂可以点击此处查看视频讲解

上面内容搞清楚以后,本章的难点也就是没有了,考试的重点也多在上面


全相联映射

与直接映射不同,全相联映射的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块。优点是比较灵活,冲突概率低,空间利用率高;缺点是速度较慢

计组-存储系统-25

组相联映射

组相联映射是将Cache分成Q个大小相等的组,组间采用直接映射、组内采用全相联映射,假设每组有r个Cache行,则称为r路组相联

计组-存储系统-26

如图为二路组相联

组相联映射可定义为:Cache组号 = 主存块号 % Cache组数(Q)

组相联映射地址结构为:

标记 组号 块内地址

若Cache共有$2^q$组,则主存块号的低q位即为对应的Cache组号
例题:
计组-存储系统-27

解析:
计组-存储系统-28

Cache中主存块的替换算法

在使用全相联映射或者组相联映射时,就需要考虑Cache和主存中数据的替换问题,直接映射则无需考虑。在计组中该部分内容简要带过,重点内容在操作系统中会学习到

常用的替换算法有:

  1. 随机(RAND)算法
  2. 先进先出(FIFO)算法
  3. 近期最少使用(LRU)算法
  4. 最不常用(LFU)算法

这里重点说一下LRU算法,其余内容在操作系统中学习
LRU的一个快速手算方法是:可以从当前块从左向右找到最长时间未使用的内存块来替换,而无需像下面一样使用计数器

计组-存储系统-29

Cache的写策略

Cache中的内容是主存块的副本,当对Cache中内容进行更新时,需要使用写操作策略使Cache内容和主存内容保持一致。分为两种情况

  • Cache写命中
    • 全写法
    • 写回法:为了减少写回主存的开销,每个Cache行需要设置一个修改位(脏位),若脏位为1则表示修改过,为0则未修改过(不要忘记脏位!考试常考到,还有也不要忘记有效位,Cache映射时会用到)
  • Cache写不命中
    • 写分配法
    • 非写分配法
  1. Cache写命中

    1. 全写法
      计组-存储系统-30
      计组-存储系统-32

    2. 写回法
      计组-存储系统-31

  2. Cache写不命中

    1. 写分配法
      计组-存储系统-33

    2. 非写分配法
      计组-存储系统-34

虚拟内存

这一章主要内容在操作系统中会重点学习,在这里就不再提及了

典型例题

待补充


计组存储系统
我常用的Hexo插件
发表于2023-04-19|更新于2025-11-04|前端网站建设

常用的Hexo插件

数学公式:Mathjax
参考文章:https://www.jianshu.com/p/7ab21c7f0674;https://oysz2016.github.io/post/8611e6fb.html

思维导图:hexo-simple-mindmap
参考文章:https://hunterx.xyz/hexo-simple-mindmap-plugin-intro.html

博客说说:hpptalk)
插件文档:具体配置查看插件文档

Hexo插件
计算机组成原理-数据的表示和计算
发表于2023-04-16|更新于2025-05-21|计算机基础计算机组成原理

简介

计算机组成原理系列其一,主要是针对中国大陆考研所要求的内容对计算机组成原理的知识体系进行总结和梳理,本篇内容主要包含以下几点:

  • 数制的表示
  • 计算机的内部编码
  • 定点数和浮点数
  • C语言中的数据表示
  • 数据的计算

    大纲

    重点内容会使用黑色加粗表示

  • 数据的表示和计算

    • 前置知识
      • 数值转换
      • 计算机运算速度
      • CPU执行时间
    • 数制
      • 进位计数法
        • r位进位计数法
        • 不同进制数相互转换方法
      • 定点数的表示
        • 真值和机器数
        • 机器数的定点表示
        • 原码、补码、反码、移码
        • 定点数的移位
          • 算术位移
          • 逻辑位移
          • 循环位移
        • 定点数的加减法
        • 溢出的判别方法
    • 浮点数
      • 一般浮点数的表示
      • IEEE 754标准
    • C语言中的数据类型及强制类型转换
      • 整数类型的转换
      • 包含浮点数的转换
      • 数据的存储和排列
        • 大端法
        • 小端法
    • 拓展
      • 乘2取整法

前情提要

  1. 数值转换
    • 计算机进行数据处理时,一次存取、加工和传送的数据长度称为字,对于不同的品牌CPU 1Word(一个字)通常由一个或多个(一般是字节的整数位)字节构成
    • 在描述存储容量和文件大小时,K、M、G、T常用2次幂表示
      • 1Byte = 8bit
      • 1KB = $ 2^{10} $ B = $ 8\times2^{10} $ bit
      • 1MB = $ 2^{20} $ B = $ 8\times2^{20} $ bit
      • 1GB = $ 2^{30} $ B = $ 8\times2^{30} $ bit
      • 1TB = $ 2^{40} $ B = $ 8\times2^{40} $ bit
    • 在描述速率、频率时,K、M、G、T常用10次幂表示
      • 1K = $ 10 ^{3} $
      • 1M = $ 10 ^{6} $
      • 1G = $ 10 ^{9} $
      • 1T = $ 10 ^{12} $
      • 1P = $ 10 ^{15} $
  2. 常见秒单位:
    分数 倍数
    值 符号 名称 值 符号 名称
    10−1 s ds 分秒 101 s das 十秒
    10−2 s cs 厘秒 102 s hs 百秒
    10−3 s ms 毫秒 103 s ks 千秒
    10−6 s µs 微秒 106 s Ms 兆秒
    10−9 s ns 纳秒 109 s Gs 吉秒
    常用单位以粗体表示

计算机的性能指标

几种字长区别

参见计算机组成原理 - 指令系统

数据通路带宽

数据通路带宽是指数据总线一次所能并行传送信息的位数。这里所指的数据通路宽度是指外部数据总线的宽度,它与CPU内部的数据总线宽度(内部寄存器的大小)可能不同

CPU内部的数据通路
外部数据总线带宽

运算速度

  1. 计算机运算速度
    1. CPU时钟周期。 通常为主频的倒数,是CPU中最小的时间单位,执行指令的每个动作至少需要1个时钟周期
    2. 主频(CPU时钟频率)。 机器内部的主时钟的频率,是衡量机器速度的重要参数,以Hz为单位。
    3. CPI(Cycle Per Instruction),执行一条指令所需的时钟周期数。(不同指令的时钟周期数可能不同,CPI通常是一个平均值)
  2. CPU执行时间,指运行一个程序所花费的时间
    CPU执行时间 = $ \frac {CPU时钟周期}{主频} $ = $\frac {(指令条数\times CPI)}{主频}$
  3. MIPS(Million Instruction Per Second),每秒执行多少百万条指令
    MIPS = $ \frac {指令条数}{执行时间 \times 10^{6}} $ = $\frac {主频}{CPI \times 10^{6}}$

    数制

    进制计数法

    1. 一个r进制数($ Kn K{n-1} K{n-2} …… K{0} K{-1} …… K{-m} $)可以表示为:
      $ Kn r^n + K{n-1}r^{n-1} + …… K{0}r^{0} $ $+ K{-1}r^{-1} + …… K{-m}r^{-m} = \sum{i=n}^{-m} K_ir^i $ 其中r是基数,$r^i$ 是第i位的位权(整数位最低位规定为第0位),$K_i$的取值可以是0,1,…… r-1共r个数码中的任意一个
  1. 不同进制数之间的互相转换
    1. 二进制与八进制和十六进制可以很方便的互相转换
    2. 任意进制转换为十进制数:将任意进制数的各位数码与他们的权值相乘,再将乘积相加即可
      例如:$ (11011.1)_2 = 1\times 2^4 + 1\times 2^3 + 0\times 2^2 + 1\times 2^1 + 1\times 2^0 + 1\times 2^{-1} = 27.5 $
    3. 十进制转换为任意进制数:
      计算机组成原理-数据的表示和计算_1

定点数的编码表示

真值和机器数

  • 真值:日常生活中使用正负号表示的数字,例如:-19、20。真值是计算器所代表的实际值
  • 机器数:计算机中通常把数的符号和数值部分一起编码,通常用“0”表示正、“1”表负。这种把符号和数值一起编码的数称为机器数。常用的有原码、补码、反码、移码。例如:0,101(这里的“,”仅区分符号位和数值位)表示+5

机器数的定点表示

计算机组成原理-数据的表示和计算_2

原码、补码、反码、移码

对于这几种码的相互转换、适用范围、原码和补码的表示范围、补码原码的加减运算等要重点关注

  1. 用机器数的最高位表示符号位(单符号位),其余各位表示数的绝对值
    例如:$ x1 = +0.1101, x_2 = -0.1101 $,字长为8位,其原码表示为$ [x_1]原$ = 0,1101000 , $ [x2]原$ = 1,1101000,其中最高位为符号位
  2. 原码中的真值零有正零和负零两种形式,$ [+0]原$ = 0,0000和 $ [-0]原$ = 1,0000,而补码的零是唯一的
  3. 双符号位表示: 00表示正,11表示负,其中第一位数字表示真正的符号,第二位数字可以用于溢出判断,即01、10表示发生溢出需要进行右移保持符号位不变
  4. 四种码的相互转换
    计算机组成原理-数据的表示和计算_3

    计算机组成原理-数据的表示和计算_6

    计算机组成原理-数据的表示和计算_4

    计算机组成原理-数据的表示和计算_5

定点数的移位

定点数的移位主要包括:算数移位、逻辑移位、循环移位

  1. 算术移位:算术移位的操作对象是有符号数,其在移位过程中的符号位要保持不变(只移动数值位,其右添补0或1看符号位,左移添补0或1),左移一位相当于乘以2;右移一位相当于除以2

    • 对于正数由于$ [ x]原 $ = $ [ x]补 $ = $ [ x]_反 $ = 真值,因此对于移位(左移和右移)后的空位均添0补充
    • 对于负数:
      • 原码表示:左移和右移均添0补充
      • 补码表示:左移添0补充,右移添1补充(对于补码来说,其由低向高位找到的第一个“1”,在此“1”的左边各位均与对应的反码相同,在此“1”右边(包括此“1”)均与对应的原码相同)
      • 反码表示:左移和右移均添1补充
      • 误差分析:
        • 对于正数、负数原码,左移时高位丢1,结果出错;右移时低位丢1,影响精度
        • 对于负数补码,左移时高位丢0,结果出错;右移时,地位丢1,影响精度
        • 负数反码,左移时高位丢0,结果出错;右移时低位丢0,影响精度
          计算机组成原理-数据的表示和计算_7
  2. 逻辑移位:逻辑移位将操作数视作无符号数,其左移或右移时均添0补充

  3. 循环移位:将移出的数位又移入数据中,循环移位适合将数据的低字节数据和高字节数据互换
    计算机组成原理-数据的表示和计算_8

定点数的加减法,乘除(此处不做重点说明)

  • 补码的加减运算规则:
    • 按二进制运算规则运算
    • 若做加法,直接两数补码相加;若做减法,则先将减数转化为对于的负数再与被减数相加
    • 符号位与数值位一起运算,加、减结果的符号位也在运算中直接得出
    • 最终的运算结果的高位丢弃,保持位数不变,运算结果也为补码
  • 例子:
    计算机组成原理-数据的表示和计算_9

溢出的判别方法

计组-数据的表示和计算_10

浮点数

对于浮点数的学习可以类比十进制的科学计数法来比较学习

一般浮点数的表示

  1. 表示格式:$ N=(-1)^S \times M \times R^E $

    • S取值为0或1,用来决定浮点数的符号
    • M是一个二进制定点小数,称为尾数,一般使用定点原码小数表示,尾数的位数反映了浮点数的精度
    • E是一个二进制定点整数,称为阶码,常用移码表示。阶码的值反映了浮点数小数点的实际位置,阶码的位数反映了浮点数的表示范围
    • R是基数,一般是隐含的,可以取值为2、4、8等

      计组-数据的表示和计算_11

  2. 浮点数的规格化
    浮点数的尾数位数决定了浮点数的有效位数,有效位越多,数据的精度越高,浮点数的规格化就是为了使得尾数保留更多的有效位数。规格化的操作是通过调整一个非规格化的浮点数的尾数和阶码的大小,使得非零的浮点数在尾数的最高数位上保证是一个有效值(即值为1)

    1. 规格化操作

      • 左规:当运算结果的尾数最高数位不是有效位时,即$ \pm0.0……01XXX $的形式时需要进行左规,左规时,尾数每左移一位、阶码减1(以基数为2,下同)。左规可能需要多次
      • 右规:当运算结果的尾数的有效位进位到小数点前时,需要右规。尾数右移一位、阶码加1。右规需要进行一次
      • 为何只需要进行一次? 当浮点数运算的结果使尾数溢出(即使用双符号位表示时为01或10)时,Example:

        $ a = +2^2 \times 00.1100 $
        $ b = +2^2 \times 00.1000 $
        $ a+b = 2^2 \times(00.1100+00.1000) = 2^2 \times 01.0100$
        $ \mathtt{=>^{右规} 2^3 \times 00.1010} $

    2. 用原码表示的规格化尾数(基数为2)的形式如下:

      1. 正数为0.1xx……xx的形式,最大值表示为0.11……1,最小值为0.100……0
      2. 负数为1.1xx……xx的形式,最大值表示为1.10……0,最小值表示为1.11……1
  3. 浮点数的加减运算
    浮点数的运算特点是阶码运算和尾数运算分开进行,加减运算分为以下几步

    1. 对阶
      对阶的目的是使两个操作数的小数点位置对⻬,即使得两个数的阶码相等。为此,先求阶差,然后以小阶向大阶看⻬的原则,将阶码小的尾数右移一位(基数为2),阶加1,直到两个数的阶码相等为止。尾数右移时,舍弃掉有效位会产生误差,影响精度
      (类比科学计数法将$ 98.11 \times 10^2 + 8.11 \times 10^3 $转变为$ 9.811 \times 10^3 + 8.11 \times 10^3$)
    2. 尾数求和
      将对阶后的尾数按定点数加(减)运算规则运算。运算后的尾数不一定是规格化的,因此,浮点数的加减运算需要进一步进行规格化处理。
    3. 规格化
      参照上方规格化规则,对于IEEE 754规格化的尾数形式为$ \pm 1.xxxx $,因为IEEE 754尾数的最高位默认隐含为1所以规格化时的主要区别就是要将有效位移到小数点左边一位(即小数点左边只能为1)
    4. 舍入
      在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的两位保留下来,参加中间过程的运算,最后将运算结果进行舍入,还原表示成IEEE 754格式。
      常见的舍入方法有:
      • 舍1入法:类似于十进制的“四舍五入”法。运算结果保留位的最高数位为0,则舍去;最高数位为1,则在尾数的末位加1。这样可能会使尾数溢出,此时需再做一次右规。
      • 恒置1法:不论丢掉的最高数位是0还是1,都把右移后的尾数末位恒置1
      • 截断法:直接截取所需位数,丢弃后面的所有位,这种舍入处理最简单
    5. 溢出判断
      在尾数规格化和尾数舍入时,可能会对阶码执行加/减运算。因此,必须考虑指数溢出的问题。
      若一个正指数超过了最大允许值(127或1023),则发生指数上滥,产生异常
      若一个负指数超过了最小允许值(-126或-1022),则发生指数下溢,通常把结果按机器零处理。
      • 右规和尾数舍入。数值很大的尾数舍入时,可能因为末位加1而发生尾数溢出,此时需要通过右规来调整尾数和阶。右规时阶加1,导致阶增大,因此需要判断是否发生了指数上溢。当调整前的阶码为11111110时,加1后,会变成11111111而发生指数上滥。
      • 左规。左规时阶减1,导致阶减小,因此需要判断是否发生了指数下溢。其判断规则与指数上溢类似,左规一次,阶码减1,然后判断阶码是否为全0来确定是否指数下滥。
      • 由此可见,浮点数的溢出并不是以尾数溢出来判断的,尾数溢出可以通过右规操作得到纠正。运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由指数上滥来判断的。

IEEE 754标准

现代计算机中,一般都以IEEE 754标准存储浮点数,IEEE标准用: $V=(-1)^S \times M \times 2^E $来表示一个浮点数

简介

  • 符号: S决定这个数是正数还是负数
  • 尾数: M是一个二进制小数,采用隐藏位的原码(隐藏位是指隐藏尾数了小数点左边的1)
  • 阶码: E是对浮点数进行加权,权重是2的E次幂,使用移码表示
    • 移码 = 原码+偏移值(float型为127,double型为1023)
    • 在手算阶码时可以将其视为无符号数计算,然后再减去(加上)偏移值即可得到原码(移码也即阶码),使用十进制计算再转为二进制较为方便

在IEEE 754标准中:

规格化的短浮点数的真值为:$ (-1)^S \times 1.M \times 2^{E-127} $
规格化的短浮点数的真值为:$ (-1)^S \times 1.M \times 2^{E-1023} $

计组-数据的表示和计算_12

符号位 阶码 尾数
sign exponent fraction

对于不同精度的浮点数,阶码与数值位分配的位数不一样,如下:

精度 数符 阶码 尾数 总位数 偏移值
短浮点数(C中的float) 1 8 23 32 $127_{(10)}$ || $7F_{(16)}$
长浮点数(C中的double) 1 11 52 64 $1023_{(10)}$ || $3FF_{(16)}$

对于32位的单精度浮点数,符号位分配是1位,阶码分配了8位,尾数分配了是23位(实际上是24位,隐藏了隐含小数点左边的1)。

根据这个标准,我们来尝试把一个十进制的小数转换为IEEE 754标准表示。

规格化的值

最普遍的情况,当exp的位模式不全为0(数值0),也不全为1(单精度255,双精度2047)
例如:178.125

  1. 先把浮点数分别把整数部分和小数部分转换成2进制

    1. 整数部分用除2取余的方法,求得:10110010

    2. 小数部分用乘2取整的方法,求得:001

    3. 合起来即是:10110010.001

    4. 转换成二进制的浮点数,即把小数点移动到整数位只有1,即为:1.0110010001 * 2^111,111是二进制,由于左移了7位,所以是111

  2. 把浮点数转换二进制后,这里基本已经可以得出对应3部分的值了

    1. 数符:由于浮点数是正数,故为0.(负数为1)

    2. 阶码 : 阶码的计算公式:阶数 + 偏移量, 阶码是需要作移码运算,在转换出来的二进制数里,阶数是111(十进制为7),对于单精度的浮点数,偏移值为01111111(127)[偏移量的计算是:$ 2^{(e-1)} - 1 $, e为阶码的位数,即为8,因此偏移值是127],即:111+01111111 = 10000110

    3. 尾数:小数点后面的数,即0110010001

    4. 最终根据位置填到对位的位置上:

数符 阶码 尾数
0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

阶码与尾数之间隐含小数点

可能有个疑问:小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是“1”
我们将尾数定义为M=1+f,小数字段被描述为小数值f,其中0<=f<1,其二进制表示为:
IEEE浮点表示
也就是二进制小数点在最高有效位的左边。
我们也可以把M看成一个二进制表达式为下图的数字,也总能调整阶码使得尾数M的范围在1到2之间。
IEEE浮点表示_2

既然第一位总是1,那就可以直接隐藏不需要显示出来,同时也能够获得一个额外的精度位。

非规格化的值

当阶码全为0时,所表示的数非规格化的形式。这种情况下,阶码的值是1-Bias,尾数M=f,也就是小数字段的值,不包含隐含开头的1。
非规格化有两个用途:

  • 一、是提供一种表示数值0的方法,因为使用规格化的数我们必须使M>=1,无法表示0。
  • 二、是表示那些非常接近0的数。

定点、浮点表示的区别

在字长相同时,浮点数取字长的一部分作为阶码,所以表示的范围比定点数要大,但是由于字长固定也就意味着尾数部分的有效位数减少,精度就要比定点数有所降低

计组-数据的表示和计算_13

C语言中的数据类型及强制类型转换

在C语言中常会用到强制类型转换,C中对定点整数的存储是使用补码形式,常见的转换有char->int->long->double和float->double。从前到后的范围和精度都是从小到大,转换的过程中没有损失

整数类型的转换

  1. 无符号<——>有符号:不改变数据内容,只改变对其的解释方式
  2. 长整数 ——>短整数:高位截断,只保留低位
  3. 短整数 ——>长整数:
    • 无符号数,进行高位“0”拓展
    • 有符号数,高位用原符号位拓展

包含浮点数的转换

  • int转换为float时,虽然不会发生溢出,但float尾数连隐藏位共24位,当int型数的第24~31位非0时,无法精确转换成24位浮点数的尾数,需进行舍入处理,影响精度。
  • int或float转化为double时,因double的有效位数更多,因此能保留精确値。
  • double转换为float时,因float表示范围更小,因此大数转换时可能会发生滥出。此外,由于尾数有效位数变少,因此高精度数转换时会发生舍入。
  • float或double转换为int时,因int没有小数部分,因此数据会向0方向截断(仅保留整数部分),发生舍入。另外,因int表示范围更小,因此大数转换时可能会溢出。
机器字长 char short int long float double
32位机 1B 2B 4B 4B 4B 8B
64位机 1B 2B 4B 8B 4B 8B

数据的存储和排列

  1. 大端法和小端法
    计组-数据的表示和计算_14

  2. 数据按照“边界对齐”的方式存储
    计组-数据的表示和计算_15

典型例题

  • P11-22
  • P17-20-23
  • P32-28-30
  • P51-(33,37)-(38,44)-41

拓展

乘2取整法

考虑一个十进制小数0.123,我们可以用“乘10取整”法得到它的每一位小数:第一位小数是0.123 10=1.23,取整数1;第二位小数:0.23 10=2.3,取整数2

上面的方法供你直观理解,下面我们从数学的角度分析其中的原理。

现在有一个十进制小数为0.625,要把它转换为二进制小数,我们需要找到它的每一位。记这个二进制小数点后第1位是$a_1$,第二位是$a_2$,……,那么这个小数的值就是$ a_1 \ast {\frac{1}{2}}^{-1}+a_2 \ast {\frac{1}{2}}^{-2}+a_3 \ast {\frac{1}{2}}^{-3}+… $ 。现在我们的目标是根据0.625找到对应的$ a_1,a_2,a_3$ ,…使得$ 0.625=a_1 \ast {\frac{1}{2}}^{-1}+a_2 \ast {\frac{1}{2}}^{-2}+a_3 \ast {\frac{1}{2}}^{-3}+… $

在等式两边同时乘以2,得到$1.25=a_1 \ast {\frac{1}{2}}^{0}+a_2 \ast {\frac{1}{2}}^{-1}+a_3 \ast {\frac{1}{2}}^{-2}+…$

我们发现,左边的整数部分1对应右边的$a_1$,也就是二进制小数的第一位,于是$a_1=1$,对于剩下的部分:

$0.25=a_2 \ast {\frac{1}{2}}^{-1}+a_3 \ast {\frac{1}{2}}^{-2}+…$

我们再次乘以2,得到$0.5=a_2 \ast {\frac{1}{2}}^{0}+a_3 \ast {\frac{1}{2}}^{-1}+… $于是$a_2=0$

再乘以2,得到$1=a_3 \ast {\frac{1}{2}}^{0}+…$, 于是$a_3=1$,到这里,所有的数都消耗完了,我们找到了0.625对应的二进制小数:0.101


参考文献:
《王道考研-计算机组成原理复习指导》
《Computer Systems A Programer’s Perspective Third Edition》

计算机组成原理计算机数据表示浮点数补码
搭建TG贴纸下载Robot
发表于2023-04-09|更新于2025-05-21|实用工具教程

前情提要

最近回家用TG贴纸下载机器人的时候发现太大的贴纸包无法下载,无奈只好自己搭建一个,正好在网上看到一个不错的,于是正好写这篇教程记录一下

源码下载和必备环境

  • Robot源代码来源Github
  • Imagemagick下载
  • 所需环境:
    • Node.js v8.0.0及以上
    • ImageMagick with webp support (Check with identify -list format | grep -i 'webp'on Linux systems)

开始搭建Robot

  1. 因为 Imagemagick 没有 webp 支持,可以使用identify -list format查看支持的图片格式
  2. Imagemagick源码编译webp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #先安装webp
    yum install libwebp -y

    #卸载系统自带的ImageMagick
    yum remove ImageMagick -y

    #下载ImageMagick源码包,编译
    wget -c https://download.imagemagick.org/archive/releases/ImageMagick-7.1.1-4.tar.gz
    tar -zxf ImageMagick-7.1.1-4.tar.gz && cd ImageMagick-7.1.1-4
    ./configure --with-webp
    make && make install

    #查看是否成功支持webp
    identify -list format | grep -i 'webp'
  • tips:
    • 编译时一定要带上 --with-webp
    • ERROR:编译imagemagick时一直无法将webp成功一起编译无法使用机器人,输入以下命令后成功sudo ldconfig /usr/local/lib(如果出现同样的问题尝试一下,未找到准确原因,可以参考Imagemagick官方文档)
  1. Robot代码配置

    1. git clone https://github.com/phoenixlzx/telegram-stickerimage-bot.git
    2. Get a bot token from @BotFather
    3. Copy config.js.example to config.js and edit as your needs
    4. npm install && npm start
  2. 设置开机自启

    1. 可以直接写一个shell脚本

      1
      2
      3
      4
      5
      6
      7
      #!/bin/bash

      # 切换到目标项目目录下
      cd 你的Robot应用根目录

      # 启动服务
      npm start
    2. centos自启动配置(我的机器是Centos机器不同可能不一致)
      在CentOS 7中,开机启动脚本的位置为/etc/rc.d/rc.local文件

      1
      2
      3
      4
      5
      6
      7
      sudo vim /etc/rc.d/rc.local

      #在开机时自动启动一个名为``auto-start.sh``的脚本,只需要在rc.local文件中添加如下内容:
      sh /path/to/auto-start.sh

      #需要注意的是,rc.local 文件必须具有可执行权限,因此你需要运行以下命令来添加权限:
      sudo chmod +x /etc/rc.d/rc.local

完成参考

搭建TG贴纸下载Robot-1
搭建TG贴纸下载Robot-2


参考文章:
机器人源码:
https://github.com/phoenixlzx/telegram-stickerimage-bot

开机自启动node.js服务:
https://juejin.cn/post/7215100409156157497

imagemagick:
https://imagemagick.org/script/install-source.php#linux
https://download.imagemagick.org/archive/releases/

教程:
https://halo.sherlocky.com/archives/imagemagick-heic
https://github.com/phoenixlzx/telegram-stickerimage-bot/issues/13

TG_Robot
1234…6
avatar
Hiyoung
若无闲事挂心头,便是人间好时节
文章
51
标签
75
分类
31
Follow Me
公告
网站破后重生,变得更加花哨!
最新文章
飞牛NAS备忘录2025-10-20
安卓实用软件记录2025-10-15
github pages 使用自定义域名2025-05-21
hexo引用站内文章2025-05-21
MacOS上配置Hexo教程2025-05-21
分类
  • 二次元1
    • 《路人女主的养成方法》1
  • 前端11
    • CSS2
    • 网站建设9
  • 学习笔记8
    • C++2
    • Linux2
标签
nas飞牛OS路人女主的养成方法霞之丘诗羽完结读评加藤惠完结后有感丸户史明游戏制作,游戏叙事CppC++CcppSTLstring字符串HexohexoMacOSMarkdown
归档
  • 十月 20252
  • 五月 20253
  • 一月 20251
  • 十二月 20246
  • 十月 20241
  • 七月 20241
  • 三月 20242
  • 一月 20241
网站资讯
文章数目 :
51
已运行时间 :
本站总字数 :
96.2k
最后更新时间 :
©2020 - 2026 By Hiyoung
Love from nobody!
搜索
数据库加载中