[{"data":1,"prerenderedAt":220},["ShallowReactive",2],{"blog:\u002Fblog\u002F2021\u002F03\u002F04\u002Fhigh-concurrency-2\u002F":3},{"id":4,"title":5,"body":6,"categories":183,"comments":185,"date":186,"description":187,"draft":188,"extension":189,"legacySlug":190,"meta":191,"navigation":185,"path":214,"seo":215,"stem":216,"tags":217,"updated":218,"__hash__":219},"blog\u002Fblog\u002F2021\u002F03\u002F04\u002Fhigh-concurrency-2.md","高并发程序设计(二)：多进程并发模型",{"type":7,"value":8,"toc":176},"minimark",[9,13,16,19,24,33,36,39,42,46,59,62,65,69,72,105,108,157,160,163,166],[10,11,12],"p",{},"本篇为高并发程序设计系列第二篇，主要内容为：",[10,14,15],{},"多进程并发模型",[17,18],"hr",{},[20,21,23],"h3",{"id":22},"一模型简介","一：模型简介",[25,26,27,30],"blockquote",{},[10,28,29],{},"“进程是操作系统提供的最古老的也是最重要的抽象概念之一。即使可以利用的CPU只有一个，但它们也支持并发操作的能力。它们将一个单独的CPU变换成多个虚拟的CPU。没有进程的抽象，现代计算将不复存在。”",[10,31,32],{},"摘录来自: Andrews Tanenbaum. “现代操作系统（原书第3版） (计算机科学丛书)。”",[10,34,35],{},"该系列上篇博文提到过，因为CPU的速度越来越快，更多的进程倾向为I\u002FO密集型。而对于I\u002FO密集型进程来说，如果只启动单个进程，则CPU的大部分时间因为等待I\u002FO完成而白白浪费。所以即便只有一个单核CPU，通过启动多个进程来提供服务，可以更高效地利用CPU的计算能力，并发处理多个任务。",[10,37,38],{},"另外，如果是在一个多核环境，启动多个进程可以充分利用多核，进行并行运算。",[10,40,41],{},"基于以上两个原因，多进程并发模型自然而来。",[43,44,45],"h4",{"id":45},"特点",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"每个进程可以并发处理1个请求，并发能力等于进程数量",[50,54,55],{},"由操作系统负责进程调度，程序无法控制",[50,57,58],{},"可以通过操作系统命令影响进程调度优先级",[43,60,61],{"id":61},"举例",[10,63,64],{},"在一台4核服务器上，运行20个PHP进程。 由操作系统负责给某个PHP进程分配某个CPU内核的时间片，实现20个并发处理",[20,66,68],{"id":67},"二优缺点","二：优缺点",[43,70,71],{"id":71},"优点",[47,73,74,77,88,99,102],{},[50,75,76],{},"并发模型非常简单，由操作系统调度运行稳定强壮",[50,78,79,80],{},"非常容易管理\n",[47,81,82,85],{},[50,83,84],{},"很容易通过操作系统方便的监控，例如每个进程CPU，内存变化状况",[50,86,87],{},"很容易通过操作系统管理进程，例如可以通过给进程发送signal，实现各种管理",[50,89,90,91],{},"隔离性非常好\n",[47,92,93,96],{},[50,94,95],{},"一个进程崩溃不会影响其他进程",[50,97,98],{},"某进程出现问题的时候，只要杀掉它重启即可，不影响整体服务的可用性",[50,100,101],{},"代码兼容性极好，不必考虑线程安全问题",[50,103,104],{},"多进程可以有效利用多核CPU，实现并行处理",[43,106,107],{"id":107},"缺点",[47,109,110,113,121,132,143],{},[50,111,112],{},"独立的地址空间使得进程共享状态信息比较困难。为了共享信息，它们必须使用显示的IPC机制。",[50,114,115,116],{},"内存消耗大",[47,117,118],{},[50,119,120],{},"每个独立进程都需要加载完整的应用环境，内存消耗超大。(COW技术可以缓解这个问题)\n例如: 每个PHP进程物理内存占用为20MB，50个workers，则需要1GB物理内存。",[50,122,123,124],{},"CPU消耗偏高",[47,125,126,129],{},[50,127,128],{},"多进程并发，需要CPU内核在多个进程间频繁切换， 而进程的上下文切换(context switch)是非常昂贵的。",[50,130,131],{},"如果使用IPC来共享状态信息，IPC开销也很高",[50,133,134,135],{},"并发处理能力有限",[47,136,137,140],{},[50,138,139],{},"每个进程只能并发处理1个请求",[50,141,142],{},"单台服务器启动的进程数有限，并发处理能力无法有效提高",[50,144,145,146],{},"只适合处理短请求，不适合处理长请求",[47,147,148,151,154],{},[50,149,150],{},"如果每个请求都能在很短时间内执行完毕，则不会造成进程被长期阻塞",[50,152,153],{},"一旦某个操作特别是IO操作阻塞，就会造成进程阻塞，当大面积IO操作阻塞发生，服务器就无法响应新的请求了",[50,155,156],{},"对于无法预知的外部IO操作，应用代码必须设置 timeout参数，以防进程阻塞",[10,158,159],{},"参考资料：",[10,161,162],{},"1.《现代操作系统》",[10,164,165],{},"2.《深入理解计算机系统》",[10,167,168,169],{},"3.",[170,171,175],"a",{"href":172,"rel":173},"https:\u002F\u002Fwww.iteye.com\u002Fblog\u002Frobbin-1744725",[174],"nofollow","Web并发模型粗浅探讨",{"title":177,"searchDepth":178,"depth":178,"links":179},"",2,[180,182],{"id":22,"depth":181,"text":23},3,{"id":67,"depth":181,"text":68},[184],"高并发",true,"2021-03-04","本篇为高并发程序设计系列第二篇，主要内容为： 多进程并发模型 一：模型简介 “进程是操作系统提供的最古老的也是最重要的抽象概念之一。即使可以利用的CPU只有一个，但它们也支持并发操作的能力。它们将一个单独的CPU变换成多个虚拟的CPU。没有进程的抽象，现代计算将不复存在。” 摘录来自: Andrew",false,"md","high-concurrency-2",{"excerpt":192},{"type":7,"value":193},[194,196,198,200,202,208,210,212],[10,195,12],{},[10,197,15],{},[17,199],{},[20,201,23],{"id":22},[25,203,204,206],{},[10,205,29],{},[10,207,32],{},[10,209,35],{},[10,211,38],{},[10,213,41],{},"\u002Fblog\u002F2021\u002F03\u002F04\u002Fhigh-concurrency-2",{"title":5,"description":187},"blog\u002F2021\u002F03\u002F04\u002Fhigh-concurrency-2",[184],null,"_7_brjd0gLt5fxvPX7sz-bo6rWM9CevxSheBJe6Ghb8",1783807996336]