Nodejs:單線程爲什麼能支持高併發?

1、Nodejs是一個平臺,構建在chrome的V8上(js語言解釋器),採用事件驅動、非阻塞模型( c++庫:libuv)。
  參考官方: Node.js is a platform built on  Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an  event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
 
2、爲什麼單線程卻能夠支持高併發?
(1)前提:I/O密集型任務
(2)單線程的解釋:主線程一個,底層工作線程多個。
(3)事件機制的底層依賴庫:libuv、libeio、libev
  • libuv:開發node過程中需要跨平臺,首選爲Linux使用libev(底層爲epoll),備選Windows使用IOCP實現,用於抽象libev和IOCP的高性能網絡庫
    • 非阻塞TCP、非阻塞命名管道、UDP、異步DNS
    • 異步文件系統、路徑查找、ANSI轉義、文件系統事件
    • 子進程生成、線程池調度、進程間IPC與套接字共享
    • 高分辨率時間、定時器
  • epoll和IOCP的區別:
    • epoll用於Linux系統,IOCP用於Windows系統;
    • epoll是同步非阻塞模型:當事件資源滿足時發出可處理通知消息(主線程需要自己去處理);IOCP是異步非阻塞模型,當事件完成時發出通知消息(工作線程幫主線程處理完了)。

(4)nodejs運行機制:
 
    

    a、V8引擎解析JavaScript腳本

    b、解析後的代碼,調用Node API

    c、libuv庫負責Node API的執行。它將不同的任務分配給不同的線程,形成一個Event Loop(事件循環),以異步的方式將任務的執行結果返回給V8引擎

    d、V8引擎再將結果返回給用戶

3、單線程的好處:
(1)多線程佔用內存高
(2)多線程間切換使得CPU開銷大
(3)多線程由內存同步開銷
(4)編寫單線程程序簡單
(5)線程安全
 
4、單線程的劣勢:
(1)CPU密集型任務佔用CPU時間長
(2)無法利用CPU的多核
(3)單線程拋出異常使得程序停止
 
參考:
https://www.oschina.net/p/libuv
https://blog.csdn.net/lijinqi1987/article/details/71214974
https://blog.csdn.net/sparkliang/article/details/4836536
https://blog.csdn.net/leftfist/article/details/41891407
http://www.cnblogs.com/shuidao/p/3262780.html