我看了面经和个人经历发现大厂面试到计算机基础知识这一块内存,硬盘,cpu这一块比较多,比如内存的分段,分页原理等等。所以这一块也是给大家讲这方面的知识。好了话不多说进入主题吧!!这篇是参考《计算机组成与结构》
一个 完整 的 计算机 系统 由 硬件 和 软件 两大 部分 组成。 硬件 是指 看得见、 摸 得 着 的 物理 设备, 包括 运算器、 控制器、 存储器、 输入 设备 和 输出 设备 等,如下图所示。

计算机 系统 各 硬件 设备 是 如何 协同 工作 的 呢? 无论是 进行 复杂 数据 计算 还是 进行 大 范围 数据 查询, 或者 实现 一个 自动控制 过程, 整个 系统 都 必须 按 步骤 来 处理。 首先, 必须 使用 编程 语言 事先 编写 源程序。 源程序 是 不 能被 计算机 直接 执行 的, 计算机 只 执行 机器 指令。 指令。 每一 条 指令 规定了 计算机 从 哪里 获取 数据, 进行 何种 操作, 以及 操作 结果 送到 什么地方 去 等 步骤。 因此, 在 运行 程序 之前, 必须 把 源程序 转换 为 指令 序列, 并将 这些 指令 序列 按 一定 顺序 存放 在 存储器 的 各个 地址 单元 中。 在 运行 程序 时, 控制器 先 从 存储器 中 取出 第 1 条 指令, 并 根据 这条 指令 的 含义 发出 相应 的 操作 命令, 以 执行 该 指令。 如果 需要 从 存储器 中 取出 操作 数( 例如 执行 一条 加法 指令), 则 先 从 存储 单元 中 读取 操作 数, 送入 运算器, 再由 运算器 进行 指定 的 算术 运算 和 逻辑 操作 等 加工, 最后 把 运算 结果 送回 存储器 中。 接下来, 读取 后续 指令, 在 控制器 的 指挥 下 完成 规定 操作, 依此 进行 下去, 直到 遇到 停止 指令。 在 程序 的 执行 过程中, 如果 需要 输入 数据 或 输出 运行 结果, 则在 控制器 的 控制下 通过 输入 设备 所 输入 的 数据 将 输入 并 保存 到 存储器 中, 或者 通过 输出 设备 将 程序 的 运行 结果 输出。
冯· 诺 依 曼 计算机 根据 功能, 把 硬件 划分 为 运算器、 控制器、 存储器、 输入 设备 和 输出 设备 共 五大 部件。 但 随着 计算机 技术 的 发展, 计算机 硬件 系统 的 组成 已发 生 许多 重大 变化, 例如, 将 运算器 和 控制器 组合 为 一个 整体, 称为 CPU( Central Processing Unit, 中央 处理器, 在 大中型 计算 机中 又叫 中央 处理机)。
1、CPU
微型机 的 CPU, 又称 微 处理器, 它是 整个 微型机 系统 的 核心, 其外 观 如下图所示。 CPU 品质 的 高低 直接 决定了 一个 计算机 系统 的 档次。 反映 CPU 品质 的 最重要的 指标 是 主 频 与 字长。 主 频 是指 CPU 的 时钟 频率, 单位 通常 是 MHz( 兆赫兹)。 主 频 越高, CPU 的 运算 速度 就 越快。 人们 通常 说 Intel Core i7 2600K- 3. 4GHz, 就 是指 该 CPU 的 时钟 频率 为 3. 4 吉 赫兹。

CPU 的 内部 通常 由 运算 部件( ALU)、 寄存器 组、 控制器( EU) 等 部件 组成, 如下图所示。 这些 部件 通过 CPU 内部 的 总线 相互 交换 信息。 CPU 的 主要 功能 包括 两个 方面: 一是 完成 算术 运算( 包括 定点 数 运算、 浮点 数 运算) 和 逻辑 运算, 二 是 读取、 分析 和 执行 指令。

