如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: 陈进涛
作者昵称: 江上轻烟
本文链接: https://zhizhi123.com/2021/03/04/high-concurrency-2/
本篇为高并发程序设计系列第二篇,主要内容为:
多进程并发模型
一:模型简介
“进程是操作系统提供的最古老的也是最重要的抽象概念之一。即使可以利用的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物理内存。
- 每个独立进程都需要加载完整的应用环境,内存消耗超大。(COW技术可以缓解这个问题)
- CPU消耗偏高
- 多进程并发,需要CPU内核在多个进程间频繁切换, 而进程的上下文切换(context switch)是非常昂贵的。
- 如果使用IPC来共享状态信息,IPC开销也很高
- 并发处理能力有限
- 每个进程只能并发处理1个请求
- 单台服务器启动的进程数有限,并发处理能力无法有效提高
- 只适合处理短请求,不适合处理长请求
- 如果每个请求都能在很短时间内执行完毕,则不会造成进程被长期阻塞
- 一旦某个操作特别是IO操作阻塞,就会造成进程阻塞,当大面积IO操作阻塞发生,服务器就无法响应新的请求了
- 对于无法预知的外部IO操作,应用代码必须设置 timeout参数,以防进程阻塞
参考资料:
1.《现代操作系统》
2.《深入理解计算机系统》
-------------本文结束,感谢您的阅读-------------
本文链接: https://zhizhi123.com/2021/03/04/high-concurrency-2/
版权声明: 本作品采用 署名—非商业性使用—相同方式共享 4.0 协议国际版 进行许可。转载请注明出处!