node中异步IO的理解
解释性语言和编译型语言的区别:
计算器不能直接的理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器语言,翻译的方式有两种,一个是编译,一个是解释。
解释性语言的程序不需要编译,它是在运行程序的时候进行翻译,比如java,专门有一个解释器可以直接执行Java程序,每一个语句都是执行的时候才能翻译,编译型就是编译的时候直接编译成机器可以执行的,编译和执行时分开的,但是不能跨平台。因为翻译只做了一次,运行的时候不需要再去翻译,所以编译型语言的程序执行效率高。
对于解释性语言,程序运行时的控制权在解释器而不在于程序,对于编译型语言程序运行时的控制权在程序。
进程的前台运行和后台运行
后台进程是一直运行的服务端程序,又称为守护进程,通常是在系统后台运行,没有控制终端,不与前台交互,一般作为系统服务使用。其称为后台进程的原因大部分是因为它没有控制端,无法和前台的用户交互。
相对应的前台进程,就是我们在终端中开启的进程,例如我们在终端中npm run server.js启动一个webServer,此时启动的进程就是前台进程,当你把当前的命令行终端进行关闭了之后,该进程也便被杀死了。
node中的阻塞/非阻塞IO和同步/异步IO
表面上来看,这两组的概念都差不多,阻塞/非阻塞IO,是操作系统内核对于IO的两种处理方式,对于阻塞IO,比如读取文件,操作系统在读取完文件之后,才会给应用程序返回结果,这一段过程呢,应用程序在等待操作系统的回复,是为应用层面的同步IO。
对于非阻塞IO,操作系统在接收到应用程序对于读取文件的请求时,立即返回给应用程序一个结果,但是应用程序怎么知道操作系统完成了IO操作呢?这时候应用程序就会对操作系统发起询问(你到底好了没有?人家都快急死了),发起询问的方法又经过好几种演变,比如read、poll、epoll等,中间多的无非就是根据文件描述符减少询问的次数,总体上来说这种方式不好。并不能达到我们理想的异步IO。
那么从应用程序方面来将,我们期望的异步IO,就是应用程序进行了IO操作之后,不再需要操心操作系统什么时候返回,去执行下边的代码就行了,当操作执行完了之后呢,直接给应用程序发信息告诉他就行了。Linux系统下原生提供了一种AIO是通过信号或者回调来传递数据的,这个AIO就是我们的理想的异步IO。但是不幸的是只有Linux中有,而且无法利用系统缓存。
node(单线程)中对于*nix平台而言,采用的是线程池+epoll异步IO模拟实现应用程序层面的异步IO,主线程进行执行程序,碰到我们异步IO调用时,将改异步IO分配给线程池中的某一个线程,然后就变成了线程池中的某个线程和操作系统的阻塞IO进行IO操作,当IO线程接收到操作系统的阻塞IO执行的返回结果之后,IO线程再发送时间给主线程。
node中对于window平台而言,是依靠于IOCP来实现的,其内部仍然是线程池原理,不同之处在于这些线程池由系统内核接手管理。
node中对于异步IO的实现:
对于异步IO的实现,其中有几个组成部分:事件循环、观察者、请求对象
事件循环是node中的一种执行机制,这种机制是回调执行的基础部分,它保证了我们的回调函数能够被执行。
观察者是暴露回调函数的窗口,如果整体的场景为饮料工厂的话,我们的瓶子就是我们的回调函数,事件循环就是传送带在那一直转,而观察者就是瓶子就如机器的入口,机器就是我们的应用程序。所以应用程序从观察者这里获取事件,应用程序询问观察者是否还有事件。
请求对象,是应用程序封装的一个对象,里边包含了要做的IO操作类型,以及回调函数。
整体流程就是,异步调用开始之后,应用程序封装一个请求对象,送入我们的线程池中的某个线程,该线程和操作系统的非阻塞IO通过epoll机制进行工作,这其中,会有观察者在线程池中进行检查,当某个线程的IO操作完成之后,观察者会将回调函数(封装在请求对象中的)放在事件循环上(上段提到的传送带),然后主线程调用回调函数。
参考:《深入浅出Node.js》
问题思考:
- 操作系统的线程与CPU中的线程有什么不同?
node中异步IO的理解的更多相关文章
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- Node.js异步IO原理剖析
为什么要异步I/O? 从用户体验角度讲,异步IO可以消除UI阻塞,快速响应资源 JavaScript是单线程的,它与UI渲染共用一个线程.所以在JavaScript执行的时候,UI渲染将处于停顿的状态 ...
- 小白对异步IO的理解
前言 看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下. 因为是初学者,在理解上有很多不到位的地方,如果有错误,还希望能够有 ...
- python IO模式(多路复用和异步IO深入理解)
1.事件渠道模型.事件渠道为异步IO的原型. 2.IO模式,一次IO调用会经历两个阶段.一.等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二.将数据从内核拷贝到进程中. 基于这两 ...
- 同步IO, 异步IO的理解
1. 什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO. 2. 阻塞IO (1)当用户线程发起IO ...
- 深入理解node.js异步编程:基础篇
###[本文是基础内容,大神请绕道,才疏学浅,难免纰漏,请各位轻喷] ##1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平 ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- 异步IO比同步阻塞IO性能更好吗?为什么?
最近在看node.js, 介绍中提到node是异步io的方式实现, 性能比同步阻塞io的更好. 对于一个request而言, 如果我们依赖io的结果, 异步io和同步阻塞io都是要等到io完成才能继续 ...
- 深入浅出node(4) 异步编程
一)函数式编程基础 二)异步编程的优势和难点 2.1 优势 2.2 难点 2.2.1 异常处理 2.2.2 函数嵌套过深 2.2.3 阻塞 2.2.4 多线程编程 2.2.5 异步转同步 三)异步编程 ...
随机推荐
- Mysql DataPacketTooBigException异常处理
在本地上运行好好,然后发布到服务器上去, 总是报错,后来查了一下日志,得到了如下的错误日志: [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Pa ...
- 设计与实现分离——面向接口编程(OO博客第三弹)
如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度 ...
- angualrJs指令起名的bug
我在写一个demo时: <div ng-repeat="user in users" my-template2 my-template> //my-template2 ...
- Task 6.2冲刺会议四 /2015-5-17
今天主要是学习并熟悉了C#的开发流程,把他的文件的大体结构和每个组件之间的联系弄清楚之后.开始写服务器部分的内容.学习过程中,感觉网上的资料有些太鱼龙混杂了,不知道该怎么取舍.明天准备完善服务器的功能 ...
- springmvc 映射重复
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- self和super关键字介绍
1.self和super OC提供两个保留字self 和 super ,用在方法定义中 OC语言中的self, 就相当于C++和Java中的this指针,学会使用self 首先要搞清楚属性这一概念以及 ...
- Week 2
第1章:概论1.原文“这些软件企业的商业模式有些事合情合理也合法:有些看似合情合理,但不怎么合法:有些做法不合 理,但是还没有出台相关的法律.在相关法律完善之前,软件行业还有一个行规,即应该有职业道德 ...
- STL的集合set
集合: 集合是由元素组成的一个类,其成员可以是一个集合,也可以是一个原子,通常一个元素在一个集合中不能多次出现:由于对实现集合不是很理解,只简单写下已有的STL中的set集合使用: C++中set基本 ...
- 汇编语言段和RSEG用法
RSEG是段选择指令,要想明白它的意思就要了解段的意思.段是程序代码或数据对象的存储单位.程序代码放到代码段,数据对象放到数据段.段分两种,一是绝对段,一是再定位段.绝对段在汇编语言中指定,在用L51 ...