计算机系统基本知识
计算机系统概述
计算机系统就是硬件+软件+网络的"三位一体"有机整体,它的核心使命是"数据输入→处理→输出"的完美闭环。
计算机硬件
冯诺依曼体系结构
冯诺依曼体系结构是现代计算机的基础架构,其核心思想是将计算机分为五大基本部件:
- 运算器(ALU):负责执行算术和逻辑运算。
- 控制器(CU):负责指令的解释和执行控制。
- 存储器(Memory):用于存储数据和程序指令。
- 输入设备(Input Devices):用于将数据和指令输入计算机。
- 输出设备(Output Devices):用于将计算结果输出给用户。
瓶颈问题
冯・诺依曼瓶颈:因指令和数据共享总线与存储器,同一时刻 CPU 只能读取其一,限制处理速度。
处理器
- 处理器类型
- CPU:通用性强,顺序执行能力突出,控制逻辑复杂,适用于个人电脑与服务器等通用计算场景。
- GPU:具备强大并行处理能力,拥有大量计算核心,主要用于图形渲染、AI训练及科学计算。
- DSP:专为数字信号处理优化,支持定点与浮点运算,常用于音频/视频处理和通信设备。
- FPGA:可编程硬件,灵活性高且功耗低,常用于原型验证与专用加速,如加密、图像识别领域。
- 指令集架构
- CISC:指令数量多(数百条),指令长度可变,执行周期多,寻址方式复杂,硬件复杂度高,典型代表为Intel x86、AMD64 。
- RISC:指令数量少(几十到百余条),指令长度固定,大多单周期执行,寻址方式简单,硬件复杂度低,典型代表有ARM、RISC - V、MIPS、PowerPC 。
架构融合
现代处理器倾向融合两者优势,如x86将CISC指令转为类似RISC的微操作。
- 国产处理器芯片结构
- 龙芯:基于自研LoongArch指令集,源于MIPS,强调自主。
- 飞腾:获ARM架构授权,用于服务器和桌面。
- 鲲鹏:华为基于ARMv8自主设计,用于云计算和数据中心。
- 申威:用于超算,自研SW64指令集。
- 兆芯:获x86授权(通过VIA),兼容Windows生态。
- RISC-V系列:如阿里平头哥玄铁处理器,基于开源指令集,生态发展迅速。
存储器层次结构
- L1/L2/L3 Cache:集成在CPU内,由SRAM实现,访问速度极快(ns级),容量为KB - MB。
- Main Memory(主存RAM):由DRAM构成,易失性,访问速度快(10 - 100 ns),容量为GB级。
- Secondary Storage(外存):如硬盘/SSD,非易失性,访问速度慢(ms级),容量为TB级。
- Off - line Storage(离线存储):如磁带、光盘,用于长期归档,访问速度极慢,容量超大。局部性原理是缓存设计基础。
总线
- 片内总线:用于CPU内部各功能单元通信,如ALU与寄存器间。
- 内总线(片上总线):实现SoC内部模块互联,如AXI、AHB(ARM AMBA总线)。
- 系统总线:连接CPU、内存、I/O控制器,如前端总线FSB(旧)、QPI、DMI 。
- 外部总线:连接外部设备,如USB、PCIe、SATA、HDMI 。现代趋势是高速串行总线(如PCIe)取代传统并行总线,以提升带宽与扩展性。
接口与外部设备
- 常见接口类型:包括显示接口(如HDMI、DisplayPort等)、音频接口(如3.5mm耳机孔等)、网络接口(如RJ45、Wi - Fi模块)、存储接口(如SATA、NVMe等)。
- 典型外部设备:输入设备(如键盘、鼠标等)、输出设备(如显示器、打印机等)、输入/输出设备(如触摸屏、网卡等)。接口用于解决设备间速度、协议、电气特性差异,实现即插即用。
计算机软件
计算机软件概述
计算机软件(Computer Software) 是指为实现特定功能而编写的程序、数据及相关文档的集合。它以指令序列的形式存在,控制硬件执行操作,使计算机能够完成用户所需的任务。
tip
简单说:软件 = 程序 + 数据 + 文档
软件通常分为系统和应用两大类:
- 系统软件:管理和控制计算机硬件资源,为应用软件提供运行环境。包括操作系统(如Windows、Linux)、设备驱动程序、实用工具等。
- 应用软件:满足用户特定需求的程序,如办公软件(如Microsoft Office)、图像处理软件(如Adobe Photoshop)、浏览器(如Google Chrome)等。
计算操作系统
操作系统的组成、作用和类型
操作系统是由多个功能模块协同工作的软件系统,主要包含以下核心组成部分:
- 进程管理:负责创建、调度和终止进程,管理进程间通信与同步。
- 内存管理:负责分配和回收内存资源,维护内存地址空间,支持虚拟内存技术。
- 文件系统:提供文件的存储、组织和访问机制,支持目录结构和权限管理。
- 设备管理:管理硬件设备的驱动程序,协调设备的使用和资源分配。
- 用户接口:提供用户与操作系统交互的方式,如命令行界面(CLI)和图形用户界面(GUI)。
- 网络管理:支持网络通信协议,管理网络连接和数据传输。
tip
这些模块共同构建了一个资源抽象层,使应用程序无需关心底层硬件细节。
操作系统的主要作用包括:
- 资源管理者:统一调度 CPU、内存、外设等硬件资源,负责进程/线程调度、内存分配与回收、I/O 资源管理,以提高资源利用率并避免冲突。
- 服务提供者:为应用程序提供标准化服务(如文件系统、设备驱动、网络通信、进程间通信),通过系统调用接口将受控的硬件访问封装为易用的抽象。
- 用户与硬件之间的桥梁:屏蔽底层硬件差异与复杂性,提供一致的编程模型与用户接口(CLI/GUI),使软件开发与使用更简单可靠。
- 提升系统效率与可靠性:通过并发控制、缓冲与缓存机制、虚拟内存、异常与错误恢复、权限与隔离等技术,保障系统在高负载和故障情形下稳定高效运行。
操作系统的特点
| 特性 | 说明 |
|---|---|
| 并发性(Concurrency) | 多个程序在宏观上“同时”运行(微观上可能交替执行)。 |
| 共享性(Sharing) | 系统资源(如内存、CPU、文件)可被多个进程共享使用。 |
| 虚拟性(Virtualization) | 通过虚拟内存、虚拟设备等技术让每个程序“感觉”独占资源。 |
| 异步性(Asynchronism) | 程序执行不可预测,系统通过中断、回调等机制保证结果正确。 |
tip
这些特点都是针对程序来说的
操作系统的基本原理
操作系统的基本原理是支撑其所有功能(如多任务、内存管理、文件系统等)的核心机制和思想。理解这些原理,有助于深入掌握操作系统如何高效、安全、可靠地管理计算机资源。
1 中断机制(Interrupt Mechanism)
核心作用: 实现 CPU 对外部事件(如 I/O 完成、时钟信号、硬件故障)的及时响应,是操作系统实现并发、实时性和设备管理的基础。
工作过程:
- 硬件或软件触发中断;
- CPU 暂停当前程序,保存现场(寄存器状态);
- 跳转到对应的中断服务程序(ISR);
- 处理完成后恢复现场,继续原程序。
类型:
- 硬件中断:来自外设(如键盘按下、磁盘读完);
- 软件中断:由程序主动发起(如系统调用 int 0x80);
- 异常(Exception):CPU 内部错误(如除零、缺页)。
✅ 意义:没有中断,CPU 就无法“感知”外部世界,也无法实现多任务切换。
2 系统调用(System Call)
核心作用: 为应用程序提供安全访问操作系统服务的唯一合法接口。
原理: - 用户程序运行在用户态(User Mode),权限受限; - 当需要 OS 服务(如读文件、创建进程)时,通过系统调用陷入内核态(Kernel Mode); - 内核执行特权操作后返回结果。
示例(Linux):
int fd = open("file.txt", O_RDONLY); // 触发系统调用
底层通过软中断(如 syscall 指令)进入内核。
🔒 安全隔离:防止用户程序直接操作硬件或破坏系统。
3 进程与线程模型(Process & Thread)
进程(Process):
- 程序的一次执行实例;
- 拥有独立的地址空间、文件描述符、环境变量;
- 是资源分配的基本单位。
线程(Thread):
- 进程内的执行单元;
- 共享进程的地址空间和资源;
- 是CPU 调度的基本单位。
并发实现:
- 单 CPU:通过时间片轮转实现“伪并行”;
- 多 CPU:真正并行执行多个线程。
关键技术
进程控制块(PCB)记录进程状态;上下文切换(Context Switch)保存/恢复执行环境。
4 虚拟内存(Virtual Memory)
核心思想: 为每个进程提供连续且私有的逻辑地址空间,将程序地址与物理内存解耦,从而扩展可用内存并实现隔离与共享。
实现要点:
- 分页(Paging):将地址空间和物理内存均划分为大小相同的页/页框(常见页大小 4KB);内存管理以页为单位进行分配。
- 页表(Page Table):存储虚拟页号(VPN)到物理页框号(PFN)的映射。常用结构:多级页表、反向页表。
- TLB(Translation Lookaside Buffer):快表缓存最近的页表项,加速地址转换。
- 缺页中断(Page Fault)与换入/换出:若访问的页不在内存,触发缺页;OS 从磁盘(swap/backing store)读取到物理页框,更新页表并恢复执行。
- 页面替换算法:LRU、FIFO、Clock 等用于选择被换出的页;还有预取(prefetch)与延迟写(write-back)策略。
- 共享与写时复制(Copy-on-Write):多个进程可共享只读页;写入时复制以节省内存并延迟复制开销。
地址转换过程
步骤
-
表示法
- 虚拟地址(VA)按位划分为虚拟页号(VPN)和页内偏移(offset):VA = [VPN | offset]
- 物理地址(PA)由物理页框号(PFN)和相同的页内偏移组成: PA = [PFN | offset]
- 例:32 位地址、4KB 页面 → offset = 12 位,VPN = 20 位(4KB = 2^12)。
-
转换流程
- CPU 产生虚拟地址 VA。
- 从 VA 提取 offset(低位)和 VPN(高位)。
-
在 TLB 查找 VPN → PFN:
- 命中:用 PFN 与 offset 合成 PA,直接访问物理内存。
-
未命中:查询页表(可能为多级页表):
- 若存在映射:得到 PFN,更新 TLB,合成 PA。
- 若无映射:触发缺页异常(page fault),由操作系统加载页面或返回错误。
-
物理地址计算:PA = (PFN << offset_bits) | offset
-
具体示例
-
VA = 0x12345678(32 位,4KB 页)
- offset = 低 12 位 = 0x678
- VPN = 高 20 位 = 0x12345
-
假设页表映射 VPN 0x12345 → PFN 0x0ABCD,则:
- PA = 0x0ABCD678(将 PFN 左移 12 位再与 offset 合并)
-
-
要点提醒
- TLB 是页表项的缓存,能显著减少多级页表查找延迟;TLB 未命中的代价高(多次内存访问或缺页)。
- 页大小决定 offset 位数,影响可支持的页数与 VPN 位宽。
- PFN 的位宽由物理地址空间大小决定;物理地址位数小于虚拟地址时 PFN 位数较少。
- 多级页表、反向页表或巨页(huge pages)是常用的权衡手段以降低页表开销或提高 TLB 命中率。
-
优点
- 支持程序地址空间大于物理内存(按需装入)。
- 提供进程间隔离与安全。
- 便于共享库、内存映射文件与进程间通信。
- 简化程序的地址模型(每进程视为连续虚拟空间)。
-
缺点与权衡
- 频繁缺页(抖动)会严重影响性能。
- 页表本身占用内存,需通过多级表或反向表压缩。
- 页面大小选择影响内部碎片与 TLB 命中率,需要在碎片和性能间折中。
示例
32 位系统、4KB 页:虚拟地址空间 4GB;页数 = 4GB / 4KB = 1,048,576 页;每页偏移 12 位(VPN 20 位 + offset 12 位)。
5 I/O 与设备抽象(Device Abstraction)
核心思想:
将各种外设(磁盘、网卡、串口、打印机等)在操作系统中抽象为统一接口,以便应用以一致方式访问硬件,常见抽象为“文件/设备文件”。
关键技术:
- 设备驱动(Driver):厂商或内核提供的模块,封装硬件寄存器与协议,向内核导出统一操作接口(初始化、读写、控制)。
- 虚拟文件系统(VFS):为不同文件系统、块/字符设备提供统一调用层,屏蔽底层差异。
- 设备分类:字符设备(字符流,顺序访问)与块设备(按块读写,支持缓存与随机访问)。
- 缓冲与缓存(Buffering vs. Caching):缓冲区缓解速率差异;页缓存提高磁盘访问效率,降低同步开销。
- 中断 + DMA:外设通过中断通知完成事件,DMA 允许设备直接在内存与外设间传输,减少 CPU 参与。
- 同步模型:阻塞 I/O、非阻塞 I/O、异步 I/O(AIO)、事件驱动(epoll/select)适配不同延迟需求。
- 控制接口:ioctl / sysfs / procfs 等用于设备特定控制与状态查询。
- API 示例(概念):
int fd = open("/dev/ttyS0", O_RDWR); ssize_t n = read(fd, buf, len); write(fd, buf, n);
理念
📁 “一切皆文件”(Unix/Linux 哲学):
键盘(/dev/input/event*)、磁盘(/dev/sda)、串口、socket(在用户层表现为文件描述符)均可通过统一 I/O 原语操作,简化编程模型与资源管理。
补充原理
- 死锁处理:四个必要条件——互斥、占有且等待、不可抢占、循环等待。策略包括预防(破坏条件)、避免(银行家算法)、检测与恢复(回滚或终止进程)、资源剥夺。
- 同步与互斥:常用原语有互斥锁(mutex)、读写锁(rwlock)、信号量(semaphore)、条件变量(cond)、自旋锁(spinlock)、原子操作;选择依场景(并发粒度、优先级、实时性)。
- 调度算法:
- 进程/线程:FCFS、RR(时间片)、优先级调度、多级反馈队列(MLFQ)等以平衡吞吐与响应。
- 磁盘/块 I/O:SSTF、SCAN、C‑SCAN、电梯算法,操作系统/驱动层还常用 noop、deadline、cfq 等 I/O 调度器以适配存储特性。
批处理操作系统和分时操作系统
批处理操作系统(Batch Operating System)
定义:批处理操作系统是在没有用户交互的情况下,把多个作业(Job)按批次提交给系统,由操作系统按一定策略自动依次执行的操作模式。常见于早期大型机环境。
工作流程:作业收集 → 排序与装载(Job Scheduling) → 顺序执行 → 输出汇总。
特点
- 高吞吐量(吞吐率为优化目标):强调作业连续执行以减少设备空闲。
- 无交互:作业通常通过作业控制语言(JCL)或批处理脚本提交。
- 调度:以作业优先级、估计运行时间和资源需求为依据,常用非抢占调度。
优缺点
- 优点:资源利用率高,管理简单,适合长时间、批量的后台任务(如账单处理、批量报表)。
- 缺点:响应时间长,不支持~实时交互;对短任务不友好。
典型应用场景:银行、批量数据处理、定期报表生成、大规模科学计算(历史上)。
历史补充
批处理系统是早期计算机主流操作模式,随终端和交互式系统普及逐步被分时/交互式系统替代,但在现代仍以批处理作业(cron、batch job、MapReduce 等)形式广泛存在。
分时操作系统(Time-sharing Operating System)
定义:分时操作系统通过快速切换 CPU 资源在多个交互式用户或进程间分配,使每个用户都能感觉到“同时”占有计算机,从而支持多人同时交互使用系统。
核心机制:
- 时间片(Time Slice/Quantum):为每个进程分配一个短时间片,时间片结束后发生上下文切换。
- 抢占式调度:操作系统可中断正在运行的进程以调度其他进程,常用调度算法有轮转(Round Robin)、多级反馈队列(MLFQ)等。
- 快速响应与公平性是主要设计目标。
特点:
- 强调响应时间和交互体验,支持多用户同时在线。
- 需要高效的上下文切换、内存管理与公平调度策略。
优缺点:
- 优点:低响应延迟,用户体验好,适合交互式应用与多任务环境。
- 缺点:上下文切换开销较大,若时间片过短影响吞吐,过长影响响应;需要更复杂的资源管理。
典型应用场景:桌面操作系统、共享主机、多用户终端、交互式服务(如shell、IDE、Web 服务器在多会话场景下)。
周转时间
分时系统中,周转时间(Turnaround Time)是指从作业提交到完成的总时间,包括等待时间和执行时间。分时系统通过合理调度和时间片分配,力求在保证响应速度的同时,优化整体周转时间。
网络操作系统及分布式操作系统
网络操作系统(Network Operating System)
定义与定位
网络操作系统指运行在单机上的操作系统,同时提供集中式的网络服务与管理功能,使多台主机能共享文件、打印、用户认证和目录服务。通常以主从/客户端-服务器模型为主。
主要功能与组件:
- 身份与权限管理:域控制器、集中认证(如Active Directory、LDAP)。
- 资源共享:文件共享(SMB/CIFS、NFS)、打印服务、挂载点管理。
- 网络服务:DHCP、DNS、远程登录(RDP/SSH)与集中备份。
- 管理与监控:集中策略下发、补丁管理、日志与审计。
特点:
- 中心化管理,便于统一策略与安全控制。
- 强一致性假设较多(例如文件/权限在中心点统一管理)。
- 适用于企业局域网、校园网、局部数据中心场景。
典型示例:Windows Server(域/Active Directory)、Samba + Linux、Novell NetWare(历史)。
优缺点:
- 优点:易于集中运维、用户管理与权限控制;部署与故障定位相对简单。
- 缺点:中心节点或服务成为瓶颈与单点故障,需要备份与冗余设计;扩展性受限于中心架构。
分布式操作系统(Distributed Operating System)
定义与目标
分布式操作系统的目标是将多台物理机器的资源整合为一个“单一系统映像(SSI)”,对用户和应用提供透明的资源访问、调度与管理。强调资源分布、并发控制与故障透明化。
核心特性与机制:
- 单一系统映像(Transparency):集群对用户对透明,如同一个单一系统提供服务。
- 通信模型:RPC、RMI、消息传递与分布式共享内存(DSM)。
- 同步与一致性:逻辑时钟(Lamport)、向量时钟、强一致性与最终一致性策略。
- 故障容忍:复制、心跳/故障检测、主备与共识算法(Paxos、Raft)用于一致性与可用性。
- 资源管理:分布式调度、负载均衡、全局命名与位置服务。
常见组件与技术:
- 分布式文件系统(如分布式设计理念:透明访问、缓存一致性策略)。
- 中间件:屏蔽底层异构性,提供事务、消息队列与服务发现。
- 一致性与共识:事务协调(两阶段提交)、分布式锁、Paxos/Raft 等。
- 时钟与同步:NTP、逻辑时钟、分布式快照(Chandy-Lamport)。
设计挑战:
- 部分失败(Partial Failure):节点失效但系统仍需继续工作。
- 网络分区与 CAP 权衡:一致性(Consistency)、可用性(Availability)、分区容忍(Partition tolerance)间的权衡。
- 可扩展性与性能:跨节点通信开销与一致性维护成本。
- 安全性与身份认证:分布式环境下的认证、授权与机密性保护。
典型系统与研究原型:Amoeba、Plan 9、Sprite、LOCUS(学术/历史示例);现代分布式系统更多由分布式中间件与云原生组件(Kubernetes、分布式数据库)构成分布式操作功能。
选型建议
- 如果目标是局域网内集中管理用户与资源、简化桌面/服务器运维,优先考虑网络操作系统(如域控制器 + 文件服务)。
- 如果需要跨多台物理机器透明扩展资源、追求高可用与横向扩展(如大规模计算、分布式存储、云平台),应采用分布式操作系统思想或基于分布式中间件的架构(关注一致性模型与容错机制)。
嵌入式操作系统与实时操作系统
定义:嵌入式操作系统(Embedded OS)是为嵌入式设备(如单片机、SoC、消费电子、工业控制器、物联网终端)定制的操作系统,目标是资源受限环境下提供可靠、可裁剪的运行环境与外围驱动支持。
主要特点:
- 体积小、可裁剪:模块化设计,可剔除不需要的组件以节省 ROM/RAM。
- 设备驱动丰富且紧耦合:直接面向特定硬件外设与总线。
- 低功耗与启动快:支持省电模式与快速上电初始化。
- 长时间运行与高可靠性:生命周期与稳定性要求高。
核心组件与要点:
- 内核:可为单片循环(superloop)、轻量线程或带抢占的微内核。
- 设备驱动与 HAL(硬件抽象层):封装硬件差异,便于移植。
- 通信协议栈:TCP/IP、BLE、Zigbee、CAN 等常作为可选组件。
- 文件系统与持久化:根据需求选用轻量文件系统或裸闪管理(如FAT、LittleFS、NAND/Flash 方案)。
- 安全与更新:引导验证、固件升级(OTA)、加密模块。
常见示例:FreeRTOS、Zephyr、RT-Thread、嵌入式 Linux(如Buildroot/Yocto构建的系统)、μC/OS。
选型建议:
- 资源极度受限(几十KB RAM):选轻量内核或裸机设计。
- 需要网络/可扩展生态:考虑 Zephyr 或嵌入式 Linux。
- 对实时性要求不高但需多任务与网络:嵌入式 Linux 可行。
提示
嵌入式操作系统并不必然是实时操作系统,很多嵌入式系统使用非实时内核(例如标准 Linux),但可通过补丁/隔离或使用 RT 补丁提高确定性。
实时操作系统
定义:实时操作系统(RTOS)强调任务在确定时间约束内完成,对延迟和响应时间有可测可保证的要求。常用于工业控制、航天、汽车电子、医疗设备等对时间约束敏感的场景。
实时分类:
- 硬实时(Hard RT):错过截止时间会导致系统灾难性后果(必须保证截止)。
- 软实时(Soft RT):错过截止会导致性能下降但不致命。
- Firm 实时:介于两者之间,部分丢失可接受但有成本。
关键特性与技术要点:
- 确定性(Determinism):保证最大中断延迟和任务响应上界。
- 抢占式内核与优先级调度:支持固定优先级、优先级继承、优先级天花板或 EDF(最早截止优先)。
- 最小化中断处理时间:中断服务尽量短、将复杂处理下放到任务上下文或工作队列。
- 避免不可预测机制:通常不使用会引入抖动的分页、耗时垃圾回收或长时间锁。
- 资源管理与优先级反转处理:实现优先级继承或协议以避免反转导致的不可预测延迟。
- 时钟与定时器精度:高精度定时器与硬件定时中断用于任务触发与度量。
验证与评估:
- 最坏情形执行时间(WCET)分析。
- 响应时间分析(RTA)与延迟测试(latency benchmarks)。
- 故障注入与长期运行测试以验证稳定性与确定性。
典型 RTOS:VxWorks、QNX、INTEGRITY、FreeRTOS(可用于软/部分硬实时场景)、RT-Thread(实时特性)、μC/OS。
选型建议:
- 严苛的硬实时需求:选专门 RTOS(VxWorks、QNX 等)并进行 WCET 验证。
- 嵌入式且轻量的实时需求:可选 FreeRTOS/μC/OS/RT-Thread,并注意调度策略与优先级设计。
- 需要丰富设备驱动与用户态生态且有中等实时需求:考虑带 RT 支持的嵌入式 Linux(如 PREEMPT_RT)。
工程提示
在设计实时系统时,应从架构层面(划分实时与非实时域、隔离驱动与应用)出发,结合定量测试(延迟、抖动、WCET)来验证满足实时约束。
数据库系统
数据库的定义、作用和类型
定义:
数据库是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内、有组织的、可共享的、统一管理的数据集合。
- 数据库中的数据具有最小冗余度、高独立性(逻辑与物理独立)、易扩展性,并能被多个用户或应用程序以不同方式访问。
- 数据库通常由数据库管理系统(DBMS)进行创建、维护和操作。
数据库的主要作用包括:
- 集中存储与统一管理:将分散数据汇集到统一仓库,便于集中备份、权限控制和运维监控。
- 降低冗余并保证一致性:通过模式设计(规范化/反规范化权衡)、约束和触发器减少重复数据与更新异常。
- 支持并发访问与事务保障:提供并发控制与事务机制(ACID 或隔离级别)以在多用户并发读写时保持数据一致性。
- 提供数据安全性与完整性 :细粒度权限与审计、传输/存储加密以及主键/外键/检查约束等机制共同保障安全与完整性。
- 支持高效查询与分析:利用索引、查询优化器、物化视图和列式/分区等技术提升检索与分析性能,满足 BI/大数据场景。
- 实现持久化与恢复能力:借助事务日志、定期/增量备份、复制与故障切换等手段在系统故障后快速恢复数据。
数据库的类型主要包括:
按数据模型分类:
- 关系型数据库(RDBMS):基于关系模型,使用表格存储数据,支持 SQL 查询语言。典型代表有 MySQL、PostgreSQL、Oracle Database、Microsoft SQL Server。
- 非关系型数据库(NoSQL):不使用传统表格结构,适用于大规模分布式数据存储。常见类型有键值存储(如 Redis)、文档存储(如 MongoDB)、列族存储(如 Cassandra)、图数据库(如 Neo4j)。
按用途分类:
- OLTP(联机事务处理):支持高并发短事务(如银行转账)→ 常用关系型数据库。
- OLAP(联机分析处理):支持复杂查询和数据分析(如数据仓库)→ 常用列式数据库(如 ClickHouse、Snowflake)。
分布式数据库系统
分布式数据库系统(Distributed Database System, DDBS)是一种将数据分布在多个物理位置(如不同服务器、数据中心甚至地理区域)上,但逻辑上仍作为一个统一整体进行管理和访问的数据库系统。它结合了数据库技术与计算机网络技术,旨在提升系统的可扩展性、可用性、性能和容错能力。
下面从 结构 和 应用 两个方面系统阐述分布式数据库系统:
分布式数据库系统的结构
基本组成要素
| 组件 | 说明 |
|---|---|
| 站点(Site)或节点(Node) | 网络中的一台计算机,拥有本地数据库管理系统(Local DBMS),可独立处理本地事务。 |
| 全局数据库(Global Database) | 逻辑上完整的数据库,由分布在各站点的数据片段组成。 |
| 分布式数据库管理系统(DDBMS) | 负责协调各站点、管理数据分布、查询优化、事务一致性等的软件层。 |
| 通信网络 | 连接各站点的网络基础设施(如局域网、广域网)。 |
数据分布方式
数据如何在多个站点之间组织,是分布式数据库设计的核心。主要有以下几种策略:
| 分布方式 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 分片(Fragmentation) | 将一个关系(表)按行或列拆分为多个片段,分别存储在不同站点。 • 水平分片:按行(如按地区) • 垂直分片:按列(如敏感字段单独存放) |
减少传输量,提高局部查询效率 | 查询涉及多片段时需连接 |
| 复制(Replication) | 同一份数据在多个站点保存副本 • 完全复制:所有站点都有全量数据 • 部分复制:关键数据多副本 |
高可用、负载均衡、容错性强 | 更新需同步,一致性维护复杂 |
| 混合方式 | 分片 + 复制结合使用(最常见) | 兼顾性能与可靠性 | 系统复杂度高 |
✅ 实际系统通常采用“分片+部分复制”策略,例如:用户表按用户ID哈希分片,同时热点数据(如首页配置)全局复制。
系统架构类型
| 架构类型 | 特点 |
|---|---|
| 同构分布式数据库 | 所有站点使用相同的 DBMS(如全是 MySQL 或全是 PostgreSQL) |
| 异构分布式数据库 | 各站点可能使用不同 DBMS(如 Oracle + MongoDB + MySQL) |
| 联邦数据库系统(Federated) | 各数据库自治,通过统一接口虚拟集成(逻辑集中,物理分散) |
关键技术挑战
- 透明性(Transparency):用户无需知道数据物理位置(位置透明)、分片方式(分片透明)、复制情况(复制透明)等。
- 分布式查询处理与优化 :查询可能涉及多个站点,需决定执行顺序、数据移动策略(如“把计算推到数据端”)。
-
分布式事务管理:保证跨站点事务的 ACID 特性,常用协议:
- 两阶段提交(2PC):协调者+参与者模型
- Paxos / Raft:用于共识和日志复制(尤其在强一致性系统中)
- 一致性与可用性权衡(CAP 定理)
在网络分区(P)下,只能在一致性(C)和可用性(A)之间取舍。
分布式数据库系统的应用
典型应用场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 大规模互联网服务 | 用户量大、数据量高、需弹性扩展 | 微信用户数据、淘宝订单系统 |
| 多地部署与低延迟访问 | 用户分布全球,需就近访问数据 | Netflix、Google Spanner |
| 高可用与容灾系统 | 避免单点故障,支持故障自动切换 | 银行核心系统、电信计费系统 |
| 物联网(IoT) | 海量设备产生数据,需边缘+中心协同处理 | 智能电表、车联网平台 |
| 企业多分支机构系统 | 各地分公司本地处理业务,总部汇总分析 | 连锁零售、跨国公司 ERP |
主流分布式数据库系统举例
| 系统 | 类型 | 特点 |
|---|---|---|
| Google Spanner | NewSQL,强一致性,全球分布 | 使用 TrueTime 实现外部一致性 |
| CockroachDB | 兼容 PostgreSQL 的分布式 SQL 数据库 | 强一致性,自动分片与故障恢复 |
| TiDB | MySQL 兼容,HTAP 架构 | 支持 OLTP + OLAP 混合负载 |
| Amazon Aurora(Global Database) | 云原生,主从跨区域复制 | 读写延迟 < 1 秒,适用于全球应用 |
| Apache Cassandra | NoSQL,宽列存储,最终一致性 | 高写入吞吐,无单点故障 |
| MongoDB Sharded Cluster | 文档型 NoSQL,支持分片 | 灵活 schema,适合非结构化数据 |
文件系统
文件系统的定义、作用和类型
1.定义:
文件系统是一种逻辑结构,用于在存储介质上组织和管理文件及其元数据(如文件名、大小、创建时间、权限等)。它为用户和应用程序提供了一种统一、抽象的方式来访问存储设备上的数据,而无需关心底层物理存储细节。
2.作用:
- 数据组织:将数据以“文件”和“目录”的形式进行结构化组织,便于查找和管理。
- 数据存取:提供读写接口,支持对文件的创建、打开、读取、写入、删除等操作。
- 空间管理:跟踪磁盘空间的使用情况,分配和回收存储块。
- 元数据管理:维护每个文件的属性信息(如权限、所有者、时间戳等)。
- 数据安全与可靠性: - 通过权限控制防止未授权访问; - 支持日志(Journaling)等功能提高崩溃后的恢复能力; - 部分文件系统支持加密、快照、校验和等高级功能。
- 抽象硬件差异:屏蔽底层存储设备的物理特性,提供统一的访问接口。
3.类型:
| 文件系统 | 类型 | 支持平台 | 特点与适用场景 |
|---|---|---|---|
| ext4 | 日志(Journaling) | Linux | 稳定、兼容性好,桌面/服务器常用。支持大文件与延迟分配。 |
| ext3 | 日志 | Linux | ext4 前身,兼容性好,功能相比 ext4 限制较多。 |
| ext2 | 无日志 | Linux | 轻量、适用于嵌入式或不需日志的场景(如小存储设备)。 |
| XFS | 日志 | Linux | 擅长大文件与并发写入,常用于大型存储/数据库。 |
| Btrfs | 日志、Copy-on-Write | Linux | 支持快照、子卷、内置校验与压缩,面向高级存储功能。 |
| ZFS | 日志/写时复制(COW) | Solaris、FreeBSD、Linux(移植) | 数据完整性、快照、压缩、池化存储,适合企业级存储。 |
| NTFS | 日志 | Windows(兼容驱动在其他平台) | Windows 默认,支持权限、压缩、加密与大文件。 |
| FAT32 | 无日志 | 跨平台 | 最广泛兼容(USB、FAT设备),单文件最大4GB限制。 |
| exFAT | 无日志 | 跨平台(现代系统) | 用于大容量可移动介质,支持大文件且兼容性较好。 |
| APFS | 日志/写时复制 | macOS | Apple 新一代文件系统,支持快照、加密与空间共享。 |
| HFS+ | 日志 | macOS(旧) | 旧版 macOS 文件系统,现逐步被 APFS 取代。 |
| F2FS | 日志(为闪存优化) | Linux | 为闪存/SSD优化的文件系统,适合 eMMC/闪存设备。 |
| UFS | 日志/传统 | BSD、Unix 系统 | 传统类 Unix 文件系统,多用于 BSD/UNIX 系统。 |
文件系统的组成和基本原理
文件系统(File System)是操作系统用于管理和组织存储设备(如硬盘、SSD、U盘等)上数据的一种机制。它定义了数据如何存储、命名、访问和保护,是用户与物理存储介质之间的抽象层。
文件系统的组成
文件系统通常由以下几个核心组成部分构成:
1.文件(File)
- 是存储在存储设备上的逻辑数据单元。
- 包含用户数据(如文本、图片、程序代码等)以及元数据(metadata)。
- 每个文件都有一个唯一的名称(在目录内唯一),便于用户识别和访问。
2.目录(Directory / Folder)
- 是一种特殊的文件,用于组织和管理其他文件或子目录。
- 提供层次化的命名空间(如树形结构),避免文件名冲突。
- 支持路径(Path)概念,如
/home/user/document.txt。
3.元数据(Metadata)
- 描述文件属性的信息,不包含实际用户数据。
-
常见元数据包括:
- 文件名
- 文件大小
- 创建/修改/访问时间
- 所有者和权限(如读、写、执行)
- 文件类型(普通文件、目录、符号链接等)
- 存储位置(如 inode 编号)
4.存储块(Block / Cluster)
- 物理存储设备被划分为固定大小的块(如 4KB)。
- 文件系统以块为单位分配和管理空间。
- 即使文件很小,也会占用至少一个块(可能造成内部碎片)。
5.索引结构(如 inode 表、FAT 表等)
- 用于记录文件与其数据块之间的映射关系。
-
不同文件系统使用不同机制:
- FAT(File Allocation Table):链式结构,适合简单嵌入式系统。
- inode(Unix/Linux):每个文件对应一个 inode,记录元数据和数据块指针。
- B+树(如 NTFS、ext4 的 extent):高效支持大文件和快速查找。
6.超级块(Superblock)
-
存储整个文件系统的全局信息,如:
- 总块数、空闲块数
- 文件系统类型、版本
- 挂载状态、一致性标志
- 通常在文件系统挂载时被读入内存。
文件系统的基本原理
1.抽象与虚拟化
- 将物理磁盘的线性地址空间抽象为“文件”和“目录”的逻辑视图。
- 用户无需关心数据实际存储在磁盘的哪个扇区。
2.命名与路径解析
- 通过路径名(如
/usr/bin/ls)定位文件。 - 系统逐级解析目录,最终找到目标文件的元数据。
3.空间管理
- 跟踪哪些块已被使用,哪些是空闲的(通过位图、空闲列表等)。
- 分配策略影响性能和碎片程度(如连续分配、链式分配、索引分配)。
4.持久性与一致性
- 使用日志(Journaling,如 ext3/ext4、NTFS)或写时复制(Copy-on-Write,如 ZFS、Btrfs)等技术,确保系统崩溃后仍能恢复一致状态。
- 避免“部分写入”导致的数据损坏。
5.访问控制与安全
- 通过权限位(如 rwx)或 ACL(访问控制列表)限制用户对文件的操作。
- 支持加密、审计等高级安全功能(如 EFS、fscrypt)。
6.缓存与性能优化
- 利用内存缓存(Page Cache)减少磁盘 I/O。
- 预读(read-ahead)、延迟写(write-back)等策略提升吞吐量。
文件系统的存取方式与存储管理
文件系统的存取方式(Access Methods)和存储管理(Storage Management)是其核心功能的两个重要方面,分别决定了“如何读写文件”以及“如何在物理存储设备上组织和分配空间”。
文件系统的存取方式(Access Methods)
存取方式指的是用户或程序访问文件内容的方式。不同应用场景对访问模式的需求不同,文件系统需支持相应的机制。
1.顺序存取(Sequential Access)
- 原理:从文件开头开始,按顺序逐字节/块读取或写入,不能直接跳转。
- 特点:
- 实现简单,适合磁带等顺序设备。
- 早期操作系统(如 DOS)主要采用此方式。
- 典型应用:日志文件、音频/视频流(早期)、批处理作业输出。
- 示例:
fread()在未 seek 的情况下默认顺序读取。
2.随机存取(Random Access / Direct Access)
- 原理:可直接定位到文件任意位置进行读写(通过偏移量 offset)。
- 特点:
- 需要文件系统支持“寻址”能力(如 inode 中记录数据块位置)。
- 现代磁盘(HDD/SSD)天然支持随机访问。
- 典型应用:数据库文件、可执行程序加载、编辑文档。
- 示例:使用
lseek()+read()跳转到指定位置读取。
3.索引存取(Indexed Access)
- 原理:为文件建立索引结构(如 B+ 树),通过关键字快速定位记录。
- 特点:
- 不是所有通用文件系统原生支持,但数据库系统常在其上构建索引。
- 某些高级文件系统(如 NTFS 的索引根、ext4 的 HTree 目录索引)用于加速目录查找。
- 典型应用:数据库索引文件、大型目录结构。
📌 注意:现代操作系统通常以字节流模型提供统一接口(如 POSIX 文件 API),底层由文件系统将逻辑偏移映射到物理块,从而同时支持顺序与随机访问。
文件系统的存储管理(Storage Management)
存储管理关注的是如何在物理存储设备上高效、可靠地组织和分配空间,主要包括以下几个方面:
1.存储空间划分
- 分区(Partitioning):硬盘被划分为一个或多个逻辑分区,每个分区可格式化为独立文件系统。
- 块(Block)/簇(Cluster):
- 文件系统将分区进一步划分为固定大小的块(如 4KB)。
- 块是分配和 I/O 的最小单位(即使文件只有 1 字节,也占用 1 个块)。
2.空闲空间管理
文件系统需跟踪哪些块未被使用,常用方法包括:
| 方法 | 原理 | 优缺点 |
|---|---|---|
| 位图(Bitmap) | 用一个比特位表示一个块是否空闲(0=空闲,1=已用) | 查找快,空间开销小;适用于 ext2/ext3/ext4 |
| 空闲块链表(Free List) | 将所有空闲块链接成链表 | 简单,但遍历效率低 |
| 分组/成组链接 | 如 UNIX System V 的“空闲块数组”,每组包含多个空闲块指针 | 平衡效率与复杂度 |
3.文件分配策略
决定文件的数据块如何在磁盘上分布:
| 分配方式 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 连续分配(Contiguous) | 文件所有块连续存放 | 顺序访问快,寻道少 | 容易产生外部碎片,扩展困难 |
| 链接分配(Linked) | 每个块含指向下一个块的指针(如 FAT 表) | 无碎片,灵活扩展 | 不支持随机访问,指针占用空间,可靠性差 |
| 索引分配(Indexed) | 为每个文件建索引块,记录所有数据块地址(如 inode) | 支持随机访问,无外部碎片 | 小文件有空间浪费,大文件需多级索引 |
✅ 现代文件系统(如 ext4、NTFS)多采用混合索引分配(直接块 + 间接块 + 双重/三重间接块 或 extent 机制)。
4.Extent 机制(现代优化) - 原理:不再记录每个单独块,而是记录“起始块 + 长度”的连续区间(extent)。 - 优势: - 减少元数据开销 - 提高大文件顺序 I/O 性能 - 减少碎片影响 - 应用:ext4、XFS、NTFS、APFS 均支持 extent。
5.碎片管理 - 外部碎片:空闲块分散,无法满足大文件连续分配需求。 - 对策: - 使用非连续分配(如 extent 或 inode) - 定期碎片整理(Windows NTFS 支持,Linux ext4 一般不需要) - 写时预留空间(delayed allocation in ext4)
6.日志与一致性保障
- 日志式文件系统(Journaling):
- 在修改元数据前,先写入日志(journal)。
- 系统崩溃后可通过日志恢复一致性。
- 如 ext3/ext4(data=ordered/journal/writeback)、NTFS、JFS。
- 写时复制(Copy-on-Write, COW):
- 修改时不覆盖原数据,而是写入新位置并更新指针。
- 天然支持快照、防崩溃(如 ZFS、Btrfs、APFS)。
7.缓存与预读
- 页缓存(Page Cache):将频繁访问的文件块缓存在内存中。
- 预读(Read-ahead):预测用户将顺序读取后续数据,提前加载。
- 延迟写(Write-back):修改暂存内存,稍后批量写入磁盘,提升性能。