最下邊是別人的文章,寫的非常好。其中有幾點摘出來再細說下:
select poll歸為一類說:
1.select和poll區別是文件描述符數量多少差別,select 用數組記錄套接字,poll用的鏈表。本質沒啥區別的。找幾個代碼例子就能看出來。
2.select和poll相同點,都是輪循,比如有1000個需要監控的TCP連結,同一時間活躍的有10個,那么他們會把1000個套接字標志傳到內核,內核遍歷1000遍,發現有10個活躍的,修改這10個套接字中狀態為可讀。然后再傳到用戶進程遍歷1000遍,看看哪個套接字對的狀態為可讀的。
可以看出,效率低的2點: (1)每次循環3000次,(2)每次拷貝2000個
3.關於這一點:s觸發方式是水平觸發,應用程序如果沒有完成對一個已經就緒的文件描述符進行IO操作,那么之后每次調用還是會將這些文件描述符通知進程。
做游戲服務器的一般不存在這點。
epoll 歸為一類,是如何解決select和poll 效率低的問題呢?
1.epoll監控tcp連接用的紅黑樹,添加到內核后,不需要再次添加重復連接。如果繼續用上邊的數據例子,那么(1)一共循環1000 Log1000 ,加上 每次活躍的 10個 (2)每次拷貝10個
2.每幀檢測活躍的套接字會放到雙列表里,送到用戶進程也就10個
深度理解select、poll和epoll_傻眼哥的博客-CSDN博客
如果這篇文章說不清epoll的本質,那就過來掐死我吧! (1) - 知乎 (zhihu.com)
當你看完這兩篇文章時回答這幾個問題:
1.當網絡數據到達時,網卡發送中斷信號給CPU,然后進行數據分類拷貝到對應的套接字,然后喚醒進程A。問題:怎么知道這個套接字屬於哪個進程呢?或者說CPU怎么知道應該喚醒進程A,而不是B呢?