从求职材料中拆出的通用知识,覆盖进程、线程、协程、IPC 与死锁。
进程和线程区别
| 项目 | 进程 | 线程 |
|---|---|---|
| 定义 | 资源分配单位 | CPU调度单位 |
| 地址空间 | 独立 | 共享 |
| 创建开销 | 大 | 小 |
| 切换开销 | 大 | 小 |
| 通信 | IPC | 共享内存 |
协程
协程是 用户态线程。
特点:
- 由程序调度
- 非抢占式
协程 vs 线程
| 项目 | 协程 | 线程 |
|---|---|---|
| 调度 | 用户态 | 操作系统 |
| 切换开销 | 极小 | 较大 |
| 上下文 | 少 | 多 |
| 并发能力 | 高 | 较低 |
协程优势
- 切换成本低
- 可以创建大量协程
- 适合高并发 IO
常见应用:
- 网络服务器
- 高并发框架
进程通信方式
常见 IPC:
管道
- 匿名管道
- 命名管道
特点:
- 半双工
消息队列
特点:
- 按消息传递
共享内存
特点:
- 速度最快
信号
特点:
- 异步通知
Socket
特点:
- 可以跨主机通信
共享内存优势
共享内存是 最快的 IPC。
原因:
其他 IPC:
用户态 → 内核 → 用户态
共享内存:
直接访问
优点:
- 无需数据复制
- 速度最快
缺点:
- 需要同步机制
信号进行进程同步
信号是 异步通知机制。
常见信号:
SIGINT
SIGTERM
SIGKILL
同步方式:
- 进程注册信号处理函数
- 收到信号
- 执行处理逻辑
信号常用于:
- 终止进程
- 通知事件
死锁
死锁定义
多个进程互相等待资源,导致永远无法执行。
死锁产生条件
必须同时满足:
- 互斥
- 占有并等待
- 不可抢占
- 循环等待
解决方法
预防
破坏四个条件之一。
例如:
- 一次申请所有资源
避免
动态判断资源分配。
例如:
银行家算法。
检测与恢复
系统检测死锁并终止进程。
银行家算法
银行家算法用于 死锁避免。
思想:
系统只有在 安全状态 时才分配资源。
核心概念
最大需求
进程最多需要多少资源。
已分配
当前已占资源。
剩余需求
need = max - allocation
安全状态
如果存在一个 安全序列
例如:
P1 → P3 → P2
所有进程都能完成。
系统就是安全的。