IO复用
同步:發出一個功能調用時,在沒得到結果之前,該調用就不會返回
異步:當一個異步調用發出以后,調用者不會立刻得到結果,實際處理這個調用的部件是在調用發出之后,通過狀態通知調用者。
同步異步他們是消息通知機制
阻塞和非阻塞,他們是程序在等待消息時的狀態。
阻塞:在調用結果返回之前 ,當前線程會被掛起,函數只有在得到結果之后才會返回;
非阻塞:指不能立即得到結果之前,該函數不會阻塞當前線程,而是立即返回。
阻塞I/O模型:
應用程序調用一個IO函數,導致應用程序阻塞,等待數據準備好。 如果數據沒有準備好,一直等待….數據準備好了,從內核拷貝到用戶空間,IO函數返回成功指示。
非阻塞I/O模型
i/O復用模型:
簡介:主要是select和epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO并沒有什么優越性;關鍵是能實現同時對多個IO端口進行監聽;
/O復用模型會用到select、poll、epoll函數,這幾個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。
select模式
首先創建了事件的描述符集合,,對于一個事件,關注其上面的讀事件,寫事件,異常事件,所以要創建三類事件的描述符,分別用來收集事件的描述符,寫事件的描述符,調用select()函數,等待事情發生,然后輪訓所有事件的描述符的每個描述符,檢查是否有事件的發生,如果有就處理,
poll方式
和select方式相同,都是創建一個描述符的集合,再去等待事件的發生,然后再去輪詢描述符的集合,檢查有沒有事件的發生。
區別在于:select庫需要為讀事件,寫事件,異常事件分別創建一個描述符的集合,再最后輪詢的時候需要輪詢三個集合,而poll庫只需要創建一個集合,再每個描述符對應的結構上分別設置讀事件,寫事件,或異常事件,最后輪訓的時候,可以同時檢查這三個事件的是否發生。
他們的處理方式都是創建了一個待處理事件的列表,然后把這個列表發給內核,返回的時候,再去輪詢檢查這個列表,以判斷是否有事情發生,效率低下。
比較好的做法就是把描述符列表的權限交給內核負責,一旦有事情發生,內核會把發生事件的描述符通知給進程,這樣就避免了輪詢整個描述符列表。
epoll方式
通過相關的調用,通知內核創建了一個描述符的列表,然后給這些描述符設置所關注的事件,并把它添加到內核的事件列表中去,完成設置以后,epoll就開始等待內核通知事件了,某一事件發生以后,內核就將發生事件的描述符上報給epoll庫,得知事件列表的epoll庫,就開始進行事件的處理了。
epoll有兩種模式:水平觸發和邊緣觸發
水平觸發:內核通知進程來讀取數據,進程沒來讀取數據,內核需要一次一次通知進程
邊緣觸發:內核只通知一次讓進程來讀取數據,進程可以在超時時間內隨時來讀取數據。
轉載于:https://www.cnblogs.com/hanfei-1005/p/5685118.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
- 上一篇: 【转】ASP.NET MVC框架下使用M
- 下一篇: .net 用户控件ascx.cs注册js