高并发程序设计(二):多进程并发模型

本篇为高并发程序设计系列第二篇,主要内容为: 多进程并发模型 一:模型简介 “进程是操作系统提供的最古老的也是最重要的抽象概念之一。即使可以利用的CPU只有一个,但它们也支持并发操作的能力。它们将一个单独的CPU变换成多个虚拟的CPU。没有进程的抽象,现代计算将不复存在。” 摘录来自: Andrew

高并发

本篇为高并发程序设计系列第二篇,主要内容为:

多进程并发模型


一:模型简介

“进程是操作系统提供的最古老的也是最重要的抽象概念之一。即使可以利用的CPU只有一个,但它们也支持并发操作的能力。它们将一个单独的CPU变换成多个虚拟的CPU。没有进程的抽象,现代计算将不复存在。”

摘录来自: Andrews Tanenbaum. “现代操作系统(原书第3版) (计算机科学丛书)。”

该系列上篇博文提到过,因为CPU的速度越来越快,更多的进程倾向为I/O密集型。而对于I/O密集型进程来说,如果只启动单个进程,则CPU的大部分时间因为等待I/O完成而白白浪费。所以即便只有一个单核CPU,通过启动多个进程来提供服务,可以更高效地利用CPU的计算能力,并发处理多个任务。

另外,如果是在一个多核环境,启动多个进程可以充分利用多核,进行并行运算。

基于以上两个原因,多进程并发模型自然而来。

特点

  • 每个进程可以并发处理1个请求,并发能力等于进程数量
  • 由操作系统负责进程调度,程序无法控制
  • 可以通过操作系统命令影响进程调度优先级

举例

在一台4核服务器上,运行20个PHP进程。 由操作系统负责给某个PHP进程分配某个CPU内核的时间片,实现20个并发处理

二:优缺点

优点

  • 并发模型非常简单,由操作系统调度运行稳定强壮
  • 非常容易管理
    • 很容易通过操作系统方便的监控,例如每个进程CPU,内存变化状况
    • 很容易通过操作系统管理进程,例如可以通过给进程发送signal,实现各种管理
  • 隔离性非常好
    • 一个进程崩溃不会影响其他进程
    • 某进程出现问题的时候,只要杀掉它重启即可,不影响整体服务的可用性
  • 代码兼容性极好,不必考虑线程安全问题
  • 多进程可以有效利用多核CPU,实现并行处理

缺点

  • 独立的地址空间使得进程共享状态信息比较困难。为了共享信息,它们必须使用显示的IPC机制。
  • 内存消耗大
    • 每个独立进程都需要加载完整的应用环境,内存消耗超大。(COW技术可以缓解这个问题) 例如: 每个PHP进程物理内存占用为20MB,50个workers,则需要1GB物理内存。
  • CPU消耗偏高
    • 多进程并发,需要CPU内核在多个进程间频繁切换, 而进程的上下文切换(context switch)是非常昂贵的。
    • 如果使用IPC来共享状态信息,IPC开销也很高
  • 并发处理能力有限
    • 每个进程只能并发处理1个请求
    • 单台服务器启动的进程数有限,并发处理能力无法有效提高
  • 只适合处理短请求,不适合处理长请求
    • 如果每个请求都能在很短时间内执行完毕,则不会造成进程被长期阻塞
    • 一旦某个操作特别是IO操作阻塞,就会造成进程阻塞,当大面积IO操作阻塞发生,服务器就无法响应新的请求了
    • 对于无法预知的外部IO操作,应用代码必须设置 timeout参数,以防进程阻塞

参考资料:

1.《现代操作系统》

2.《深入理解计算机系统》

3.Web并发模型粗浅探讨

ABOUT THE AUTHOR

织织

前大厂程序员、AI 工具开发者,正在记录从技术到产品的实践。

关于作者
DISCUSSION

评论与讨论

留下你的想法