美文网首页
异步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(待修正)

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