溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

workerman的核心概念

發(fā)布時(shí)間:2021-01-26 14:17:07 來源:億速云 閱讀:295 作者:小新 欄目:編程語言

小編給大家分享一下workerman的核心概念,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

Workerman是一款純PHP開發(fā)的開源高性能的PHP socket 服務(wù)框架。它不是一個(gè)MVC框架,而是一個(gè)更底層更通用的socket服務(wù)框架,你可以用它開發(fā)tcp代理、梯子代理、做游戲服務(wù)器、郵件服務(wù)器、ftp服務(wù)器。

實(shí)際上Workerman類似一個(gè)PHP版本的nginx,核心也是多進(jìn)程+Epoll+非阻塞IO。Workerman每個(gè)進(jìn)程能維持上萬并發(fā)連接。由于本身常住內(nèi)存,不依賴Apache、nginx、php-fpm這些容器,擁有超高的性能。

同時(shí)支持TCP、UDP、UNIXSOCKET,支持長連接,支持Websocket、HTTP、WSS、HTTPS等通訊協(xié)以及各種自定義協(xié)議。擁有定時(shí)器、異步socket客戶端、異步Mysql、異步Redis、異步Http、異步消息隊(duì)列等眾多高性能組件。

首先需要了解一下幾個(gè)核心概念,1.多進(jìn)程 2.Epoll 3.非阻塞IO

1、多進(jìn)程:

首先什么是進(jìn)程呢,一個(gè)進(jìn)程包括了代碼、數(shù)據(jù)和分配給進(jìn)程的資源(內(nèi)存),在計(jì)算機(jī)系統(tǒng)里直觀地說一個(gè)進(jìn)程就是一個(gè)PID。操作系統(tǒng)保護(hù)進(jìn)程空間不受外部進(jìn)程干擾,即一個(gè)進(jìn)程不能訪問到另一個(gè)進(jìn)程的內(nèi)存。

有時(shí)候進(jìn)程間需要進(jìn)行通信,這時(shí)可以使用操作系統(tǒng)提供進(jìn)程間通信機(jī)制。通常情況下,執(zhí)行一個(gè)可執(zhí)行文件操作系統(tǒng)會(huì)為其創(chuàng)建一個(gè)進(jìn)程以供它運(yùn)行。

但如果該執(zhí)行文件是基于多進(jìn)程設(shè)計(jì)的話,操作系統(tǒng)會(huì)在最初的進(jìn)程上創(chuàng)建出多個(gè)進(jìn)程出來,這些進(jìn)程間執(zhí)行的代碼是一樣,但執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的。

為什么需要多進(jìn)程?最直觀的想法是,如果操作系統(tǒng)支持多核的話,那么一個(gè)執(zhí)行文件可以在不同的核心上跑;即使是非多核的,在一個(gè)進(jìn)程在等待I/O操作時(shí)另一個(gè)進(jìn)程也可以在CPU上跑,提高CPU利用率、程序的效率。

在Linux系統(tǒng)上可以通過fork()來在父進(jìn)程中創(chuàng)建出子進(jìn)程。一個(gè)進(jìn)程調(diào)用fork()后,系統(tǒng)會(huì)先給新進(jìn)程分配資源,例如存儲(chǔ)數(shù)據(jù)和代碼空間。然后把原來進(jìn)程的所有值、狀態(tài)都復(fù)制到新的進(jìn)程里,只有少數(shù)的值與原來的進(jìn)程不同,以區(qū)分不同的進(jìn)程。

fork()函數(shù)會(huì)返回兩次,一次給父進(jìn)程(返回子進(jìn)程的pid或者fork失敗信息),一次給子進(jìn)程(返回0)。至此,兩個(gè)進(jìn)程分道揚(yáng)鑣,各自運(yùn)行在系統(tǒng)里。

2、非阻塞IO:

首先什么是IO,即input與output的操作。網(wǎng)絡(luò)IO的本質(zhì)是socket的讀取,socket在linux系統(tǒng)被抽象為流,IO可以理解為對流的操作。對于一次IO訪問(以read舉例),數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間。

所以說,當(dāng)一個(gè)read操作發(fā)生時(shí),它會(huì)經(jīng)歷兩個(gè)階段:

第一階段(等待數(shù)據(jù)):等待數(shù)據(jù)準(zhǔn)備 (Waiting for the data to be ready)。

第二階段(拷貝數(shù)據(jù)):將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中 (Copying the data from the kernel to the process)

對于socket流(即IO)而言,

第一步:通常涉及等待網(wǎng)絡(luò)上的數(shù)據(jù)分組到達(dá),然后被復(fù)制到內(nèi)核的某個(gè)緩沖區(qū)。

第二步:把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)。

