select epoll原始碼剖析與對比

2021-08-07 04:34:12 字數 1088 閱讀 7832

io復用就是通過一組函式來監聽多個檔案描述符。程式只需要關注是否有檔案描述符就緒即可。

在linux下,有select、poll、epoll等io復用函式。

select是指,在使用者空間建立乙個fd_set用於存放需要監聽的檔案描述符,每次呼叫select的時候需要將被監聽的檔案描述符全部拷貝給核心,而核心會進行輪詢監聽,檢視是否有就緒的檔案描述符。一旦發現檔案描述符準備就緒,就會將更改過的監聽情況返回給使用者態,而使用者態則需要進行位操作判斷哪個檔案描述符就緒,每次都需要重新傳遞新的拷貝情況。

epoll是指,在使用者空間和核心空間開闢一塊記憶體用於存放檔案描述符的集合。然後在呼叫epoll_init的時候,註冊乙個新的檔案系統,這應該是epoll返回乙個epfd的原因吧。然後會開闢兩塊快取,一塊用於分配epoll_item紅黑樹的節點的具體的結構體,一塊用於分配epoll_entry等待佇列節點。開闢快取的原因是epoll核心需要維護乙個紅黑樹和就緒鍊錶,所以會設計大量的空間分配。呼叫epoll_create的時候,底層呼叫sys_epoll_create(int size),這裡傳遞的size只是乙個建議。首先呼叫ep_getfd建立新的inode節點,新的file指標,新的fd並且將他們關聯起來。然後呼叫d_alloc為inode分配乙個dentry實體。之後呼叫ep_file_init建立乙個新的eventpoll結構體並且初始化他,並將檔案指標的資料域指向它,其中,eventpoll結構體主要包括一顆紅黑樹,乙個就緒鍊錶,乙個讀寫鎖。sys_epoll_ctl函式會根據巨集定義的不同,選擇具體的操作,首先根據eventpoll結構體中紅黑樹的根進行查詢ep_find,這時,如果是插入,建立乙個epoll_item節點並且進行掛載,建立epoll_entry並且加入到等待佇列,設定回掉函式。當操作完成時,呼叫回掉函式,加入完成佇列。epoll_wait,每次檢查epitem中有沒有已經完成的事件,有則返回,沒有則等待,直到超時。

總結一下就是,系統核心建立一顆紅黑樹用於儲存需要監聽的檔案描述符,使用mmap開闢一塊在核心態和使用者態中間的記憶體用於傳遞檔案描述符,每個檔案描述符在插入樹的時候就已經註冊乙個回掉函式,當裝置檢測到該檔案描述符上有事件發生的時候,通過該回掉函式返回,並將該描述符插入到系統準備好的就緒鍊錶當中,而epoll_wait只需要檢測鍊錶中是否有資料即可。

spring security認證原始碼剖析

spring security 和shiro目前最主流的安全框架,很好的保護了系統的安全性。shiro實現的原理和spring security具有異曲同工之妙,學會乙個框架,另乙個框架也會很容易上手。1 spring security流程 usernamepasswordauthenticatio...

ReentrantLock獨佔鎖原始碼剖析

在開始分析reentrantlock 獨佔鎖之前,我們先來簡單了解幾個概念 悲觀鎖指對資料被外界修改持保守態度,認為資料很容易就會被其他執行緒修改,所以在資料被處理前先對資料進行加鎖,並在整個資料處理過程中,使資料處於鎖定狀態。例如synchronized。樂觀鎖是相對悲觀鎖來說對,它認為資料在一般...

locust對應原始碼HttpUser剖析(7)

老規矩,先貼 self.client session比較簡單,無非就是繼承了user的各個屬性,這裡把類變數client清空了,不再是noclientwarningraiser 了。其他都是繼續沿用,只是例項化的時候client變成了session。這個時候第乙個關注點就是,例項化的時候一定要有ho...