libuv 网络库设计概览译
设计概览
libuv 是一种支持跨平台的网络库,最初是为了NodeJS作为某个模块实现的,主要基于事件驱动的I/O 模型设计的。
这个库不仅仅对不同的I/O polling 机制提供简单的抽象。 handles 和 sreams对scokets和其他的实体提供更高层的抽象,而且还支持跨平台文件I/O和线程的功能。
下面有个图,展示了libuv的不同组成部分和他们分别属于那个系统。
Handle和requests
libuv为用户提供了两个可以使用的抽象,结合事件循环:handles和request。
Handles代表一个持久对象,存活期间可以执行一系列确定的操作。例如:
o 当一个准备好的handle在存活的时候,每次循环迭代获得一次回调函数的回调
o 一个TCP的server
handle在每次有新链接的时候都会获得一次连接回调。
而Request代表一个短期操作。
这些操作可以给予handle来实现。 写请求用来在handles上写数据,或者标志:getaddrinfo不需要一个handle直接在loop中运行。
I/O 循环
I/O 循环是libuv的核心部分。它建立起IO操作的所有内容。并且它被绑定在一个单线程上。如果你想运行多个时间循环只需要在不同的线程里面运行就可以了。libuv的事件循环(其他的API可以引入事件循环和handles)不是线程安全的除非另有说明。
event事件循环采用单线程异步I/O的方法。所有的网络I/O是非阻塞的方式执行的,异步的处理方式也是操作系统中最好的方式。linux下用的epoll, OSX和其他的BSD用的是kqueque,在SUNOS用的是event ports,而windows上用的是IOCP。作为循环迭代的一部分,循环将会阻塞等待已经被poll的I/O活动 。当套接字上的条件显示可读或者可写或者其他的操作的时候,回调将会被触发。
为了更好的理解事件循环是怎么工作的。下面的这张图展示了循环迭代的所有阶段。
解释一下上面的那张图
- 更新循环概念中'now'事件循环在事件循环开始的时候缓存当前的时间以减少时间相关的系统调用。
- 循环存活迭代开始,都在循环立刻退出。所以什么时候后循环被认为是在存活呢。如果一个循环当中有活动, ref’d请求(不知道咋翻译),活跃的请求,或者正在关闭的handle,就认为他是火存活的。
- 由于计时器正在运行。在循环的当前概念获得他们的回调的时候所有的计时器被调度一次。
- pending的callbacks被调用。所有的I/O callbacks大多数情况下在polling I/O
之后正好被调用。也有些情况在调用的时候被推迟到下一次迭代。其实上一次的迭代将任何的I/O调用推迟就会出现这种情况。
5.idlehandle被调用。尽管这是个不幸的名字,但是idle handle在每次loop迭代都会调用,当然前提是loop存活。
6.接下来 Prepare handle被调用。 Prepare handles在loop被I/O阻塞之前恰好被调用。
- poll 是否超时被计算。在因为I/O被阻塞之前计算它应该被阻塞多久。超时规则的计算如下:
1)如果循环以UV_RUN_NOWAIT 标志运行的,,等待时间应该为0 2)如果循环将会停止(uv_stop被调用),超时时间是0. 3)如果没有活动的handles和request,超时时间是0 4)如果没有idlehandle活动漫画。超时时间是0 5)如果没有任何的handle期望结束,超时时间是0 6)如果以上没有任何一个条件满足,取最近的时间计时器,否则设为无穷大。 - 循环因I/O阻塞。这里循环将会因上一步中I/O计算而阻塞。这里所有管理读写或其他操作的文件描述符的相关handle将得到调用。
- check handle 被调用。 check handles恰好在loop阻塞之前恰好被调用。check handles和prepare handles是对应的。
- close handles 被调用。 如果一个handle 被调用uv_close时候被关闭。close回调会被调用
- 特别情况下loop可以以UV_RUN_ONCE调用。在I/O阻塞之后没有I/O调用被触发也是可能的。但是有些时间已经过去了,所以一些计时器已经到期了。这些计时器获得调用。
12.迭代停止。如果loop运行flag是 UV_RUN_NOWAIT 和 UV_RUN_ONCE迭代将会结束并且Uv_run() 将会返回。如果循环以UV_RUN_DEFAULT运行, loop存活的话会从头开始运行,否则就结束。
特别的:libuv利用线程池让异步 I/O操作变得可能。所以网络I/O 总是在单线程,每个loop是个线程。
文件I/O
不像网络 I/O, 文件I/O没有平台特殊性的文件I/O基本元可依赖。当前的方案是在线程池中运行阻塞的I/O操作。
libuv用的全局线程池,所有的事件循环都可以在上面工作。有三种类型的操作在池上运行。
文件系统操作
DNS函数
用户通过uv_queue_work()声明的代码
看一下线程池的调度部分,其实线程池大小很有限。
转载于:https://www.cnblogs.com/xiaozhi007/p/7295667.html
libuv 网络库设计概览译相关推荐
- muduo网络库设计与实现(二)
muduo网络库设计与实现(一) 文章目录 muduo网络库设计与实现(一) base InetAddress Socket 单线程网络库 Acceptor TcpServer TcpConnecti ...
- 网易云音乐网络库跨平台化实践
导读: 2021年10月21日,「QCon 全球软件开发大会」在上海举办,网易智企技术 VP 陈功作为出品人发起了「AI 时代下的融合通信技术」专场,邀请到网易云信.网易音视频实验室.网易云音乐的技术 ...
- 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...
- Linux C++ 网络库 Muduo
muduo 是一个基于 Reactor 模式的现代 C++ 网络库,它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序.视频连接:http ...
- 网络库libevent、libev、libuv、libhv对比
网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...
- 网络库libevent、libev、libuv对比
Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...
- XMNetworking 网络库的设计与使用
2019独角兽企业重金招聘Python工程师标准>>> XMNetwoking 是我们团队开源的一个网络库,详见:GitHub XMNetworking 是一个轻量的.简单易用但功能 ...
- muduo网络库学习(三)定时器TimerQueue的设计
Linux下用于获取当前时间的函数有 time(2) / time_t (秒) ftime(3) / struct timeb (毫秒) gettimeofday(2) / struct timeva ...
- 收藏的博客 -- 高性能Linux/Windows服务器/C++网络库(★★★★★)
免费的跨平台SSH和SFTP工具: https://www.putty.org/ -- Windows https://www.chiark.greenend.org.uk/~sgtatham/put ...
最新文章
- java aws访问授权 实例_java – 使用IAM身份验证和Spring JDBC访问AWS ...
- CentOS 7如何设置Linux开机自动获取IP地址
- 第一课 计算机组成原理(哈工大)
- 爬虫开发.1爬虫介绍
- 使用order by排序判断返回结果的列数,order by排序判断字段数原理详解
- C++的基础知识【面试遇到】
- Python 分析Nginx 日志并存入MySQL数据库(单线程)
- modbus发送接收_自己编写MODBUS协议代码所踩过的坑
- sql prompt linux,sqlplus中灵活使用sqlprompt提示符
- 2018华为软件精英大赛
- php语言能开发app吗_如何利用PHP语言开发手机APP
- 杂谈 之 闲来无事(三)
- QListView实现自定义Item
- java调用打印机打印
- 【深入理解TcaplusDB技术】详细介绍TDR 表中Tcaplus的相关属性
- 哪吒之魔童降世视听语言影评_《哪吒之魔童降世》观后感——不用吹爆,但值得点赞...
- 小游戏正在毁灭微信群聊(文中有福利)
- android netd和kernelframeworks的通信逻辑
- dz邮箱验证怎么设置_如何设置discuz qq邮箱验证
- 应用层 DNS域名解析服务器 文件传送协议FTP 简单邮件传送协议SMTP 万维网 HTTP超文本协议
热门文章
- oracle的table是什么,oracle – 什么是XMLTABLE
- 为什么用java开发app_安卓开发为什么选择用Java语言
- python 打开网页自动播放视频_html5的video标签自动播放
- Docker容器时间与宿主机同步
- Golang slice 的底层实现
- imagestring不支持中文,改用imagettftext
- 百度区块链所遇到的问题及处理汇总
- 高效实用Kafka-Kafka消息处理(底层原理)
- Laravel核心解读--路由(Route)
- 深入理解BeanPostProcessor接口