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 异步转同步 三)异步编程 ...
随机推荐
- sqlplus远程连接oracle
格式: sqlplus 用户名/密码@192.168.19.189:1521/MYTEST MYTEST 数据库名称
- 软件功能说明书beta修订
贪吃蛇(单词版)软件功能说明书beta修订 1 开发背景 “贪吃蛇”这个游戏对于80,90后的人来说是童年的记忆,可以将其说为是一个时代的经典,实现了传统贪吃蛇的游戏功能:现在人们对英语的重视程度越来 ...
- 20145214 《网络对抗技术》 Web基础
20145214 <网络对抗技术> Web基础 1.实验后回答问题 (1)什么是表单 表单在网页中主要负责数据采集,提供了填写数据.选择数据,收集数据并提交给后台的功能 一个表单有三个基本 ...
- spring冲刺第一天
第一天总结 昨天我们开始了spring冲刺会议,我们进行了明确的分工,每个人都有自己的任务.我的目前任务是游戏地图的初步设计. 今天早上我们开了站立会议,算是正式开始了spring冲刺.我上网查找了一 ...
- 福大软工 Alpha 事后诸葛亮
写在前面 林燊大哥 一路走来,好不容易,终于完结了. 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 用户在进店之前无法得知店铺的优劣 ...
- 图论 Kruskal算法 并查集
#include<iostream> #include<cstring> #include<string> #include<cstdio> #incl ...
- Teamwork(The second day of the team)
梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...
- Alpha 冲刺报告(4/10)
Alpha 冲刺报告(4/10) 队名:洛基小队 峻雄(组长) 已完成:继续行动脚本的编写 明日计划:尽量完成角色的移动 剩余任务:物品背包交互代码 困难:具体编码进展比较缓慢 ----------- ...
- SQL Server 无法连接到本地服务器
未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接: 解决办法: 在服务中启动SQL Server (MSSQLSERVER)这个服务.
- redis简介及增删改查
redis 是一个文档(nosql)数据库,工作与内存,主要用做高速缓存 缓存经常会查到的数据 存入的值默认是字符串 使用步骤: 1 从redis.io下载 2 点击redis-server.exe启 ...