libuv 基本概念
libuv是一个跨平台库,是围绕着事件驱动的异步I/O模型来设计的。
本库不止提供了对不同I/O polling机制的抽象,handles和streams机制也提供了一个更高层的对于sockets和其他实体的抽象。本库还提供了跨平台的文件I/O操作及线程功能。
1) 最底层的socket相关操作有epoll/kqueue和event ports,这些事基于unix like系统的,在这些系统特定的API之上抽象出了一层uv_io_t结构用于提供统一的unix-like平台上的socket及事件接口。
2)epoll ->linux内核;kqueue->freeBSD 4.1之后;event ports->貌似也是用在linux上的机制。
3)IOCP为windows上特有的异步I/O事件模型,libuv也是支持的。着也就是libuv好于libev的地方。
4)此外libuv还支持线程池。
5)在上述底层抽象之上,libuv提供了更高一层的抽象,提供了抽象了的TCP/UDP/TTY/PIPE等接口。
6)在这些接口之上提供了文件I/O操作,DNS操作等。
7)用户可以基于上述的全部抽象接口实现自己的应用程序。
句柄和请求
libuv给用户提供了两种方式与event loop一起协同工作,一个是句柄(handle)一个是请求(request)。
句柄代表了一个长期存在的对象,这些对象当处于活跃状态的时候能够执行特定的操作。例如:一个准备(prepare)句柄在活跃的时候可以在每个循环中调用它的回调一次。一个TCP服务器的句柄在每次有新的连接的时候都会调用它的连接回调函数。
请求(request)一般代表短时操作。这些操作能用作用于句柄之上。写请求用于在句柄上写数据;还有一些例外,比如说getaddrinfo请求不需要句柄而是直接在循环中执行。
I/O循环
I/O循环或者叫做事件循环是整个libuv的核心部分。I/O循环建立了所有IO操作的执行环境,I/O循环会被绑定在一个线程之上。我们可以运行多个时间循环,只要每一个都运行在不同的线程之上。libuv事件循环 不是 线程安全的,所以所有包含事件循环的API及句柄都不是线程安全的。
事件循环遵循最普遍的单线程异步I/O方法:所有I/O或者网络操作在非阻塞的socket上执行,这个socket会使用基于平台的组好的poll机制:在linux上使用epoll,在OSX和其他BSD平台上使用kqueue,在sunOS上使用event ports,在windows上使用IOCP。为循环迭代的一部分,循环会阻塞以等待socket上的I/O活动,这些活动已经被加到socket的触发实践中了,一旦这些条件满足,那么socket的状态就会发生变化,从而循环不再阻塞,而且句柄也可以读、写及执行其他期望的I/O操作。
为了更好的理解事件循环操作如何进行,一下的图展示了一个循环迭代的所有阶段。
循坏中的“now”被更新为当前时间。事件循环在循环开始时缓存当前时间滴答数的目的是为了减少时间相关的系统调用数量。
如果循环是alive的,那么表明一个迭代已经开始了,否则的话循环会立即退出。那么,什么时候一个循环被认为是alive的呢?答案是如果一个循环中包括活跃及被引用的句柄(active and ref`d handles),活跃的请求或者是正在关闭的句柄,那么这个循环被认为是活的(alive)。
Due定时器运行。
挂起的回调被调用。
空闲(idle)句柄回调被调用。
准备(prepare)回调句柄被调用。
计算poll超时。
循环阻塞。
调用check句柄。
调用close句柄。
特殊case运行。
一次循环迭代结束。
libuv利用线程池技术使得异步文件I/O操作称为可能,但是对于网络IO只能执行在一个单一线程中,即loop的线程中。
libuv 基本概念相关推荐
- 《大前端进阶 Node.js》系列 多进程模型底层实现(字节跳动被问)
前言 Coding 应当是一生的事业,而不仅仅是 30 岁的青春饭 本文已收录 Github https://github.com/ponkans/F2E,欢迎 Star,持续更新 字节跳动面试官问: ...
- libuv 原理_Libuv初理解
整体概念 libuv是一个跨平台.专门写给nodejs的库,它的设计是围绕着事件驱动的异步I/O模型.在不同的I/O轮询机制上,libuv提供的不是简单抽象对象:handle和streams为sock ...
- libuv 网络库设计概览译
设计概览 libuv 是一种支持跨平台的网络库,最初是为了NodeJS作为某个模块实现的,主要基于事件驱动的I/O 模型设计的. 这个库不仅仅对不同的I/O polling 机制提供简单的抽象. ha ...
- 跨平台异步IO库 libuv 源代码接口详解
Table of Contents 简介 谁这本书是为 背景 代码 libuv的基础知识 事件循环 helloworld 默认循环 错误处理 把手和要求 空转 存储方面 文件系统 读/写文件 文件系统 ...
- libuv:多平台支持库-异步I / O
http://libuv.org/ 目录 概述¶ 功能 文档 下载 安装 设计概述¶ 把手和请求¶ I / O循环 文件I / 概述¶ libuv是一个多平台支持库,主要关注异步I / O.它主要通过 ...
- 浅析libuv源码-node事件轮询解析(1)
好久没写东西了,过了一段咸鱼生活,无意中想起了脉脉上面一句话: 始终保持自己的竞争力.所以,继续开写! 一般的JavaScript源码看的已经没啥意思了,我也不会写什么xx入门新手教程,最终决定还是啃 ...
- JavaScript概念梳理
一.JavaScript 的奇葩命名史 1995 年,网景浏览器(Netscape Navigator)首次发布了一种运行于浏览器端的脚本语言,网景给这个新语言命名为 LiveScript.一年后,为 ...
- 网络库libevent、libev、libuv、libhv对比
网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...
- 开源免费Webrtc转发服务器Mediasoup的概念解释与基本介绍(一)
用于Webrtc的媒体流转发服务器不计其数,开源与免费的也不计其数,有基于C++开发的,有基于Java开发的,有基于Go开发的,但以笔者的实践经验,mediasoup是性能最好的转发服务器.Media ...
最新文章
- Spring Cloud应用开发(二:实现服务间的调用)
- C++二个数组求交集的实现算法(附完整源码)
- 的训练过程_最全深度学习训练过程可视化工具(附github源码)
- 米聊PK微信:微信是一朵奇葩
- Java原来如此-随机数
- 微信自定义tabbar有小红点_自定义微信小程序tabBar组件上边框的颜色
- OpenCV学习(二十) :分水岭算法:watershed()
- iOS_网络_02_搭建本地Web服务器
- layu多个文件上传php,文件上传 · ThinkPHP6.0 · 看云
- Soul Api 网关发布 1.0.3-RELEASE 版本
- 【元胞自动机】基于matlab元胞自动机森林大火【含Matlab源码 235期】
- springboot+旅游管理系统 毕业设计-附源码261117
- 作为一个程序猿你必须会的技能----自学框架!
- 旅游网之后台管理系统
- 窄带Vs宽带 MIMO
- 社会化媒体营销方案简介
- manjaro Linux 手动安装mysql 5.7 每次重启系统都无法直接启动
- 用js做一个简单的秒表计时器
- 计算机网络中常见的数据传输方式(电路交换,报文交换,分组交换)
- Unity 如何实现一个强大的MMO技能系统!
热门文章
- Excel 分列和行转列
- D2Q9模型--基于MATLAB的LBM代码
- 《DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter》(NeurIPS-2019)论文阅读
- 基于Zedboard的PetaLinux
- 03 Hadoop(HDFS)
- 修改监控录像时间的方法以及基础常识,必看!
- 使用beyond compare4作为Git的比较工具
- 手写数字识别增强版项目实践规划
- 图片服务器项目测试用例
- “CL.exe”已退出,代码为 -1073741515。