PHP socket初探 --- 關於IO的一些枯燥理論

[原文地址:https://blog.ti-node.com/blog...]php

要想更好了解socket編程,有一個不可繞過的環節就是IO.
在Linux中,一切皆文件.實際上要文件幹啥?不就是讀寫麼?因此,這句話本質就是"IO纔是王道".用php的fopen打開文件關閉文件讀讀寫寫,這叫本地文件IO.在socket編程中,本質就是網絡IO.
因此,在開始進一步的socket編程前,咱們必須先從概念上認識好IO.
若是到這裏你還對IO沒啥概念,那麼我就經過幾個詞來給你一個大概的印象:同步,異步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,異步阻塞,異步非阻塞.是否是暈了?截至到目前爲止,你能夠簡單地認爲只要搞明白這幾個名詞的含義以及區別,就算弄明白IO了,至少了能夠繼續往下看了.
先機械記憶一波兒:IO分爲兩大種,同步和異步.node

同步IO:
  • 阻塞IO
  • 非阻塞IO
  • IO多路複用(包括select,poll,epoll三種)
  • 信號驅動IO
異步IO

那麼如何理解區別這幾個概念呢?尤爲是同步和阻塞,異步和非阻塞,看起來就是同樣的.
我先舉個例子結合本身的理解來講明一下:編程

  1. 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你本身看着點兒!".因而你就站在旁邊只等饅頭.此時的你,是阻塞的是同步的.阻塞表如今你除了等饅頭,別的什麼都不作了.同步表如今等饅頭的過程當中,阿梅不提供通知服務,你不得不本身要等到"饅頭出爐"的消息.
  2. 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你本身看着點兒!".因而你就站在旁邊發微信,而後問一句:"好了沒?",而後發QQ,而後再問一句:"好了沒?".此時的你,是非阻塞的是同步的.非阻塞表如今你除了等饅頭,本身還乾乾別的時不時會主動問問饅頭好沒好.同步表如今等饅頭的過程當中,阿梅不提供通知服務,你不得不本身要等到"饅頭出爐"的消息.
  3. 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".但你依然站在旁邊只等饅頭,此時的你,是阻塞的是異步的.阻塞表如今你除了等饅頭,別的什麼都不作了.異步表如今等饅頭的過程當中,阿梅提供電話通知"饅頭出爐"的消息,你只須要等阿梅的電話.
  4. 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".因而你就走了,去買了雙新球鞋,看了看武館,總之,今後再也不過問饅頭的事情,一心只等阿梅電話.此時的你,是非阻塞的是異步的.非阻塞表如今你除了等饅頭,本身還乾乾別的時不時會主動問問饅頭好沒好.異步表如今等饅頭的過程當中,阿梅提供電話通知"饅頭出爐"的消息,你只須要等阿梅的電話.

若是你仔細品過上面案例中的每個字,你就能慢慢體會到之因此異步和非阻塞,同步和阻塞容易混淆,僅僅是由於兩者的表現形式稍微有點兒類似而已.
阻塞和非阻塞關注的是:在等饅頭的過程當中,你在幹啥.
同步和異步關注的是:等饅頭這件事,你是一直等到"饅頭出爐"的結果,仍是當即跑路等阿梅告訴你的"饅頭出爐".重點的是你是如何得知"饅頭出爐"的.
因此現實世界中,最傻的人才會採用異步阻塞的IO方式去寫程序.其他三種方式,更多的人都會選擇同步阻塞或者異步非阻塞.同步非阻塞最大的問題在於,你須要不斷在各個任務中忙碌着,致使你的大腦混亂,很是累.微信

[原文地址:https://blog.ti-node.com/blog...]網絡

相關文章
相關標籤/搜索