异步:
你请人吃饭,准备一起去的。结果那人刚好有事,让你先去点菜,你去点好菜,他忙完就来了,这就是异步的优势(不耽误事!)
同步:
同步:
就是,你必须等那个人忙完了,才一起去(浪费时间)
理解来源于群友“老了学nodejs”
1、Nodejs最大的特点就是异步式I/O(或者非阻塞I/O)与事件紧密结合的编程模型。此模型与传统的同步式I/O线性的编程思想有很大不同,因为控制流在很大程度上需要事件和回调函数来组织,一个逻辑要拆分为若干个单元。
2、什么是阻塞式(同步式I/O):
线程在执行中如果遇到磁盘读写或者网络通信(统称I/O操作),通常要耗费较长时间,这时操作系统会剥夺这个线程对CPU的控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞式。
当I/O操作完毕时候,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行,这种模式就是同步式I/O(Synchronous I/O)或者阻塞式(Blocking I/O)
3、异步式I/O:
当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或者数据的返回,而只是将I/O的请求发送给操作系统,继续执行下一条语句。当操作系统完成I/O的操作时,以事件的形式通知执行I/O操作的线程,线程会在特定的时间处理这个事件。
为了处理异步I/O,线程必须有事件循环,不断的检测有没有未处理的事件,依次予以处理。
4、阻塞模式下一个线程只能处理一项任务,要想提高吞吐量,必须使用多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%。多线程带来的好处是在多核CPU的情况下利用更多的核,而Nodejs的单线程也能带来同样的好处。
5、单线程事件相比传统的多线程阻塞I/O的优缺点?
优:多线程的开销,创建一个线程对OS来讲代价还是比较大的(需要分配内存,列入调度、线程切换时内存换页,CPU缓存清理)。
缺:异步式编程不符合人们对于一般程序的设计思维,容易让流程控制变得隐晦难懂!
6、同步式I/O和异步式I/O特点对比:
同步式(I/O)
|
异步式(I/O)
|
利用多线程提供吞吐量
|
单线程即可实现高吞吐量
|
通过事件片分割和线程调度利用多核CPU
|
通过功能划分利用多核CPU
|
需要由操作系统调度多线程使用多核CPU
|
可以将单进程绑定到单核CPU上
|
难以充分利用CPU资源
|
可以充分利用CPU资源
|
内存轨迹大,数据局部性若
|
内存轨迹小,数据局部性强
|
符合线性的编程思想
|
不符合传统编程思想
|
PS:为毛每个语言都说自己好得不得了,这也得广告一把?