要想更好了解socket編程,有一個(gè)不可繞過(guò)的環(huán)節(jié)就是IO.
在Linux中,一切皆文件.實(shí)際上要文件干啥?不就是讀寫(xiě)么?所以,這句話本質(zhì)就是”IO才是王道”.用php的fopen打開(kāi)文件關(guān)閉文件讀讀寫(xiě)寫(xiě),這叫本地文件IO.在socket編程中,本質(zhì)就是網(wǎng)絡(luò)IO.
所以,在開(kāi)始進(jìn)一步的socket編程前,我們必須先從概念上認(rèn)識(shí)好IO.
如果到這里你還對(duì)IO沒(méi)啥概念,那么我就通過(guò)幾個(gè)詞來(lái)給你一個(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è)概念呢?尤其是同步和阻塞,異步和非阻塞,看起來(lái)就是一樣的.我先舉個(gè)例子結(jié)合自己的理解來(lái)說(shuō)明一下:
- 你去甜在心饅頭店買(mǎi)太極饅頭,阿梅說(shuō):"暫時(shí)沒(méi),正在蒸呢,你自己看著點(diǎn)兒?。ⅲ谑悄憔驼驹谂赃呏坏瑞z頭.此時(shí)的你,是阻塞的,是同步的.阻塞表現(xiàn)在你除了等饅頭,別的什么都不做了.同步表現(xiàn)在等饅頭的過(guò)程中,阿梅不提供通知服務(wù),你不得不自己要等到"饅頭出爐"的消息.
- 你去甜在心饅頭店買(mǎi)太極饅頭,阿梅說(shuō):"暫時(shí)沒(méi),正在蒸呢,你自己看著點(diǎn)兒!".于是你就站在旁邊發(fā)微信,然后問(wèn)一句:"好了沒(méi)?",然后發(fā)QQ,然后再問(wèn)一句:"好了沒(méi)?".此時(shí)的你,是非阻塞的,是同步的.非阻塞表現(xiàn)在你除了等饅頭,自己還干干別的時(shí)不時(shí)會(huì)主動(dòng)問(wèn)問(wèn)饅頭好沒(méi)好.同步表現(xiàn)在等饅頭的過(guò)程中,阿梅不提供通知服務(wù),你不得不自己要等到"饅頭出爐"的消息.
- 你去甜在心饅頭店買(mǎi)太極饅頭,阿梅說(shuō):"暫時(shí)沒(méi),正在蒸呢,蒸好了我打電話告訴你?。ⅲ阋廊徽驹谂赃呏坏瑞z頭,此時(shí)的你,是阻塞的,是異步的.阻塞表現(xiàn)在你除了等饅頭,別的什么都不做了.異步表現(xiàn)在等饅頭的過(guò)程中,阿梅提供電話通知"饅頭出爐"的消息,你只需要等阿梅的電話.
- 你去甜在心饅頭店買(mǎi)太極饅頭,阿梅說(shuō):"暫時(shí)沒(méi),正在蒸呢,蒸好了我打電話告訴你?。ⅲ谑悄憔妥吡?,去買(mǎi)了雙新球鞋,看了看武館,總之,從此不再過(guò)問(wèn)饅頭的事情,一心只等阿梅電話.此時(shí)的你,是非阻塞的,是異步的.非阻塞表現(xiàn)在你除了等饅頭,自己還干干別的時(shí)不時(shí)會(huì)主動(dòng)問(wèn)問(wèn)饅頭好沒(méi)好.異步表現(xiàn)在等饅頭的過(guò)程中,阿梅提供電話通知"饅頭出爐"的消息,你只需要等阿梅的電話.
如果你仔細(xì)品過(guò)上面案例中的每一個(gè)字,你就能慢慢體會(huì)到之所以異步和非阻塞,同步和阻塞容易混淆,僅僅是因?yàn)槎叩谋憩F(xiàn)形式稍微有點(diǎn)兒相似而已.
阻塞和非阻塞關(guān)注的是:在等饅頭的過(guò)程中,你在干啥.
同步和異步關(guān)注的是:等饅頭這件事,你是一直等到"饅頭出爐"的結(jié)果,還是立即跑路等阿梅告訴你的"饅頭出爐".重點(diǎn)的是你是如何得知"饅頭出爐"的.所以現(xiàn)實(shí)世界中,最傻的人才會(huì)采用異步阻塞的IO方式去寫(xiě)程序.其余三種方式,更多的人都會(huì)選擇同步阻塞或者異步非阻塞.同步非阻塞最大的問(wèn)題在于,你需要不斷在各個(gè)任務(wù)中忙碌著,導(dǎo)致你的大腦混亂,非常累.
注:文章來(lái)源于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)告知?jiǎng)h除。