要想更好了解socket編程裁良,有一個(gè)不可繞過的環(huán)節(jié)就是IO.
在Linux中,一切皆文件.實(shí)際上要文件干啥腾夯?不就是讀寫么颊埃?所以,這句話本質(zhì)就是”IO才是王道”.用php的fopen打開文件關(guān)閉文件讀讀寫寫俯在,這叫本地文件IO.在socket編程中竟秫,本質(zhì)就是網(wǎng)絡(luò)IO.
所以,在開始進(jìn)一步的socket編程前跷乐,我們必須先從概念上認(rèn)識(shí)好IO.
如果到這里你還對(duì)IO沒啥概念肥败,那么我就通過幾個(gè)詞來給你一個(gè)大概的印象:同步,異步愕提,阻塞馒稍,非阻塞,甚至是同步阻塞浅侨,同步非阻塞纽谒,異步阻塞,異步非阻塞.是不是暈了如输?截至到目前為止鼓黔,你可以簡(jiǎn)單地認(rèn)為只要搞明白這幾個(gè)名詞的含義以及區(qū)別,就算弄明白IO了不见,至少了可以繼續(xù)往下看了.先機(jī)械記憶一波兒:IO分為兩大種澳化,同步和異步.
同步IO:
- 阻塞IO
- 非阻塞IO
- IO多路復(fù)用(包括select,poll稳吮,epoll三種)
- 信號(hào)驅(qū)動(dòng)IO
異步IO
那么如何理解區(qū)別這幾個(gè)概念呢缎谷?尤其是同步和阻塞,異步和非阻塞灶似,看起來就是一樣的.我先舉個(gè)例子結(jié)合自己的理解來說明一下:
- 你去甜在心饅頭店買太極饅頭列林,阿梅說:"暫時(shí)沒瑞你,正在蒸呢,你自己看著點(diǎn)兒O3铡".于是你就站在旁邊只等饅頭.此時(shí)的你者甲,是阻塞的,是同步的.阻塞表現(xiàn)在你除了等饅頭润梯,別的什么都不做了.同步表現(xiàn)在等饅頭的過程中过牙,阿梅不提供通知服務(wù),你不得不自己要等到"饅頭出爐"的消息.
- 你去甜在心饅頭店買太極饅頭纺铭,阿梅說:"暫時(shí)沒,正在蒸呢刀疙,你自己看著點(diǎn)兒2芭狻".于是你就站在旁邊發(fā)微信,然后問一句:"好了沒谦秧?"竟纳,然后發(fā)QQ,然后再問一句:"好了沒疚鲤?".此時(shí)的你锥累,是非阻塞的,是同步的.非阻塞表現(xiàn)在你除了等饅頭集歇,自己還干干別的時(shí)不時(shí)會(huì)主動(dòng)問問饅頭好沒好.同步表現(xiàn)在等饅頭的過程中桶略,阿梅不提供通知服務(wù),你不得不自己要等到"饅頭出爐"的消息.
- 你去甜在心饅頭店買太極饅頭诲宇,阿梅說:"暫時(shí)沒际歼,正在蒸呢,蒸好了我打電話告訴你9美丁".但你依然站在旁邊只等饅頭鹅心,此時(shí)的你,是阻塞的纺荧,是異步的.阻塞表現(xiàn)在你除了等饅頭旭愧,別的什么都不做了.異步表現(xiàn)在等饅頭的過程中,阿梅提供電話通知"饅頭出爐"的消息宙暇,你只需要等阿梅的電話.
- 你去甜在心饅頭店買太極饅頭输枯,阿梅說:"暫時(shí)沒,正在蒸呢客给,蒸好了我打電話告訴你S醚骸".于是你就走了,去買了雙新球鞋靶剑,看了看武館蜻拨,總之池充,從此不再過問饅頭的事情,一心只等阿梅電話.此時(shí)的你缎讼,是非阻塞的收夸,是異步的.非阻塞表現(xiàn)在你除了等饅頭,自己還干干別的時(shí)不時(shí)會(huì)主動(dòng)問問饅頭好沒好.異步表現(xiàn)在等饅頭的過程中血崭,阿梅提供電話通知"饅頭出爐"的消息卧惜,你只需要等阿梅的電話.
如果你仔細(xì)品過上面案例中的每一個(gè)字,你就能慢慢體會(huì)到之所以異步和非阻塞夹纫,同步和阻塞容易混淆咽瓷,僅僅是因?yàn)槎叩谋憩F(xiàn)形式稍微有點(diǎn)兒相似而已.
阻塞和非阻塞關(guān)注的是:在等饅頭的過程中,你在干啥.
同步和異步關(guān)注的是:等饅頭這件事舰讹,你是一直等到"饅頭出爐"的結(jié)果茅姜,還是立即跑路等阿梅告訴你的"饅頭出爐".重點(diǎn)的是你是如何得知"饅頭出爐"的.所以現(xiàn)實(shí)世界中,最傻的人才會(huì)采用異步阻塞的IO方式去寫程序.其余三種方式月匣,更多的人都會(huì)選擇同步阻塞或者異步非阻塞.同步非阻塞最大的問題在于钻洒,你需要不斷在各個(gè)任務(wù)中忙碌著,導(dǎo)致你的大腦混亂锄开,非常累.
注:文章來源于網(wǎng)絡(luò)素标,如有侵權(quán)請(qǐng)告知?jiǎng)h除。