• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Whokay 必ず勝つ!頑張ろう!
博客园    首页    新随笔    联系   管理    订阅  订阅
深入理解NODE.JS机制的几篇文章及思考

http://cnodejs.org/topic/51659db96d38277306d202a3

 

node.js的单线程就是主线程,主线程是什么?就是事件队列,node.js(javascript)就是面向事件驱动的编程,web是事件化的,os也是事件化的。os的服务(I/O,database)都是在自己独立的进程中完成,当发生一个请求后,node.js只是在这个事件队列中注册一个事件,然后就不管了,具体这个事件的执行就交给了os(i/o,database)不同的进程,等os完成后,通过回调(node.js会轮询)再回到主线程的处理,所以node.js单线程是指自己的主线程,而不是所有的操作都是在这个线程里,这个线程只是事件调度,事件的执行都是交给操作系统在其它的线程中完成。所以node.js是非I/O阻塞,而不是非cpu阻塞,那么node.js会出现cpu阻塞,是不是性能就会有问题呢?不是的,就象Nginx一样,因为对web而言运算是非常非常小的,一次I/O的操作的时间远大于你做百万次的for循环。

相对的并发是如果一个服务器可以开250个线程,再加上线程池就可以保证一定的并发量。
但是,线程是什么?是OS执行的最小单元,由线程ID,当前指令指针(PC),寄存器集合和堆栈组成(是不是专业的都要背?),然而线程是昂贵的,线程对cpu和内存的占用都是很重的,就象一个人跑步一样,你加速了,停下,启动再加速,那是很费力的。这就使得HTTP SERVER的后起之秀nginx以光的速度蔓延开来,nginx就是以单线程为基础的,为什么nginx快?

 

nginx进程模型是所有需要阻塞请求的部分全部由epool(事件通知接口)触发相应事件,非阻塞(处理耗时 很短)部分用主线程一直执行,直到遇到阻塞部分就停止,交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。这部分可以研究一下nginx进程就可以得知。

 

 

http://chembo.iteye.com/blog/1367283

虽然nodejs是单线程的,但它的IO操作是多线程的

 

4. 事件驱动 
传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。 
相反的,NodeJS使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO) 

 

 

http://www.tangwen.org/archives/163

 

 http://freewind.me/blog/20120516/926.html

 

二、Nodejs是单线程吗?

我们写下的js代码,是在单线程的环境中执行,但nodejs本身不是单线程的。如果我们在代码中调用了nodejs提供的异步api(如IO等),它们可能是通过底层的c(c++?)模块在另外的线程中完成。但对于我们自己的js代码来说,它们处于单线程中。因为异步函数执行完将结果通过回调函数传给我们的时候,我们的代码一次只能处理一个。

 http://www.veryhuo.com/a/view/39756.html

posted on 2013-11-18 01:25  Vince  阅读(255)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3