学习目标:深入理解操作系统核心原理,为Java并发编程和性能优化打下坚实基础
想象一下,你是一个大型图书馆的馆长…
没有操作系统 vs 有操作系统
没有操作系统:
读者1 → 直接找书架 ← 读者2
↘ ↙
发生冲突!
有操作系统:
读者1 → 图书管理系统 → 有序分配 → 书架1
读者2 → 图书管理系统 → 有序分配 → 书架2
读者3 → 图书管理系统 → 排队等待 → 书架?
操作系统的核心职责:
• 资源管理:CPU、内存、磁盘、网络
• 进程调度:决定哪个程序先运行
• 内存管理:为程序分配和回收内存
• 文件管理:统一的文件存储接口
• 设备管理:统一的硬件访问接口
操作系统特性:
️ 操作系统分层架构:
┌─────────────────────────────────────┐
│ 用户应用程序 │ ← 用户态
├─────────────────────────────────────┤
│ 系统调用接口 │ ← 内核态边界
├─────────────────────────────────────┤
│ 进程管理 │ 内存管理 │ 文件管理 │
├─────────────────────────────────────┤ ← 内核态
│ 设备管理 │ 网络管理 │ 安全管理 │
├─────────────────────────────────────┤
│ 硬件抽象层 │
└─────────────────────────────────────┘
硬件层
进程生命周期:
创建 → 就绪 → 运行 → 阻塞 → 终止
↑ ↓ ↓ ↑
└──────┴──────┴──────┘
进程状态转换:
• 创建→就绪:进程创建完成,等待CPU
• 就绪→运行:获得CPU时间片
• 运行→阻塞:等待I/O或其他资源
• 阻塞→就绪:所需资源到位
• 运行→就绪:时间片用完
• 运行→终止:进程执行完毕
进程控制块(PCB):
┌─────────────────┐
│ 进程ID(PID) │
│ 进程状态 │
│ CPU寄存器 │
│ 内存管理信息 │
│ 文件描述符 │
│ 调度信息 │
└─────────────────┘
进程 vs 线程对比:
进程(重量级):
┌─────────────────┐
│ 进程A │
│ ┌─────┐ ┌─────┐ │
│ │线程1│ │线程2│ │
│ └─────┘ └─────┘ │
│ 独立内存空间 │
└─────────────────┘
线程(轻量级):
• 共享进程内存空间
• 拥有独立的栈和寄存器
• 创建开销小,切换快
• 通信简单但需要同步
线程实现模型:
1. 用户级线程:内核不感知,效率高但无法利用多核
2. 内核级线程:内核管理,可利用多核但开销大
3. 混合模型:结合两者优势
CPU调度算法详解:
1. 先来先服务(FCFS):
进程: A(24) → B(3) → C(3)
时间: 0────24──27─30
平均等待时间: (0+24+27)/3 = 17
2. 最短作业优先(SJF):
进程: B(3) → C(3) → A(24)
时间: 0─3──6────30
平均等待时间: (0+3+6)/3 = 3
3. 时间片轮转(RR):
时间片=4,进程队列: A(24),B(3),C(3)
A(4) → B(3) → C(3) → A(4) → A(4) → A(4) → A(4) → A(4)
4. 优先级调度:
┌─────────────────┐
│ 优先级队列 │
│ 高 ┌─────┐ │
│ ↑ │进程A│ │
│ │ └─────┘ │
│ │ ┌─────┐ │
│ │ │进程B│ │
│ │ └─────┘ │
│ 低 ┌─────┐ │
│ │进程C│ │
│ └─────┘ │
└─────────────────┘
进程同步机制:
1. 互斥锁(Mutex):
```java
synchronized(lock) {
// 临界区代码
共享资源访问
}
信号量(Semaphore):
Semaphore semaphore = new Semaphore(3); // 允许3个线程
semaphore.acquire(); // P操作,获取资源
try {
// 使用资源
} finally {
semaphore.release(); // V操作,释放资源
}
条件变量(Condition):
ReentrantLock lock = new ReentrantLock();
Condition condition = lock