亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1572 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條評論
主站蜘蛛池模板: 欧美在线性爱视频 | 一级欧美激情毛片 | 精品亚洲一区二区 | 97视频在线观看视频在线精品 | 欧美a毛片 | 老司机午夜视频在线观看 | 好好的曰com久久 | 日本久久网站 | 国产精品午夜久久 | 毛片黄片视频 | 久久久久久久尹人综合网亚洲 | 一a一级片| 激情综合网五月 | 精品综合久久久久久蜜月 | 午夜小视频网站 | 久久99这里只有精品国产 | 日韩欧美亚洲国产高清在线 | 中文字幕精品一区二区三区在线 | 农村女人十八毛片a级毛片 农村三级孕妇视频在线 | 欧美 日本 国产 | 亚洲精品久久久久午夜福 | 毛片免费永久不卡视频观看 | 精品国产一区二区三区久久影院 | 国产成人刺激视频在线观看 | 视频一区二区三区在线 | 国产成人亚洲综合小说区 | 日日摸夜夜 | 亚洲综合免费视频 | 欧美日韩图区 | 国产精品国偷自产在线 | 九九99国产精品视频 | 手机看片国产 | 中文xxx视频 | www色综合 | 不卡中文字幕在线观看 | 爱爱免费网址 | 国产精品一区久久精品 | 久久精品这里有 | 九九热精彩视频 | 美女毛片免费 | 午夜宅男在线观看 |