日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libuv 原理_Libuv初理解

發布時間:2023/12/2 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libuv 原理_Libuv初理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

整體概念

libuv是一個跨平臺、專門寫給nodejs的庫,它的設計是圍繞著事件驅動的異步I/O模型。在不同的I/O輪詢機制上,libuv提供的不是簡單抽象對象:handle和streams為sockets和其他實例提供了一個高級抽象。此外,libuv還提供了跨平臺文件I/O和線程化功能

這里有一個圖表,說明了構成libuv的不同部分以及它們與什么子系統相關:

handles和request

libuv給用戶提供了2個可操作的抽象對象,evnt loop的組合:handles和requests。

handles能夠操作那些長時間活躍的對象,例如:

活躍的handle在每一次event loop期間會被調用一次循環迭代

tcp服務會回調一次連接服務當一個新的連接過來時

requests代表的是短時間活躍的操作。這些操作可以被表現依賴于handle上:寫請求用來在handle上寫數據。或者獨立的:像getaddrinfo請求就不需要依賴handle,可以自己獨立在event loop中執行

I/O循環

I/O或者說event loop是libuv的核心。它為所有I/O操作創建了內容,也就意味著這些操作綁定在了某一個單一的線程上。只要每個線程運行在不同的線程中,就可以運行多個事件循環。不過libuv的event loop不是一個安全的線程

event loop遵從一個單一異步I/O線程方法:所有的(網絡)I/O必須執行在一個沒有被阻塞的sockets中,使用給定平臺上可用的最佳機制進行輪詢(例如:Linux的epoll、OSX的kqueue和其他的一些BSDs、SunOs的事件接口和windows上的IOCP)。作為循環迭代的一部分,loop會被阻塞,等待已經添加到poller和回調的sockets上的I/O活動,此時將觸發sockets狀態(可讀、可寫的掛起),因此handle可以讀取、寫入或執行所需的I/O操作。

為了更好的理解event loop的操作,下圖將展示所有循環迭代(loop iteration)的狀態

1.“now”的循環概念得到了更新。事件循環在事件循環開始時緩存當前時間,以減少與時間相關的系統調用的數量。

2.如果循環是活躍的,則會啟動循環迭代,否則循環將立即退出。那么,什么時候被認為是活躍著的循環呢?如果一個循環有活動和ref自己的handles,主動請求或關閉句柄被認為是有活躍著的。

3.由于計時器運行。所有活躍著的時間調度器都安排在循環的now概念之前調用他們的回調函數

4.掛載的回調函數將被調用。所有I/O回調函數都是在輪詢event loop的poll之后被調用的。但是,存在一些特殊情況:比如調用這樣的回調被推遲到下一個循環迭代中調用,那么此時就可能立刻執行上一個event loop中延遲的I/O回調函數。

5.調用idle handle回調函數被調用。盡管這個名稱不是很好聽,但如果idle handle是活躍的,那么再每次event loop過程中都一定會調用

6.調用prepare handle的回調函數。Prepare handles的回調函數在I/O之前

7.poll階段計算延遲時間。在阻塞I/O之前,loop去計算它應該阻塞多長時間。這些是計算超時時的規則:

如果loop運行的flag是UV_RUN_NOWAIT,延遲時間為0

如果loop是被uv_stop阻塞,則延遲0

如果此時沒有活躍的handles和requests,延遲為0

如果此時有任何活躍著的idel handles,則延遲0

如果此時有任何處于pending狀態的handles被關閉,則延遲為0

如果上述任何情況都沒有,則調用最近的timeout,如果沒有任何活躍的時間timer存在,則無限延遲

8.在I/O階段阻塞。在這個時候,the loop將阻塞I/O,用于在上一步中計算的持續時間。所有正在監視一個讀或寫操作的給定文件描述符的I/O相關handles將在此處調用它們的回調。

9.調用check handle的回調。check handle在I/O階段之后調用。

10.調用CLose的回調函數。如果一個handes被uv_close()函數調用關閉,那么close的回調函數就會被調用

11.在使用UV_RUN_ONCE模式這個特殊情況下運行,I/O可能沒有回調函數存在在I/O被阻塞之后去調用,而有timers到期,從而回調了timers的回調函數

12.循環結束。如果loop是運行在UV_RUN_NOWAIT或者UV_RUN_ONCE模式下的運行結束,那么就uv_run()方法會被返回。如果運行在UV_RUN_DEFAULT模式下,且the loop在結束的時候仍然活著,那么將會繼續運行,并且從頭開始循環迭代,否則也將會結束

在每次循環線程中,libuv使用線程池實現異步文件I/O操作,但是網絡I/O總是在單個線程中執行。

I/O文件

不像網絡I/O,沒有特定于平臺的文件I/O原語libuv可以依賴,所以當前的方法是在線程池中運行阻塞文件I/O操作。

libuv目前使用的是一個全局線程池,其中所有循環都可以在其中進行隊列工作。3種操作目前在此池中運行:

文件系統操作

DNS功能(getaddrinfo和getnameinfo)

用戶通過uv_queue_work()指定的代碼

總結

以上是生活随笔為你收集整理的libuv 原理_Libuv初理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。