libuv

1. 概述 
libuv是一个支持多平台的异步IO库。它主要是为了node.js而开发的,但是也可以用于Luvit, Julia, pyuv及其他软件。 
注意:如果您发现了此软件中的错误,那么请提交pull requests来帮助我们修改这个错误以提升软件质量。 
2. 特性 
1. 基于epoll, kqueue, IOCP及事件端口(event ports)的事件循环的全部特性。 
2. 异步TCP和UDP sockets。 
3. 异步DNS决策。 
4. 异步的文件及文件系统操作。 
5. 文件系统事件。 
6. ANSI转义码(escape code)控制的TTY。 
7. 带有socket共享进程间通信(IPC),使用unix域sockets或者有名管道(named pipes)(在windows平台上)。 
8. 子进程。 
9. 线程池。 
10. 信号处理。 
11. 高分辨率(high resolution)时钟。 
12. 线程和同步元语(synchronization primitives) 
3.下载 
libuv从http://dist.libuv.org/dist/下载。

libuv是一个跨平台库,是围绕着事件驱动的异步I/O模型来设计的。 
本库不止提供了对不同I/O polling机制的抽象,handles和streams机制也提供了一个更高层的对于sockets和其他实体的抽象。本库还提供了跨平台的文件I/O操作及线程功能。 
下面的图展示了libuv的不同组件及相关的子系统。 

    1. 最底层的socket相关操作有epoll/kqueue和event ports,这些事基于unix like系统的,在这些系统特定的API之上抽象出了一层uv_io_t结构用于提供统一的unix-like平台上的socket及事件接口。
    2. epoll ->linux内核;kqueue->freeBSD 4.1之后;event ports->貌似也是用在linux上的机制。
    3. IOCP为windows上特有的异步I/O事件模型,libuv也是支持的。着也就是libuv好于libev的地方。
    4. 此外libuv还支持线程池。
    5. 在上述底层抽象之上,libuv提供了更高一层的抽象,提供了抽象了的TCP/UDP/TTY/PIPE等接口。
    6. 在这些接口之上提供了文件I/O操作,DNS操作等。
    7. 用户可以基于上述的全部抽象接口实现自己的应用程序。

      句柄和请求 
      libuv给用户提供了两种方式与event loop一起协同工作,一个是句柄(handle)一个是请求(request)。 
      句柄代表了一个长期存在的对象,这些对象当处于活跃状态的时候能够执行特定的操作。例如:一个准备(prepare)句柄在活跃的时候可以在每个循环中调用它的回调一次。一个TCP服务器的句柄在每次有新的连接的时候都会调用它的连接回调函数。 
      请求(request)一般代表短时操作。这些操作能用作用于句柄之上。写请求用于在句柄上写数据;还有一些例外,比如说getaddrinfo请求不需要句柄而是直接在循环中执行。 
      I/O循环 
      I/O循环或者叫做事件循环是整个libuv的核心部分。I/O循环建立了所有IO操作的执行环境,I/O循环会被绑定在一个线程之上。我们可以运行多个时间循环,只要每一个都运行在不同的线程之上。libuv事件循环 不是 线程安全的,所以所有包含事件循环的API及句柄都不是线程安全的。 
      事件循环遵循最普遍的单线程异步I/O方法:所有I/O或者网络操作在非阻塞的socket上执行,这个socket会使用基于平台的组好的poll机制:在linux上使用epoll,在OSX和其他BSD平台上使用kqueue,在sunOS上使用event ports,在windows上使用IOCP。作为循环迭代的一部分,循环会阻塞以等待socket上的I/O活动,这些活动已经被加到socket的触发实践中了,一旦这些条件满足,那么socket的状态就会发生变化,从而循环不再阻塞,而且句柄也可以读、写及执行其他期望的I/O操作。 
      为了更好的理解事件循环操作如何进行,一下的图展示了一个循环迭代的所有阶段。

    8. delphi-libuv wrapper :

      https://github.com/HeZiHang/Delphi-libuv

