系统梳理了操作系统和数据库(MySQL)的核心知识点,涵盖选择题、填空题、简答题和计算题。

二、操作系统(10章 · 378题)

第1章 操作系统概述

- 计算机系统四部分:硬件、操作系统、应用程序、用户。操作系统是资源分配器
- 内核(Kernel):始终运行在计算机上的核心部分
- 中断向量:提供中断服务程序地址。CPU与设备控制器通过 公共总线 连接
- 存储层次(快→慢):寄存器 > Cache > 主存 > SSD > HDD
- 双重模式:用户态 + 内核态。用户态→内核态 唯一途径是中断(含 trap/系统调用)
- 操作系统三大目的:方便用户使用、管理计算机资源、提供程序运行环境
- 进程内存四区域:文本段、数据段、堆(heap)、栈(stack)
- LKM:可加载内核模块,允许内核功能在 运行时 动态添加/移除
- 特权指令只允许OS使用:关中断、I/O指令、设置中断屏蔽字
- 引导程序驻留在 ROM 中,MBR检查分区表加载活动分区引导扇区
- init 进程(PID=1)是所有用户进程的祖先

第2章 操作系统结构

- 设计原则策略与机制分离
- 微内核结构:文件系统服务不宜放微内核中。优点:可扩展、可移植、可靠。缺点:效率较低(频繁上下文切换)
- 外核(exokernel)不负责进程调度,给用户进程分配未经抽象的硬件资源
- 引导过程:CPU加电 CS:IP→FFFF0H → JMP到BIOS → 登记中断入口 → 硬件自检 → OS引导
- 虚拟机可软件/硬件实现,多虚拟机可并行运行在物理机上

第3章 进程管理

- 进程 vs 程序:程序是被动实体,进程是活动实体(程序的一次执行实例)
- 五状态模型:新建 → 就绪 → 运行 → 等待(阻塞) → 终止
- PCB(进程控制块):包含进程状态、程序计数器、CPU寄存器、调度信息、内存管理信息、I/O状态
- 上下文切换:保存当前进程状态并恢复下一进程状态,是纯开销
- Linux命令fork() 创建子进程、ps 查看进程、passwd 改密码、cp 复制文件、man 查看帮助
- IPC两种模型:共享内存(快,无需内核介入)、消息传递(适合分布式)

第4章 线程与并发

进程 vs 线程对比:

- 资源:进程是独立资源分配单位 | 线程共享进程资源
- 调度:进程独立调度 | 线程是CPU调度基本单位
- 开销:进程创建/切换开销大 | 线程开销小
- 通信:进程需IPC机制 | 线程直接读写共享数据
- 独立性:进程互不影响 | 线程崩溃影响同进程其他线程

多线程模型:多对一(不能真并行)、一对一(并发好开销大)、多对多(折中)

第5章 CPU调度

- FCFS(先到先服务):最简单,非抢占。可导致 护航效应(短进程被长进程阻塞)
- SJF(最短作业优先):最优平均等待时间。抢占版为SRTF
- RR(轮转调度):时间片轮转。过大→退化FCFS,过小→过多 上下文切换 开销
- 优先级调度:高优先级先运行。可能 饥饿( starvation )老化(aging) 解决
- 多级队列/反馈:按进程类型分队列,反馈可动态调整优先级

调度准则:CPU利用率、吞吐量、周转时间、等待时间、响应时间

第6章 进程同步

- 临界区三要求:互斥、进步、有限等待
- 信号量(semaphore):P(wait)减 / V(signal)加。计数信号量 / 二元信号量
- 管程(Monitor):高级同步构造,含条件变量
- 互斥锁(mutex):acquire / release,忙等待(spinlock)
- 经典同步问题
- 生产者-消费者(有界缓冲):empty + full + mutex 三个信号量
- 读者-写者:多读者可同时读,写者需独占
- 哲学家就餐:死锁预防(最多4人同时拿筷子 / 奇数先左偶数先右)

第7章 死锁

- 四个必要条件:① 互斥 ② 持有并等待 ③ 非抢占 ④ 循环等待(全部满足才死锁)
- 银行家算法Need = Max - Allocation。找 Need ≤ Available 的进程,分配释放递推

⚠ 注意:可能存在多个安全序列,需全部找出

- 处理策略:预防(破坏条件)、避免(银行家)、检测与恢复

第8章 内存管理

