计算机系统基础与操作系统笔记
文章目录
- 一、计算机基本构成(冯诺依曼体系结构)
- 二、CPU核心指标详解
- 三、CPU执行指令过程完整解析
- 1. 指令表设计
- 2. 指令格式
- 3. 内存空间示例
- 4. 指令执行三阶段详细过程
- 5. 完整执行流程示例
- 四、操作系统核心功能详解
- 1. 操作系统的作用
- 2. 操作系统组成
- 3. 程序跨平台
- 五、进程管理
- 0. 先描述,再组织
- 1. 进程概念
- 2. 进程控制块(PCB)详细结构
- 3. 进程调度机制
- 4. 进程间通信(IPC)
- 六、操作系统与编程的关系
一、计算机基本构成(冯诺依曼体系结构)
- CPU - 中央处理器,负责执行指令和数据处理
- 存储器 - 包括内存(临时存储)和硬盘(永久存储)等存储设备
- 输入设备 - 键盘、鼠标、扫描仪等输入信息的设备
- 输出设备 - 显示器、打印机、音响等输出信息的设备
二、CPU核心指标详解
- 核心数:
- 物理核心:CPU实际拥有的处理单元数量
- 逻辑核心:通过超线程技术模拟的核心数
- 例如6核12线程表示6个物理核心,12个逻辑核心
- 频率:
- 基础频率:CPU的最低运行频率
- 加速频率:CPU最高可达到的运行频率
- 单位GHz,表示每秒可以执行多少亿个时钟周期
三、CPU执行指令过程完整解析
1. 指令表设计
一个CPU能执行的指令在最初设计时就已确定,通过指令表定义:
指令 (instruction) | 功能说明 | 4位 opcode | 操作的地址或者寄存器 |
---|---|---|---|
LOAD_A | 从 RAM 的指定地址,将数据加载到 A 寄存器 | 0010 | 4 位 RAM 地址 |
LOAD_B | 从 RAM 的指定地址,将数据加载到 B 寄存器 | 0001 | 4 位 RAM 地址 |
STORE_A | 将数据从 A 寄存器写入 RAM 的指定地址 | 0100 | 4 位 RAM 地址 |
ADD | 计算两个指定寄存器的数据的和,并将结果放入第二个寄存器 | 1000 | 2 位的寄存器 ID,2 位的寄存器 ID |
2. 指令格式
假设每个指令8bit,分为两部分:
- 前4bit是操作码(opcode):表示指令功能
- 后4bit是操作数(operand):相当于参数
3. 内存空间示例
地址 | 数据 |
---|---|
0 | 00101110 |
1 | 00011111 |
2 | 10000100 |
3 | 01001101 |
… | … |
14 | 00000011 |
15 | 00001110 |
4. 指令执行三阶段详细过程
- 取指令阶段:
- CPU根据程序计数器(PC)的值从内存读取指令
- 例如PC=0时读取00101110
- 解析指令阶段:
- 拆分操作码和操作数:0010(操作码) + 1110(操作数)
- 查指令表得知0010是LOAD_A指令
- 操作数1110表示内存地址14
- 执行指令阶段:
- 从内存地址14(1110)读取数据00000011(3)
- 将值3存入A寄存器
- PC自动+1,准备执行下一条指令
5. 完整执行流程示例
- 初始状态:
- PC=0
- A=0, B=0
- 执行地址0指令(00101110):
- 解析:LOAD_A 14
- 执行:A=内存[14]=3
- PC=1
- 执行地址1指令(00011111):
- 解析:LOAD_B 15
- 执行:B=内存[15]=14
- PC=2
- 执行地址2指令(10000100):
- 解析:ADD B(01) A(00)
- 执行:A=A+B=3+14=17
- PC=3
- 执行地址3指令(01001101):
- 解析:STORE_A 13
- 执行:内存[13]=A=17
- PC=4
- 执行地址4指令(00000000):
- 结束
四、操作系统核心功能详解
1. 操作系统的作用
- 硬件管理:
- 管理CPU、内存、I/O设备等硬件资源
- 通过驱动程序与硬件交互
- 提供稳定运行环境:
- 为应用程序提供统一的API接口
- 例如Java的System.out.println最终会调用操作系统的write API
2. 操作系统组成
- 内核:核心功能模块
- 配套应用程序:提供用户界面和工具
3. 程序跨平台
不同操作系统之间存在天然的兼容性障碍。例如,在Windows环境下开发的程序,无法直接在Linux或macOS系统上运行。这是因为:
- 各操作系统使用完全不同的可执行文件格式(如Windows的PE、Linux的ELF)
- 系统API调用方式存在根本性差异
- 底层硬件架构也可能不同(如x86与ARM)
Java的跨平台
正是为了解决这种平台割裂问题,Java提出了"一次编写,到处运行"的跨平台方案:
- 统一字节码:Java编译器将源代码转换为平台无关的.class字节码文件
- 定制化JVM:各平台提供自己的Java虚拟机实现
- Windows平台:Windows版JVM
- Linux平台:Linux版JVM
- macOS平台:macOS版JVM
- 无缝衔接:虽然各平台JVM实现不同,但都能正确解释执行相同的字节码
五、进程管理
0. 先描述,再组织
1)描述:通过结构体/类,把进程的各种属性表示出来。
- 主流系统用 C/C++ 实现,广泛用到结构体
struct
。
2)组织:通过数据结构,把多个结构体串联起来,并进行增删改查。
- 简单认为,通过链表的方式将多个 PCB(进程控制块)串联到一起。
- 创建进程(如双击 exe 运行程序):相当于创建一个 PCB 结构体,并插入链表。
- 销毁进程:从链表删除 PCB,并释放结构体。
- 查看进程列表:遍历链表并显示信息。
对于 Linux 操作系统,使用称为 “PCB” 的结构体来描述进程信息。
PCB 包含的信息
PCB(进程控制块)是一个非常复杂的结构体,包含众多属性。以下讨论关键信息:
-
PID(进程标识符)
- 同一时刻,一台机器上所有进程的 PID 是唯一的,不会重复。
- 系统内部通过 PID 定位并操作特定进程。
-
内存指针(一组)
- 描述进程依赖的指令和数据在内存中的具体位置。
- 操作系统运行可执行文件(exe)时,会将其指令和数据加载到内存的特定地址。
-
文件描述符表(顺序表/数组)
- 记录进程当前打开了哪些文件。
- 当进程打开一个文件时,会在表中新增一项。
- 体现了进程对硬盘资源的使用情况。
说明:
- 进程的执行需要内存资源(通过内存指针管理)。
- 进程的执行也可能需要硬盘资源(通过文件描述符表管理)。
1. 进程概念
- 静态程序:硬盘上的可执行文件(如.exe)
- 动态进程:程序加载到内存中执行的实例
2. 进程控制块(PCB)详细结构
- PID:唯一进程标识符,用于系统识别和管理进程
- 内存指针:
- 代码段指针:指向程序指令
- 数据段指针:指向程序数据
- 堆栈指针:指向运行时栈
- 文件描述符表:
- 记录进程打开的文件和I/O设备
- 通常实现为数组结构
- 进程状态:
- 就绪、运行、阻塞等状态
- 状态转换由操作系统调度器控制
- 进程优先级:
- 影响调度顺序
- 可通过nice值调整
- 进程上下文:
- 寄存器值(PC、SP、通用寄存器等)
- 切换进程时需要保存和恢复
- 记账信息:
- CPU使用时间
- 内存使用情况
- I/O操作统计
3. 进程调度机制
- 分时复用原理:
- CPU时间划分为小的时间片(通常几毫秒)
- 每个进程轮流获得时间片执行
- 并发与并行:
- 并发:宏观上同时执行(单核CPU)
- 并行:真正同时执行(多核CPU)
- 上下文切换:
- 保存当前进程的寄存器状态到PCB
- 从PCB恢复下一个进程的寄存器状态
- 类似游戏的存档和读档
4. 进程间通信(IPC)
主要方式:
- 网络通信(socket)
- 管道(pipe)
- 共享内存
- 消息队列
现在最主要的进程间通信方式有且只有一个:通过网络(socket),这个是后续重点内容。
C++ 会讲得更多一些,Java就不做过多讨论了
C++ 进行编程时高度依赖操作系统的原生 API,但对 Java 程序员来说不需要——JVM 包办一切了
六、操作系统与编程的关系
- 系统编程:
- C/C++直接调用系统API
- 需要深入理解操作系统原理
- 高级语言开发:
- Java等语言通过虚拟机抽象系统细节
- 开发者更关注业务逻辑实现