網(wǎng)絡(luò)IO的模型大致有如下幾種:

同步模型(synchronous IO)

阻塞IO(bloking IO)資源不可用時(shí),IO請求一直阻塞,直到反饋結(jié)果(有數(shù)據(jù)或超時(shí))。在linux中,默認(rèn)情況下所有的socket都是blocking,blocking IO的特點(diǎn)就是在IO執(zhí)行的兩個(gè)階段(等待數(shù)據(jù)和拷貝數(shù)據(jù)兩個(gè)階段)都被block了。

非阻塞IO(non-blocking IO)資源不可用時(shí),IO請求離開返回,返回?cái)?shù)據(jù)標(biāo)識(shí)資源不可用。在linux中,如果數(shù)據(jù)還沒有準(zhǔn)備好,那么它并不會(huì)block用戶進(jìn)程,內(nèi)核馬上返回給進(jìn)程,說明這個(gè)命令不能立即滿足(EAGAIN 或 EWOULDBLOCK)。因此非阻塞就是使用輪詢的(polling)方式來實(shí)現(xiàn)。

多路復(fù)用IO(multiplexing IO) IO multiplexing就是我們說的select,poll,epoll,有些地方也稱這種IO方式為event driven IO。select/epoll的好處就在于單個(gè)process就可以同時(shí)處理多個(gè)網(wǎng)絡(luò)連接的IO。

它的基本原理就是select,poll,epoll這個(gè)function會(huì)不斷的輪詢所負(fù)責(zé)的所有socket,當(dāng)某個(gè)socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。在IO multiplexing Model中,實(shí)際中,對于每一個(gè)socket,一般都設(shè)置成為non-blocking。

但是,整個(gè)用戶的process其實(shí)是一直被block的。只不過process是被select這個(gè)函數(shù)block,而不是被socket IO給block。所以IO多路復(fù)用是阻塞在select,epoll這樣的系統(tǒng)調(diào)用之上,而沒有阻塞在真正的I/O系統(tǒng)調(diào)用如recvfrom之上。

信號(hào)驅(qū)動(dòng)式IO(signal-driven IO)

異步IO(asynchronous IO)用戶進(jìn)程發(fā)起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當(dāng)它受到一個(gè)asynchronous read之后,首先它會(huì)立刻返回,所以不會(huì)對用戶進(jìn)程產(chǎn)生任何block。

然后,kernel會(huì)等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存,當(dāng)這一切都完成之后,kernel會(huì)給用戶進(jìn)程發(fā)送一個(gè)signal,告訴它read操作完成了。

3、Epoll : epoll現(xiàn)在就很好理解了,epoll就是Linux內(nèi)核為處理大批量文件描述符而作了改進(jìn)的poll,是Linux下多路復(fù)用IO接口select/poll的增強(qiáng)版本,它能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。

PS.幾個(gè)需要注意的點(diǎn):

1:IO多路復(fù)用是同步阻塞模型還是異步阻塞模型?

同步是需要主動(dòng)等待消息通知,而異步則是被動(dòng)接收消息通知,通過回調(diào)、通知、狀態(tài)等方式來被動(dòng)獲取消息。IO多路復(fù)用在阻塞到select階段時(shí),用戶進(jìn)程是主動(dòng)等待并調(diào)用select函數(shù)獲取數(shù)據(jù)就緒狀態(tài)消息,并且其進(jìn)程狀態(tài)為阻塞。所以,把IO多路復(fù)用歸為同步阻塞模式。

2:到底什么是并發(fā),高并發(fā)到底是一張?jiān)趺礃拥臓顟B(tài)?

高并發(fā)的程序一般使用同步非阻塞方式而非多線程 + 同步阻塞方式。要理解這一點(diǎn),首先要看一下并發(fā)和并行的區(qū)別。也就是說并發(fā)數(shù)是指同時(shí)進(jìn)行的任務(wù)數(shù)(如同時(shí)服務(wù)的 HTTP 請求),而并行數(shù)是可以同時(shí)工作的物理資源數(shù)量(如 CPU 核數(shù))。

通過合理調(diào)度任務(wù)的不同階段,并發(fā)數(shù)可以遠(yuǎn)遠(yuǎn)大于并行度,這就是區(qū)區(qū)幾個(gè) CPU 可以支持上萬個(gè)用戶并發(fā)請求的奧秘。在這種高并發(fā)的情況下,為每個(gè)任務(wù)(用戶請求)創(chuàng)建一個(gè)進(jìn)程或線程的開銷非常大。而同步非阻塞方式可以把多個(gè) IO 請求丟到后臺(tái)去,這就可以在一個(gè)進(jìn)程里服務(wù)大量的并發(fā) IO 請求。

看完了這篇文章,相信你對“workerman的核心概念”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI