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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 定时器_定时器: Nodejs 中的 timers

發布時間:2023/12/19 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 定时器_定时器: Nodejs 中的 timers 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在看 Node http 模塊文檔的時候, 才留意到?server.timeout?這個屬性, 本想簡單介紹一下, 但是在梳理過后發現關于?timeout?有龐大的內容支撐:?server.timout -> node core timers -> uv timers -> linux msleep/hrtimer -> clocksource -> tsc -> cmos rtc -> clock cycle, 所以拆分成幾部分大致做下介紹, 期望定時器系列結束之后, noder 能夠大致明白:?clock cycle?是如何驅動 linux 的?msleep/hrtimer;linux 的 timers 與 uv timers 的關系;node timers 與 uv timers的關系。

前面敘述了計算機中timer實現原理,libuv層如何借助epoll_wait實現timer的機制,現在講下Nodejs應用層相關的timers。

數據結構與調用關系

從上至下各層的數據結構有:

  • Nodejs - 鏈表,最小堆(實現的優先隊列)
  • Libuv - 最小堆
  • Linux - 分桶-鏈表,紅黑樹
  • 考慮一下場景,三者之間的數據模型是怎樣的

    setTimout(fn1(){},?1000);
    setTimout(fn2(){},?1000);
    setTimout(fn3(){},?2000);
    setTimout(fn4(){},?2000);
    setTimout(fn5(){},?3000);
    setTimout(fn6(){},?3000);
    一圖勝千言(點擊放大)

    關鍵函數:

  • scheduleTimer- node 調用此函數構建了libuv的數據
  • processTimers?- node 定時器的回調函數,libuv 到時會觸發次回調,由此可見具體的fn[x]并沒有傳遞而libuv,而是在node端執行的
  • epoll_wait - libuv 調用linux系統函數構建了高精度定時器的紅黑樹
  • 關鍵點:

  • 三個層面的數據并不一樣
  • Node端時間+函數,三個時間點,6個函數
  • Libuv端時間,三個時間點
  • Linux端最小時間,一個時間點
  • 調用關系
  • Nodejs 把固定的定時回調函數processTimers傳遞給libuv并通過scheduleTimer調用libuv,等待回調
  • Libuv 讀取最小時間同步阻塞調用Linux的epoll_wait,進程進入可中斷睡眠,等待中斷
  • Linux 高精度定時器設置APIC的cycles,繼續執行其他任務,APIC到時觸發中斷
  • Nodejs 的 timers們

    Nodejs 提供的timers們,除了給用戶使用,其實自身也在大量使用。對于Node來說,timer應該算是一種保護機制,先看下Node自身哪里在用吧。

  • TCP 相關模塊?- http[s],net
  • server.timeout
  • server.keepAliveTimeout
  • child_process 模塊
  • child_process.exec(..., {timeout})
  • dns 模塊
  • Resolver({ timeout })
  • readline 模塊
  • readline.createInterface({..., escapeCodeTimeout})
  • vm 模塊
  • script.runInContext(..., { timeout})
  • 以上模塊或模塊中的方法都是系統資源的重度消耗者,而nodejs 作為server端的編程語言,需要特別留意資源的開銷,所以在有資源開銷地方一般都會Timer守護者,以便及時的釋放資源。

    server.timeout

    本次關于定時器的主題,來自網上關于socket hang up與connect ECONNREFUSED的討論,至此還沒有涉及這方面內容。此內容將會涉及到timer以外的,socket, tcp等層面的內容,該內容相對獨立,所以會作為定時器最后一節,放到下次討論。

    總結

    以上是生活随笔為你收集整理的linux 定时器_定时器: Nodejs 中的 timers的全部內容,希望文章能夠幫你解決所遇到的問題。

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