文章概述
本篇主要讲解第十章以及附录:操作系统实例分析。其余章节请参考专栏其他篇幅。
目录
十、操作系统实例分析
本章节将分析几个主流的操作系统实例,包括Windows、Linux、Unix和macOS。通过分析这些实际的操作系统,可以更好地理解操作系统理论的实践应用,以及不同操作系统的设计理念和特点。
10.1 Windows操作系统
Windows是由Microsoft开发的图形化操作系统系列,是目前使用最广泛的桌面操作系统之一。Windows采用了模块化、分层的架构设计,提供了丰富的功能和良好的用户体验。
10.1.1 Windows系统架构
Windows架构概述
Windows操作系统采用了分层、模块化的架构设计,主要分为用户模式和内核模式两个层次。
Windows架构层次:
1. 用户模式(User Mode):
- 应用程序运行空间
- 系统进程
- 环境子系统
- 受限制的执行环境
2. 内核模式(Kernel Mode):
- 执行体(Executive)
- 内核(Kernel)
- 硬件抽象层(HAL)
- 设备驱动
- 系统关键组件
架构图:
┌─────────────────────────────────┐
│ 用户模式(User Mode) │
│ ┌───────────────────────────┐ │
│ │ 应用程序 │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 环境子系统 │ │
│ │ (Win32, POSIX, OS/2) │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 系统进程 │ │
│ │ (服务、LSASS等) │ │
│ └───────────────────────────┘ │
├─────────────────────────────────┤
│ 内核模式(Kernel Mode) │
│ ┌───────────────────────────┐ │
│ │ 执行体(Executive) │ │
│ │ (I/O, 内存, 进程管理等) │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 内核(Kernel) │ │
│ │ (线程调度, 中断处理) │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 硬件抽象层(HAL) │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
硬件(Hardware)
用户模式(User Mode)
用户模式组件:
1. 应用程序:
- 用户应用程序
- 第三方软件
- 在受限环境中运行
2. 环境子系统(Environment Subsystems):
- Win32子系统:主要子系统,支持Windows API
- POSIX子系统:支持POSIX应用
- OS/2子系统:支持OS/2应用(已废弃)
功能:
- 提供应用程序编程接口(API)
- 转换系统调用
- 管理应用程序进程
3. 系统进程:
- 服务控制管理器(SCM)
- LSASS(本地安全认证子系统服务)
- Winlogon(Windows登录进程)
- 其他系统服务
特点:
- 不能直接访问硬件
- 需要系统调用访问内核
- 每个进程有独立地址空间
- 进程间隔离
内核模式(Kernel Mode)
内核模式组件:
1. 执行体(Executive):
- I/O管理器(I/O Manager)
- 对象管理器(Object Manager)
- 进程和线程管理器(Process/Thread Manager)
- 虚拟内存管理器(Virtual Memory Manager)
- 安全引用监视器(Security Reference Monitor)
- 本地过程调用(LPC)
- 缓存管理器(Cache Manager)
- 即插即用管理器(PnP Manager)
- 电源管理器(Power Manager)
- 配置管理器(Configuration Manager)
2. 内核(Kernel):
- 线程调度
- 中断和异常处理
- 多处理器同步
- 硬件抽象
3. 硬件抽象层(HAL - Hardware Abstraction Layer):
- 抽象硬件差异
- 提供统一接口
- 便于移植
- 隐藏硬件细节
特点:
- 完全访问硬件
- 共享地址空间
- 高特权级别
- 关键系统组件
Windows API
Windows API:
定义:
- 应用程序编程接口
- 应用程序与操作系统交互的接口
- 提供系统功能访问
主要API集合:
1. Win32 API:
- 主要的Windows API
- 提供核心系统功能
- 文件、内存、进程、线程等
2. .NET Framework:
- 托管代码框架
- 高级API
- 跨语言支持
3. Windows Runtime (WinRT):
- 现代Windows API
- 用于UWP应用
- 跨设备支持
API示例:
- CreateProcess():创建进程
- CreateFile():创建/打开文件
- VirtualAlloc():分配虚拟内存
- CreateThread():创建线程
系统调用机制
系统调用机制:
实现方式:
1. 软件中断(传统):
- INT 2E指令(x86)
- 切换到内核模式
2. 快速系统调用(现代):
- SYSENTER/SYSEXIT(Intel)
- SYSCALL/SYSRET(AMD)
- 更快的切换
流程:
用户模式 → 系统调用 → 内核模式 → 执行功能 → 返回用户模式
示例:
用户调用CreateFile()
↓
用户模式库函数
↓
系统调用(切换到内核模式)
↓
内核模式I/O管理器
↓
执行文件操作
↓
返回结果
↓
切换回用户模式
10.1.2 Windows进程管理
Windows进程模型
Windows进程:
定义:
- 程序的执行实例
- 资源的容器
- 拥有独立的地址空间
进程组成:
1. 可执行程序
2. 私有地址空间
3. 系统资源句柄
4. 安全上下文(访问令牌)
5. 进程ID(PID)
6. 至少一个线程
进程对象(EPROCESS):
- 进程控制块
- 存储进程信息
- 内核数据结构
进程特点:
- 独立地址空间
- 进程间隔离
- 通过句柄访问资源
- 安全标识
Windows线程模型
Windows线程:
定义:
- 进程内的执行单元
- CPU调度的基本单位
- 共享进程地址空间
线程组成:
1. 线程上下文(寄存器、栈等)
2. 线程本地存储(TLS)
3. 线程优先级
4. 线程ID(TID)
5. 访问令牌(可选)
线程对象(ETHREAD):
- 线程控制块
- 存储线程信息
- 内核数据结构
线程特点:
- 轻量级(比进程)
- 共享进程资源
- 独立栈空间
- 可独立调度
进程与线程关系:
一个进程可以包含多个线程
线程共享进程的地址空间
线程有独立的执行上下文
进程和线程创建
创建过程:
进程创建(CreateProcess):
1. 打开可执行文件
2. 创建EPROCESS对象
3. 创建初始线程
4. 分配地址空间
5. 加载可执行文件
6. 初始化进程环境
7. 通知Win32子系统
8. 开始执行
线程创建(CreateThread):
1. 分配线程栈
2. 创建ETHREAD对象
3. 初始化线程上下文
4. 设置线程优先级
5. 将线程加入就绪队列
6. 开始执行
API示例:
c
// 创建进程
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
CreateProcess(
NULL, // 应用程序名
"notepad.exe", // 命令行
NULL, // 进程安全属性
NULL, // 线程安全属性
FALSE, // 句柄继承
0, // 创建标志
NULL, // 环境变量
NULL, // 当前目录
&si, // 启动信息
&pi // 进程信息
);
// 创建线程
HANDLE hThread = CreateThread(
NULL, // 安全属性
0, // 栈大小
ThreadProc, // 线程函数
NULL, // 参数
0, // 创建标志
NULL // 线程ID
);
Windows调度机制
调度机制:
调度单位:
- 线程是调度单位
- 内核级线程
- 一对一模型
优先级:
1. 进程优先级类(Process Priority Class):
- IDLE(空闲):4
- BELOW_NORMAL(低于正常):6
- NORMAL(正常):8
- ABOVE_NORMAL(高于正常):10
- HIGH(高):13
- REALTIME(实时):24
2. 线程相对优先级(Thread Relative Priority):
- THREAD_PRIORITY_IDLE:-15
- THREAD_PRIORITY_LOWEST:-2
- THREAD_PRIORITY_BELOW_NORMAL:-1
- THREAD_PRIORITY_NORMAL:0
- THREAD_PRIORITY_ABOVE_NORMAL:1
- THREAD_PRIORITY_HIGHEST:2
- THREAD_PRIORITY_TIME_CRITICAL:15
3. 线程基本优先级(Base Priority):
基本优先级 = 进程优先级类 + 线程相对优先级
调度算法:
- 多级反馈队列
- 基于优先级
- 抢占式调度
- 时间片轮转(同优先级)
调度策略:
- 高优先级线程优先
- 实时优先级最高
- 动态优先级调整
- CPU亲和性支持
进程和线程同步
同步机制:
1. 互斥对象(Mutex):
- 互斥访问
- 可以命名
- 跨进程同步
- CreateMutex, WaitForSingleObject, ReleaseMutex
2. 信号量(Semaphore):
- 计数信号量
- 控制资源数量
- 可以命名
- CreateSemaphore, WaitForSingleObject, ReleaseSemaphore
3. 事件对象(Event):
- 信号通知
- 手动/自动重置
- 可以命名
- CreateEvent, SetEvent, ResetEvent, WaitForSingleObject
4. 临界区(Critical Section):
- 快速互斥
- 只能进程内使用
- 比互斥对象快
- InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection
5. 互锁函数(Interlocked):
- 原子操作
- 无锁编程
- InterlockedIncrement, InterlockedCompareExchange等
示例:
c
// 互斥对象
HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(hMutex, INFINITE);
// 临界区代码
ReleaseMutex(hMutex);
// 事件对象
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(hEvent); // 设置事件
WaitForSingleObject(hEvent, INFINITE); // 等待事件
10.1.3 Windows存储管理
Windows内存管理架构
内存管理:
层次结构:
1. 虚拟内存管理器(VMM)
2. 工作集管理器(Working Set Manager)
3. 页面交换管理器(Page Swap Manager)
功能:
- 虚拟地址空间管理
- 物理内存管理
- 页面交换
- 内存保护
- 内存共享
地址空间:
- 32位:4GB(用户2GB,内核2GB)
- 64位:非常大(用户空间很大)
内存分配:
- 虚拟内存分配(VirtualAlloc)
- 堆分配(HeapAlloc)
- 栈分配(自动)
虚拟内存管理
虚拟内存:
页大小:
- x86:4KB(默认)
- x64:4KB(默认),可配置2MB/1GB大页
页状态:
1. 有效(Valid):
- 在物理内存中
- 可以访问
2. 备用(Standby):
- 在物理内存但已修改
- 可以快速重用
3. 修改(Modified):
- 已被修改
- 需要写回磁盘
4. 无效(Invalid):
- 未分配或已换出
- 访问会触发页面错误
页面错误处理:
1. 无效页面错误:
- 页面不在内存
- 从磁盘加载
- 可能需要换出其他页面
2. 保护页面错误:
- 访问权限违规
- 可能触发写时复制(Copy-on-Write)
3. 转换后备缓冲区(TLB)未命中:
- TLB中没有页表项
- 从页表加载
页表结构:
- 多级页表(x64:4级或5级)
- 页表项(PTE)
- 页目录项(PDE)
工作集管理
工作集(Working Set):
定义:
- 进程当前在物理内存中的页面集合
- 最近使用的页面
- 动态调整
工作集类型:
1. 进程工作集:
- 进程私有页面
2. 系统工作集:
- 系统共享页面
- 驱动程序和系统代码
工作集管理:
- 工作集大小限制
- 工作集修剪(Working Set Trimming)
- 页面替换算法(LRU变体)
- 动态调整
工作集修剪:
- 当内存压力大时
- 将页面移到备用列表
- 优先修剪不活跃页面
- 保持活跃页面在内存中
内存分配API
内存分配:
1. VirtualAlloc/VirtualFree:
- 分配虚拟内存页面
- 粒度:页面大小
- 直接使用虚拟内存
- 最底层的内存分配
2. HeapAlloc/HeapFree:
- 堆内存分配
- 从堆管理器分配
- 粒度:字节级
- 更高层接口
3. malloc/free(C运行时):
- C标准库函数
- 基于堆分配
- 跨平台
- 常用接口
示例:
c
// VirtualAlloc
LPVOID pMem = VirtualAlloc(
NULL, // 地址
1024 * 1024, // 大小(1MB)
MEM_COMMIT, // 分配类型
PAGE_READWRITE // 保护属性
);
VirtualFree(pMem, 0, MEM_RELEASE);
// HeapAlloc
HANDLE hHeap = GetProcessHeap();
LPVOID pMem = HeapAlloc(hHeap, 0, 1024);
HeapFree(hHeap, 0, pMem);
10.1.4 Windows文件系统(NTFS)
NTFS概述
NTFS(New Technology File System):
特点:
- Windows的主要文件系统
- 支持大文件和卷
- 安全性好
- 可恢复性
- 压缩和加密
- 配额管理
版本:
- NTFS 1.0(Windows NT 3.1)
- NTFS 1.1(Windows NT 3.5)
- NTFS 1.2(Windows NT 4.0)
- NTFS 3.0(Windows 2000)
- NTFS 3.1(Windows XP及以后)
限制:
- 最大文件大小:16TB - 64KB
- 最大卷大小:256TB - 64KB
- 最大文件名长度:255字符
- 路径长度:32,767字符(Windows 10+)
NTFS结构
NTFS结构:
1. 引导扇区(Boot Sector):
- 卷信息
- 文件系统参数
- 启动代码
2. 主文件表(MFT - Master File Table):
- 文件系统核心
- 所有文件和目录的元数据
- 类似inode表
3. MFT镜像:
- MFT的备份
- 提高可靠性
4. 日志文件($LogFile):
- 事务日志
- 可恢复性支持
- 元数据更新记录
5. 位图文件($Bitmap):
- 簇分配位图
- 标记已使用的簇
6. 根目录($Root):
- 文件系统根目录
- 特殊文件
7. 簇分配表:
- 文件数据存储
- 簇是分配单位(通常4KB)
MFT(主文件表)
MFT结构:
MFT记录:
- 每个文件/目录有一个MFT记录
- 固定大小(通常1KB或4KB)
- 包含文件元数据
MFT记录结构:
1. 记录头:
- 记录类型
- 记录号
- 序列号
2. 属性(Attributes):
- 标准信息($STANDARD_INFORMATION)
- 文件名($FILE_NAME)
- 数据($DATA)
- 属性列表($ATTRIBUTE_LIST)
- 索引根($INDEX_ROOT)
- 索引分配($INDEX_ALLOCATION)
- 位图($BITMAP)
- 其他属性
属性类型:
- 常驻属性(Resident):
- 存储在MFT记录中
- 小文件数据可以常驻
- 非常驻属性(Non-resident):
- 存储在外部簇
- 大文件和属性
文件数据存储:
小文件(< 1KB):
- 数据存储在MFT记录中
- 常驻属性
- 快速访问
大文件:
- 数据存储在外部簇
- 非常驻属性
- 使用运行列表(Run List)记录簇号
NTFS特性
1. 安全性
安全性:
访问控制:
- 访问控制列表(ACL)
- 访问控制项(ACE)
- 用户和组权限
- 权限继承
权限类型:
- 完全控制
- 修改
- 读取和执行
- 读取
- 写入
- 特殊权限
安全标识符(SID):
- 唯一标识用户和组
- 存储在ACL中
- 跨域支持
加密文件系统(EFS):
- 文件级加密
- 透明加密/解密
- 基于证书
- Windows Pro及以上版本
2. 可恢复性
可恢复性:
日志记录:
- 所有元数据更改记录在日志中
- 支持快速恢复
- 一致性保证
恢复过程:
1. 分析阶段:
- 读取日志
- 确定需要重做的操作
2. 重做阶段:
- 应用已提交的事务
- 恢复元数据
3. 撤销阶段:
- 撤销未提交的事务
- 保证一致性
检查点:
- 定期创建检查点
- 标记已提交的事务
- 加速恢复
3. 压缩和稀疏文件
压缩:
文件压缩:
- 透明压缩
- 节省磁盘空间
- 性能开销
- 可以按文件/目录启用
压缩算法:
- LZNT1算法
- 块级压缩
- 随机访问支持
稀疏文件(Sparse Files):
- 只存储非零数据
- 零数据不占用空间
- 支持大文件
- 适合数据库和虚拟磁盘
硬链接(Hard Links):
- 多个文件名指向同一文件
- 节省空间
- 删除最后一个链接才删除文件
符号链接(Symbolic Links):
- 指向另一个文件/目录
- 可以跨卷
- 相对/绝对路径
4. 配额和版本控制
配额管理:
磁盘配额:
- 限制用户磁盘使用
- 警告阈值
- 硬限制
- 按用户跟踪
版本控制:
卷影副本(Volume Shadow Copy):
- 文件系统快照
- 时间点备份
- 文件历史版本
- 恢复旧版本文件
卷影副本服务(VSS):
- 创建卷影副本
- 应用程序感知
- 一致性保证
NTFS vs FAT32对比
NTFS vs FAT32:
特性 NTFS FAT32
────────────────────────────────────────
最大文件大小 16TB 4GB
最大卷大小 256TB 32GB(理论2TB)
文件名长度 255字符 255字符
安全性 ACL, EFS 无
压缩 支持 不支持
加密 EFS 不支持
日志 支持 不支持
配额 支持 不支持
硬链接 支持 不支持
符号链接 支持 不支持
磁盘利用率 高(小簇) 低(大簇)
性能 好 一般
Windows操作系统总结
Windows操作系统总结:
1. 架构特点:
- 分层架构(用户模式/内核模式)
- 模块化设计
- 执行体和内核分离
- HAL硬件抽象
2. 进程和线程:
- 线程是调度单位
- 一对一线程模型
- 丰富的同步机制
- 多级反馈队列调度
3. 内存管理:
- 虚拟内存管理
- 工作集管理
- 页面交换
- 多种内存分配API
4. 文件系统:
- NTFS特性丰富
- MFT结构
- 安全性和可恢复性
- 压缩、加密、配额
优势:
- 用户界面友好
- 软件生态丰富
- 企业支持好
- 兼容性强
应用领域:
- 桌面计算
- 服务器
- 企业环境
- 游戏平台
10.2 Linux操作系统
Linux是一个开源的类Unix操作系统内核,广泛用于服务器、超级计算机、嵌入式系统等领域。Linux采用单内核架构,但通过模块化设计实现了灵活性和可扩展性。
10.2.1 Linux系统架构
Linux架构概述
Linux采用单内核(Monolithic Kernel)架构,但通过可加载内核模块(Loadable Kernel Modules)实现了类似微内核的灵活性。
Linux架构层次:
1. 用户空间(User Space):
- 应用程序
- 系统库(glibc)
- Shell和工具
- 系统服务
2. 系统调用接口(System Call Interface):
- 用户空间和内核空间的接口
- 系统调用API
3. 内核空间(Kernel Space):
- 内核核心
- 设备驱动
- 可加载模块
架构图:
┌─────────────────────────────────┐
│ 用户空间(User Space) │
│ ┌───────────────────────────┐ │
│ │ 应用程序 │ │
│ │ (用户程序、系统程序) │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 系统库(glibc) │ │
│ └───────────────────────────┘ │
├─────────────────────────────────┤
│ 系统调用接口(Syscall) │
├─────────────────────────────────┤
│ 内核空间(Kernel Space) │
│ ┌───────────────────────────┐ │
│ │ 进程管理 │ │
│ │ 内存管理 │ │
│ │ 文件系统 │ │
│ │ 网络协议栈 │ │
│ │ 设备驱动 │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ 可加载内核模块(LKM) │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
硬件(Hardware)
Linux内核组件
内核组件:
1. 进程管理(Process Management):
- 进程创建和销毁
- 进程调度
- 进程间通信(IPC)
- 信号处理
2. 内存管理(Memory Management):
- 虚拟内存管理
- 物理内存管理
- 页面交换
- 内存分配
3. 文件系统(File System):
- 虚拟文件系统(VFS)
- 各种文件系统实现
- 文件I/O
- 设备文件
4. 设备驱动(Device Drivers):
- 字符设备驱动
- 块设备驱动
- 网络设备驱动
- 可加载模块
5. 网络协议栈(Network Stack):
- TCP/IP协议栈
- 网络设备接口
- Socket接口
- 防火墙和路由
6. 系统调用接口(System Call Interface):
- 系统调用处理
- 用户/内核空间切换
- 参数传递
7. 中断处理(Interrupt Handling):
- 中断处理程序
- 中断上下文
- 软中断和任务队列
Linux内核特点
内核特点:
1. 单内核架构:
- 所有核心功能在内核空间
- 性能好
- 但复杂度高
2. 模块化设计:
- 可加载内核模块(LKM)
- 动态加载和卸载
- 扩展内核功能
- 减少内核大小
3. 抢占式内核:
- 内核代码可被抢占
- 提高响应性
- 实时性支持
4. 多线程支持:
- 内核线程
- 用户线程
- NPTL(Native POSIX Thread Library)
5. SMP支持:
- 对称多处理
- 多核支持
- 负载均衡
6. 可移植性:
- 支持多种架构
- x86, ARM, PowerPC, MIPS等
- 架构抽象层
系统调用
系统调用:
定义:
- 用户程序访问内核功能的接口
- 用户空间和内核空间的桥梁
- 受保护的操作
系统调用流程:
用户程序 → 库函数 → 系统调用 → 内核 → 返回
常见系统调用:
- fork():创建进程
- exec():执行程序
- open():打开文件
- read()/write():读写文件
- mmap():内存映射
- socket():创建套接字
- ioctl():设备控制
系统调用编号:
- 每个系统调用有唯一编号
- syscall number
- 通过编号调用
实现方式:
- x86-32:INT 0x80
- x86-64:SYSCALL指令
- ARM:SWI/SVC指令
10.2.2 Linux进程管理
Linux进程模型
Linux进程:
定义:
- 程序的执行实例
- 资源的容器
- 拥有独立的地址空间
进程控制块(task_struct):
- 内核中表示进程的数据结构
- 包含进程所有信息
- 非常大的结构体(数百个字段)
进程信息:
- 进程ID(PID)
- 父进程ID(PPID)
- 用户ID(UID)、组ID(GID)
- 进程状态
- 地址空间
- 文件描述符
- 信号处理
- 调度信息
进程状态:
- TASK_RUNNING:运行/就绪
- TASK_INTERRUPTIBLE:可中断睡眠
- TASK_UNINTERRUPTIBLE:不可中断睡眠
- TASK_STOPPED:停止
- TASK_TRACED:被跟踪
- EXIT_ZOMBIE:僵尸
- EXIT_DEAD:死亡
Linux线程
Linux线程:
实现方式:
- Linux使用轻量级进程(LWP)实现线程
- 线程共享地址空间
- 每个线程是独立的task_struct
- 共享某些资源
线程vs进程:
相同点:
- 都有task_struct
- 都可以调度
不同点:
- 线程共享地址空间
- 线程共享文件描述符
- 进程有独立地址空间
线程库:
1. LinuxThreads(旧):
- 早期实现
- 问题较多
- 已废弃
2. NPTL(Native POSIX Thread Library):
- 现代实现
- 符合POSIX标准
- 性能好
- 一对一模型(用户线程:内核线程)
进程创建(fork和exec)
进程创建:
fork()系统调用:
功能:
- 创建子进程
- 子进程是父进程的副本
- 写时复制(Copy-on-Write)
返回值:
- 父进程:返回子进程PID
- 子进程:返回0
- 错误:返回-1
写时复制(COW):
- fork时不复制内存
- 共享物理页面
- 写时再复制
- 节省内存和创建时间
exec()系统调用族:
功能:
- 执行新程序
- 替换当前进程映像
- 保留PID
函数族:
- execl, execv, execle, execve等
- execve是系统调用
- 其他是库函数包装
进程创建流程:
fork() → 创建子进程(COW) → exec() → 加载新程序
示例:
```c
pid_t pid = fork();
if (pid == 0) {
// 子进程
execl("/bin/ls", "ls", "-l", NULL);
} else if (pid > 0) {
// 父进程
wait(NULL); // 等待子进程
}
**Linux调度器**
Linux调度器:
调度策略:
1. SCHED_NORMAL(CFS):
- 普通进程调度
- 完全公平调度器(CFS)
- 时间片分配公平
2. SCHED_FIFO:
- 实时进程,先进先出
- 静态优先级
- 不会被抢占(除非更高优先级)
3. SCHED_RR:
- 实时进程,轮转
- 静态优先级
- 时间片轮转
4. SCHED_BATCH:
- 批处理进程
- 降低交互性
- 适合后台任务
5. SCHED_IDLE:
- 最低优先级
- 只在系统空闲时运行
CFS(Completely Fair Scheduler):
特点:
- 完全公平调度
- 基于虚拟时间(vruntime)
- 红黑树组织任务
- 动态优先级
虚拟时间:
vruntime = 实际运行时间 × (nice_0_weight / weight)
- 权重高的进程vruntime增长慢
- 权重低的进程vruntime增长快
- 选择vruntime最小的进程运行
优先级:
- nice值:-20到19(默认0)
- nice值越小,优先级越高
- 静态优先级:100到139(普通进程)
实时优先级:
- 1到99(SCHED_FIFO/SCHED_RR)
- 数字越大优先级越高
- 实时进程优先于普通进程
进程间通信(IPC)
进程间通信:
1. 管道(Pipe):
- 匿名管道:pipe()
- 命名管道:mkfifo()
- 单向通信
- 字节流
2. 信号(Signal):
- 异步通知
- 进程间信号:kill()
- 信号处理:signal()或sigaction()
- 有限的信息传递
3. 共享内存(Shared Memory):
- shmget(), shmat(), shmdt()
- 最快的IPC方式
- 需要同步机制
4. 消息队列(Message Queue):
- msgget(), msgsnd(), msgrcv()
- 结构化消息
- 持久化支持
5. 信号量(Semaphore):
- semget(), semop()
- 同步原语
- 控制资源访问
6. Socket:
- 网络通信
- 本地Socket(Unix Domain Socket)
- 最通用的IPC方式
7. 文件锁(File Locking):
- fcntl()
- 文件级锁
- 协调文件访问
10.2.3 Linux存储管理
Linux内存管理
内存管理架构:
层次:
1. 页分配器(Page Allocator)
2. Slab分配器(Slab Allocator)
3. 虚拟内存管理器(VMM)
4. 页面回收(Page Reclaim)
内存组织:
- NUMA感知
- 节点(Node)→ 区域(Zone)→ 页(Page)
- 区域类型:ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM
页大小:
- 通常4KB
- 支持大页(Huge Pages):2MB或1GB
- 大页减少TLB缺失
页表结构:
- 多级页表
- x86-64:4级或5级页表
- 页全局目录(PGD)→ 页上层目录(PUD)→ 页中间目录(PMD)→ 页表(PTE)
虚拟内存管理
虚拟内存:
地址空间:
- 用户空间:低地址(x86-64:0x0000000000000000 - 0x00007fffffffffff)
- 内核空间:高地址(x86-64:0xffff800000000000 - 0xffffffffffffffff)
内存映射:
1. 匿名映射(Anonymous Mapping):
- mmap(),MAP_ANONYMOUS
- 堆和栈
- 交换分区支持
2. 文件映射(File Mapping):
- mmap(),映射文件
- 共享或私有
- 按需加载
页面错误(Page Fault):
类型:
1. 主要缺页(Major Fault):
- 需要从磁盘加载
- 较慢
2. 次要缺页(Minor Fault):
- 页面在内存但未映射
- 快速处理
处理:
- do_page_fault()
- 分配页面
- 加载数据
- 建立映射
交换(Swapping):
- 页面换出到交换分区/文件
- 页面换入到内存
- kswapd内核线程负责回收
- 页面替换算法(近似LRU)
内存分配
内存分配:
1. 页分配器(Buddy System):
- 物理页面分配
- 伙伴算法
- 合并空闲页面
- 分配连续物理页面
2. Slab分配器:
- 小块内存分配
- 缓存常用对象
- 减少碎片
- 提高分配速度
3. 用户空间分配:
- malloc():C库函数
- brk()/sbrk():调整数据段
- mmap():内存映射
- 通常使用ptmalloc(glibc)
内存分配器:
- glibc malloc(ptmalloc)
- tcmalloc(Google)
- jemalloc(Facebook)
- 不同场景性能不同
10.2.4 Linux文件系统
虚拟文件系统(VFS)
虚拟文件系统(VFS):
作用:
- 抽象各种文件系统
- 统一接口
- 文件系统无关的系统调用
VFS对象:
1. 超级块(Superblock):
- 文件系统信息
- 挂载信息
2. inode(Index Node):
- 文件元数据
- 文件大小、权限、时间戳等
- 数据块指针
3. dentry(Directory Entry):
- 目录项缓存
- 文件名到inode映射
- 提高查找速度
4. file对象:
- 打开的文件
- 文件描述符对应
- 文件位置指针
VFS接口:
- 统一的操作接口
- 各文件系统实现
- open, read, write, close等
ext4文件系统
ext4文件系统:
特点:
- ext3的后继者
- 广泛使用
- 稳定可靠
- 支持大文件和文件系统
改进:
1. 扩展性:
- 最大文件大小:16TB
- 最大文件系统:1EB
- 支持更多子目录
2. 性能:
- 延迟分配(Delayed Allocation)
- 多块分配
- 预分配
3. 可靠性:
- 日志校验和
- 快速文件系统检查
- 时间戳纳秒精度
结构:
1. 超级块(Superblock):
- 文件系统元数据
2. 块组描述符(Block Group Descriptors):
- 块组信息
3. 块组(Block Groups):
- 数据和元数据
- inode表
- 数据块位图
- inode位图
4. inode:
- 文件元数据
- 直接块指针(12个)
- 间接块指针
- 双重间接、三重间接
5. 目录项(Directory Entry):
- 文件名和inode号
日志(Journaling):
- 元数据日志
- 快速恢复
- 三种模式:journal, ordered, writeback
Btrfs文件系统
Btrfs文件系统:
特点:
- B-tree文件系统
- 现代特性
- Copy-on-Write(COW)
- 写时复制
主要特性:
1. 写时复制(Copy-on-Write):
- 修改时不覆盖原数据
- 写入新位置
- 提高数据安全性
- 支持快照
2. 子卷(Subvolumes):
- 文件系统内的独立文件系统
- 独立快照
- 配额管理
- 灵活的存储管理
3. 快照(Snapshots):
- 瞬间创建
- 写时复制实现
- 只占用变化的空间
- 可以回滚
4. 校验和(Checksums):
- 数据和元数据校验和
- 检测数据损坏
- 自动修复(如果有镜像)
5. 压缩:
- 透明压缩
- zlib, lzo, zstd
- 节省空间
- 可选功能
6. 多设备支持:
- RAID 0, 1, 5, 6, 10
- 在线添加/删除设备
- 数据条带化
- 数据镜像
7. 在线碎片整理:
- 在线整理
- 不影响使用
- 提高性能
应用场景:
- 需要快照的场景
- 需要压缩的场景
- 多设备存储
- 现代存储需求
文件系统对比
文件系统对比:
特性 ext4 Btrfs
────────────────────────────────────────
最大文件 16TB 16EB
最大文件系统 1EB 16EB
日志 是 是(COW)
快照 否 是
压缩 否 是
校验和 元数据 数据和元数据
多设备 RAID(外部) 内置RAID
在线整理 是 是
COW 否 是
成熟度 成熟 较新
稳定性 非常稳定 稳定但较新
选择建议:
- 传统稳定需求:ext4
- 现代特性需求:Btrfs
- 服务器:ext4或Btrfs
- 桌面:ext4或Btrfs
Linux操作系统总结
Linux操作系统总结:
1. 架构特点:
- 单内核但模块化
- 可加载内核模块
- 开放源代码
- 高度可定制
2. 进程管理:
- 进程和线程统一模型
- CFS完全公平调度
- 丰富的IPC机制
- 写时复制
3. 内存管理:
- 虚拟内存管理
- 伙伴系统和Slab分配器
- NUMA支持
- 页面回收
4. 文件系统:
- VFS虚拟文件系统
- ext4稳定可靠
- Btrfs现代特性
- 支持多种文件系统
优势:
- 开放源代码
- 高度可定制
- 性能优秀
- 稳定性好
- 成本低
应用领域:
- 服务器
- 超级计算机
- 嵌入式系统
- 云计算
- 移动设备(Android)
10.3 Unix操作系统
Unix是一个多用户、多任务的操作系统,最初由AT&T贝尔实验室开发。Unix的设计哲学和架构对现代操作系统产生了深远的影响,许多现代操作系统(如Linux、macOS)都继承了Unix的设计理念。
10.3.1 Unix系统架构
Unix架构概述
Unix采用简洁、分层的架构设计,遵循"一切皆文件"的设计哲学。
Unix架构层次:
1. 用户程序层:
- 应用程序
- Shell
- 系统工具
2. Shell层:
- 命令解释器
- 脚本语言
- 管道和重定向
3. 系统调用接口:
- 用户程序访问内核的接口
- 系统调用API
4. 内核层:
- 文件系统
- 进程管理
- 内存管理
- 设备驱动
架构图:
┌─────────────────────────────────┐
│ 用户程序 │
│ (应用程序、工具、Shell) │
├─────────────────────────────────┤
│ Shell │
├─────────────────────────────────┤
│ 系统调用接口 │
├─────────────────────────────────┤
│ 内核 │
│ (文件系统、进程、内存、I/O) │
└─────────────────────────────────┘
硬件(Hardware)
Unix内核组件
内核组件:
1. 文件系统:
- 层次化文件系统
- 一切皆文件
- 设备文件
- 特殊文件
2. 进程管理:
- 进程创建(fork)
- 进程执行(exec)
- 信号处理
- 进程间通信
3. 内存管理:
- 虚拟内存
- 分页
- 交换
4. I/O系统:
- 设备驱动
- 字符设备
- 块设备
- 网络
5. 系统调用:
- 用户/内核接口
- 进程控制
- 文件操作
- 系统信息
Unix变种
Unix变种:
商业Unix:
1. System V(AT&T):
- 商业Unix
- 影响深远
- 标准化基础
2. BSD(Berkeley Software Distribution):
- 加州大学伯克利分校
- 开源贡献大
- 网络功能强
3. Solaris(Sun):
- 企业级Unix
- ZFS文件系统
- 容器技术(Zones)
4. AIX(IBM):
- IBM Unix
- 企业服务器
- 高可靠性
5. HP-UX(HP):
- HP Unix
- 企业环境
类Unix系统:
- Linux:最成功的类Unix系统
- macOS:基于BSD
- FreeBSD、OpenBSD、NetBSD:开源BSD
- Minix:教学用
标准化:
- POSIX:可移植操作系统接口
- SUS:单一Unix规范
- IEEE标准
10.3.2 Unix设计哲学
Unix设计哲学
Unix设计哲学(由Doug McIlroy总结):
1. 让每个程序做好一件事(Do one thing and do it well)
- 程序功能单一
- 做好本职工作
- 避免功能臃肿
2. 期望每个程序的输出成为另一个程序的输入(Expect the output of every program to become the input to another)
- 文本流作为接口
- 程序组合
- 管道机制
3. 设计并构建软件时,即使要推迟也要考虑可移植性(Design and build software, even operating systems, to be tried early, ideally within weeks)
- 快速原型
- 早期测试
- 迭代开发
4. 使用工具来减轻编程任务(Use tools in preference to unskilled help to lighten a programming task)
- 工具自动化
- 减少重复工作
- 提高效率
补充原则(Peter H. Salus总结):
5. 一切皆文件(Everything is a file)
- 统一的文件接口
- 设备、网络、进程都是文件
- 简化接口
6. 小即是美(Small is beautiful)
- 简洁设计
- 避免过度设计
- 易于理解和维护
7. 沉默是金(Silence is golden)
- 程序成功时不输出
- 错误时输出错误信息
- 避免冗余输出
8. 组合原则(Composition)
- 小工具组合
- 管道和重定向
- 灵活组合
9. 可移植性(Portability)
- 可移植代码
- 标准化接口
- 跨平台
10. 简单性(Simplicity)
- 简单设计
- 避免不必要的复杂性
- 易于理解
Unix哲学的应用
Unix哲学的应用:
1. 管道(Pipe):
- 程序间通信
- 组合小工具
- 示例:ls | grep "txt" | sort
2. 重定向(Redirection):
- 输入重定向:<
- 输出重定向:>
- 追加:>>
- 错误重定向:2>
3. 过滤器(Filter):
- 读取输入,处理,输出
- grep, sed, awk, sort等
- 可以组合使用
4. 脚本语言:
- Shell脚本
- 自动化任务
- 组合工具
示例:
# 查找包含"error"的日志行,统计数量
cat /var/log/app.log | grep "error" | wc -l
# 查找大文件并排序
find . -type f -size +100M | xargs ls -lh | sort -k5 -h
# 系统监控
ps aux | grep "python" | awk '{print $2}' | xargs kill
Unix文件系统
Unix文件系统:
特点:
- 层次化结构
- 根目录(/)
- 一切皆文件
目录结构:
/:根目录
/bin:基本命令
/sbin:系统命令
/etc:配置文件
/home:用户主目录
/usr:用户程序和数据
/var:可变数据
/tmp:临时文件
/dev:设备文件
/proc:进程信息(Linux)
/sys:系统信息(Linux)
文件类型:
1. 普通文件(-)
2. 目录(d)
3. 字符设备(c)
4. 块设备(b)
5. 符号链接(l)
6. 命名管道(p)
7. Socket(s)
文件权限:
- 用户(u)、组(g)、其他(o)
- 读(r)、写(w)、执行(x)
- 权限位:rwxrwxrwx
特殊文件:
- /dev/null:空设备
- /dev/zero:零设备
- /dev/random:随机数
- /dev/stdin, /dev/stdout, /dev/stderr
10.3.3 Unix系统调用
Unix系统调用分类
系统调用分类:
1. 进程控制:
- fork():创建进程
- exec():执行程序
- exit():退出进程
- wait():等待子进程
- getpid():获取进程ID
- kill():发送信号
2. 文件操作:
- open():打开文件
- read():读文件
- write():写文件
- close():关闭文件
- lseek():定位文件
- stat():获取文件信息
3. 目录操作:
- mkdir():创建目录
- rmdir():删除目录
- opendir():打开目录
- readdir():读目录
- chdir():改变目录
4. 内存管理:
- brk()/sbrk():调整数据段
- mmap():内存映射
- munmap():取消映射
5. 进程间通信:
- pipe():创建管道
- shmget():共享内存
- semget():信号量
- msgget():消息队列
- socket():套接字
6. 系统信息:
- uname():系统信息
- time():时间
- getuid():用户ID
- getgid():组ID
重要系统调用
重要系统调用:
- fork():
c
pid_t fork(void);
// 创建子进程
// 返回:父进程返回子进程PID,子进程返回0
- exec()族:
c
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
// 执行新程序
- open()/read()/write():
c
int open(const char *pathname, int flags, mode_t mode);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
// 文件I/O
- pipe():
c
int pipe(int pipefd[2]);
// 创建管道
// pipefd[0]:读端
// pipefd[1]:写端
Unix的影响
Unix的影响:
1. 设计理念:
- Unix哲学影响深远
- 简洁和组合的原则
- 一切皆文件的理念
2. 标准化:
- POSIX标准
- 可移植性
- 跨平台开发
3. 现代操作系统:
- Linux继承Unix
- macOS基于BSD
- 许多概念来源于Unix
4. 工具和语言:
- Shell脚本
- awk, sed, grep等工具
- C语言的发展
5. 网络:
- TCP/IP在Unix上发展
- 网络编程模型
- Socket接口
6. 开源:
- BSD开源
- 影响开源运动
- 自由软件运动
Unix操作系统总结
Unix操作系统总结:
1. 架构特点:
- 简洁分层架构
- 一切皆文件
- 内核和用户空间分离
2. 设计哲学:
- 单一职责
- 组合优于功能
- 简洁性
- 可移植性
3. 系统调用:
- 丰富的系统调用
- 简洁的接口
- 标准化的API
4. 文件系统:
- 层次化结构
- 统一的文件接口
- 设备文件
影响:
- 现代操作系统的基础
- 设计哲学的传承
- 标准化的重要参考
- 开源运动的重要推动
应用领域:
- 服务器
- 工作站
- 企业环境
- 作为其他系统的基础
10.4 macOS操作系统
macOS是Apple公司开发的操作系统,用于Mac计算机。macOS基于Unix(BSD),结合了Unix的稳定性和Apple的设计美学,提供了良好的用户体验和强大的功能。
10.4.1 macOS系统架构
macOS架构概述
macOS采用分层架构,基于Darwin(BSD Unix),包含多个层次和框架。
macOS架构层次:
1. 应用层(Application Layer):
- 用户应用程序
- Cocoa应用
- Unix命令行工具
2. 应用框架层(Application Frameworks):
- Cocoa框架
- Carbon框架(已废弃)
- 其他框架
3. 图形和媒体层(Graphics & Media):
- Quartz(图形系统)
- OpenGL/Metal
- Core Audio/Video
4. 应用服务层(Application Services):
- Core Services
- Core Foundation
- 系统服务
5. Darwin核心(Darwin Core):
- BSD内核
- Mach微内核
- I/O Kit
- 系统库
架构图:
┌─────────────────────────────────┐
│ 应用程序 │
│ (Cocoa, Unix工具) │
├─────────────────────────────────┤
│ Cocoa框架 │
├─────────────────────────────────┤
│ 图形和媒体 │
│ (Quartz, OpenGL, Metal) │
├─────────────────────────────────┤
│ 应用服务 │
│ (Core Services) │
├─────────────────────────────────┤
│ Darwin (BSD + Mach) │
├─────────────────────────────────┤
│ I/O Kit │
└─────────────────────────────────┘
硬件(Hardware)
Darwin内核
Darwin内核:
组成:
1. XNU内核:
- 基于Mach微内核
- 整合BSD Unix
- 混合内核架构
2. Mach微内核:
- 消息传递
- 任务和线程管理
- 内存管理
- IPC
3. BSD层:
- POSIX API
- 网络协议栈
- 文件系统
- 进程管理
特点:
- 混合内核架构
- 结合Mach和BSD优势
- Unix兼容
- Apple优化
I/O Kit:
- 设备驱动框架
- 面向对象
- 热插拔支持
- 电源管理
Cocoa框架
Cocoa框架:
定义:
- macOS和iOS的应用开发框架
- 面向对象
- Objective-C和Swift
主要框架:
1. Foundation:
- 基础类
- 字符串、集合、日期等
- 网络和文件操作
2. AppKit(macOS):
- 用户界面
- 窗口和控件
- 事件处理
3. UIKit(iOS):
- iOS用户界面
- 触摸事件
- 视图控制器
特点:
- MVC架构
- 委托模式
- 通知机制
- 内存管理(ARC)
10.4.2 macOS特色功能
Quartz图形系统
Quartz:
组成:
1. Quartz 2D:
- 2D图形渲染
- PDF渲染
- 矢量图形
2. Quartz Compositor:
- 窗口合成
- 图形加速
- 视觉效果
特点:
- PDF作为图形模型
- 分辨率独立
- 硬件加速
- 平滑动画
Core Animation:
- 动画框架
- 硬件加速
- 简化动画开发
- 流畅的用户界面
Spotlight搜索
Spotlight:
功能:
- 系统级搜索
- 实时索引
- 全文搜索
- 元数据搜索
索引:
- 自动索引文件
- 提取元数据
- 内容索引
- 快速搜索
搜索内容:
- 文件名
- 文件内容
- 元数据
- 邮件、联系人等
API:
- Spotlight API
- 应用可以集成
- 提供搜索功能
Time Machine备份
Time Machine:
功能:
- 自动备份系统
- 增量备份
- 版本历史
- 快速恢复
工作原理:
1. 定期备份
2. 增量备份(只备份变化)
3. 版本快照
4. 自动管理空间
恢复:
- 完整系统恢复
- 文件恢复
- 应用恢复
- 时间点恢复
存储:
- 外置硬盘
- Time Capsule
- 网络存储
Gatekeeper和沙箱
Gatekeeper:
功能:
- 应用安全控制
- 签名验证
- 阻止未签名应用
- 保护用户
级别:
1. Mac App Store:
- 只能运行App Store应用
2. Mac App Store和被认可开发者:
- App Store + 签名应用
3. 任何来源(不推荐):
- 允许任何应用
沙箱(Sandbox):
- 应用隔离
- 权限控制
- 资源限制
- 安全性
沙箱权限:
- 文件访问
- 网络访问
- 硬件访问
- 其他权限
其他特色功能
其他特色功能:
1. AirDrop:
- 无线文件传输
- 设备间直接传输
- 加密传输
2. Handoff:
- 设备间连续性
- 跨设备工作
- iCloud同步
3. Mission Control:
- 窗口管理
- 虚拟桌面
- 应用切换
4. Notification Center:
- 通知中心
- 系统通知
- 应用通知
5. Dashboard(已废弃):
- 小工具桌面
- 快速信息
6. Automator:
- 自动化工具
- 工作流
- 脚本生成
7. AppleScript:
- 脚本语言
- 自动化
- 应用控制
10.4.3 macOS文件系统(APFS)
APFS概述
APFS(Apple File System):
特点:
- macOS和iOS的现代文件系统
- 替换HFS+
- 专为闪存优化
- 支持加密和快照
设计目标:
- 性能优化
- 数据完整性
- 加密支持
- 快照和克隆
主要特性:
1. 写时复制(Copy-on-Write)
2. 快照(Snapshots)
3. 克隆(Clones)
4. 加密(Encryption)
5. 空间共享(Space Sharing)
6. 快速目录大小计算
APFS特性详解
APFS特性:
1. 写时复制(COW):
- 修改时不覆盖原数据
- 写入新位置
- 提高数据安全性
- 支持快照
2. 快照(Snapshots):
- 瞬间创建
- 只读时间点视图
- 用于Time Machine
- 节省空间
3. 克隆(Clones):
- 文件/目录克隆
- 共享数据块
- 快速复制
- 节省空间
4. 加密(Encryption):
- 全盘加密
- 单文件加密
- 多密钥支持
- 硬件加速
5. 空间共享(Space Sharing):
- 容器内卷共享空间
- 动态分配
- 灵活管理
6. 性能优化:
- 优化SSD
- 减少碎片
- 快速元数据操作
- 64位inode
APFS结构
APFS结构:
容器(Container):
- 物理存储的逻辑分组
- 包含多个卷
- 共享存储空间
卷(Volume):
- 文件系统实例
- 独立的命名空间
- 共享容器空间
- 可以有多个卷
对象存储:
- 对象作为基本单位
- 文件和目录都是对象
- 元数据作为对象
B-tree结构:
- 用于索引
- 快速查找
- 高效更新
APFS vs HFS+对比
APFS vs HFS+:
特性 APFS HFS+
────────────────────────────────────────
最大文件 8EB 8EB
最大文件系统 8EB 8EB
快照 支持 不支持
克隆 支持 不支持
加密 原生支持 文件级
COW 是 否
空间共享 是 否
性能 优化(SSD) 一般
时间戳 纳秒 秒
大小计算 快速 慢
碎片 少 多
macOS操作系统总结
macOS操作系统总结:
1. 架构特点:
- 基于Darwin(BSD + Mach)
- Cocoa应用框架
- 混合内核
- Unix兼容
2. 特色功能:
- Quartz图形系统
- Spotlight搜索
- Time Machine备份
- Gatekeeper安全
- 沙箱机制
3. 文件系统:
- APFS现代文件系统
- 快照和克隆
- 加密支持
- 性能优化
优势:
- Unix稳定性
- 优秀用户体验
- 硬件软件集成
- 安全性好
- 开发者工具完善
应用领域:
- 个人计算机
- 创意工作
- 开发环境
- 企业环境
附录
A. 操作系统术语表
进程和线程
术语 英文 说明
─────────────────────────────────────────────────
进程 Process 程序的执行实例
线程 Thread 进程内的执行单元
进程控制块 PCB (Process Control 操作系统管理进程的数据结构
Block)
线程控制块 TCB (Thread Control 操作系统管理线程的数据结构
Block)
上下文切换 Context Switch 从一个进程/线程切换到另一个
调度 Scheduling 选择下一个运行的进程/线程
优先级 Priority 进程/线程的执行优先级
时间片 Time Slice 分配给进程的时间配额
死锁 Deadlock 多个进程相互等待,无法继续
饥饿 Starvation 进程长期得不到资源
内存管理
术语 英文 说明
─────────────────────────────────────────────────
虚拟内存 Virtual Memory 程序的逻辑地址空间
物理内存 Physical Memory 实际的硬件内存
页面 Page 虚拟内存的基本单位
页框 Page Frame 物理内存的基本单位
页面错误 Page Fault 访问不在内存中的页面
交换 Swapping 将页面移入/移出内存
分段 Segmentation 将内存分为逻辑段
分页 Paging 将内存分为固定大小页
TLB Translation Lookaside 地址转换快表
Buffer
工作集 Working Set 进程当前使用的页面集合
文件系统
术语 英文 说明
─────────────────────────────────────────────────
文件系统 File System 管理文件的系统
inode Index Node 文件的元数据节点
目录 Directory 文件的组织结构
路径 Path 文件的访问路径
硬链接 Hard Link 多个文件名指向同一文件
软链接 Symbolic Link 指向另一个文件的链接
挂载 Mount 将文件系统连接到目录树
格式化 Format 创建文件系统结构
日志 Journaling 记录文件系统更改的日志
碎片 Fragmentation 文件不连续存储
同步和通信
术语 英文 说明
─────────────────────────────────────────────────
临界区 Critical Section 需要互斥访问的代码段
互斥 Mutual Exclusion 同一时刻只有一个进程能访问
信号量 Semaphore 同步原语,控制资源访问
互斥锁 Mutex 互斥访问的锁
条件变量 Condition Variable 用于线程间条件等待
管程 Monitor 高级同步机制
死锁 Deadlock 循环等待资源
活锁 Livelock 进程持续改变状态但不进展
管道 Pipe 进程间通信通道
共享内存 Shared Memory 多个进程共享的内存区域
消息队列 Message Queue 进程间消息传递
调度算法
术语 英文 说明
─────────────────────────────────────────────────
FCFS First-Come-First- 先来先服务调度
Served
SJF Shortest Job First 最短作业优先调度
RR Round Robin 时间片轮转调度
优先级调度 Priority Scheduling 按优先级调度
多级反馈队列 Multilevel Feedback 多个队列,任务可以在队列间移动
Queue
抢占式 Preemptive 可以强制剥夺CPU
非抢占式 Non-preemptive 进程主动释放CPU
响应时间 Response Time 从提交到首次响应的时间
周转时间 Turnaround Time 从提交到完成的时间
虚拟化和云计算
术语 英文 说明
─────────────────────────────────────────────────
虚拟机 Virtual Machine 虚拟的计算机系统
Hypervisor 虚拟机监控器 管理虚拟机的软件层
容器 Container 轻量级虚拟化技术
IaaS Infrastructure as a 基础设施即服务
Service
PaaS Platform as a Service 平台即服务
SaaS Software as a Service 软件即服务
B. 系统调用参考
Linux/Unix常用系统调用
进程控制:
系统调用 说明 参数
─────────────────────────────────────────────────
fork() 创建子进程 无
execve() 执行程序 路径、参数、环境变量
exit() 退出进程 退出码
wait() 等待子进程 状态指针
waitpid() 等待指定子进程 进程ID、状态、选项
getpid() 获取进程ID 无
getppid() 获取父进程ID 无
kill() 发送信号 进程ID、信号
signal() 设置信号处理 信号、处理函数
文件操作:
系统调用 说明 参数
─────────────────────────────────────────────────
open() 打开文件 路径、标志、模式
read() 读文件 文件描述符、缓冲区、大小
write() 写文件 文件描述符、缓冲区、大小
close() 关闭文件 文件描述符
lseek() 定位文件 文件描述符、偏移、起始位置
stat() 获取文件信息 路径、状态结构
fstat() 获取文件信息 文件描述符、状态结构
目录操作:
系统调用 说明 参数
─────────────────────────────────────────────────
mkdir() 创建目录 路径、模式
rmdir() 删除目录 路径
opendir() 打开目录 路径
readdir() 读目录 目录流
closedir() 关闭目录 目录流
chdir() 改变目录 路径
内存管理:
系统调用 说明 参数
─────────────────────────────────────────────────
brk() 调整数据段 新结束地址
sbrk() 调整数据段 增量
mmap() 内存映射 地址、长度、保护、标志、文件描述符、偏移
munmap() 取消映射 地址、长度
Windows API参考
进程和线程:
API 说明 参数
─────────────────────────────────────────────────
CreateProcess() 创建进程 应用程序名、命令行等
CreateThread() 创建线程 安全属性、栈大小、函数、参数等
ExitProcess() 退出进程 退出码
WaitForSingleObject() 等待对象 句柄、超时
GetCurrentProcessId() 获取当前进程ID 无
GetCurrentThreadId() 获取当前线程ID 无
TerminateProcess() 终止进程 进程句柄、退出码
文件操作:
API 说明 参数
─────────────────────────────────────────────────
CreateFile() 创建/打开文件 文件名、访问模式、共享模式等
ReadFile() 读文件 文件句柄、缓冲区、大小等
WriteFile() 写文件 文件句柄、缓冲区、大小等
CloseHandle() 关闭句柄 句柄
SetFilePointer() 定位文件 文件句柄、偏移、起始位置
GetFileSize() 获取文件大小 文件句柄
内存管理:
API 说明 参数
─────────────────────────────────────────────────
VirtualAlloc() 分配虚拟内存 地址、大小、类型、保护
VirtualFree() 释放虚拟内存 地址、大小、类型
HeapAlloc() 堆分配 堆句柄、标志、大小
HeapFree() 堆释放 堆句柄、标志、地址
C. 操作系统实验指导
实验1:进程创建和管理
目标:
- 理解进程的创建过程
- 掌握fork()和exec()的使用
- 理解进程间关系
实验内容:
1. 编写程序使用fork()创建子进程
2. 使用exec()执行新程序
3. 使用wait()等待子进程
4. 观察进程ID和父子关系
实验要求:
- 运行程序并观察输出
- 使用ps命令查看进程
- 分析进程创建过程
示例代码(Linux):
c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("Child process, PID: %d, PPID: %d\n",
getpid(), getppid());
execl("/bin/ls", "ls", "-l", NULL);
} else if (pid > 0) {
// 父进程
printf("Parent process, PID: %d, Child PID: %d\n",
getpid(), pid);
wait(NULL);
printf("Child process finished\n");
}
return 0;
}
实验2:进程间通信
目标:
- 理解管道通信
- 掌握信号的使用
- 理解共享内存
实验内容:
1. 使用管道实现进程间通信
2. 使用信号进行进程间通知
3. 使用共享内存传递数据
示例代码(管道):
c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd[2];
char message[] = "Hello from parent!";
char buffer[100];
pipe(fd);
if (fork() == 0) {
// 子进程:读
close(fd[1]);
read(fd[0], buffer, sizeof(buffer));
printf("Child received: %s\n", buffer);
close(fd[0]);
} else {
// 父进程:写
close(fd[0]);
write(fd[1], message, strlen(message) + 1);
close(fd[1]);
wait(NULL);
}
return 0;
}
实验3:线程编程
目标:
- 理解线程的创建和同步
- 掌握互斥锁的使用
- 理解线程安全
实验内容:
1. 创建多个线程
2. 使用互斥锁保护共享资源
3. 观察线程并发执行
示例代码(Linux pthread):
c
#include <stdio.h>
#include <pthread.h>
int counter = 0;
pthread_mutex_t mutex;
void* thread_func(void* arg) {
for (int i = 0; i < 100000; i++) {
pthread_mutex_lock(&mutex);
counter++;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t threads[4];
pthread_mutex_init(&mutex, NULL);
for (int i = 0; i < 4; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for (int i = 0; i < 4; i++) {
pthread_join(threads[i], NULL);
}
printf("Counter: %d\n", counter);
pthread_mutex_destroy(&mutex);
return 0;
}
实验4:内存管理
目标:
- 理解虚拟内存
- 掌握内存分配
- 观察内存使用
实验内容:
1. 使用malloc()分配内存
2. 使用mmap()进行内存映射
3. 观察内存使用情况
实验工具:
- valgrind:内存检查工具
- /proc/meminfo:内存信息
- top/htop:进程内存查看
实验5:文件系统
目标:
- 理解文件系统操作
- 掌握文件I/O
- 理解文件权限
实验内容:
1. 文件读写操作
2. 目录操作
3. 文件权限设置
4. 文件系统信息查看
实验命令:
- ls -l:查看文件详细信息
- stat:查看文件状态
- df:查看文件系统使用情况
- du:查看目录大小
D. 参考资料与延伸阅读
经典教材
1. 《操作系统概念》(Operating System Concepts)
作者:Abraham Silberschatz, Peter Baer Galvin, Greg Gagne
出版社:John Wiley & Sons
推荐指数:⭐⭐⭐⭐⭐
特点:经典教材,内容全面,适合教学
2. 《现代操作系统》(Modern Operating Systems)
作者:Andrew S. Tanenbaum, Herbert Bos
出版社:Prentice Hall
推荐指数:⭐⭐⭐⭐⭐
特点:深入浅出,理论与实践结合
3. 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective)
作者:Randal E. Bryant, David R. O'Hallaron
出版社:Pearson
推荐指数:⭐⭐⭐⭐⭐
特点:从程序员角度理解系统
4. 《操作系统:设计与实现》(Operating Systems: Design and Implementation)
作者:Andrew S. Tanenbaum, Albert S. Woodhull
出版社:Prentice Hall
推荐指数:⭐⭐⭐⭐
特点:结合Minix实例,深入理解
在线资源
1. Linux内核源码:
- https://www.kernel.org/
- 最新内核源码
- 文档和邮件列表
2. OS Dev Wiki:
- https://wiki.osdev.org/
- 操作系统开发资源
- 教程和示例
3. MIT 6.828课程:
- https://pdos.csail.mit.edu/6.828/
- MIT操作系统课程
- 实验和材料
4. Stanford CS140:
- 斯坦福操作系统课程
- 视频和材料
5. Linux Documentation Project:
- https://www.tldp.org/
- Linux文档
- HOWTO和指南
重要论文
1. "The UNIX Time-Sharing System" (1974)
作者:Dennis M. Ritchie, Ken Thompson
介绍Unix系统的经典论文
2. "Monitors: An Operating System Structuring Concept" (1974)
作者:C. A. R. Hoare
管程概念的提出
3. "The Design and Implementation of a Log-Structured File System" (1991)
作者:Mendel Rosenblum, John K. Ousterhout
日志文件系统设计
4. "End-to-End Arguments in System Design" (1984)
作者:J. H. Saltzer, D. P. Reed, D. D. Clark
系统设计原则
开源项目
1. Linux内核:
- 最成功的开源操作系统
- 学习和贡献的好项目
2. FreeBSD:
- Unix-like操作系统
- 优秀的文档
3. Minix:
- 教学用操作系统
- Tanenbaum开发
4. xv6:
- MIT教学用操作系统
- 简化版本,易于理解
5. OSASK:
- 日本开发的小型OS
- 代码清晰,适合学习
学习路径建议
初学者:
1. 阅读经典教材
2. 完成课后习题
3. 编写简单的系统调用
4. 理解基本概念
进阶学习:
1. 阅读内核源码
2. 参与开源项目
3. 实现简单的操作系统
4. 深入研究特定领域
实践项目:
1. 实现简单的shell
2. 实现简单的文件系统
3. 实现进程调度算法
4. 实现内存管理器
5. 参与内核开发
相关领域延伸
1. 分布式系统:
- 分布式操作系统
- 云计算平台
- 分布式存储
2. 嵌入式系统:
- 实时操作系统
- 嵌入式Linux
- 设备驱动开发
3. 系统安全:
- 操作系统安全
- 恶意软件分析
- 安全机制设计
4. 性能优化:
- 系统性能调优
- 内存优化
- I/O优化
5. 虚拟化:
- 虚拟机技术
- 容器技术
- 云计算基础设施
结语
操作系统是计算机科学的核心领域之一,理解操作系统对于理解计算机系统的工作原理至关重要。本教程涵盖了操作系统的主要概念和原理,希望读者能够通过学习和实践,深入理解操作系统的工作机制。
继续学习和实践是掌握操作系统的关键。建议读者:
- 阅读经典教材和论文
- 动手编写代码和实践
- 参与开源项目
- 关注操作系统的最新发展
祝学习顺利!