libuv:多平台支持库-异步I / O
http://libuv.org/
目录
概述¶
功能
文档
下载
安装
设计概述¶
把手和请求¶
I / O循环
文件I /
概述¶
libuv是一个多平台支持库,主要关注异步I / O。它主要通过开发使用Node.js的,但它也使用了Luvit, 朱莉娅,pyuv,和其他人。
注意
如果您在本文档中发现错误,可以发送拉取请求来帮助您 !
功能
- 由epoll,kqueue,IOCP和事件端口支持的功能齐全的事件循环。
- 异步TCP和UDP套接字
- 异步DNS解析
- 异步文件和文件系统操作
- 文件系统事件
- ANSI转义码控制的TTY
- 具有套接字共享的IPC,使用Unix域套接字或命名管道(Windows)
- 子进程
- 线程池
- 信号处理
- 高分辨率时钟
- 线程和同步原语
文档
- 设计概述
- API文档
- 用户指南
- 升级中
下载
可以从这里下载libuv 。
安装
安装说明可在README中找到。
设计概述¶
libuv是跨平台支持库,最初是为Node.js编写的。它是围绕事件驱动的异步I / O模型设计的。
该库提供的不只是对不同I / O轮询机制的简单抽象:“句柄”和“流”为套接字和其他实体提供了高级抽象;还提供跨平台文件I / O和线程功能。
这是说明组成libuv的不同部分以及它们与哪个子系统有关的图:
把手和请求¶
libuv与事件循环结合为用户提供2种抽象的处理方式:句柄和请求。
句柄表示活动时能够执行某些操作的长寿命对象。一些例子:
- 准备句柄在活动时每次循环迭代都会调用一次其回调。
- 一个TCP服务器句柄在每次有新连接时都会调用其连接回调。
请求代表(通常)短暂的操作。这些操作可以在一个句柄上执行:写请求用于在句柄上写数据;还是独立运行:getaddrinfo请求不需要直接在循环上运行的句柄。
I / O循环
I / O(或事件)循环是libuv的核心部分。它建立所有I / O操作的内容,并且将其绑定到单个线程。只要每个事件循环在不同的线程中运行,就可以运行多个事件循环。除非另有说明,否则libuv事件循环(或与此有关的任何其他涉及循环或句柄的API)都不是线程安全的。
事件循环遵循通常的单线程异步I / O方法:所有(网络)I / O在非阻塞套接字上执行,这些套接字使用给定平台上可用的最佳机制进行轮询:Linux上的epoll,OSX上的kqueue和其他BSD,SunOS上的事件端口和Windows上的IOCP。作为循环迭代的一部分,循环将阻止等待已添加到轮询器中的套接字上的I / O活动,并且将触发回调以指示套接字条件(可读,可写挂起),以便句柄可以读取,写入或执行所需的I / O操作。
为了更好地了解事件循环的运行方式,下图说明了循环迭代的所有阶段:
“ now”的循环概念已更新。为了减少与时间相关的系统调用的数量,事件循环在事件循环滴答的开始处缓存当前时间。
如果循环是活动 的,则开始迭代,否则循环将立即退出。那么,什么时候认为循环还活着?如果循环具有活动句柄和引用句柄,活动请求或关闭句柄,则认为该循环是活动的。
到期计时器运行。计划在循环概念之前的某个时间的所有活动计时器现在 将调用其回调。
调用待处理的回调。大多数情况下,在轮询I / O之后立即调用所有I / O回调。但是,在某些情况下,调用此类回调会推迟到下一个循环迭代。如果先前的迭代推迟了任何I / O回调,则它将在此时运行。
空闲句柄回调被调用。尽管名称很不幸,但如果空闲句柄处于活动状态,则会在每次循环迭代中运行它们。
准备句柄回调。准备句柄在循环将阻止I / O之前立即调用其回调。
计算轮询超时。在阻塞I / O之前,循环会计算阻塞的时间。这些是计算超时的规则:
- 如果使用该
UV_RUN_NOWAIT
标志运行循环,则超时为0。 - 如果要停止循环(
uv_stop()
被调用),则超时为0。 - 如果没有活动的句柄或请求,则超时为0。
- 如果有任何空闲的句柄处于活动状态,则超时为0。
- 如果有任何要关闭的句柄,则超时为0。
- 如果以上情况均不匹配,则采用最接近的定时器超时,或者如果没有活动的定时器,则为无穷大。
- 如果使用该
I / O的循环块。此时,循环将在上一步计算的持续时间内阻止I / O。此时,监视给定文件描述符的读写操作的所有与I / O相关的句柄都将调用其回调。
检查句柄回调被调用。在为I / O阻塞循环之后,检查句柄立即调用其回调。检查手柄本质上是准备手柄的对应物。
关闭回调被调用。如果通过调用关闭了句柄
uv_close()
,则将调用close回调。如果循环使用来运行
UV_RUN_ONCE
,则为特例,因为这意味着前进。阻止I / O后可能没有触发任何I / O回调,但是经过了一段时间,因此可能有到期的计时器,这些计时器将调用其回调。迭代结束。如果循环以
UV_RUN_NOWAIT
或UV_RUN_ONCE
模式运行,则迭代结束并uv_run()
返回。如果运行了循环,UV_RUN_DEFAULT
那么如果循环仍然存在,它将从头开始继续运行,否则也将结束。
重要
libuv使用线程池使异步文件I / O操作成为可能,但是网络I / O 始终在单个线程(每个循环的线程)中执行。
注意
尽管轮询机制不同,但是libuv使执行模型在Unix系统和Windows之间保持一致。
文件I /
与网络I / O不同,libuv没有依赖于平台的文件I / O原语,因此当前方法是在线程池中运行阻止文件I / O操作。
要全面了解跨平台文件I / O的情况,请查看 这篇文章。
libuv当前使用全局线程池,所有循环都可以在该线程池上排队工作。当前在此池上运行3种类型的操作:
- 文件系统操作
- DNS函数(getaddrinfo和getnameinfo)
- 用户指定的代码通过
uv_queue_work()
警告:有关更多详细信息,请参见“ 线程池工作调度”部分,但是请记住,线程池的大小非常有限。
- Introduction
- Who this book is for
- Background
- Code
- Basics of libuv
- Event loops
- Hello World
- Error handling
- Handles and Requests
- Filesystem
- Reading/Writing files
- Filesystem operations
- Buffers and Streams
- File change events
- Networking
- TCP
- UDP
- Querying DNS
- Network interfaces
- Threads
- Core thread operations
- Synchronization Primitives
- libuv work queue
- Inter-thread communication
- Processes
- Spawning child processes
- Changing process parameters
- Detaching processes
- Sending signals to processes
- Signals
- Child Process I/O
- Parent-child IPC
- Advanced event loops
- Stopping an event loop
- Utilities
- Timers
- Event loop reference count
- Idler pattern
- Passing data to worker thread
- External I/O with polling
- Check & Prepare watchers
- Loading libraries
- TTY
- About
libuv:多平台支持库-异步I / O相关推荐
- Windows 平台下面的IOCP技术 Linux下面Epoll 还有FreeBSD下面Kqueue的应用了。跨平台库行业里面最出名的莫过于ACE、ASIO(Boos公司)两大支持库支持IOCP
http://wenku.baidu.com/view/4117460502020740be1e9b3c.html 游戏服务器集群 自从2003年开发VOIP Radius Server以及修改Gnu ...
- C/C++开发,无可避免的多线程(篇二).thread与其支持库
目录 一.原子类型与原子操作 1.1 原子类型与操作介绍 1.2 c++11的原子类型 1.3 原子操作功能与应用 1.4 原子布尔类型 1.5 原子操作-内存同步顺序 二. 原子操作库 2.1 原子 ...
- androidx和android的区别,【译】使用AndroidX代替Android支持库
今天,我们发布一个新的Android扩展库(AndroidX)的早期预览版,这表示了支持库的一个新的时代.请为这些变化提出你们的反馈.既然这是一个早期的预览版本,我们并不建议放在生产环境尝试这些功能, ...
- DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建 DCMTK 362MD支持库与Microsoft Visual Studio 2017开发 ...
- Android 测试支持库 1.0 现已发布!
我们非常高兴地宣布,Android 测试支持库 (ATSL) 1.0 版现已发布. ATSL 1.0 版对现有测试 API 进行了重要更新,不仅添加了许多新功能.还提升了性能和稳定性,同时还修复了若干 ...
- 2023年,“新一代”固定资产管理平台——支持低代码平台
固定资产是各企业和工厂的主要生产要素,占企业整体资金比例较重,而且随着企业的发展,实物资产的数量和员工日益增多,固定资产的重要性日益凸显.如何高效管理这些实物资产也成了企业管理者经常考虑的问题.单纯依 ...
- Moodle平台题库建设技术
Moodle平台题库建设技术 简述 GIFT格式特点及支持的题目类型 一.开始制作 1.判断题 2.单选题 3.多选题 4.数值题 5.简答题 6.描述性文本 7.匹配题 二.题目选项 行注释 题目名 ...
- LDAC在QCC平台支持情况(HIFI选型指南)
LDAC在QCC平台支持情况(HIFI选型指南) 概述 这里只讲经过授权的.Sony官方承认的平台支持情况.作为DSP编解码库,只有那些支持DSP编程的QCC平台才支持. 本节也可作为HIFI选型指南 ...
- 工作邦智慧水务云平台支持的20+硬件
"工作邦智慧水务云平台"是一个软件硬件深度结合的平台,硬件来自于合作多年的行业合作伙伴.通过与硬件的深度结合,水务云平台架构比较完整,业务办理更加流畅.操作更加快捷. 下面是平台支 ...
最新文章
- 从AndroidStudio同步上传项目代码到GitHub
- 使用read_html爬取网页表哥,Python笔记:用read_html()爬取table形式表格的网络数据...
- ubuntu dpkg mysql_ubuntu-12.04 – 在Ubuntu 12.04上无法启动MySQL5.5 – “dpkg:依赖问题”...
- java 序列化异常_关于spring:Java序列化异常消息
- CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置
- Getway 中predicates: - Query=x 标签作用
- 2022-2028全球与中国卫星地面网络科技市场现状及未来发展趋势
- 苹果开发者证书报错证书不受信任
- 关于申请博客园开通博客功能
- 怎样取消php加密mppe,PHP 加密问题 求大神帮忙? 谢谢
- 未得冠军的运动员也有教练——Leo鉴书71
- web下载文件夹的解决方案
- 2022年「博客之星」参赛博主:落寞的魚丶
- CSS图片底部留白的解决办法
- mysql实现自增字符串_Mysql实现字符串主键自增示例教程-Go语言中文社区
- mv150us无线网卡驱动linux,水星MW150US2.0驱动-水星MW150US无线网卡驱动下载v2.0 官方最新版-西西软件下载...
- 【ALGO】模拟退火(1)
- FPGA的BRAM和distributed RAM学习
- 常用的遥感植被指数介绍
- com.android.phone目录,手机开机一直显示quot;com.android.phone已停止quot;肿么弄
热门文章
- Kafka集群全部断开,然后重启时报“The broker is trying to join the wrong cluster. Configured zookeeper.connect……”问题
- 【2019.09.08】2019icpc南昌网络赛
- PHP7实战开发简单CMS内容管理系统(11)批量删除栏目数据
- 前端如何展示商品属性:SKU多维属性状态判断算法的应用-Vue 实现
- 求计算两个时间的差(DateTime类和TimeSpan类)
- 文本框中只能输入小于等于100的正整数
- [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.16
- EZGUI下的动态图片的处理
- Repeater绑定ArrayList数据源
- 9-Mybatis 多表查询之一对多