1. 程式人生 > >Socket網路程式設計_之I/O多路複用

Socket網路程式設計_之I/O多路複用

1. IO多路複用:
每一次網路通訊都是一個Socket的I/O流,對於伺服器而言,有兩種方法
1.傳統的多程序併發模型(每進來一個新的I/O流會分配一個新的程序管理。)
2.方法二就是I/O的多路複用(單執行緒,記錄跟蹤每一個Socket的狀態,來即使管理多個I/O流。)

io多路複用就是多個Sock複用一根網線,這個是由核心與驅動層實現。

這裡寫圖片描述

2.select ,poll,epoll(linux下的)
select(最早)
• select 會修改傳入的引數陣列,這個對於一個需要呼叫很多次的函式。
• select 如果任何一個sock(I/O stream)出現了資料,select 僅僅會返回,但是並不會告訴你是那個sock上有資料,於是你只能自己一個一個找。
• Select 只監視1024個連結。

Poll(其次)
• poll 去掉了1024個連結的限制,於是要多少連結呢, 主人你開心就好。
• poll 從設計上來說,不再修改傳入陣列,不過這個要看你的平臺了

Epoll:
• epoll 告訴你sock組裡面數據,還會告訴你具體哪個sock有資料,你不用自己去找。

其中除了Epoll是執行緒安全,其他的poll,select都不是執行緒安全的

簡單說epoll和select/poll最大區別是
1.epoll內部使用了mmap共享了使用者和核心的部分空間,避免了資料的來回拷貝
2.epoll基於事件驅動,epoll_ctl註冊事件並註冊callback回撥函式,epoll_wait只返回發生的事件避免了像select和poll對事件的整個輪尋操作。