进程与线程
进程
进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位
每个进程拥有独立的内存空间(代码、数据、堆栈等)、系统资源(如文件句柄、网络连接)和至少一个执行线程
如浏览器为每个 Tab 页分配独立进程(如果是单进程,那么某个 Tab 页崩溃了,就影响了整个浏览器)
线程
线程是进程内的执行单元,是 CPU 调度的基本单位
同一进程内的所有线程共享进程的内存空间和资源,但每个线程拥有独立的栈和程序计数器
JS 中 WebWorker 是一个线程,它可以和主线程共享内存数据,独立运行不阻塞 UI
进程间的通信
进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同进程之间交换信息和数据的过程,常见的进程通信方式包括:
- 管道:用于父子进程单向通信
- 消息队列:结构化数据、异步通信
- 共享内存:多个进程可以访问同一块内存区域
- 信号:用于进程间的同步
- 套接字:用于网络通信
线程间通信与进程间通信类似,但由于线程之间共享进程的资源,线程间通信通常比进程间通信更高效
堆和栈
操作系统对内存空间的两种管理方式
对比维度 | 栈 | 堆 |
---|---|---|
管理方式 | 操作系统自动管理,函数执行时分配,执行完毕后自动释放 | 动态手动分配释放,通过垃圾回收管理 |
访问速度 | 快(无碎片,内存连续分配) | 慢(内存分散,需通过引用地址间接访问) |
空间大小 | 小 | 大 |
灵活性 | 固定大小,生命周期短 | 动态扩展,生命周期可控 |
典型错误 | 栈溢出(如递归过深) | 内存泄漏、野指针 |
JS 中原始类型的值存放在栈中,引用类型的值存放在堆中
调度算法
CPU 调度算法
- 先来先服务(FCFS, First-Come First-Served):按作业到达顺序分配 CPU,先到先执行。
- 短作业优先(SJF, Shortest Job First):优先调度运行时间最短的作业。
- 轮转调度(RR, Round Robin):为每个作业分配固定时间片(如 10ms),时间片用完则切换至下一作业。
- 优先级调度(Priority Scheduling):根据作业优先级分配 CPU,高优先级先执行。
- 多级反馈队列(MLFQ, Multilevel Feedback Queue):设置多个优先级队列,新作业进入最高优先级队列。
- 完全公平调度器(CFS, Completely Fair Scheduler):基于虚拟运行时间(vruntime)分配 CPU。
页面置换算法
内存的页面置换算法是操作系统中用于管理虚拟内存的关键机制,当物理内存不足时,决定哪些内存页面应被换出到磁盘
最佳置换算法(OPT, Optimal Page Replacement)
- 原理:替换未来最长时间不会被访问的页面。
- 优点:理论上的最低缺页率,作为性能评估基准。
- 缺点:需预知未来访问序列,无法实际实现。
- 适用场景:仅用于算法研究或模拟测试。
先进先出算法(FIFO, First-In First-Out)
- 原理:替换最早进入内存的页面。
- 实现:维护一个页面队列,新页面加入队尾,置换时选择队首页面。
- 缺点:
- Belady 异常:增加物理页框数可能反而导致缺页率上升。
- 忽略访问频率,可能频繁置换常用页面。
最近最少使用算法(LRU, Least Recently Used)
- 原理:替换最长时间未被访问的页面。
- 实现:
- 链表法:维护一个按访问时间排序的链表,每次访问将页面移至链表头部。
- 计数器法:为每个页面维护时间戳,选择时间戳最小的页面置换。
- 优点:符合时间局部性原理,缺页率接近 OPT。
- 缺点:硬件开销大(需维护精确访问记录)。
时钟算法(CLOCK/NRU, Not Recently Used)
- 原理:近似 LRU,使用环形链表和访问位(Reference Bit)。
- 每个页面有一个访问位(初始为 0),被访问时置为 1。
- 置换时,按顺序扫描页面,若访问位为 0 则替换;若为 1 则置为 0 并继续扫描。
- 改进版(考虑修改位):
- 优先替换未修改(干净页)且未访问的页面,减少磁盘 I/O。
- 优点:实现简单,开销低于 LRU。
- 缺点:精确度略低于 LRU。
最不常用算法(LFU, Least Frequently Used)
- 原理:替换访问次数最少的页面。
- 实现:为每个页面维护计数器,每次访问时递增。
- 缺点:
- 历史权重问题:旧的高频页面可能长期驻留,即使不再使用。
- 计数器溢出风险。
- 改进:定期老化(Aging),减少旧访问记录的权重。
磁盘调度算法
- 先来先服务(FCFS, First-Come First-Served):按请求到达顺序依次处理,无优先级调整。
- 最短寻道时间优先(SSTF, Shortest Seek Time First):优先处理离当前磁头位置最近的请求。
- 扫描算法(SCAN, 电梯算法):磁头单向移动至磁盘一端,处理沿途请求;到达端点后反向移动。
- 循环扫描算法(C-SCAN, Circular SCAN):磁头单向移动至磁盘一端后,立即返回起点重新开始(返程不处理请求)。
- 分步扫描(N-Step SCAN):将请求队列分为多个子队列,依次对每个子队列执行 SCAN 算法。
6.1 进程调度/页面置换/磁盘调度算法 | 小林coding
大厂面试爱问的「调度算法」,20 张图一举拿下 - 小林coding - 博客园