----------------
1.程序,用戶空間,內核,系統空間
應用程序從用戶空間取數據,內核把數據放到系統空間,再從系統空間複製到用戶空間。
流程是:A應用->B系統調用->C內核->D數據到系統空間->E系統空間複製到用戶空間->F 應用從用戶空間取。
------------------
2.同步異步、阻塞非阻塞
必須強調:"同步異步"與"阻塞非阻塞"是兩碼事兒,因此場景共有同步阻塞,同步非阻塞,異步阻塞,異步非阻塞 四個。
--------------------------
3.read(),select(),poll(),epoll(),aio_read()。
同步:只用read(),而read()自己能夠置爲阻塞模式,則此時爲同步阻塞。置爲非阻塞模式,則此時爲同步非阻塞。
異步:先調read()或aio_read(),再調selelct()或poll()或epoll()
異步阻塞:首先是調read()且置爲非阻塞 ,而後調用select()或poll(),之因此叫異步阻塞,是由於select()或poll()是阻塞的!
異步非阻塞:首先是調aio_read(),而後調epoll(),epoll()是非阻塞的。
-----------------------
4.問一:那到底啥是阻塞非阻塞??問二:到底誰調read()???問三:爲啥異步阻塞還要先調個非阻塞的read()????冷靜。
阻塞:線程被掛起,啥也幹不了了。
非阻塞,線程能幹別的,不過幹別的事時要不停的回來檢查數據到底取好沒。
我去銀行取錢
阻塞:我去大廳取錢,我只能取錢,我等着錢拿出來前不能抽菸。
非阻塞:我去大廳取錢,我等着錢拿出來前我還打撲克。固然得不停的看着點,錢出來沒,我是來取錢的。
因此,若是錢是數據,那麼read()是取錢,當read()置爲阻塞時,我只能等着。當read()置爲非阻塞時,我打會撲克,打十秒鐘問問錢出來沒,沒出來繼續打撲克。注意,銀行就是系統空間,銀行把錢從系統空間放到我手裏,個人手就是用戶空間,我就 是程序,我花錢只容許從本身手裏拿(即1中的F)。因而1中的流程可理解爲,A我->B喊銀行給我錢->CD銀行錢搞出來->E放我手裏- >F我隨便花
能夠發現不管如何,CD這兩步的控制及花費的時間,我雖然能夠不關心不控制,但我必須在此處等着。而所謂阻塞非阻塞,就是 在我等着這段時間我是否容許打撲克。
答一:到底啥是阻塞非阻塞??答:阻塞:我用read()要錢,若read()置爲阻塞模式,那麼我在等內核搞數據的CD這兩步時,啥都不讓我 幹,乾等。若read()置爲非阻塞模式,那麼我再等內核搞數據的CD這兩步時,我打撲克,隔幾秒鐘問問內核數據好沒好呀,錢還沒來嗎。
因此阻塞非阻塞是針對我在必需要等待CD的這段時間,個人行爲是否受限制,我是否被掛起,線程是否被掛起。
答二:因此誰調read()???答:我。
答三:但是爲啥異步阻塞還要先調個非阻塞的read()????答:額,我知道阻塞非阻塞,那異步是什麼東西?
同步:應用程序本身等待數據
異步:應用程序能夠處理其餘業務,讓另外一段程序幫本身等待數據。
我仍是去銀行取錢
同步:我去大廳叫號,我脫不開身,萬一走了個人號過了,再回來須要從新排隊。我不能走!
異步:我去大廳叫號,可是找一哥們幫我排着,我先去外面馬路上打幾個路燈,號到了哥們給我電話。
同步阻塞:我(程序) 取錢(調用read),read置爲阻塞模式,我乾等(線程被掛起)。
同步非阻塞:我(程序) 取錢(調用read),read置爲非阻塞模式,我打撲克幾秒鐘問問錢好沒(線程未被掛起,處理其餘邏輯時,不停的詢問 監控數據是否已到用戶空間,若是內核返回EAGAIN/EWOULDBLOCK,那麼繼續詢問,直到ok)。
異步阻塞:我(程序)取錢(調read),注意,我要出去打路燈了,我要我哥們幫我排號,若是read是阻塞模式,那麼我被掛起,啥也幹不了,連叫哥們都不行。因此read首先是非阻塞模式,即我能夠乾點啥事,只不過我乾的這事再也不是打撲克,而是叫哥們幫我等,而我出去打路燈 。問題是哥們怎麼等?我要錢是用read,哥們呢,其實哥們要錢用的是select()或者poll()。所以,異步阻塞爲程序先用非阻塞的read,以後把取數據的任務交給select()或poll(),注意!此時read雖然是非阻塞的,可是select()或者poll()但是阻塞的!就是說我這個哥們吧,幫我等就是乾等,若是內核沒準備好數據時,他是掛起的,他不會說再叫他的哥們再幫排隊。
異步非阻塞:到這裏就很好解釋了,我哥們的select()或poll()雖然是阻塞的,但我告訴你吧,我哥們還有一個epoll(),epoll()但是非阻塞的,我給我哥們留一電話說幫我排,我哥們也跑了留給大堂經理一個杯子,到時候摔杯爲號。
最後,異步阻塞,我是先設置本身的read爲非阻塞,從而能夠乾點啥事,才能叫哥們幫排隊。
而異步非阻塞,未用read,而是aio_read,而後我就無論了,而且我自由了。只是留一個電話, 直到最後的最後電話響了通知我,電話號做爲回調函數的入口,我收到通知再回來。異步