中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

workerman的核心概念

發布時間:2021-01-26 14:17:07 來源:億速云 閱讀:306 作者:小新 欄目:編程語言

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

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

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

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

首先需要了解一下幾個核心概念,1.多進程 2.Epoll 3.非阻塞IO

1、多進程:

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

有時候進程間需要進行通信,這時可以使用操作系統提供進程間通信機制。通常情況下,執行一個可執行文件操作系統會為其創建一個進程以供它運行。

但如果該執行文件是基于多進程設計的話,操作系統會在最初的進程上創建出多個進程出來,這些進程間執行的代碼是一樣,但執行結果可能是一樣的,也可能是不一樣的。

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

在Linux系統上可以通過fork()來在父進程中創建出子進程。一個進程調用fork()后,系統會先給新進程分配資源,例如存儲數據和代碼空間。然后把原來進程的所有值、狀態都復制到新的進程里,只有少數的值與原來的進程不同,以區分不同的進程。

fork()函數會返回兩次,一次給父進程(返回子進程的pid或者fork失敗信息),一次給子進程(返回0)。至此,兩個進程分道揚鑣,各自運行在系統里。

2、非阻塞IO:

首先什么是IO,即input與output的操作。網絡IO的本質是socket的讀取,socket在linux系統被抽象為流,IO可以理解為對流的操作。對于一次IO訪問(以read舉例),數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。

所以說,當一個read操作發生時,它會經歷兩個階段:

第一階段(等待數據):等待數據準備 (Waiting for the data to be ready)。

第二階段(拷貝數據):將數據從內核拷貝到進程中 (Copying the data from the kernel to the process)

對于socket流(即IO)而言,

第一步:通常涉及等待網絡上的數據分組到達,然后被復制到內核的某個緩沖區。

第二步:把數據從內核緩沖區復制到應用進程緩沖區。

網絡IO的模型大致有如下幾種:

同步模型(synchronous IO)

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

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

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

它的基本原理就是select,poll,epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有數據到達了,就通知用戶進程。在IO multiplexing Model中,實際中,對于每一個socket,一般都設置成為non-blocking。

但是,整個用戶的process其實是一直被block的。只不過process是被select這個函數block,而不是被socket IO給block。所以IO多路復用是阻塞在select,epoll這樣的系統調用之上,而沒有阻塞在真正的I/O系統調用如recvfrom之上。

信號驅動式IO(signal-driven IO)

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

然后,kernel會等待數據準備完成,然后將數據拷貝到用戶內存,當這一切都完成之后,kernel會給用戶進程發送一個signal,告訴它read操作完成了。

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

PS.幾個需要注意的點:

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

同步是需要主動等待消息通知,而異步則是被動接收消息通知,通過回調、通知、狀態等方式來被動獲取消息。IO多路復用在阻塞到select階段時,用戶進程是主動等待并調用select函數獲取數據就緒狀態消息,并且其進程狀態為阻塞。所以,把IO多路復用歸為同步阻塞模式。

2:到底什么是并發,高并發到底是一張怎么樣的狀態?

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

通過合理調度任務的不同階段,并發數可以遠遠大于并行度,這就是區區幾個 CPU 可以支持上萬個用戶并發請求的奧秘。在這種高并發的情況下,為每個任務(用戶請求)創建一個進程或線程的開銷非常大。而同步非阻塞方式可以把多個 IO 請求丟到后臺去,這就可以在一個進程里服務大量的并發 IO 請求。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临沭县| 卓尼县| 沽源县| 阳朔县| 沈阳市| 遵义县| 图木舒克市| 宿松县| 九龙城区| 合阳县| 泉州市| 深圳市| 尼玛县| 张掖市| 保亭| 瓮安县| 汝阳县| 尤溪县| 磐石市| 鄂伦春自治旗| 衢州市| 吐鲁番市| 延津县| 旅游| 西峡县| 隆尧县| 象州县| 伊宁市| 松滋市| 阿坝县| 靖江市| 武穴市| 陇西县| 秦皇岛市| 广饶县| 平南县| 宜良县| 冀州市| 达日县| 阳曲县| 南木林县|