一、操作系统
1. 内存管理
什么是虚拟内存?
虚拟内存为程序提供了比物理内存更大的空间,同时提升了内存管理的灵活性和多任务处理能力。简单来说,虚拟地址空间是进程看到的连续、独立的内存空间,而实际物理地址是所有进程共享的有限资源。通过映射技术,我们实现了内存隔离、扩展以及页面交换。
内存隔离确保每个进程互不干扰;内存扩展让进程能处理更多数据;当物理内存不足时,系统会将不常用的数据交换到硬盘(Swap),释放内存供其他进程使用。相比早期的分段技术,现代分页机制效率更高,能有效消除外部碎片。
内存分段与分页的区别
- 分段:按逻辑功能划分(如代码段、数据段),容易产生外部碎片。
- 分页:将内存划分为固定大小的页(如 4KB),容易产生内部碎片。 两者相辅相成,共同服务于逻辑隔离、内存保护和共享等目标。
内核态与用户态
操作系统通过这两种模式控制硬件访问权限。用户态执行普通应用程序,内核态则负责特权操作(如系统调用、中断处理)。这种隔离保障了系统的稳定性和安全性。
中断与异常
- 中断:通常由外部设备触发(异步),如键盘输入、网络到达,提醒 CPU 处理事件。
- 异常:由当前指令引起(同步),如除零错误、非法内存访问,用于处理程序错误。
2. 进程与线程
进程 vs 线程
进程是资源分配的基本单位,拥有独立内存空间,创建和切换开销大,但安全性高,崩溃不影响他人。线程是 CPU 调度的最小单位,共享进程内存,创建和切换开销小,通信方便,但一个线程崩溃可能导致整个进程挂掉。
协程
协程是比线程更轻量的并发单元,由程序自身调度。它运行在同一线程内,无需锁机制,避免了竞态条件,非常适合高并发场景下的异步编程。
调度原则与算法
调度旨在提高 CPU 利用率、吞吐率,并减少周转时间和响应时间。常见算法包括先来先服务、最短作业优先、时间片轮转、多级反馈队列等。对于交互式应用,响应时间尤为关键。
进程间通信 (IPC)
由于进程内存隔离,通信需经过内核:
- 管道:单向通信,简单但效率低。
- 消息队列:内核维护的消息链表,适合中小数据。
- 共享内存:速度最快,直接映射物理内存,无需拷贝。
- 信号量:用于互斥与同步,非数据传输。
- 信号:唯一的异步通信机制,通知异常情况。
- Socket:跨主机通信。
互斥与同步
- 互斥:保证临界区同一时刻只有一个线程访问。
- 同步:协调执行顺序,如'操作 A 完成后才能执行 B'。 实现手段主要有锁(加锁/解锁)和信号量(P/V 操作)。例如生产者 - 消费者模型,利用锁和信号量解耦生产与消费,提升并发效率。
典型锁类型
- 自旋锁:忙等待,适用于短临界区。
- 互斥锁:最常见,保证独占访问。
- 读写锁:允许多读单写。
- 悲观锁:假设冲突概率高,访问必上锁。
- 乐观锁:先修改,冲突再回滚。
死锁
死锁需同时满足四个条件:互斥、持有并等待、不可剥夺、环路等待。破坏其中任一即可避免,常用方法是资源有序分配法。
孤儿与僵尸进程
- :子进程已退出,父进程未回收状态信息。占用 PID 资源,但不占 CPU/内存。父进程应及时调用 。


