首頁  >  文章  >  後端開發  >  PHP7核心剖析2之 I/O模型

PHP7核心剖析2之 I/O模型

不言
不言原創
2018-04-13 14:50:201692瀏覽

本篇文章的內容介紹的是關於PHP7核心剖析2之I/O模型,現在分享給大家,有需要的朋友可以參考一下

1.同步:我客戶端(C端呼叫者)一個功能,該功能沒有結束前,我死等結果。
2.異步:我(c端調用者)調用一個功能,不知道該功能結果,該功能有結果後通知我,即回調通知
3.阻塞:就是調用我(s端被調用者,函數),我(s端被呼叫者,函數)沒有完全接受完數據或沒有得到結果之前,我不會返回。
4.非阻塞:就是呼叫我(s端被呼叫者,函數),我(s端被呼叫者,函數)立即返回,得出結果後通知呼叫者

#五種I/O模型

(1) 阻塞I/O (Blocking I/O)

PHP7核心剖析2之 I/O模型

當使用者程序進行系統呼叫時,核心就開始了I/O的第一個階段,準備資料到緩衝區中,當資料都準備完成後,則將資料從核心緩衝區中拷貝到使用者進程的記憶體中,這時用戶進程才解除block的狀態重新運作。

(2) 非阻塞I/O (Non-Blocking I/O)

PHP7核心剖析2之 I/O模型

使用者程式只有在第二個階段被阻塞了,而第一個階段沒有阻塞,但是在第一個階段中,用戶進程不需要盲等,不停的去輪詢內核,看數據是否準備好了,因此該模型是比較消耗CPU的。

(3) I/O複用(I/O Multiplexing)

PHP7核心剖析2之 I/O模型

#I/O執行的兩個階段都是用戶進程都是阻塞的,但是兩個階段是獨立的,在一次完整的I/O操作中,該用戶進程是發起了兩次系統呼叫。和阻塞I/O不同的是第一段可以等待多個描述符就緒

(4) 訊號驅動的I/O (Signal Driven I/O)

PHP7核心剖析2之 I/O模型

只有在I/O執行的第二階段阻塞了使用者進程,而在第一階段是沒有阻塞的。此模型在I/O執行的第一階段,當資料準備完成之後,會主動的通知使用者進程資料已經準備完成,也就是對使用者進程做一個回呼。該通知分為兩種,一為水平觸發,即如果用戶進程不響應則會一直發送通知,二為邊緣觸發,即只通知一次。

(5) 非同步I/O (Asynchrnous I/O)

PHP7核心剖析2之 I/O模型

#當使用者行程啟動系統呼叫後,立刻就可以開始去做其它的事情,然後直到I/O執行的兩個階段都完成之後,核心會給用戶進程發送通知,告訴用戶進程操作已經完成了。

I/O多路復用技術

select

#(1).select()的機制中提供一fd_set的資料結構,每個元素都能與一打開的文件句柄(不管是Socket句柄,還是其他文件或命名管道或設備句柄)建立聯繫,建立聯繫的工作由程式設計師完成, 當調用select()時,由內核根據IO狀態修改fd_set的內容,由此來通知執行了select()的程序哪一Socket或檔案可讀或可寫。主要用於Socket通訊當中。

(2).程式執行select後,如果沒有資料輸入,程式會一直等待(阻塞時),直到有資料為止,也就是程式中不需要循環和sleep。

(3).每次呼叫select,都需要把fd_set集合從用戶態拷貝到內核態,這個開銷在fd_set很多時會很大

(4).同時每次呼叫select都需要在內核遍歷傳遞進來的所有fd_set,這個開銷在fd_set很多時也很大

(5).select支援的檔案描述符數量太小了,預設是1024

poll

(1).poll的實作和select非常相似,只是描述fd_set集合的方式不同,poll使用pollfd鍊錶結構而不是select的fd_set結構,其他的都差不多。

(2).監視描述子個數無上限;

epoll/kqueue

(1).監視描述子個數無上限;
(2 ).效率提升,不是輪詢的方式,不會隨著fd數目的增加效率下降。只有活躍可用的fd才會呼叫callback函數;即epoll/kqueue最大的優點就在於它只管你「活躍」的連接,而跟連接總數無關,因此在實際的網路環境中,epoll/kqueue的效率就會遠高於select和poll。
(3).記憶體拷貝,利用mmap()檔案映射記憶體加速與核心空間的訊息傳遞;

#相關推薦:

PHP7核心剖析1之CGI與FastCGI

#

以上是PHP7核心剖析2之 I/O模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn