![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Libuv源码解析
文章平均质量分 88
Anita-Sun
一只热衷于分享前端知识的奶牛猫~ ️
展开
-
Reactor和Proactor
此文章转自 小林coding正好最近系统学习了这两个东西,写了篇 8000+ 字总结,带你图解 Reactor 和 Proactor 这两个高性能网络模式。别小看这两个东西,特别是 Reactor 模式,市面上常见的开源软件很多都采用了这个方案,比如 Redis、Nginx、Netty 等等,所以学好这个模式设计的思想,不仅有助于我们理解很多开源软件,而且也能在面试时吹逼。发车!演进如果要让服务器服务多个客户端,那么最直接的方式就是为每一条连接创建线程。其实创建进程也是可以的,原理是一样.转载 2022-04-30 14:24:01 · 237 阅读 · 0 评论 -
libuv 源码解析系列文章已经全部完成
欢迎大家去看!希望对大家有帮助,加油,奥里给!https://github.com/Anita-Mul/Libuv-Analyse原创 2022-04-27 21:42:19 · 608 阅读 · 0 评论 -
Libuv源码分析 —— 10. unix域
unix 域Unix 域一种进程间通信的方式,他类似 socket 通信,但是他是基于单主机的。可以说是单机上的 socket 通信。在 libuv 中,unix 域用 uv_pipe_t 表示unix 域的实现和 tcp 的实现类似。都是基于连接的模式。服务器启动等待连接,客户端去连接。 然后服务器逐个摘下连接的节点进行处理。uv_pipe_t — 管道句柄管道句柄对Unix上的本地域套接字和Windows上的有名管道提供一个抽象数据类型uv_pipe_t管道句柄类型(原创 2022-04-11 16:35:30 · 1395 阅读 · 0 评论 -
Libuv源码分析 —— 9. DNS
在上节中,我们学会了线程池的执行流程,在这一节中,咱们一起了解 DNS 是如何利用线程池完成解析这种慢IO操作的。DNSLibuv 提供了一个异步 dns 解析的能力。包括通过域名查询 ip 和 ip 查询域名两个功能。 Libuv 对操作系统提供的函数进行了封装,配合线程池和事件循环实现异步的能力数据类型uv_getaddrinfo_tgetaddrinfo请求类型。void (*uv_getaddrinfo_cb)( uv_getaddrinfo_t.原创 2022-04-11 09:53:07 · 1717 阅读 · 0 评论 -
Libuv源码分析 —— 8. 线程池
网络I/O在 上一节 的学习中,我们已经搞明白了网络I/O的基本过程,并通过了解进程/线程间通信来熟悉这个流程。下面,让咱们学习线程池中的线程如何工作、并和主进程进行通信的吧!线程池Libuv 是基于事件驱动的异步库。对于耗时的操作。如果在 Libuv 的主循环里执行的话, 就会阻塞后面的任务执行。所以 Libuv 里维护了一个线程池。他负责处理 Libuv 中耗时 的操作,比如文件 io、dns、用户自定义的耗时任务(文件 io 因为存在跨平台兼容的问 题。无法很好地在事件驱动模块实现异步原创 2022-04-10 18:12:09 · 3707 阅读 · 0 评论 -
Libuv源码分析 —— 7. 进程/线程间通信
网络 I/O 运行原理通过之前的学习,我们已经明白了 Libuv 是通过 循环 来不断取出 watcher 队列中的事件,利用 epoll(linux) 来实现无阻塞 I/O。我们可以通过调用 IO观察者 相关API来将事件推入 watcher 队列中。下面就让咱们通过这种机制来了解进程/线程间是如何通信的吧!进程/线程间通信其他进程/线程和主进程的通信是使用 uv_async_t 结构体实现的。Libuv 使用 loop->async_handles 记 录 所有的 uv_async_原创 2022-04-09 22:36:49 · 997 阅读 · 0 评论 -
Libuv源码分析 —— 6. 事件循环【uv_run】
通过之前的学习,咱们已经明白了在事件循环中的三个核心内容,分别是:Libuv源码分析 —— 定时器Libuv源码分析 —— idle、prepare、checkLibuv源码分析 —— poll io现在让咱们从头捋一遍事件循环到底完成了什么功能呢?uv_runint uv_run(uv_loop_t* loop, uv_run_mode mode)这个函数运行事件循环。 它将依指定的模式而采取不同的行为:UV_RUN_DEFAULT:运行事件循环直到没有更.原创 2022-04-08 22:28:19 · 1808 阅读 · 0 评论 -
Libuv源码分析 —— 5. poll io
经过之前的学习,咱们已经学会了计时器模块、idle、prepare、check 模块。下面咱们继续学习 uv_run 中最后一个,也是最难的一个模块 —— poll iopoll io 是 libuv 非常重要的一个阶段,文件 io、网络 io、信号处理等都在这 个阶段处理uv_runint uv_run(uv_loop_t* loop, uv_run_mode mode) {int timeout;int r;int ran_pending;r = uv__loop_alive(l..原创 2022-04-08 20:26:11 · 647 阅读 · 0 评论 -
Libuv源码分析 —— 4. idle、prepare、check
在上一节中,咱们介绍了 uv_run 中的第一部分 —— 定时器,让咱们接着来看 uv_run 中的下一部分 —— prepare,check,idleuv_runint uv_run(uv_loop_t* loop, uv_run_mode mode) { int timeout; int r; int ran_pending; r = uv__loop_alive(loop); if (!r) uv__update_time(loop); while (r != 0 &am.原创 2022-04-08 14:27:44 · 2774 阅读 · 0 评论 -
Libuv源码分析 —— 3. 定时器
恭喜你,完成了上一节的学习,下面让咱们一起来分析一下定时器是如何实现的吧!helloworld首先,让咱们来一个最简单的 Libuv 程序#include <stdio.h>#include <stdlib.h>#include <uv.h>int main() { uv_loop_t *loop = malloc(sizeof(uv_loop_t)); // 初始化给定的 uv_loop_t 结构体 uv_loop_init(l.原创 2022-04-08 09:38:58 · 1389 阅读 · 0 评论 -
Libuv源码分析 —— 2. Libuv基本介绍
Libuv 介绍Libuv 是一个跨平台的的基于事件驱动的异步 io 库。但是他提供的功能不仅仅是 io,包括进程、线程、信号、定时器、进程间通信等句柄【Handle】句柄 表示能够在活动时执行特定操作的长期存在的对象Libuv 中所有的句柄都需要初始化,初始化的时候会调用 uv_xxx_init,xxx 表示句柄的类型Libuv 中句柄种类uv_loop_t — 事件循环uv_handle_t — 基础句柄uv_req_t — 基础请求uv_原创 2022-04-08 09:37:47 · 1388 阅读 · 0 评论 -
libuv 源码分析 —— 1.queue
定义指针数组类型typedef void *QUEUE[2];使用QUEUE q; // 相当于 void *q[2]定义基本操作#define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0]))#define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1]))#define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q)))#define原创 2022-04-05 17:29:57 · 1836 阅读 · 0 评论