libuv初学者学习笔记

简介: 开始阅读前,我简单的理解觉得是,类似于leetcode的一种题,外部同时启动开始,但是内部严格的按照线程1->线程2的顺序发生过程。

ibuv框架

50615a5f9de34bb4975a48e8de4b9dad.png

从上往下看,从左往右分成网络IO与文件IO等操作:网络I/O看,linux平台通过底层epoll作为异步I/O处理,中间是抽象层uv__io_t;对于文件I/O,linux没有特定平台的异步原语,所以在线性池中执行阻塞Io来实现异步。


同步I/O


由于与cpu处理速度不匹配,我们采用多线程多进程来执行,不会当一个进程挂起后影响其他线程或进程。但是存在弊端,系统不会无上限的增加线程/进程,并且切换线程的开销也不能忽略,所以多线程多进程切换时间会占用cpu运行代码时间,降低性能,所以引入异步I/O。

异步I/O

简单来说就是,用户不需要等待内核完成实际对io的读写操作就直接返回了。


异步 事件驱动


libuv提供一套事件循环和基于I/O通知的回调函数还有loop。

9277848f584a4d0b901c6e2c4ff7fd0c.png


libuv提供的核心工具->计时器、非阻塞网络编程(tcp)、异步访问文件系统……

loops:职责:收集事件或监控其它事件。

事件驱动编程,程序会关注事件,对于每个事件产生反应。

上图就是所有I/O事件循环处理的过程,即uv_run()函数执行过程。


1.首先判断循环是否活着,通过是否存在alive活动状态的句柄,不存在则退出。

2.开始倒计时,维护所有的定时器,若句柄超时就告知应用层,退出或者重新加入循环。

3.调用待处理的回调函数,如果有待处理的就去处理它。

4.运行空闲句柄。

5.运行准备回调句柄,在某个I/O要阻塞前,有需要的话就运行回调函数。

6.计算轮询超时,在阻塞I/O前循环会计算阻塞时间,并将I/O进入阻塞状态。


规则(先留印象,后理解):

如果使用该UV_RUN_NOWAIT模式运行循环,则超时为0。

如果要停止循环(uv_stop()被调用),则超时为0。

如果没有活动的句柄或请求,则超时为0。

如果有任何空闲的句柄处于活动状态,则超时为0。

如果有任何要关闭的句柄,则超时为0。

如果以上情况均不匹配,则采用最接近的定时器超时,或者如果没有活动的定时器,则为无穷大。


7.检查句柄回调,此时如果有可读可写的

操作就调用相应回调,如果超时了就调用超时回调。

8.如果通过调用uv_close()函数关闭,则调用close关闭。

9.在超时后更新下一次循环时间。通过UV_RUN_DEFAULT模式运行循环。


uv_run(loop, UV_RUN_DEFAULT);


读取写入是一个会降低性能的过程,与cpu速度差的很多,所以要改善这个问题。

1744f5680dc6423d814dddc110092463.png

常见的解决方式是多线程,但是libuv采用了异步的解决方法,非阻塞风格。

初始化loop前,给其分配相应的内存。在用uv_loop_close(uv_loop_t *)关闭loop后,要回收内存空间。

libuv通过创造对应的I/O设备、定时器、进程等handle来实现。

handle是不透明的数据结构,其中对应的类型uv_TYPE_t的type指定handle的使用目的。


handle(句柄)代表持久性对象。相应的handle有许多相关联的request,request是一个短暂性对象(对比于持久性就是只维持一个回调函数的时间),对映着handle的I/O操作。



相关文章
QT软件开发: QPlainTextEdit当做日志显示窗口
QT软件开发: QPlainTextEdit当做日志显示窗口
1279 0
QT软件开发: QPlainTextEdit当做日志显示窗口
vscode 使用markdown 转PDF的常见问题 之插件安装
vscode 使用markdown 转PDF的常见问题 之插件安装
1141 0
|
传感器 网络协议 物联网
Linux MQTT通信:实现轻量级物联网传输协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网传输协议,专门设计用于低带宽、不稳定网络环境下的传感器和物联网设备通信。本文将深入探讨Linux环境下如何实现MQTT通信,介绍MQTT协议的基本原理、常用MQTT库以及如何在Linux系统中编写MQTT客户端和服务器端程序。
2915 0
|
C++ 开发者 编译器
C/C++经典面试50题(挑重点整理)下
重点整理了C/C++经典面试题
23736 0
|
开发框架 Ubuntu 应用服务中间件
FastCGI与spawn-fcgi安装与配置
FastCGI与spawn-fcgi安装与配置
1569 0
FastCGI与spawn-fcgi安装与配置
|
6月前
|
人工智能 IDE 开发工具
Visual Studio 2026 v18.5 发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
Visual Studio 2026 Enterprise 18.5 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
342 2
Visual Studio 2026 v18.5 发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
|
Ubuntu 定位技术
Ubuntu 20.04应用部署:Beyond Compare 4.4.7安装教程
这样,你就成功在Ubuntu 20.04上安装了Beyond Compare 4.4.7。就像一个探险者,你有了罗盘,有了地图,熟能生巧,你就可以在未知的世界中探索,发现,享受这个过程。这是一次成功的探险,你做得很好!
2410 7
|
算法 Unix Linux
快速了解C++17 std:: filesystem的原理和使用
快速了解C++17 std:: filesystem的原理和使用
1140 4
|
Ubuntu Linux Shell
9-19|linux由于修改了时间,我现在想调成北京时间
9-19|linux由于修改了时间,我现在想调成北京时间
|
存储 网络协议 调度
淘宝移动端统一网络库的架构演进和弱网优化技术实践
本文将介绍淘宝 APP 统一网络库演进的过程,讲述如何围绕体验持续构建南北向从监测到加速一体化的终端网络架构,通过构建 NPM 弱网诊断感知能力,落地原生多通道技术/多协议择优调度手段,贴合厂商附能网络请求加速,实现去 SPDY 及规模化 IPv6/H3 协议簇的平滑过渡,为用户提供弱网更好、好网更优的 APP 加载浏览体验,支撑业务创造更多的可能性。
1311 0

热门文章

最新文章