- 逻辑地址 vs 物理地址:逻辑=CPU生成(程序视角)、物理=内存实际。MMU负责转换。逻辑地址空间可大于物理
- 连续分配算法
- 首次适应(FF):分配第一个足够大的空闲分区
- 最佳适应(BF):分配满足需求的最小空闲分区(产生最多外部碎片)
- 最差适应(WF):分配最大的空闲分区(减少小碎片)
- 外部碎片:空闲空间被分割成小块 → 紧凑(compaction) 解决
- 内部碎片:分配空间超出请求的部分
- 分页(Paging):物理内存分帧(frame),逻辑内存分页(page)。无外部碎片。TLB(快表) 缓存页表项
- 分段:按逻辑单元(代码段、数据段、栈段)划分,方便共享保护但有外部碎片

第9章 虚拟内存

- 五大优点:扩大逻辑地址空间、提高内存利用率、支持多道程序、地址保护、简化编程
- 缺页中断:页面不在内存→从磁盘调入

页面置换算法:

- FIFO:置换最早进入的页面。简单,但可能有 Belady异常(帧增多缺页反而增加)
- OPT(最佳置换):置换将来最久不用的页面。理论最优,不可实现,用于性能比较
- LRU:置换最久未使用的页面。近似OPT,实现代价大需硬件支持
- CLOCK(二次机会):循环扫描+访问位。LRU近似,实际系统常用

缺页率 = 缺页次数 / 总访问次数

- 系统抖动(Thrashing):频繁换页→CPU利用率↓。解决:减少多道程序度、工作集模型

第10章 文件系统与I/O

- 树形目录最常用。绝对路径 vs 相对路径
- 磁盘调度算法:FCFS → SSTF(最短寻道) → SCAN(电梯) → C-SCAN。目标:最小化寻道时间
- I/O方式演进:轮询 → 中断驱动 → DMA(块设备直接内存访问)

三、MySQL数据库(8章 · 160题)

第1章 数据库基础

- 数据库定义:长期存储、有组织、可共享、统一管理的数据集合
- 发展阶段:人工管理 → 文件系统 → 数据库系统 → 高级数据库
- 数据库种类:层次式、网络式、关系式(主流)。"链式数据库"不存在
- 行 = 记录/元组,列 = 字段/属性
- 主键(Primary Key):唯一标识每条记录,不可为NULL;唯一约束允许一个NULL
- 外键(Foreign Key):引用主表的主键,保证引用完整性
- 数据库系统三部分:数据库 + DBMS + 数据库应用程序
- SQL = 结构化查询语言(Structured Query Language)。DML包括 INSERTSELECTUPDATEDELETE

第2章 MySQL安装与配置

- MySQL是 关系型 DBMS。默认端口 3306。默认引擎 InnoDB(MySQL 5.7+)
- 登录命令:mysql -h 主机 -u 用户名 -p
- Windows服务管理:net start MySQL(启动)/ net stop MySQL(停止)
- Linux安装:rpm -ivh 包名。查看状态:service mysql status
- 官方图形工具:MySQL Workbench(Visual Studio不是MySQL管理工具)
- 服务器配置类型:Developer Machine | Server Machine | Dedicated Machine(使用所有可用资源)

第3章 数据库与表操作

数据库操作:
- 创建:CREATE DATABASE 库名
- 删除:DROP DATABASE 库名无确认提示!
- 查看所有:SHOW DATABASES
- 查看定义:SHOW CREATE DATABASE 库名

数据表操作:
- 创建:CREATE TABLE 表名(列 类型 约束, ...)
- 删除:DROP TABLE 表名
- 查看结构:DESCRIBE 表名DESC 表名(Key列PRI=主键)
- 改表名:ALTER TABLE ... RENAME ...
- 改字段类型:ALTER TABLE ... MODIFY ...
- 改字段名+类型:ALTER TABLE ... CHANGE ...

约束速查:
- PRIMARY KEY — 主键(唯一+非空,一表一个)
- FOREIGN KEY ... REFERENCES 主表(主键) — 外键
- NOT NULL — 值不能为空
- UNIQUE — 值不可重复,允许一个NULL
- DEFAULT 值 — 默认值
- AUTO_INCREMENT — 自增(须为主键一部分,一表最多一个)

存储引擎对比:
- InnoDB:默认引擎,支持事务(ACID)、行级锁、外键
- MyISAM:不支持事务,表级锁,适合读多写少
- MEMORY:数据存内存中,速度快但断电丢失
- 查看所有引擎:SHOW ENGINES。查看当前默认:SHOW VARIABLES LIKE 'storage_engine'

第4章 数据类型

整数:
- TINYINT — 1字节,-128~127
- SMALLINT — 2字节
- INT — 4字节
- BIGINT — 8字节

⚠ INT(11)中11是显示宽度,不是字节数!INT固定占4字节

小数:
- FLOAT / DOUBLE:近似值,有精度问题
- DECIMAL(M,D)定点小数,无精度问题,适合货币。M=总位数(精度),D=小数位数(标度)

字符串:
- CHAR(N):定长,总是占用N字符
- VARCHAR(N):变长,按实际长度+1~2字节

