进程与线程

进程

进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位
每个进程拥有独立的内存空间(代码、数据、堆栈等)、系统资源(如文件句柄、网络连接)和至少一个执行线程

如浏览器为每个 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 - 博客园