I/O 基础
简单介绍一下I/O的基本工作方式
- 你的程序通过“syscall()”请求操作系统的内核去做一个I/O操作。
- 一个”syscall()”是阻断的,你的程序需要等待内核返回才能继续执行你的代码。
- 内核执行底层的I/O操作,大多在硬件层面,执行时间根据的硬件的速度而变化。
阻断型I/O
大多语言,比如说Java,Python的I/O调用的阻断型的,你的程序需要等待I/O返回之后才能继续后面的工作。当有高并发的需求的时候,大量的线程需要进行大量的上下文切换。就会导致浪费大量CPU资源。
非阻断型I/O
Nodejs的独特的事件循环使得他可以方便的运行非阻断型I/O。每一个I/O请求都会作为一个消息发送在事件循环中,Nodejs会继续执行其他代码直到这个I/O请求结束之后通过callback返回结果。
由于这个独特的设计是的Nodejs在处理高并发,I/O为主的程序中发挥极大的功效。当传统的网络服务器(线程型)能处理4000并发的时候,Nodejs可以处理1百万并发,和大约60万并发websockets的连接。
但是由于Nodejs基于V8单线程的原因,他不适合处理高运算量的代码,一个高运算量的循环就可以使得整个程序瘫痪。
基于Nodejs的这些特性,以下是一些比较适合他的应用场景:
- 聊天软件
- 读写NoSQL数据库的API(MongoDB)
- 队列/消息请求
- 数据流
- 代理(Proxy)
更多阅读:
Why the Hell Would You Use Node.js
Server-side I/O Performance: Node vs. PHP vs. Java vs. Go