1. 程式人生 > >libuv中文API手冊(1)

libuv中文API手冊(1)

官方文件URL

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從此處下載。
4.安裝
安裝說明可以在README中找到。
5.升級
不同版本的程式遷移參考如下:
從0.10遷移到1.0.0
6.文件
6.1 設計概述
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操作。
    為了更好的理解事件迴圈操作如何進行,一下的圖展示了一個迴圈迭代的所有階段。
    這裡寫圖片描述

    1. 循壞中的“now”被更新為當前時間。事件迴圈在迴圈開始時快取當前時間滴答數的目的是為了減少時間相關的系統呼叫數量。
    2. 如果迴圈是alive的,那麼表明一個迭代已經開始了,否則的話迴圈會立即退出。那麼,什麼時候一個迴圈被認為是alive的呢?答案是如果一個迴圈中包括活躍及被引用的控制代碼(active and ref`d handles),活躍的請求或者是正在關閉的控制代碼,那麼這個迴圈被認為是活的(alive)。
    3. Due定時器執行。
    4. 掛起的回撥被呼叫。
    5. 空閒(idle)控制代碼回撥被呼叫。
    6. 準備(prepare)回撥控制代碼被呼叫。
    7. 計算poll超時。
    8. 迴圈阻塞。
    9. 呼叫check控制代碼。
    10. 呼叫close控制代碼。
    11. 特殊case執行。
    12. 一次迴圈迭代結束。
      **注意:
      libuv利用執行緒池技術使得非同步檔案I/O操作稱為可能,但是對於網路IO只能執行在一個單一執行緒中,即loop的執行緒中。**