CPU 的 运算 部件( ALU) 负责 数据 的 加工 处理, 即对 来自 内存 的 数据 进行 算术 运算 和 逻辑 运算 处理, 以 实现 指令 所 规定 的 功能。控制器( EU) 负责 指令 的 读取、 分析 和 执行, 产生 与 指令 相关 的 操作 信号, 并把 各 操作 信号 按 顺序( 称为 微 命令 序列) 送往 相应 的 部件, 从而 控制 这些 部件 按 指令 的 要求 执行 动作, 包括 收集 各 部件 的 状态 信息。
2、主 存储器
存储器 的 种类 很多, 按其 用途 可分 为主 存储器 和 辅助 存储器( 也称 为 内 存储器 和 外 存储器)。 内存 一般 采用 半导体 存储 器件 构成 存储 单元。 因为 RAM 是 内存 中 最重要的 存储器, 所以 通常 我们 直接 称之为 内存。 内存 就是 存储 欲 运行 的 程序 和 数据 的 地方。 如在 使用 WPS 处理 文稿 时, 当你 在 键盘 上 敲入 字符 时, 所 输入 的 字符 就被 存入 内存 中; 当你 要把 内存 的 信息 进行 保存 时, 内存 中的 数据 才会 被 存入 磁盘( 如 硬盘 或 U 盘)。 RAM 既可以 从中 读取 数据, 也可以 写入 数据。 当机 器 电源 关闭 时, 存于 RAM 的 数据 就会 丢失。 我们 通常 购买 或 升级 的 内存 条 就 用作 计算机 的 内存。 内存 条 就是 将 若干 RAM 集成 块 集中 在一起 的 一 小块 电路板。 它 插在 计算机 中的 内存 插槽 上, 以 减少 RAM 集成 块 占用 的 空间。 目前 市 场上 单 根 内存 条 的 容量 有 512 MB、 1 GB、 2 GB、 4 GB 等。 通常, 一般 计算机 系统 使用 的 随机 存取 内存( RAM) 可分 为 动态 随机 存取 内存( DRAM) 与 静态 随机 存取 内存( SRAM) 两种。 这 两种 RAM 的 差异 在于, DRAM 需要 由 存储器 控制 电路 按 一定 周期 对 存储器 刷新, 才能 维系 数据 保存; SRAM 的 数据 则 不需要 刷新 过程, 在上 电 期间, 数据 不会 丢失。 对于 在 指定 功能 或 应用 软件 之间 共享 的 存储器 来说, 如果 一个 或 两个 应用 软件占用 了 所有 存储器 空间, 此时 将 无法 为 其他 应用 软件 分配 存储器 空间。 例如, 日历、 短 信息 和 电 话簿( 或 通信 录) 可能 会 共享 移动 设备 中的 动态 存储器。 动态 存储器 一般 采用 超 大 容量 的 存储 技术, 但是, 其 存储 组件 要求 由 控制器 控制 其 刷新 周期。 它与 静态 存储器 等 其他 存储 技术 相比, 耗电量 相对 较高。 与其 他 类型 的 存储器 相比, 动态 存储器 的 优点 是 每 GB 的 价格 最低。
2.1 按 存储器 的 功能 划分
(1) 主 存储器:主 存储器 是 CPU 能 编程 访问 的 存储器, 它 存放 当前 CPU 正在 执行 和 欲 执行 的 程序 和 需要 处理 的 数据。 主 存储器 与 CPU 共同 组成 计算机 的 主机 系统, 因为 通常 安装 在 主机 箱 之中, 故 又称 内 存储器, 简称 主 存 或 内存。
(2) 辅助 存储器:由于 主 存储器 容量 有限( 主要 受 地址 线 位数、 成本 和 存取 速度 等 因素 制约), 在 计算机 系统 中 通过 配置 更大 容量 的 磁盘、 光盘 和 U 盘 等 存储器, 作为 对 主 存储器 容量 不足 的 补充 和 后援。 这些 存储器 就 统称 为 辅助 存储器。 因为 它 位于 主机 的 逻辑 范畴 之外, 故 又称为 外 存储器, 简称 为辅 存 或 外存。 外存 包括 软盘、 硬盘、 磁带、 光盘、 U 盘 等。
(3) 高速 缓存( Cache):CPU 与 主 存储器 之间 存在 巨大 的 速度 差异, 使得 CPU 发出 访问 主 存储器 的 请求 后, 可能 需要 等待 多个 时钟 周期 才能 读取 存储器 的 内容。 为了 解决 速度 匹配 问题, 可以 在 CPU 中 设置 高速 缓存( Cache)。 Cache 的 速度 基本上 接近 CPU 的 工作 速度, 专门 存放 CPU 即将 使用 的 部分 程序 和 数据, 这些 程序 和 数据 是 主 存 中正 在 运行 或 处理 的 程序 和 数据 的 副本。
当 CPU 访问 主 存 时, 同时 访问 Cache 和 主 存。 通过 对 地址 码 的 分析, 可以 判断 所 访问 物理 地址 区间 的 内容 是否 已 复制 在 Cache 中。 如果 所要 访问 的 内容 已经 复制 在 Cache 中( 称为 Cache 命中), 则 直接 从 Cache 中 快速 地 读取; 如果 没有 在 Cache 中 找到 所需 的 程序 和 数据, 称为 Cache 不 命中; 否则, 从 主 存 中 读取。
2.2 存储 系统 的 层次 结构
如下图所示 的 是一 个 非常 典型的 三级 存储 体系 结构, 分为 高速 缓冲 存储器( Cache)、 主 存储器、 外 存储器 3 个 层次。 在这 种 分层 存储 体系 结构 中, 对于 CPU 直接 访问 的 存储器, 其 速度 尽可能 快, 而 容量 相对 有限; 作为 后援 的 一级, 则 容量 要 大, 而 其 速度 就可能 慢 些。 这样 的 合理 搭配, 对 用户 来讲, 整个 存储器 系统 既可 提供 大 容量 的 存储 空间, 又可 有 较快 的 存取 速度。

