全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2513
推到 Plurk!
推到 Facebook!

關於 socket 的阻塞,非阻塞,異步,與同步的 精要解說

 
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-01-03 02:42:55 IP:36.229.xxx.xxx 訂閱


有人常常會問,異步阻塞,同步非阻塞… 什麼跟什麼的… 以下是我至目前為止的心得分享,若有錯,尚請糾正,感謝。

以windows的socket模式來看,socket 本身可分為 2種 (塞與不塞),io model 可以分成6種…(blocking, select, WSAAsyncSelect, WSAEventSelect, overlapped, and completion port)。這六種 models,當以架構的形式來看待,是一種管理 io 的模型。

問題,好亂…對,好亂就是個問題,所以我才要分享嘛:


異步與同步是什麼? 抽象,於是我把它具實化。比如說我們去吃buffet,某些食物是要現做的。你想得到這種現做的食物,你可以:

1) 去填一個單,寫著你想要某道菜,單子交給廚師。等啊等的…廚師把菜做好了,放在他的盤子上,你眼尖的看到並要求把菜盤拿過來讓我倒。他不爽的拿給你,於是你把他的菜倒入你的盤。

2) 你填好單子說要點某菜,並把單子放在你自己的盤子上,連單 *帶盤* 的交給廚師。等啊等的…菜好了,廚師把菜直接放你盤子,等你帶回去吃。

1就是同步IO 而2就是異步IO

什麼是阻塞? 以上例來說,就是「等啊等啊的行為區分」,如果你:

A) 傻傻的站在料理台前等,直到菜被做好,你就是… 傻b,不是啦,是阻塞

B) 你交待好你要的菜後,你就跑去點的別菜,或是跑去尿尿…直到有人服務人員通知你,菜都要冷了,還不來拿,你才前往取。你就是聰明人?…是非阻塞啦。


於是,我們不禁要想,以上四種組合:

1 A = 單純的人,別說他傻b,delphi的indy都是單純的人。

1 B = 怪怪的,會有這樣的組合? 要盯著看菜好沒,又要跑去尿尿… 有啊,請你老母來站(真不孝),你老母拿到了,叫你這不孝子來取。你發現了嗎? 你開了另一條thread,block住,自己卻一付很爽的到處跑,苦了媽。select是你媽,了解嗎?

2 A = 自以為聰明,又怕被人下毒的人。他放了單,放了盤,卻一直站在那裡盯廚師(怕他下毒),直到廚師說,「怕死就不要點,拿去吧!」。這應該就是windows上 overlapped 的 socket 模式,但socket設成block。送出異步後,乾等著(一般不會這樣笨) 或是在請老子罰站盯是否被下毒(可用select來監控,但又何苦呢,都異步了)。overlapped 預設*不搭配* block socket。你要配block也無不可(在win9x時代)。記住: 原則上可以忽略這種模式,應該極少人會這樣搞。

2 B = 聰明又自信的人,交了盤,再去別的地方點,直到服務員一一的來通知,「快來拿回你的菜盤」。這是windows的iocp 或 overlapped。附帶一提 iocp的模式,餐廳還特別為這種人提供queu服務,怕你少拿了。至overlapped可能會漏,因它限制一處理64。


至於效能…

1 A 的人多時,則餐廳沒路好走,大家推來推去。大家吃很少。

1 B 的人多時,則許多的老木站在路上擋人。不過還好的是一個老木可以幫好幾個孩子忙(一般是64)。但是每個人要自己倒菜到自己盤子。流通慢。

2 A 的人多時,苦了老子,但還好孩子們不用倒菜,拿了就走,流通快。

2 B 的人多時,大家吃好飽,也不用自己倒菜。累的是餐廳的人呀,尤其是少數妹服務一堆人…
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2015-01-03 02:49:50, 註解 無‧
aftcast 重新編輯於 2015-01-03 02:50:40, 註解 無‧
aftcast 重新編輯於 2015-01-03 02:51:17, 註解 無‧
aftcast 重新編輯於 2015-01-03 03:10:34, 註解 無‧
aftcast 重新編輯於 2015-01-03 03:20:43, 註解 無‧
aftcast 重新編輯於 2015-01-03 03:31:47, 註解 無‧
aftcast 重新編輯於 2015-01-03 03:32:39, 註解 無‧
aftcast 重新編輯於 2015-01-05 01:31:32, 註解 無‧
aftcast 重新編輯於 2015-01-05 01:32:34, 註解 無‧
aftcast 重新編輯於 2015-01-05 11:09:12, 註解 無‧
aftcast 重新編輯於 2015-01-05 11:30:50, 註解 無‧
aftcast 重新編輯於 2015-01-05 11:35:17, 註解 錯別字太多,排版亂,一直修正。 :p‧
系統時間:2024-04-18 23:17:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!