libuv的更多相关文章

  1. TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

    使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...

  2. libuv源码分析前言

    Libevent,libev,libuv三者的区别所在? libevent提供了全套解决方案(事件库,非阻塞IO库,http库,DNS客户端),然而libevent使用全局变量,导致非线程安全.它的w ...

  3. Nodejs事件引擎libuv源码剖析之:请求(request)结构的设计剖析

    声明:本文为原创博文,转载请注明出处.         在libuv中,请求(request)代表一个用户向libuv发出的指令,比如uv_connect_s就表示一个tcp的连接请求.uv_work ...

  4. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  5. Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

    声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...

  6. Nodejs事件引擎libuv源码剖析之:高效队列(queue)的实现

     声明:本文为原创博文,转载请注明出处. 在libuv中,有一个只使用简单的宏封装成的高效队列(queue),现在我们就来看一下它是怎么实现的. 首先,看一下queue中最基本的几个宏: typede ...

  7. linux下libuv库安装教程

    下载并编译libuv libuv需要自己手动下载源码,并手动编译. 当前目录为:/home/xlz/test/github,在后面,会用$PATH来代替,我的系统的Debian8,64bit. $gi ...

  8. libuv(不断更新)

    /* * Initialize the uv_async_t handle. A NULL callback is allowed. * * Note that uv_async_init(), un ...

  9. libuv在cocos2d-x中的使用

    libuv经过Node.js的实践和应用,已经证明非常之成熟,本来之前项目用的是这个:clsocket https://github.com/DFHack/clsocket  当初选它的主要原因是它支 ...

  10. libuv里的几个缺陷

    libuv是node.js使用的基础库,主要包括主循环,文件和网络接口.虽然libuv是为node.js而生的,但它本身是一个独立的库,加上使用简单方便,所以在node.js之外也有不少人使用.最近整 ...

随机推荐

  1. elasticsearch代码片段,及工具类SearchEsUtil.java

    ElasticSearchClient.java package com.zbiti.framework.elasticsearch.utils; import java.util.Arrays; i ...

  2. linux系统下安装nginx

    1.第一步:获取nginx的安装包 wget http://nginx.org/download/nginx-1.7.8.tar.gz 2.解压安装包tar -xvf nginx-1.7.8.tar. ...

  3. KVM -> 虚拟化简介&虚拟机安装_01

    什么是虚拟化? 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以抽象.转换后呈现 ...

  4. centos6.5环境通过rpm包安装mysql5.5.51数据库

    centos6.5环境通过rpm包安装mysql5.5.51数据库 注意:此方法适用于单独安装数据库的需求,如果在该机器上还需要安装php环境,建议mysql通过编译或yum方式安装 1.查找已经安装 ...

  5. .gitkeep

    看一个开源项目中有个.gitkeep文件,不知道是干嘛用的查询知道 git是不允许提交一个空的目录到版本库上的,可以在空的文件夹里面建立一个.gitkeep文件,然后提交去即可. 其实在git中 .g ...

  6. Python外部脚本调用Django项目Model表

    在实际生产中有时候会出现这种情况,原本运行了一个Django项目,后面又需要一些外部脚本进行辅助,而这些脚本又不希望集成到项目当中,但是又需要用到Django项目的Model,这时候是无法像在项目当中 ...

  7. SSL证书链说明

    SSL证书链说明 1. SSL证书链定义 证书颁发机构(CA)共分为两种类型:根CA和中间CA.为了使SSL证书被信任,该证书必须由设备所连接的可信存储库CA颁发. 如果该证书不是由受信任CA,该链接 ...

  8. 均方根误差(RMSE),平均绝对误差 (MAE),标准差 (Standard Deviation)

    来源:https://blog.csdn.net/capecape/article/details/78623897 RMSE Root Mean Square Error, 均方根误差是观测值与真值 ...

  9. 洛谷P2261 [CQOI2007] 余数求和 [数论分块]

    题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...

  10. jQuery中click(),bind(),live()的区别(转)

    原文:http://www.jquery001.com/click%28%29-bind%28%29-live%28%29-delegate%28%29.html click(),bind(),liv ...