libuv 原理_Libuv初理解

整体概念

libuv是一个跨平台、专门写给nodejs的库,它的设计是围绕着事件驱动的异步I/O模型。在不同的I/O轮询机制上,libuv提供的不是简单抽象对象:handle和streams为sockets和其他实例提供了一个高级抽象。此外,libuv还提供了跨平台文件I/O和线程化功能

这里有一个图表,说明了构成libuv的不同部分以及它们与什么子系统相关:b5f0f77fd5939b5349723f86e9d1c7d2.png

handles和request

libuv给用户提供了2个可操作的抽象对象,evnt loop的组合:handles和requests。

handles能够操作那些长时间活跃的对象,例如:

活跃的handle在每一次event loop期间会被调用一次循环迭代

tcp服务会回调一次连接服务当一个新的连接过来时

requests代表的是短时间活跃的操作。这些操作可以被表现依赖于handle上:写请求用来在handle上写数据。或者独立的:像getaddrinfo请求就不需要依赖handle,可以自己独立在event loop中执行

I/O循环

I/O或者说event loop是libuv的核心。它为所有I/O操作创建了内容,也就意味着这些操作绑定在了某一个单一的线程上。只要每个线程运行在不同的线程中,就可以运行多个事件循环。不过libuv的event loop不是一个安全的线程

event loop遵从一个单一异步I/O线程方法:所有的(网络)I/O必须执行在一个没有被阻塞的sockets中,使用给定平台上可用的最佳机制进行轮询(例如:Linux的epoll、OSX的kqueue和其他的一些BSDs、SunOs的事件接口和windows上的IOCP)。作为循环迭代的一部分,loop会被阻塞,等待已经添加到poller和回调的sockets上的I/O活动,此时将触发sockets状态(可读、可写的挂起),因此handle可以读取、写入或执行所需的I/O操作。

为了更好的理解event loop的操作,下图将展示所有循环迭代(loop iteration)的状态

bf2fd8151d78b0d282cc431fc12e1ef4.png

1.“now”的循环概念得到了更新。事件循环在事件循环开始时缓存当前时间,以减少与时间相关的系统调用的数量。

2.如果循环是活跃的,则会启动循环迭代,否则循环将立即退出。那么,什么时候被认为是活跃着的循环呢?如果一个循环有活动和ref自己的handles,主动请求或关闭句柄被认为是有活跃着的。

3.由于计时器运行。所有活跃着的时间调度器都安排在循环的now概念之前调用他们的回调函数

4.挂载的回调函数将被调用。所有I/O回调函数都是在轮询event loop的poll之后被调用的。但是,存在一些特殊情况:比如调用这样的回调被推迟到下一个循环迭代中调用,那么此时就可能立刻执行上一个event loop中延迟的I/O回调函数。

5.调用idle handle回调函数被调用。尽管这个名称不是很好听,但如果idle handle是活跃的,那么再每次event loop过程中都一定会调用

6.调用prepare handle的回调函数。Prepare handles的回调函数在I/O之前

7.poll阶段计算延迟时间。在阻塞I/O之前,loop去计算它应该阻塞多长时间。这些是计算超时时的规则:

如果loop运行的flag是UV_RUN_NOWAIT,延迟时间为0

如果loop是被uv_stop阻塞,则延迟0

如果此时没有活跃的handles和requests,延迟为0

如果此时有任何活跃着的idel handles,则延迟0

如果此时有任何处于pending状态的handles被关闭,则延迟为0

如果上述任何情况都没有,则调用最近的timeout,如果没有任何活跃的时间timer存在,则无限延迟

8.在I/O阶段阻塞。在这个时候,the loop将阻塞I/O,用于在上一步中计算的持续时间。所有正在监视一个读或写操作的给定文件描述符的I/O相关handles将在此处调用它们的回调。

9.调用check handle的回调。check handle在I/O阶段之后调用。

10.调用CLose的回调函数。如果一个handes被uv_close()函数调用关闭,那么close的回调函数就会被调用

11.在使用UV_RUN_ONCE模式这个特殊情况下运行,I/O可能没有回调函数存在在I/O被阻塞之后去调用,而有timers到期,从而回调了timers的回调函数

12.循环结束。如果loop是运行在UV_RUN_NOWAIT或者UV_RUN_ONCE模式下的运行结束,那么就uv_run()方法会被返回。如果运行在UV_RUN_DEFAULT模式下,且the loop在结束的时候仍然活着,那么将会继续运行,并且从头开始循环迭代,否则也将会结束

在每次循环线程中,libuv使用线程池实现异步文件I/O操作,但是网络I/O总是在单个线程中执行。

I/O文件

不像网络I/O,没有特定于平台的文件I/O原语libuv可以依赖,所以当前的方法是在线程池中运行阻塞文件I/O操作。

libuv目前使用的是一个全局线程池,其中所有循环都可以在其中进行队列工作。3种操作目前在此池中运行:

文件系统操作

DNS功能(getaddrinfo和getnameinfo)

用户通过uv_queue_work()指定的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab排序函数sort()和sortrows()

sort() 调用形式 1.Ysort(X) 对矩阵、向量或数组进行升序排列。 例1 >> amagic(4)a 16 2 3 135 11 10 89 7 6 124 14 15 1>> brand(1,4)b 0.8147 0.9058 0.1270 0.9134>> sort(a)ans 4 2 3…

[Swift]LeetCode968.监控二叉树 | Binary Tree Cameras

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…

Maven神秘化

