欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

并發編程基礎概念(一) IO-同步,異步,阻塞,非

系統 1617 0

原文鏈接: http://blog.csdn.net/historyasamirror/article/details/4270633

作為程序員從應用層面來考慮的四個概念

?

同步阻塞IO:


并發編程基礎概念(一) IO-同步,異步,阻塞,非阻塞
? ? 在 這個模型中,應用程序(application)為了執行這個read操作,會調用相應的一個system call,將系統控制權交給kernel,然后就進行等待(這其實就是被阻塞了)。kernel開始執行這個system call,執行完畢后會向應用程序返回響應,應用程序得到響應后,就不再阻塞,并進行后面的工作。?

?

?? 舉一個淺顯的例子,就好比你去一個銀行柜臺存錢。首先,你會將存錢的單子填好,然后交給柜員。這里,你就好比是application,單子就是調用的 system call,柜員就是kernel。提交好單子后,你就坐在柜臺前等,相當于開始進行等待。柜員辦好以后會給你一個回執,表示辦好了,這就是 response。然后你就可以拿著回執干其它的事了。注意,這個時候,如果你辦完之后馬上去查賬,存的錢已經打到你的賬戶上了。后面你會發現, 這點很重要。?

?

同步非阻塞IO: ?

??
并發編程基礎概念(一) IO-同步,異步,阻塞,非阻塞
?? 在linux下,應用程序可以通過設置文件描述符的屬性O_NONBLOCK,I/O操作可以立即返回,但是并不保證I/O操作成功。
? ?也 就是說,當應用程序設置了O_NONBLOCK之后,執行write操作,調用相應的system call,這個system call會從內核中立即返回。但是在這個返回的時間點,數據可能還沒有被真正的寫入到指定的地方。也就是說,kernel只是很快的返回了這個 system call(這樣,應用程序不會被這個IO操作blocking),但是這個system call具體要執行的事情(寫數據)可能并沒有完成。而對于應用程序,雖然這個IO操作很快就返回了,但是它并不知道這個IO操作是否真的成功了,如果想 知道,需要應用程序主動地去問kernel。

? ?這次不是去銀行存錢,而是去銀行匯款。同樣的,你也需要填寫匯款單然后交給柜員,柜員進行一 些簡單的手續處理就能夠給你回執。但是,你拿到回執并不意味著錢已經打到了對方的賬上。事實上,一般匯款的周期大概是24個小時,如果你要以存錢的模式來 匯款的話,意味著你需要在銀行等24個小時,這顯然是不現實的。所以,同步非阻塞IO在實際生活中也是有它的意義的。

?

異步阻塞IO:

?


并發編程基礎概念(一) IO-同步,異步,阻塞,非阻塞

? ? 和 之前一樣,應用程序要執行read操作,因此調用一個system call,這個system call被傳遞給了kernel。但在應用程序這邊,它調用system call之后,并不等待kernel返回response,這一點是和前面兩種機制不一樣的地方。這也是為什么它被稱為異步的原因。但是為什么稱其為阻塞 呢?這是因為雖然應用程序是一個異步的方式,但是select()函數會將應用程序阻塞住,一直等到這個system call有結果返回了,再通知應用程序。也就是說,“在這種模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系統調用來確定一個 I/O 描述符何時有操作。”
所以,從IO操作的實際效果來看,異步阻塞IO和第一種同步阻塞IO是一樣的,應用程序都是一直等到IO操作成功之后(數據已經被寫入或者讀取),才開始進行下面的工作。異步阻塞IO的好處在于一個select函數可以為多個描述符提供通知,提高了并發性。

? ? 關 于提高并發性這點,我們還以銀行為例說明。比如說一個銀行柜臺,現在有10個人想存錢。按照現在銀行的做法,一個個排隊。第一個人先填存款單,然后提交, 然后柜員處理,然后給回執,成功后再輪到下一個人。大家應該都在銀行排過對,這樣的流程是很痛苦的。如果按照異步阻塞的機制,10個人都填好存款單,然后 都提交給柜臺,提交完之后所有的10個人就在銀行大廳等待。這時候會專門有個人,他會了解存款單處理的情況,一旦有存款單處理完畢,他會將回執交給相應的 正在大廳等待的人,這個拿到回執的人就可以去干其他的事情了。而前面提到的這個專人,就對應于select函數。

異步非阻塞IO:?


并發編程基礎概念(一) IO-同步,異步,阻塞,非阻塞

? ? 如 圖所示,應用程序提交read請求的system call,然后,kernel開始處理相應的IO操作,而同時,應用程序并不等kernel返回響應,就會開始執行其他的處理操作(應用程序沒有被IO操 作所阻塞)。當kernel執行完畢,返回read的響應,就會產生一個信號或執行一個基于線程的回調函數來完成這次 I/O 處理過程。

? ?比如銀行存錢。現在某銀行新開通了一項存錢業務。用戶之需要將存款單交給柜臺,然后無需等待就可以離開了。柜臺辦好以后會給用戶發送一條短信,告知交易成功。這樣用戶不需要在柜臺前進行長時間的等待,同時,也能夠得到確切的消息知道交易完成。?


所謂的同步和異步,在這里指的是application和kernel之間的交互方式。如果application不需要等待 kernel的回應,那么它就是異步的。如果application提交完IO請求后,需要等待“回執”,那么它就是同步的。


而阻塞和非阻塞,指的是application是否等待IO操作的完成。如果application必須等到IO操作實際完成以后再執行下面的操作,那么它是阻塞的。反之,如果不等待IO操作的完成就開始執行其它操作,那么它是非阻塞的。?

?

并發編程基礎概念(一) IO-同步,異步,阻塞,非阻塞


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久婷婷一区二区三区不卡 | 日本黄色高清网站 | 国产精品丝袜视频 | 日韩在线视频观看 | 国产91福利在线精品剧情尤物 | 国产一级成人毛片 | a黄视频| 色蜜桃网| 天天操操操操操操 | 丝袜捆绑调教视频免费区 | 日本a v在线播放 | 一级片一级片一级片一级片 | 91麻豆蜜桃一区二区三区 | 欧美一级毛片欧美毛片视频 | 欧美日韩视频 | 我不卡在线 | 久久国产免费观看精品 | 欧美a级v片不卡在线观看 | 免费国产精品视频在线 | 国产精品成熟老女人 | 日韩色在线 | 日本免费一级视频 | 久久经典国产视频 | 日韩一级大片 | 日韩欧美中国a v | 伦理午夜电影免费观看 | 成人福利小视频 | 欧美在线看 | 精品一区二区三区在线视频 | 夜夜操天天射 | 日本高清视频在线三级 | 国产99精品 | 另类五月天| 99欧美精品 | 中文字幕国产 | 精品亚洲国产成av人片传媒 | 欧美日韩一级视频 | 亚洲国产日韩在线观频 | 日韩 欧美 亚洲国产 | 手机看片日韩国产 | 91热久久免费频精品黑人99 |