一、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.
二、爲何單線程卻可以支持高併發?
(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腳本html
b、解析後的代碼,調用Node APInode
c、libuv庫負責Node API的執行。它將不一樣的任務分配給不一樣的線程,造成一個Event Loop(事件循環),以異步的方式將任務的執行結果返回給V8引擎c++
d、V8引擎再將結果返回給用戶git
三、單線程的好處:
(1)多線程佔用內存高
(2)多線程間切換使得CPU開銷大
(3)多線程由內存同步開銷
(4)編寫單線程程序簡單
(5)線程安全
四、單線程的劣勢:
(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