2. 源码一览
本文收录自: Libuv 源码分析 (2): 源码一览
一、概述 Libuv 采用了异步 (asynchronous), 事件驱动( event-driven ) 的编程风格, 其核心任务是为开人员提供了一套事件循环和基于 I/O (或其他活动)通知的回调函数, Libuv 提供了一套核心的工具集, 例如定时器, 非阻塞网络编程的支持, 异步访问文件系统, 子进程以及其他功能。
一、概述
Libuv 采用了异步 (asynchronous), 事件驱动( event-driven ) 的编程风格, 其核心任务是为开人员提供了一套事件循环和基于 I/O (或其他活动)通知的回调函数, Libuv 提供了一套核心的工具集, 例如定时器, 非阻塞网络编程的支持, 异步访问文件系统, 子进程以及其他功能。
二、I/O 复用机制和线程池
对于网络 I/O ,Libuv 根据将不同的操作系统提供的 I/O 多路复用机制进行了封装;对于文件 I/O、域名解析等,使用了线程池 (在 Libuv 0.10, Windows 上使用的是 QueueUserWorkItem 。但在 1.0 也采用和 UNIX 一样的线程池实现。)。当然,用户代码也可以使用 Libuv 提供的线程池。

三、跨平台
Libuv 支持 Windows、Linux(Android)、AIX、SunOS(Solaris)、Darwin(macOS/iOS)、BSD(DragonFly、FreeBSD、OpenBSD、NetBSD),最近打算新增对 OS/390 的支持。

Windows 和 UNIX/Linux 是两个” 敌对” 阵营,二者在 API 上就有较大差异; Linux 和 UNIX 之间,及 UNIX 实现之间,一些 API 、系统限制和选项也不尽相同。下表作出了部分对比:
| OS | I/O 多路复用 | 线程 | Socket | extern |
|---|---|---|---|---|
| Windows | IOCP | Widows Thread | winsock | 动态库导入导出函数、数据、类 (Libuv 中主要是函数) 需: __declspec(dllexport), __declspec(dllimport), 直接使用源码当然不需要。 |
| Linux | epoll | POSIX Thread | socket | "如果使用 GCC (使用 __GNUC__测试宏) 编译需: __attribute__((visibility(""default"")))" |
| AIX | IOCP ? | 同 Linux | 同 Linux | 同 Linux |
| SunOS | event ports | 同 Linux | 同 Linux | 同 Linux |
| BSD | kqueue | 同 Linux | 同 Linux |