作業系統 webserver定時器的設計

2022-10-08 20:33:18 字數 1569 閱讀 3861

資料結構:公升序鍊錶(我的專案使用的)、跳表、時間輪、紅黑樹、最小堆。

由於非活躍連線占用了連線資源,嚴重影響伺服器的效能。

通過實現乙個伺服器定時器,處理這種非活躍連線,釋放連線資源。

利用alarm函式周期性地觸發sigalrm訊號,該訊號的訊號處理函式利用管道通知主迴圈執行定時器鍊錶上的定時任務。

伺服器的驅動邏輯:網路事件、定時事件、訊號事件。

定時器在伺服器端作用:

(1)多客戶端連線伺服器,需要通訊傳送資料報,有些客戶端連線了長時間不幹事,就需要斷開。

(2)某些任務當前不想執行,需要一定時間之後執行。

如何實現定時器?

(1)單執行緒環境下:定時事件通常與網路事件協調處理。

舉例:redix單執行緒,nginx多程序但是每個程序下都是單執行緒。

epoll_wait(epfd,使用者態陣列用於接收已經觸發的事件,從網路協議棧最大取多少資料,沒有事件到達時最長阻塞時間)。

epoll_wait和定時事件的繫結:定時時間是離散有序的乙個鍊錶上。最近要觸發的定時器會作為epoll_wait的第四個引數。

紅黑樹:平衡二叉搜尋樹   

平衡的規則:從根節點出發到任意葉子節點的黑節點數一定相等。

增加和刪除的時候都會滿足平衡規則,提供乙個搜尋穩定時間複雜度。

找最左側的節點就可以找最小的節點,就可以找到最近要觸發的定時器。 

o(logn):100萬個節點,比較20次;10億個節點,比較30次。

(2)多執行緒環境下:

有乙個單獨的定時執行緒進行處理定時事件thread_timer。

採用時間輪結構實現定時器,跳表也可以,最小堆也可以。

時間輪知識:

時針、分針、秒針。時間精度是每一秒,時間範圍是60。單層級時間輪是迴圈陣列,使用取餘來操作。(time%60)

插入任務時間複雜度永遠是o(1)。不能執行刪除任務。單層級中,陣列的大小必須要大於 支援最大的定時任務。此外,0有任務,59有任務,中間沒有,就會造成空推進的問題。

使用多層級的時間輪解決上述兩個問題。分成秒層級(60)、分層級(60)、時層級(12)。

132解決陣列太大的問題,接下來關注秒針運轉。

跳表知識:

跳表是多層級有序鍊錶。(有大量節點資料的時候才提高效率,本質還是二分查詢,空間換時間)

跳表可以通過加鎖的方式,提供併發讀寫。每個節點都會存乙個互斥鎖。(值得做跳表kv儲存引擎專案研究研究)

如果要插入8,先查詢7到9之間,插入節點的時候分配三層1->8->20/1->7->8->20/...7->8->9....。

如果要刪除節點7,加上原子變數,方便我們併發讀。

跳表使用場景:rocksdb是kv資料庫,有記憶體資料和磁碟資料,需要提供組織kv並提供併發讀寫。

作業系統定時任務

1.系統定時任務概念 生活中鬧鐘時間資訊有時不准 時間同步操作 每過10分鐘 備份資料資訊 代替人自動完成一些任務 2.系統定時任務實現方法 crontab 設定和檢視定時任務命令 crontab l 檢視設定的定時任務 crontab e 編輯設定定時任務 語法檢查功能配置檔案 var spool...

作業系統定時任務服務

命令 crontab 檢視定時任務編寫資訊 crontab l 編寫定時任務資訊 crontab e 具有語法檢查功能 定時任務的編寫格式檔案 etc crontab 兩個關於定時任務的檔案 var log cron 定時任務日誌檔案 oct 9 09 24 26 oldboy crontab 78...

作業系統 作業系統介面

介面表現為函式呼叫,由作業系統提供,連線作業系統和應用軟體。出於安全性考慮,應用程式不能直接在記憶體中任意訪問 將核心程式和使用者程式隔離 通過比較訪問資料段cpl和rpl的特權級和當前段dpl的特權級之間的關係 應用程式呼叫庫函式printf printf呼叫庫中的write函式 write將函式...