為什麼io模式非常重要?由於現代的計算機和作業系統的架構決定了cpu是稀缺資源,大家都要來一起競爭。而io(特別是網路相關的io)的速度往往較慢。所以怎樣進行io就有了多種模式,包含同步、非同步、堵塞、非堵塞等等。
不少人把這幾個概念放到一起討論,非常多時候也難以區分。
這裡從根上剖析下該怎麼看待這幾個概念。
首先。非同步和同步是相對的,而同步情況下又有堵塞和非堵塞之分。
非同步非常easy理解。當使用者程式須要進行io的時候,發出io請求,然後就立馬返回。能夠繼續做其他事情。
比如。從網路收包,當包抵達後放到核心某個快取區,而且從核心空間放置到程式須要的使用者空間後(一種是直接複製。比較費資源;一種是對映mmap),通知程式,程式之後就能夠處理資料了。
這是最理想的模式。cpu幹活效率最高。
同步情況則是,當使用者程式須要進行io的時候,發出io請求。然後就等著資料到達後進行處理(首先將資料從核心空間拷貝到使用者空間,然後進行操作)。
詳細怎麼等呢?一種就是堵塞在那裡。cpu就處理其他的程式去了;一種就是發現沒有資料就返回乙個錯誤,程式能夠幹點別的事情(一般是不斷輪詢)。過會還得自動回來看看資料ok了麼。
同步情況下顯然效率比較差,於是有了各種技術來改進它,一種就是io多路復用(用乙個專門的執行緒來負責io)。包含linux上的select、poll和epoll。
select和poll類似,都是用乙個核心優化執行緒來不斷輪詢io,一旦有資料了使用者程式就能夠利用系統呼叫將資料從核心空間拷貝到使用者空間。之後進行處理。這儘管提高了效率,但事實上仍然是一種同步模式。
epoll則更進一步。採用了底層的notify機制和mmap,底層資料可用後通知io執行緒,並利用mmap將資料直接對映到使用者空間。
此時使用者程式能夠直接對資料進行操作了。
也談堵塞 非堵塞 同步 非同步
近期在招聘中,發現不少人對bio nio aio等理解非常模糊,認為有必要寫文章來糾正下非常多人的誤解。在談這些之前,非常有必要先介紹下unix 5種io模型 堵塞 堵塞是最經常使用的io模型,預設情況下全部的檔案操作都是堵塞的。以套接字程式設計為例。在程序空間中呼叫recvfrom。其系統呼叫直到...
php socket 同步非同步堵塞非堵塞的區別
php socket 同步非同步堵塞非堵塞的區別 從accept接受資料開始 同步就是 服務端從客戶端接受完資料 處理 然後傳送給客戶端了 然後再開始接收新的客戶端發來的資料 非同步就是 服務端從客戶端接受完資料 就可以再次繼續接收 非同步處理資料 堵塞就是 服務端堵塞執行緒狀態接收資料 read ...
理解非同步 同步 並行 併發 堵塞 非堵塞
一 同步vs非同步 同步和非同步我們經常見的,同步 執行方法是有時間順序的,例如我們執行乙個同步方法,必須等這個方法執行結束才能執行下一步操作,非同步 沒有時間順序,不需要等這個方法執行完,我們就可以執行下一步操作。二 並行vs併發 併發我們經常聽見,但是並行很少聽見吧,並行 就是一起執行,同時進行...