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 创建命名管道,其本质是先进先出缓冲区,可用于建立不同进程间的数据通信。