shell并发(Concurrency)与并行(Parallelism)核心原理
核心原理主要体现在多核资源利用、进程调度与上下文切换、异步协作以及进程间通信(IPC)四大方面。
1. 多核硬件利用
- 多核资源利用:现代计算机通常配备多核 CPU(包含多个逻辑处理器),软件或脚本需要主动利用多核才能获得性能提升。例如,多线程工具(如
pbzip2)能够自动检测 CPU 核心数,将任务拆分为多线程并行处理。 - Shell 任务并发:在 Bash 脚本中,可以通过在命令末尾添加后台操作符
&将任务放入后台并发执行。 - 并发数量控制:如果无限制生成上百个后台进程,可能强迫系统执行换页操作(Swapping)从而拖慢速度;此时可以使用
parallel等工具来优化资源利用,避免系统超载。
2. 进程调度与上下文切换(Context Switch)
时间片与优先级:Linux 内核通过调度器为进程分配 CPU时间片(Time Slice)。进程的优先级由Nice 值控制(范围为 -20 到 19),Nice值越低,调度器分配给该任务的 CPU 时间就越多。
上下文切换:当进程的时间片耗尽或因等待 I/O 被阻塞时,内核会保存其运行状态并切换到下一个进程。上下文切换分为主动切换(如等待 I/O)与被迫切换(如时间片到期)。频繁的上下文切换(如每秒万次以上)会产生较高的系统开销。
3.进程同步与异步协作
- **异步执行与
wait**:当父进程启动多个子进程异步执行时,需要保持协调。父进程可以通过使用$!保存后台进程的 PID 并调用wait命令,暂停执行直至所有并发子进程结束。
4. 进程间通信(IPC)与信号处理
- 信号机制:信号是一种异步的进程间通信方式,内核或用户可以通过发送信号(如 SIGINT、SIGTERM、SIGKILL)中断进程运行并触发对应的处理程序。Shell 脚本可以通过
trap命令捕获特定信号并执行自定义清理或响应逻辑。 - 命名管道(FIFO):除了传统管道外,Linux 还支持通过
mkfifo创建命名管道,其本质是先进先出缓冲区,可用于建立不同进程间的数据通信。