日期时间:
- DATE — 3字节,1000~9999年
- YEAR — 1字节,1901~2155
- DATETIME — 8字节,1000~9999年+时分秒
- TIMESTAMP — 4字节,1970~2038(⚠2038问题)

NULL判断:必须用 IS NULL / IS NOT NULL,不能用 = NULL<=> 是安全等于,可判断NULL。

第5章 MySQL函数

数学函数:
- ABS(x) — 绝对值
- MOD(x,y) — 求余数,MOD(10,3)=1
- CEIL(x) — 向上取整,CEIL(3.35)=4
- FLOOR(x) — 向下取整,FLOOR(-3.35)=-4 ⚠不是-3
- ROUND(x,d) — 四舍五入到d位,ROUND(1.38,1)=1.4
- TRUNCATE(x,d) — 截断到d位,TRUNCATE(1.99,0)=1
- RAND() — 返回0~1之间随机数

字符串函数:
- CONCAT(s1,s2,...) — 连接字符串。⚠任一参数NULL→整结果返回NULL
- UPPER(str) / LOWER(str) — 大小写转换。UPPER('black')='BLACK'
- LEFT(str,n) / RIGHT(str,n) — 取左右n字符。LEFT('football',5)='footb'
- CHAR_LENGTH(str) — 字符数
- FORMAT(x,d) — 格式化数字+千位逗号。FORMAT(1234.567,2)='1,234.57'

日期与控制函数:
- NOW() — 当前日期和时间
- YEAR('2024-06-20') — 返回2024
- IF(expr,v1,v2) — 真→v1,假→v2
- IFNULL(v1,v2) — v1为NULL→v2,否则→v1

聚合函数COUNT() 计数、SUM() 求和、AVG() 平均、MAX() 最大、MIN() 最小

第6章 数据查询SELECT

完整语法顺序SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT

关键字速查:
- DISTINCT — 去除重复行
- ORDER BY — 排序,默认 ASC升序(不是DESC)
- LIKE — 模糊匹配:% 任意多字符,_ 任意单个字符
- REGEXP — 正则匹配:^ 匹配开头,$ 匹配结尾
- BETWEEN x AND y — 范围查询(含端点)
- IN(值1,值2) — 匹配列表中任一值
- HAVING — 分组后过滤(可用聚合函数),WHERE不能替代
- LIMIT 0,4 — 从第0条起取4条
- * — 查询所有字段(不是 ?%
- 逻辑运算符:AND(同时满足)、OR(满足任一)、NOT(取反)

第7章 数据操作

INSERT 插入:
- INSERT INTO 表名(列1,列2) VALUES(值1,值2)
- VALUES数量须与指定列数相同
- 多行插入(逗号分隔多个VALUES)比多次单行 效率更高
- AUTO_INCREMENT 列插NULL → 系统自动生成唯一自增编号
- INSERT INTO ... SELECT ... 将查询结果插入表

UPDATE 更新:
- UPDATE 表名 SET 列=值 WHERE 条件
- ⚠ 省略WHERE → 更新表中所有行!

DELETE 删除:
- DELETE FROM 表名 WHERE 条件 — 删除特定行
- DELETE FROM 表名(无WHERE)— 删除所有记录但 保留表结构
- DROP TABLE — 删除整个表(结构+数据全部删除)

第8章 连接查询与子查询

- INNER JOIN:只返回两表匹配行
- LEFT JOIN:左表全保留+右表匹配。查询所有客户含无订单的→用LEFT JOIN
- RIGHT JOIN:右表全保留
- EXISTS:判断子查询是否返回结果(有/无)
- UNION:纵向合并多个SELECT结果并自动去重。⚠≠JOIN(横向关联)
- 别名AS 关键字,可省略。表名和字段名均可用

---

四、常见易错点 TOP 12

1. "访存时缺页"属于 异常(内部事件),不是中断(外部事件)
2. 微内核效率 更低(频繁上下文切换),不是更高效
3. 死锁有 4个 必要条件,别忘了 循环等待
4. OPT算法 不可实现,是理论最优仅用于性能比较
5. 主键 不可为NULL;唯一约束允许一个NULL
6. DROP DATABASE 无确认提示 直接删除。CREATE DATABASE 注意拼写不是 DADABASE
7. ORDER BY 默认 ASC升序,不是DESC降序
8. CONCAT 任一参数为NULL → 整个结果返回 NULL
9. FLOOR(-3.35) = -4(向下取整!不是-3)
10. 进程切换在 内核态 发生,不在用户态
11. INT(11) 中11是 显示宽度,INT固定4字节与范围无关
12. UNION纵向合并(上下堆),JOIN横向关联(左右拼),功能完全不同