日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

閱讀本文你將收獲:

  • 知道框架高性能的根本原因
  • 了解進程,線程切換開銷在哪里
  • 熟悉阻塞與非阻塞IO,同步與異步調(diào)用的區(qū)別

大綱:

  1. 討論一個高性能框架甚至語言的時候,我們在討論什么?
  2. 三大網(wǎng)絡模型阻塞IO+多進程阻塞IO+多線程非阻塞IO+IO多路復用
  3. 五種網(wǎng)絡IO簡介
  4. 網(wǎng)絡IO的本質(zhì)
  5. 如何區(qū)分阻塞IO和非阻塞IO
  6. 如何區(qū)分同步和異步
  7. 個人整理的網(wǎng)絡IO思維導圖

1.討論一個高性能框架甚至語言的時候,我們在討論什么

我相信大家肯定聽過什么阻塞/非阻塞IO,同步/異步調(diào)用,我也嘗試過死記概念,結果大家應該都有體會,過一陣子就忘記了。知其然而不知其所以然~然并卵。

大家在選擇一門語言或者一個框架的時候肯定優(yōu)先看它的性能,也就是并發(fā)量,例如常用的測試手段,就是用該語言或者框架寫個http server服務器,對于http請求返回一個“hello,world!”,利用wrk進行壓測,看看每分鐘請求量最高能到多少,在4核8G的Ubuntu服務器上跑該http服務,利用wrk壓測,gin框架每分鐘能處理的請求量接近300W!這是相當優(yōu)秀的!

前一陣子在go meet up深圳討論語言性能的時候,有位老哥說同等業(yè)務與機器,php每秒請求量大概在300多,處理三萬并發(fā)量的服務程序, go需要一臺服務器,而PHP需要一百臺。 我當時非常震驚,為什么語言之間的差別這么大,是什么原因造成這個巨大的差別呢?我問Boss Lee(meet up講師,一位技術大佬),他跟我說因為PHP是一個請求開一個進程處理,注意是進程而不是線程!

那為什么用進程處理請求會造成性能差別這么大,甚至到了一百臺服務器的差別呢?(一百臺服務器一年得上百萬吧~)

經(jīng)過我查閱資料,得出了是 網(wǎng)絡IO模型造成了性能根本上的差別 這一結論!

這里直接說結論:PHP是阻塞IO+多進程模型,大名鼎鼎的Netty(JAVA)框架是主從reactor+worker threads 模式。

為什么?因為CPU切換進程或線程所帶來的性能損耗是巨大的,主從reactor模式解決了IO分發(fā)的高效率問題!

這里先記住結論,后文看解析

2.三大網(wǎng)絡模型

2.1阻塞IO+多進程

服務器初始監(jiān)聽在lisnted_fd到接字上,此時一個客戶端發(fā)起連接請求,連接成功后產(chǎn)生連接套接字,此時父進程fork出一個子進程,子進程拿到連接套接字,并以此與客戶端通信。在這種網(wǎng)絡模型下,父進程關心的是監(jiān)聽套接字,子進程關心的是連接套接字。

從網(wǎng)絡IO看高性能框架

 

連接分配第一個客戶端.png

從網(wǎng)絡IO看高性能框架

 

連接分配第二個客戶端.png

這種網(wǎng)絡模型編程簡單,但是效率不高。

2.2阻塞IO+多線程

進程切換上下文代價是相當高的,有一種類似進程,但是切換開銷比進程小的東西,那就是線程。

為什么說線程切換比進程切換開銷要小呢?

因為線程由操作系統(tǒng)內(nèi)核管理,在同一個進程中,所有的線程共享該進程的整個虛擬地址空間,包括代碼、數(shù)據(jù)、堆、共享庫等。

我們的代碼被CPU執(zhí)行需要一些數(shù)據(jù)支撐的,這就是所謂的上下文,包括但不限于程序計數(shù)器需要告訴CPU代碼執(zhí)行到哪里了,寄存器中存放了一些計算中間值,內(nèi)從中存放了當前一些變量等。 從一個計算場景切換到另一個計算場景,這些值都需要重新載入,這就是上下文切換。

2.2非阻塞IO+IO多路復用

使用poll和epoll可以設計出基于套接字滿足高性能,高并發(fā)的事件驅(qū)動程序。

事件驅(qū)動模型,叫做 reactor模型,或者Even loop模型。 是不是很熟悉?這個模型的核心有兩點:

  1. 存在一個無限循環(huán)的事件分發(fā)線程,叫reactor線程,或者Even loop線程。這個分發(fā)線程背后的技術就是poll與epoll這類的IO多路復用技術。
  2. 所有的IO操作都可抽象為事件,每個事件必須有回調(diào)函數(shù)來處理。acceptor上有連接建立,已連接套接字的發(fā)送緩沖區(qū)可以寫,通信管道pipe上有數(shù)據(jù)可以讀,這些事件通過事件分發(fā),都能被檢測并調(diào)用回調(diào)函數(shù)處理。
  • 單reactor模型 + worker threads該模型是將acceptor上連接建立事件,和已連接套接字的IO事件的分發(fā)由一個reactor線程去執(zhí)行,由工作線程去處理耗時操作,例如數(shù)據(jù)庫讀取,文件解析,計算等等。單reactor模型 + worker threads.png
  • 主從reactor模型 + worker threads當所有acceptor的連接建立事件和已連接套接字的IO事件交由一個reactor線程處理,在并發(fā)量較高的情況下,這個reactor線程會 忙不過來 ,表現(xiàn)在客戶端連接建立成功率偏低。

