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 异步转同步 三)异步编程 ...
随机推荐
- windows 无法链接 \\ , 拼写错误或者网络有问题,解决方法
1. 楼主首先在网上搜索了一遍问题, 比较全面的回答链接如下http://blog.csdn.net/newizan/article/details/50313137 然而并没有解决问题, 于是反思了 ...
- ClickOnce 创建桌面快捷方式
static void Main() { bool bCreatedNew; Mutex m = new Mutex(false, "TestClickOnceClientName" ...
- 三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法
背景 背景:为锻炼代同学,老师给了她一个反向工程微信"跳一跳"小游戏的任务,希望做一个一样的出来.跳一跳中,有方块,有小人,小人站在方块上. 这个游戏的玩法是,用手指按住手机屏幕, ...
- Final发布用户使用报告 -- Thunder团队
Thunder爱阅app Final发布用户使用报告 用户数量:14人 以下为用户评论:(注:为了保护用户的姓名权,以下用户名以昵称形式给出.) 序列 昵称 个人信息 获得软件途径 使用次数 用户评论 ...
- json转对象
1,引入依赖 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib& ...
- 20162328蔡文琛week08
学号 20162328 <程序设计与数据结构>第X周学习总结 教材学习内容总结 错误和异常代表不常见的或不正确处理的对象. 抛出异常时输出的消息提供了方法调用栈的轨迹. 每个catch子句 ...
- CS小分队第二阶段冲刺站立会议(6月2日)
昨日成果:攻克了按钮移动的问题: 遇到问题:一开始按钮移动时候,非常慢,因为是根绝相对位移差来移动,延时很严重,后来改用用鼠标的位置作为按钮的移动位置,效果明显. 按钮的mousedown事件和mou ...
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
- 第一次spring冲刺第8天
针对这几天出现的问题,我们团队做了用户需求讨论. 1.客户类型:工作者为主,其他类型都适用的计算器软件 2.需求与满足:他们想要的是能使用简单,并且适用于工作上 3.满足度:最好后台可以提供意见反馈, ...
- Teamwork(The first day of the team)
今天是第一次的小组讨论,我们主要是分析了我们的大概方向及大概功能及相应的分工.其实具体也还没有确定下来,只是大概的说了一下,确定了master为杨灵超同学.下面用图片记录我们这一天的工作内容(杨灵超V ...