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的線程中。**
發佈了55 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章