1. BIO
阻塞式IO,一個線程處理一個請求。
2. NIO
NIO模型.png
輪詢器只需要一個線程就可以管理多個請求
輪詢器有select和poll,select和poll的區別是fds的數量限制,select是有限制的,poll沒有限制,其他的沒有區別
遍歷channel的狀態由內核做,不需要來回切換用戶態和內核態的上下文
只需要一次告訴內核我們需要遍歷的所有通道的fds(文件描述符)就行,內核會一次性將已經準備就緒的文件描述符返回
只會發生1次系統調用,2次用戶態和內核態的上下文切換
select基于輪詢查看事件是否準備就緒
epoll基于事件通知
怎么理解多路復用?
一次調用可以查詢到多個路通道的狀態,多個路通道被一次調用復用了,稱為IO多路復用。
說一下epoll
epoll.png
epoll涉及到3個方法
1.epoll_create 會在內核開辟兩塊空間,一個是紅黑樹,一個是雙向鏈表
2.epoll_ctl 會將要監聽的fd及需要監聽的事件放到紅黑樹的中
3.epoll_wait 遍歷雙向鏈表中準備就緒的fd
雙向鏈表中的數據是怎么來的?
場景示例:當網卡接收到數據時,內核就會檢測到網絡套接字的狀態變化,此時網絡設備驅動程序會通過內核將數據放入到對應的fd中的接收緩沖區,并修改相應的文件描述符狀態,內核就會檢查紅黑樹中注冊的文件描述符發現對應的fd現在是準備就緒狀態,內核就會把fd放到雙向鏈表中。表示這個文件描述符已經準備好被處理了