那么主從模式的核心思想就在于,主reactor上只監(jiān)聽acceptor上成功建立的連接事件,并將其分發(fā)給從reactor線程,從reactor線程只需要負責已連接套接字上的IO事件。

從網(wǎng)絡IO看高性能框架

 

主從reactor模型 + worker threads.png

總結:我們通過主reactor線程來分發(fā)成功建立的套接字,通過從reactor線程來分發(fā)已連接套接字上的IO事件,通過工作線程來處理耗時操作! 更進一步---通過用戶態(tài)自己建立的協(xié)程機制來調(diào)度業(yè)務處理程序,用戶態(tài)自己管理協(xié)程間切換,避免了CPU切換線程,又能為程序帶來更高的處理效率!

3. 五種網(wǎng)絡IO簡介

  • 阻塞IO
  • 非阻塞IO
  • IO多路復用
  • 異步IO
  • 信號驅(qū)動IO

阻塞IO:

當應用程序調(diào)用阻塞IO完成某個操作時,應用程序會被掛起,感覺上應用程序像是被“阻塞”了一樣。實際上,內(nèi)核所做的事情是將CPU時間切換給了其他有需要的進程,網(wǎng)絡應用程序在這種情況下就會得不到CPU時間做該做的事情。

非阻塞IO:

當應用程序調(diào)用非阻塞IO完成某個操作時,內(nèi)核立即返回,不會把CPU時間讓出給其他進程,應用程序在返回后可以得到足夠的CPU時間做其他的事情。

IO多路復用:

我們可以把標準輸入、套接字都看作IO的一路,多路復用的意思,就是在任何一路IO有“事件”發(fā)生的情況下,通過應用程序去處理相應的IO事件,這樣我們的程序就“好像”在同一時刻處理多個IO事件。

異步IO:

當一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結果。實際處理這個調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。

信號驅(qū)動IO:

應用進程使用 sigaction 系統(tǒng)調(diào)用,內(nèi)核立即返回,應用進程可以繼續(xù)執(zhí)行。當數(shù)據(jù)報準備好讀取時,內(nèi)核就為該進程產(chǎn)生一個SIGIO信號,我們隨后可以在信號處理函數(shù)中讀取數(shù)據(jù)報,也可以立即通知主循環(huán),讓他讀取數(shù)據(jù)。

4.網(wǎng)絡IO的本質(zhì)

網(wǎng)絡IO的本質(zhì)就是socket流的讀取,通常一次IO讀操作會涉及到兩個對象和兩個階段。

兩個對象:

  1. 用戶進程(線程)
  2. 內(nèi)核對象

兩個階段:

  1. 等待數(shù)據(jù)流準備
  2. 從內(nèi)核向進程復制數(shù)據(jù)

對于socket流而言:

  1. 第一步通常涉及等待網(wǎng)絡上的數(shù)據(jù)分組到達,然后被復制到內(nèi)核的某個緩沖區(qū)。
  2. 第二步把數(shù)據(jù)從內(nèi)核緩沖區(qū)復制到進程緩沖區(qū)。

5. 如何區(qū)分阻塞IO和非阻塞IO

阻塞IO發(fā)起的read請求,線程會被掛起,一直等到內(nèi)核數(shù)據(jù)準備好,并把數(shù)據(jù)從內(nèi)核區(qū)域拷貝到應用程序的緩沖區(qū)中,拷貝完成后,read請求調(diào)用才返回。

從網(wǎng)絡IO看高性能框架

 

阻塞IO.png

非阻塞IO的read請求在數(shù)據(jù)為準備的情況下立即返回,應用程序可以不斷查詢內(nèi)核,直到數(shù)據(jù)準備好,內(nèi)核將數(shù)據(jù)拷貝到應用程序緩沖區(qū)并完成這次read調(diào)用。

從網(wǎng)絡IO看高性能框架

 

非阻塞IO.png

6. 如何區(qū)分同步和異步

同步調(diào)用與 異步調(diào)用 是對于獲取數(shù)據(jù)的過程而言的,前面的幾種最后獲取數(shù)據(jù)的read操作調(diào)用,都是同步的,即在read調(diào)用時,內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝到應用程序空間,這個過程是在read函數(shù)中同步進行的。

從網(wǎng)絡IO看高性能框架

 

同步調(diào)用.png

當我們發(fā)起異步讀(aio_read)之后,就立即返回,內(nèi)核自動將數(shù)據(jù)從內(nèi)核空間拷貝到應用程序空間,這個拷貝過程是異步的,內(nèi)核自動完成的,和前面的同步操作不一樣,應用程序并不需要主動發(fā)起拷貝動作。

從網(wǎng)絡IO看高性能框架

 

異步調(diào)用.png

分享到:
標簽:高性能 框架
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定