由于我的Android开发的背景下,我比较习惯到摇篮 ,而不是Maven的 。 尽管我知道Gradle基于Maven,但我从未调查过幕后发生的事情。 在过去的一周中,我一直在尝试了解细节并找出Maven的不同组成部分。 什么是Maven Maven是主要用于J…

走进JVM【二】理解JVM内存区域

引言 对于C程序员,内存分配与回收的处理一直是令人头疼的问题。Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题。 不容易不代表不会出现问题,一旦内存泄漏或溢出的情况发生&…

mysql一对多_mysql一对多查询合并多的一方的数据。

有时候会有这样一个需求,查询的一条记录需要包含另一个表的多条记录,并且让多条记录成为一个字段组成最终的一条记录。比较难描述,看例子吧。创建一个产品表:create table product(proId int(10),proName varchar(50))创建一个成分…

Matlab矩阵、元胞数组的合并拼接

矩阵合并拼接 1.横向拼接 [a,b] [a b]均可 例1 >> amagic(3)a 8 1 63 5 74 9 2>> brand(3)b 0.6324 0.5469 0.15760.0975 0.9575 0.97060.2785 0.9649 0.9572>> c[a,b]c 8.0000 1.0000 6.0000 0.632…

Matlab拆分矩阵/Matlab如何分割大矩阵(mat2cell函数)

dim1Dist分割后矩阵行数组成的向量,dimNDist指的是分割后矩阵列数组成的向量 例有100*200的矩阵A >> Arand(100,200); >> bmat2cell(A,[30 40 30],[100 70 30])b 33 cell 数组{30100 double} {3070 double} {3030 double}{40100 double} {40…

分布式系统部署、监控与进程管理的几重境界

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen 陈硕关于分布式系统的系列文章:http://blog.csdn.net/Solstice/category/802325.aspx 本作品采用“Creative Commons 署名-非商业性使用-禁止演绎 3.0 Unported 许可协议(cc by-nc-nd)”…

.net core mvc初级教程(六)

一、创建movie的视图 二、对cinema、movie视图添加‘添加信息’的操作 一、创建movie的视图 在views文件夹下添加Movie文件夹,在这个文件夹下添加Index.cshtml视图,为什么添加Index.cshtml这个名字的视图,可以看看我们写的MovieController控制…

apache camel_发掘Apache Camel的力量

apache camel最近几年,ESB软件越来越受欢迎。 如果大多数人通常知道什么是ESB,那么他们很少会清楚地了解这种体系结构的不同组件的确切作用。 例如,Apache ServiceMix由三个主要组件组成:Apache Karaf(OSGI容器&#…

角反射器的功能及应用

雷达反射器又名角反射器,它是通过金属板材根椐不同用途做成的不同规格的雷达波反射器。当雷达电磁波扫描到角反射后,电磁波会在金属角上产生折射放大,产生很强的回波信号,在雷达的屏幕上出现很强的回波目标。由于角反射器有极强的…

mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...

展开全部Linu下启动MySQL结果显示:env: /etc/init.d/mysql: 是脚本执行的问题解决办法:依次e69da5e887aa3231313335323631343130323136353331333365633936执行下面的命令(执行失败的话,检查路径是否正确):cp /etc/init.d/mysql /e…

GDAL/ORG之Python获取与安装

GDAL(Geospatial Data Abstraction Library)是一个的开源栅格空间数据读取/转换库。其中还有一系列命令行工具来进行数据转换和处理。而ORG项目是GDAL的一个分支,功能与GDAL类似,但其提供对矢量数据的支持。 也就是说,可以用ORG的库来读取、处…

Firewall配置

一、安装firewall #yum install -y firewalld firewall-config 二、启动并设置开机自启动# systemctl start firewalld# systemctl enable firewalld# systemctl stop firewalld# systemctl disable firewalld 三、firewall配置# firewall-config 防火墙图形配置界面# firewall…

网页cookie是什么?

Cookie 是用户访问的网站创建的文件,存储在用户电脑的硬盘中,用于保存浏览信息,例如您的网站偏好设置或个人资料信息。网站依靠Cookie辨认用户行踪,了解用户感兴趣内容,收集与用户有关的信息。用户访问查询网页上操作信…

使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)

基于微服务的流架构与开源规则引擎相结合,使实时业务规则变得容易 这篇文章旨在详细说明我将OSS业务规则引擎与Kafka风格的现代流消息传递系统集成在一起的项目。 该项目的目标(即众所周知的复杂事件处理(CEP))旨在实…

chown r mysql ._chown -R 用户名:组名 ./ 及 chown用法介绍

当我们在不通过yum(CentOS)、apt-get(Ubuntu)来安装MySQL的时候,通常执行以下命令来改变目录的拥有者:[rootlocalhost ~]# chown -R mysql:mysql ./这两个mysql谁是用户名谁是用户组呢?见chown详解。chown将指定文件的拥有者改为指定的用户或…

c语言abs和fabs的区别是什么?

abs是整数取绝对值,定义在stdlib.h头文件中。而fabs是指浮点数取绝对值,定义在math.h头文件中。 函数原型 int abs(int x) double fabs(double x)

Linux下编译GDAL

一、准备工作 从官网下载GDAL、PROJ.4和GEOS,将其存放在/home/liml/Work/3rdPart目录并解压,如下图所示。下载地址请自行Google。注:使用的系统是CentOS6.4 X64版本,其他的Linux系统都是一样的。 接下来检查系统中是否安装了开发…

PS提示错误1解决办法

重装电脑系统后,PS打不开了,提示错误1.在网上搜索,很多网友说要卸载重装。控制面板看不到ps,于是下载了Adobe卸载工具(点击链接下载),但是这个程序识别不了安装的ps.最后通过以下办法解决。 1.…