目前, 计算机 存储 技术 还在 不断 飞速 发展中, 主要 呈现 如下 特征,如下图

• 存储器 每位 的 价格 逐渐 降低;
• 存储容量 逐渐 增大;
• 存取 速度 加快。
2.3 主 存储器(内存)
ps: 关于硬件这块我不打算介绍硬件的部分,我们程序员主要关注的是软件部分的,例如cpu怎么和内存打交道,内存的分页机制等
内存有两个比较重要的概念,逻辑地址和物理地址
2.3.1 内存地址:
内存的地址分为逻辑地址和 物理地址
逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。
内存 的 分配 管理 方式 有 分区式, 分页 式、 分 段式 和 段 页 式 等,
2.3.2 分区管理
1、静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。
例如,MOV AC,[500]
静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域内。
2、动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切地说,是在CPU每次访问内存单元前才进行地址变换。需硬件支持。优点是:(1)程序占用的内存空间动态可变,不必连续存放在一处。(2)比较容易实现几个进程对同一程序副本的共享使用。
缺点是:需要附加的硬件支持,增加了机器成本,而且实现存储管理的软件算法比较复杂。
现在一般计算机系统中都采用动态重定位方法。

对于分区管理我们只需要知道,数据按照固定的连续区域装载到内存当中去。如果数据太大了,内存装不下这么多了,那要怎么办呢?
分页式和分段式(网上看到这个例子觉得比喻的很好,地址:https://www.cnblogs.com/jinhengyu/p/10257816.html)
打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。
第一种是,你从本子的第一张纸开始用,并且事先在本子上做划分:第2张到第30张纸记语文笔记,第31到60张纸记数学笔记,第61到100张纸记英语笔记,最后在第一张纸做个列表,记录着三门笔记各自的范围。这就是分段管理,第一张纸叫段表。
第二种是,你从第二张纸开始做笔记,各种课的笔记是连在一起的:第2张纸是数学,第3张是语文,第4张英语……最后呢,你在第一张纸做了一个目录,记录着语文笔记在第3、7、14、15张纸……,数学笔记在第2、6、8、9、11……,英语笔记在第4、5、12……。这就是分页管理,第一张纸叫页表。你要复习哪一门课,就到页表里查寻相关的纸的编号,然后翻到那一页去复习
两者的优缺点:在段式存储管理中,将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片) 在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的页框,程序加载时,可以将任意一页放入内存中任意一个页框,这些页框不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)
两者的不同点:(1) 分页仅仅是由于系统管理的需要而不是用户的需要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
(2) 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
(3) 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
2.3.3 分页
页 式 虚拟 存储器 首先 将 虚拟 存储器 空间 与 内存 空间 都 划分 为 若干 大小 相同 的 页, 虚拟 存储 空 间的 页 称为 虚 页, 内存 的 页 称为 实 页。 通常 页 的 大小 为 512 B、 1 KB、 2 KB、 4 KB 等。 注意, 页 不能 分得 太大, 否则 会 影响 换进 换出 的 速度, 从而 导致 CPU 的 运行 速度 减慢。 因此, 一般 操作系统 中, 取 最大 页 为 4 KB, UNIX 操作系统 的 页 为 512 B。

