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