似乎有人不知道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开发服务器体验的场景。

多进程单线程模型与单进程多线程模型之争相关推荐

  1. Redis-Epoll模型,以及多线程模型总结

    前言: 关于redis的线程模型,在Redis 6.0版本之后引入了多线程模型.我们先对redis的单线程模型简单介绍下,然后再一起来学习下redis的多线程模型 杂记: 对于redis内部的epol ...

  2. 网络编程模型综述 之 多线程模型

    每个连接对应一个线程 一个网络socket对应一个处理线程,socket采用阻塞I/O模型: 这种模型是小程序和java常用的策略,对于交互式的长连接应用也是常见的选择(比如BBS),也常用来做内部服 ...

  3. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 我国宋代禅宗大师青原行思在<三重境界>中有这样一句话:" 参禅之初 ...

  4. Netty 多线程模型

    0x01: 背景 Java线程模型的演进 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一 在Java领域当时比较流行的是单线程编程 ...

  5. 六、线程的实现方式---多线程模型

    一.线程的实现方式----用户级线程 1.线程分为用户级线程和内核级线程 2.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换) 3.用户级线程中,线程切换可以在用 ...

  6. 王道 ——线程概念和多线程模型

    目录 1.知识总览 2.什么是线程,为什么要引入线程 3.引入线程机制后,有什么变化 4.线程有哪些重要的属性 5.线程的实现方式 5.1 用户级线程 5.2 内核级线程 6.多线程模型 1.知识总览 ...

  7. Reactor三种线程模型与Netty线程模型

    一.Reactor三种线程模型 1.1.单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常.关闭等等.单线程Reactor模型基于同步事件分离器来分发事件,这个同步事件 ...

  8. java中reactor模型_Java——Netty Reactor模型(转)

    1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...

  9. 线程和进程的区别与联系以及单线程多进程与单进程多线程的区别

    线程和进程 概念 进程(process):是指具有已一定功能的独立程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址.一个进程所拥有的数据和变量只属于它自己. ...

最新文章

  1. sobel算子原理以及运用
  2. java中io与nio复制文件性能对比
  3. poj 1180 斜率优化dp
  4. cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
  5. 5g理论速度_快看看 5G 的实际网速,失望还是兴奋?
  6. 大规模均衡分割与层次聚类
  7. java环境安装菜鸟教程,window系统安装Java 配置环境变量 | 菜鸟教程 JDK配置
  8. 可汗学院公开课:统计学
  9. 证明三角形中cosA^2+cosB^2+cosC^2=1-2cosAcosBcosC
  10. canvas实现漂亮的下雨效果
  11. 2019宁夏计算机考试报名时间,2019年上半年宁夏计算机二级考试报名时间
  12. 电子电路硬件学习目标
  13. php聚丙烯酰胺,高分子聚丙烯酰胺
  14. 题目中常见的英文单词
  15. 三星android6.0sd卡,三星 android 手机内置sd卡空间不足,怎么处理?
  16. 基于JAVA的高铁订餐微信小程序设计与实现
  17. 2021-06-11-H3C-C软件开发笔试
  18. vue移动端手写电子签名的实现方式
  19. python list增加元素_将字符串的元素添加到列表中(python)
  20. 鸿蒙os3月31号更新,华为鸿蒙OS最新Beta3月31日推送 商用最快4月启动

热门文章

  1. boost::geometry::dissolver用法的测试程序
  2. boost::diagnostic_information_what的用法程序
  3. GDCM:将DICOM文件和XML文件相互转换的测试程序
  4. Boost:求容器的最小元素和最大元素
  5. ITK:写一个TIFF图像
  6. DCMTK:图像服务器中央测试节点(ctn)主程序
  7. C++将带ui界面的qt工程封装为动态库dll
  8. OpenCV“智能剪刀“Intelligent Scissors的实例(附完整代码)
  9. c++fibonacci search斐波那契搜索的实现算法(附完整源码)
  10. C++struct和class区别