2.3.4 段式管理
在 段式 虚拟 存储器 中, 将 用户 程序 按其 逻辑 结构 划分 为 若干 段( 例如 程序 段、 数据 段, 主 程序 段、 子程序 段 等), 各 段 大小 不同。 相应 地, 段式 虚拟 存储器 也 随 程序 的 需要 动态 地 分段, 且 将 段 的 起始 地址 与 段 的 长度 填 到 段 表 之中。 编程 时 使 用的 虚 地址 分为 两部分: 高位 是 段 号, 低 位 是 段 内 地址。 例如, Intel 80386 的 段 号为 16 位, 段 内 地址 为 32 位, 可将 整个 虚拟 空间 分为 64K 段, 每 段 的 容量 最大 可达 4 GB, 使 用户 有 足够 大的 选择 余地。

2.3.5 段页存储管理
由于 分页 是 固定 的, 它是 面向 存储器 本身 的, 计算机 系统 中 只有 一种 大 小的 页。 程序 装入 内存 的 块( 页), 可能 因为 某 一页 装 不满 内存 的 一块 而 剩余 一部分 不能 利用( 称为“ 页 内 零头”)。 如果 页 内 零头 太多, 就会 影响 内存 的 利用率。 此外, 由于 页 的 划分 不能 反映 程序 的 逻辑 结构, 如果 离散 地 给 程序 分配 内存 空间, 那么 一个 程序( 包括 数据) 必然 存放 在 不 相连 的 内存 中, 这样 可能 会 给 程序 的 执行、 保护 和 共享 带来 不方便。
段式 虚拟 存储器 是 面向 程序 的 逻辑 结构 分段 的, 一个 在 逻辑上 独立 的 程序 模块 可以 为 一个 段, 这个 段 可大 可 小。 因此, 有利于 对 存储 空间 的 编译 处理、 执行、 共享 与 保护。 由于 段 的 长度 比 页 要 大 很多, 不利于 存储器 的 管理 和 调度。 一方面, 段 内地 址 必须 连续, 因 各 段 的 首、 尾 地址 没有 规律, 地址 计算 比 页 式 存储器 管理 要 复杂。 另一方面, 当 一个 段 执行 完毕 后, 新 调入 的 程序 可能 小于 现在 内存 段 的 大小, 这样 也会 造成 零头。 为此, 把 页 式 存储 管理 和 段式 存储 管理 结合 起来, 就 形 成了 段 页 式 虚拟 存储 管理 方式。 在这 种 方式 中, 先 将 程序 按 逻辑 分为 若干 段, 每个 段 再分 成 相同 大 小的 页, 内存 也 划 分为 与 页 大小 相同 的 块。 在 系统 中 建立 页 表 和 段 表, 分 两级 查表 实现 虚拟 地址 与 物理 地址的 转换。 在 多用户 系统 中, 虚 地址 包括 基 号、 段 号、 段 内 页号、 页 内 地址 等 信息。 其中, 基 号为 用户 标志 号, 用于 区别 每一个 用户。
下图给 出了 段 页 式 虚拟 存储器 地址 转换 示意图。 每 道 程序 有 自己的 段 表, 这些 段 表 的 起始 地址 在 段 表 基址 寄存器 组。 相应 地, 虚 地址 中 每 道 用户 程序 有 自己的 基 号。 根据 它 选取 相应 的 段 表 基址 寄存器, 从中 获得 自己的 段 表 起始 地址。 将 段 表 起始 地址 与 虚 地址 中的 段 号 合成, 得到 访问 段 表 对应 行的 地址。 从 段 表中 取出 该 段 的 页 表 起始 地址, 与 段 内 页号 合并, 形成 访问 页 表 对应 行的 地址。 从 页 表中 取出 实 页号, 与 页 内地 址 拼接, 形成 访问 主 存 单元 的 实 地址。

