多进程单线程模型与单进程多线程模型之争

多进程单线程模型与单进程多线程模型之争

似乎有人不知道nodejs是支持多核的?v0.10 Cluster可以搭建nodejs多核服务。v0.12重写了Cluster,据说提升了非常大的性能。

服务器,事件

多进程单线程模型典型代表:nginx
单进程多线程模型典型代表:memcached

另外redis, mongodb也可以说是走的“多进程单线程模”模型(集群),只不过作为数据库服务器,需要进行写保护,只提供了读同步。

原因很简单,因为服务器的发展大部分都是归功于Linux Unix,而不是Windows。

Linux内核提供的epoll为开发服务器提供了很大的便利,libevent和libev都是对epoll的封装,nginx自己实现了对epoll的封装。

libevent和libev都是知名的Linux系统C事件驱动编程框架。

我没说错的话,nodejs是建立在libev基础上。

memcached也依赖libevent。

所以,nginx在Windows上不像Linux快是有很大原因的。

模型,模型,多进程单线程 单进程多线程

  • 多进程单线程

    master进程管理worker进程:

    • 接收来自外界的信号
    • 向各worker进程发送信号
    • 监控woker进程的运行状态
    • 当woker进程退出后(异常情况下),会自动重新启动新的woker进程

    友情提示:nodejs属于这一种好不好,不是只能单核

单进程多线程

单进程多线程

  • 单进程多线程

    主线程负责监听客户端的连接请求,workers线程负责处理已经建立好的连接的读写等事件

单进程多线程

单进程多线程

单进程多线程肯定比多进程单线程快一些

多进程单线程单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境。

他们在实际运行中,所利用的CPU工作数应该都是相同的。也就是说,你有4核,在某个时刻要么是CPU同时在4个进程做任务(多进程单线程),要么是CPU同时在4个线程上做任务(单进程多线程)。

不过,单进程多线程肯定比多进程单线程快一些。

这是因为,多进程单线程的CPU切换,是从一个进程到另一个进程,而单进程多线程的CPU切换则只在一个进程内,每个进程|线程都有自己的上下文堆栈保存,进程间的切换消耗更大一些。

这就好比是,多进程单线程是在4个函数中切换,各自拥有自己的变量;单进程多线程在1个函数中的4个子函数切换,拥有相同的全局变量。

但是,没有你想象的“快几倍”。

副作用,副作用,单进程多线程肯定有其不利的一面

我一直提过副作用。

如果你仔细看多进程单线程的图,就应该明白,这种模型提供了一种保护机制。

当其中一个进程内部读取错误,master可以让ta重启。这使得你的服务器在表面上并没有感到“曾经崩溃”。

对于master,完全不涉及服务器的业务,使得ta能被安全隔离。

再来看单进程多线程

问题很明显,只有一个进程,一旦其中出现一个错误,整个进程都有可能挂掉。你当然可以为ta编写一个“守护程序”来重启,但是重启期间,你的服务器是真的“挂掉了”。

另外,编写单进程多线程这样的服务器,在代码上非常容易出错,而且难以控制代码的稳定性,有很多你难以琢磨的bug在等着你,因为有太多的锁,太多的全局变量需要处理,这也是函数式“纯函数”所反对的。

nodejs不能CPU密集处理?

你觉得ruby,python,php就能密集处理?

有人说:java, c#。

拜托,如果你真的想要密集处理,请使用C C++。(我个人只会用C)你见过哪个数据库服务器是java c#写的?

而现在,我觉得Rust lang是一个好的方向:

  • 面向操作系统编程
  • 从语言层面上提供并发
  • 自诩C++的替代者
  • 将会重写firefox
  • Mozilla开发
  • Javascript的作者Brendan Eich是编写者之一
  • 类似javascript的语法和编写体验

而且我已经开始憧憬未来使用nodejs + Rust开发服务器体验的场景。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113815.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Matlab 基础知识——矩阵操作及运算(矩阵、数组区别)

    Matlab 基础知识——矩阵操作及运算(矩阵、数组区别)看论文时,经常看到矩阵,但在记忆里又看到数组。那么问题来了,矩阵和数组分别是什么?二者有什么区别?看论文时,经常看到矩阵,但在记忆里又看到数组。那么问题来了,矩阵和数组分别是什么?二者有什么区别?在数学上,定义m×n个数(i=1,2…,m;j=1,2,…n)排成的m行n列的数表示为m行n列的矩阵,并且用大写加粗黑色字母表示。…

    2022年5月30日
    42
  • latex 包含的符号_LaTeX大括号

    latex 包含的符号_LaTeX大括号参考:"LaTex使用特殊章节符号(§)"LaTex使用特殊章节符号(§)在文件开头,加上以下内容:并在通过以下命令引用章节(section

    2022年8月4日
    4
  • 关于ip地址 :局域网 广域网 ip 公网 私网 ipv6 ipv4的区别、hosts文件和DNS域名解析说明

    关于ip地址 :局域网 广域网 ip 公网 私网 ipv6 ipv4的区别、hosts文件和DNS域名解析说明1.ip地址说明1.1网络基本知识说明(局域网/广域网/ip地址)场景分析:假如只有一台电脑,那么这台电脑的数据只会全部储存在此电脑的硬盘上,与其它的电脑不会产生任何关系,但是一台电脑干的事情比较少,往往需要多台电脑协同办公提高效率。问题1:多台电脑协同工作势必产生数据交互,如何进行数据交互呢???解决1:可以使用u盘之类的移动存储介质拷贝数据(缺点:需要手动的进行操作、无法做到数据的实时传输)解决2:使用线缆把2台电脑连接起来,通过这根线缆进行传输数据,这根线缆就叫做网线。如下图所示。问

    2022年10月18日
    2
  • 求生之路2机枪mod_求生之路2好看的枪械mod名字

    求生之路2机枪mod_求生之路2好看的枪械mod名字动态子弹(弹匣)数量修改工具:GCFScape、notepad++、vpk.exe自己在搜索引擎输入文件名找资源教程:教程均假设修改smg的静态子弹和动态子弹,其他枪械修改一样,只不过修改对象不同。1.先找出武器原始的数据文件(1).打开GCFScape,左上角File-open。找到“\Steam\SteamApps\common\Left4Dead2\left4dead…

    2025年6月29日
    3
  • 简易SDRAM控制器的verilog代码实现

    简易SDRAM控制器的verilog代码实现SDRAM是每隔15us进行刷新一次,但是如果当SDRAM需要进行刷新时,而SDRAM正在写数据,这两个操作之间怎么进行协调呢?需要保证写的数据不能丢失,所以,如果刷新的时间到了,先让写操作把正在写的4个数据(突发长度为4)写完,然后再去进行刷新操作;而如果在执行读操作也遇到需要刷新的情况,也可以先让数据读完,再去执行刷新操作。思路:SDRAM控制器包括初始化、读操作、写操作…

    2022年7月25日
    9
  • Java-Object转JSONObject

    Java-Object转JSONObject第一种方式importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;Objectimages=datum.getImages();if(null!=images){StringdoImages=(String)datum.getImages();charc=doImages.charAt(0);charb=doImages.charAt(d

    2022年4月29日
    77

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号