真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

workerman的核心概念-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)是專業(yè)的炎陵網(wǎng)站建設(shè)公司,炎陵接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行炎陵網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

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

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

同時(shí)支持TCP、UDP、UNIXSOCKET,支持長(zhǎng)連接,支持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)里直觀地說(shuō)一個(gè)進(jìn)程就是一個(gè)PID。操作系統(tǒng)保護(hù)進(jìn)程空間不受外部進(jìn)程干擾,即一個(gè)進(jìn)程不能訪問(wè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)程出來(lái),這些進(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)上可以通過(guò)fork()來(lái)在父進(jìn)程中創(chuàng)建出子進(jìn)程。一個(gè)進(jìn)程調(diào)用fork()后,系統(tǒng)會(huì)先給新進(jìn)程分配資源,例如存儲(chǔ)數(shù)據(jù)和代碼空間。然后把原來(lái)進(jìn)程的所有值、狀態(tài)都復(fù)制到新的進(jìn)程里,只有少數(shù)的值與原來(lái)的進(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可以理解為對(duì)流的操作。對(duì)于一次IO訪問(wèn)(以read舉例),數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間。

所以說(shuō),當(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)

對(duì)于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請(qǐng)求一直阻塞,直到反饋結(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請(qǐng)求離開(kāi)返回,返回?cái)?shù)據(jù)標(biāo)識(shí)資源不可用。在linux中,如果數(shù)據(jù)還沒(méi)有準(zhǔn)備好,那么它并不會(huì)block用戶進(jìn)程,內(nèi)核馬上返回給進(jìn)程,說(shuō)明這個(gè)命令不能立即滿足(EAGAIN 或 EWOULDBLOCK)。因此非阻塞就是使用輪詢的(polling)方式來(lái)實(shí)現(xiàn)。

多路復(fù)用IO(multiplexing IO) IO multiplexing就是我們說(shuō)的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í)際中,對(duì)于每一個(gè)socket,一般都設(shè)置成為non-blocking。

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

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

異步IO(asynchronous IO)用戶進(jìn)程發(fā)起read操作之后,立刻就可以開(kāi)始去做其它的事。而另一方面,從kernel的角度,當(dāng)它受到一個(gè)asynchronous read之后,首先它會(huì)立刻返回,所以不會(huì)對(duì)用戶進(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)接收消息通知,通過(guò)回調(diào)、通知、狀態(tài)等方式來(lá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ū)別。也就是說(shuō)并發(fā)數(shù)是指同時(shí)進(jìn)行的任務(wù)數(shù)(如同時(shí)服務(wù)的 HTTP 請(qǐng)求),而并行數(shù)是可以同時(shí)工作的物理資源數(shù)量(如 CPU 核數(shù))。

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

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


本文標(biāo)題:workerman的核心概念-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/cdhoes.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部