2.4 虚拟 存储器 的 工作 过程
由于 使用 了 虚拟 存储器 系统, 在 程序 执行 的 任何 一个 时刻, 执行 程序 的 某一 部分 被 存放 在 物理 存储器 中, 其余 部 分则 被 交换 到 磁盘( 一般 是 硬盘) 上。 当 这个 程序 运行时, 它 还要 连续不断 地 访问 这个 程序 其他 部分 的 代码 和 数据。 若 所 访问 的 代码 和 数据 在 物理 存储器 中, 则 这个 程序 就会 连续不断 地 执行。 若 所 访问 的 代码 和数 据 不在 物理 存储器 中, 此时 操作系统 的 存储器 管理 程序 就必须 给以 干预, 进行 适当 的 控制, 把 访问 的 代码 和数 据 引导 到 物理 存储器 中( 如果 需要, 这时 还要 把 程序 的 某一 部分 交换 到 磁盘 上, 即 前面 提到 的“ 换进 换出”)。 这样, 这个 应用 程序 就可以 连续不断 地 执行。 在使 用 虚拟 存储器 时, 必须 把 程序 分成 若干 小块( 也称 为 程序 段 或 页)。 各个 程序 小块 此时 不在 物理 存储器 内, 就 一定 被 交换 到了 磁盘 上。 这样, 操作系统 的 存储器 管理 子系统 对 每一个 程序 小块 进行 跟踪。 通常, 程序 可以 分段, 也可以 分页, 而 分页 的 性能 比 分段 好。 大多数 商用 虚拟 存储器 系统 提供 的 是 请求 分页 虚拟 存储器。“ 请求 分页” 就是 当 需要 访问 这些 页 时, 就把 这些 页 引导 到 物理 存储器 中。 这与 预先 定 好的 页 的 大小 不同, 在 这种 情况下, 虚拟 存储器 系统 预期 需 要的 页 总是 程序 将要 使 用的 页。目前, 能 实现 虚拟 存储 的 有 UNIX、 高 版本 的 Windows 等 操作系统。 早期 的 操作系统( 如 UNIX、 OS/ 2 等) 也 支持 请求 分页 虚拟 存储 管理。 虚拟 存储器 地址 转换 的 详细 过程 如下图

本章暂时先写到这里,cpu没有比较详细的说明,重点写在了存储器方面,后续会加上硬盘和cache相关的知识点,希望大家能多多包涵。