epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)
首先我們要知道epoll是用來干什么的(定義):epoll是一種IO多路轉接技術,在LINUX網絡編程中,經常用來做事件觸發,即當有特定事件到來時,能夠檢測到,而不必阻塞進行監聽,基于事件驅動的IO多路復用技術(通俗來說,就是來監聽系統有沒有什么事件發生,這個事件可以是socket,也可以是數據的讀取等)
既然我們要說epoll了,那么我們就要知道select poll,我們通過這兩中技術與epoll進行比較講解,首先我們就已scoket說下select。
select: 假設我們有一個服務器,服務器每條有好多客戶端鏈接 我們把客戶端稱為socket 我們把連接上的socket都用fd標識上 哪我們服務器是怎樣來判別客戶端發送過來消息沒 其實我們都是交給我們的操作系統(操作系統的內存分為兩部分 一部分是操作系統的內存空間 用來運行操作系統 另一個分配給我們的app(跑在操作系統上的服務器)的空間 )來給我們識別客戶端發又沒有發送過來數據 所以 我們都是將socket在服務器復制一份來交給操作系統 由操作系統來給我們判別 如果發送了 就告訴我們服務器 好 這個socket發送消息了 你接收吧 假設這一天我們服務器有1000個客戶端鏈接(我們已經將連接上的客戶端用文件描述符用數字1-1000來標識了 放到一個列表中) 我們就要不停的使用輪詢法將第一個socket的文件描述符復制給操作系統 然后操作系統給你判斷一下 然后你就再把第二個復制給操作系統來判斷 一直到1000個 然后再重來 這就是輪詢法 如果操作系統判斷客戶端發送消息了 服務器就接收消息 和客戶端交互 如果操作系統發現沒有發送消息 就給服務器返回一個異常 你想啊 復制來 復制去 時間全給浪費了 這就是先前的select()的缺點 而poll() 比select() 好一點 就是使用鏈表來保存文件描述符 那就不用受限制了 還可以多鏈接一點客戶 但是 還是采用輪詢法 還是復制 總體來說 還是慢(為什么要復制 因為操作系統的運行空間和服務器的運行空間不再一塊啊 )
epoll的優點:而epoll創建一個對象 對象就是一個空間 這個空間稱為公共空間(緩沖區) 就是操作系統可以用 服務器也可以用 那樣我們服務器就不用再復制fd給操作系統了, 第二點 就是由于socket也在操作系統的空間中 操作系統在一直的運行 客戶端一發送消息 操作系統就知道是那個socket發送消息了 然后操作系統就以事件通知的方法告訴服務器 那個客戶端發送消息了 服務器就能和客戶端交互了 就不使用輪詢法了 這樣效率就會更快了 這就是epoll 的特點
總結:
- 不用將套接字(fd文件描述符)從程序復制到操作系統,而是直接將套接字放到公共空間(映射技術)
- 不是采用輪詢的方式,而是采用事件通知的方式來接收套接字(客戶端)發送的消息
也可以說是空間換取速度的一種表現
- epoll_create:在epoll文件系統建立了個file節點,并開辟epoll自己的內核高速cache區,建立紅黑樹(可以快速找到那個socket發送了消息),分配好想要的size的內存對象,建立一個list鏈表,用于存儲準備就緒的事件。
- epoll_ctl:把要監聽的socket放到對應的紅黑樹上,給內核中斷處理程序注冊一個回調函數,通知內核,如果這個scoket的數據到了,就把它放到就緒列表
- epoll_wait:觀察就緒列表里面有沒有數據,并進行提取和清空就緒列表,非常高效。
核心內容:紅黑樹,就緒列表,小段cache(我個人喜歡叫公共空間)
由上面圖片可以看出,fd就是一個標志,比如一個socket就是一個標志
參考文章:談談對epoll的理解
總結
以上是生活随笔為你收集整理的epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言socket()函数解析(创建套接
- 下一篇: C语言socket getsockopt