美文网首页
异步IO(待修正)

异步IO(待修正)

作者: 逍天辰 | 来源:发表于2015-08-24 16:14 被阅读0次

** 操作系统将所有的输入输出设备抽象为文件, 在进行I/O操作时实际上要先获取文件描述符, 然后根据文件描述符进行操作。**
** 同步IO 是指:**
** 发起请求--> 获取文件描述符 --> 读取文件 --> 读取文件结束并返回 **
** 异步IO 是指: **
** 发起请求 --> 获取文件描述符 --> 返回 **
**那么, 如何知道文件是否读取完成?这时要使用 轮询, 即重复调用I/O 来确认是否完成 **

轮询

  1. read, 重复检查I/O的状态
  2. select, 使用1024 长度的数组来存储状态, 通过判断文件描述符上的事件状态
  3. poll, 将select 的数组换位链表。
  4. epoll, Linux 下效率最高的I/O机制,检测不到I/O事件时会进行休眠,直至有事件发生将其唤醒不浪费CPU
  5. iocp , windows 下的 I/O 机制,也实现了异步。

**Node 的异步IO 实际上是用 主线程 +线程池/IOCP 的方式模拟的异步IO, 而且在主线程上仍然是“同步” **
Event Loop 事件循环如下所示:

Paste_Image.png
  1. 检查 Event queue 即事件队列中是否还有事件
  2. 有事件则取出一个交给主线程去处理。
  3. 主线程将I/O操作交给线程池中的的某个线程处理,然后接着处理下一个事件。
  4. 调用线程处理事件, 如果处理事件完成,将完成的结果放回到 Event queue 中。

Node为了进行跨平台,提供了抽象封装层 --> libuv 进行平台的判断, 在Node 编译的时候会进行判断,选择性的编译 *nix 或者 Windows 文件。 在 windows 下的异步是调用了 IOCP 来实现, 在*nix 下是使用了 Node 自带的线程池实现。

Paste_Image.png
  1. V8 引擎负责解析js 代码
  2. 解析完成的代码调用Node 的API
  3. libuv 负责处理 事件循环和调用IOCP或者自己的线程池处理I/O 操作, 将结果返回给 V8 引擎
  4. V8 负责将结果返回给用户。

参考链接:
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
https://vimeo.com/96425312
朴灵 《深入简出NodeJs》

相关文章

  • 异步IO(待修正)

    ** 操作系统将所有的输入输出设备抽象为文件, 在进行I/O操作时实际上要先获取文件描述符, 然后根据文件描述符进...

  • Java IO快速入门

    网络IO实现方式分为BIO(阻塞IO)、线程池伪异步IO、NIO(非阻塞IO)、AIO(异步非阻塞IO); 异步、...

  • 前端进阶全栈-Node的异步IO

    本文力图详尽解释node的异步IO: 异步IO的产生背景 Node中的异步IO具体的实现 非I/O的异步API 一...

  • Reactor 与Proactor

    按照posix标准,系统io分为同步io和异步io两种,其中同步io常用的是bio nio。异步io有aio。 从...

  • NodeJS基础原理

    NodeJS基础原理 异步IO原理浅析及优化方案 异步IO的好处(输入输出input output) 前端通过异步...

  • IO模型

    原文参考链接 四种状态 同步 异步 阻塞 非阻塞 IO分类 同步阻塞IO 同步非阻塞IO 异步非阻塞IO注意: 没...

  • 异步IO

    摘自廖雪峰教程 在IO编程一节中,我们已经知道,CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码...

  • 异步IO

    为什么要异步IO node的事件循环 在进程启动时,node会创建一个类似于while的循环,每执行一次循环体就是...

  • 阻塞非阻塞 同步异步 IO模型及其应用 NIO实现原理

    1.同步异步概念 2.阻塞非阻塞概念 3.常见I/O模型:同步阻塞IO,同步非阻塞IO,异步阻塞IO,异步非阻塞I...

  • nodejs深入学(5)异步编程

    前言 上一章讲解了node如何通过事件循环实现异步,包括与各种IO多路复用搭配实现的异步IO已经与IO无关的异步A...

网友评论

    本文标题:异步IO(待修正)

    本文链接:https://www.haomeiwen.com/subject/vbpgqttx.html