欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

epoll原理是如何實現的

錢衛國2年前16瀏覽0評論

epoll原理是如何實現的?

其實在理解 epoll 之前,得先理解一個事情,那就是進程阻塞切換的 CPU 開銷。在高并發的網絡 IO 下,性能的最大絆腳石就是 socket 在阻塞后導致的進程上下文切換。關于這個,我進行過實際的測試。大約一次進程上下文切換的開銷是 3-5 微秒左右。

可能有的同學會說,3 - 5 微秒的開銷看起來還好啊。但是你要知道的是,從我們開發工程師的角度來看,這段時間里 CPU 吭哧吭哧的執行的切換工作對我們來說其實是無用功。

所以 epoll 作為多路復用技術中的代表,和傳統的阻塞網絡 IO 相比,最大的性能提升就是節約掉了大量的進程上下文切換。 epoll 內部又涉及出了一套復雜的數據結構,包括一棵紅黑樹和一個就緒鏈表(以及一個epollwait等待隊列)。全部都工作在內核態。通過紅黑樹,高效地管理海量的連接。在數據到來的時候,不斷地將數據 Ready 的socket 放到就緒鏈表中。

這樣應用層和內核態協作的時候就非常的容易了,最少只需要一個進程就可以維護成千上萬甚至是百萬級別的連接。這個進程的簡單地去就緒隊列中查看有沒有 Ready,需要被處理的 socket。有就拿走處理。只要活兒足夠的多,epoll_wait 根本都不會讓進程阻塞。用戶進程會一直干活,一直干活,直到 epoll_wait 里實在沒活兒可干的時候才主動讓出 CPU。大量地減少了進程切換次數,這就是 epoll 高效的地方所在!

這是 epoll 工作原理的一張匯總圖,供你參考。

最后再說說 epoll 中的紅黑樹,有的人誤以為 epoll 高效的全部因為這棵紅黑樹,這就有點夸大紅黑樹的作用了。其實紅黑樹的作用是僅僅是在管理大量連接的情況下,添加和刪除 socket 非常的高效。如果 epoll 管理的 socket 固定的話,在數據收發的事件管理過程中其實紅黑樹是沒有起作用的。內核在socket上收到數據包以后,可以直接找到 epitem(epoll item),并把它插入到就緒隊列里,然后等用戶進程把事件取走。這個過程中,紅黑樹的作用并不會得到體現。

java并行隊列,epoll原理是如何實現的