當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]?? 面試中經(jīng)常會(huì)被問到高性能服務(wù)模型選擇對(duì)比,以及如何提高服務(wù)性能和處理能力,這其中涉及操作系統(tǒng)軟件和計(jì)算機(jī)硬件知識(shí),其實(shí)都是在考察候選人的基礎(chǔ)知識(shí)掌握程度,但如果沒準(zhǔn)備的話容易一頭霧水,這次帶大家從頭到尾學(xué)習(xí)一遍,學(xué)完這一篇再也不怕面試官

  

面試中經(jīng)常會(huì)被問到高性能服務(wù)模型選擇對(duì)比,以及如何提高服務(wù)性能和處理能力,這其中涉及操作系統(tǒng)軟件和計(jì)算機(jī)硬件知識(shí),其實(shí)都是在考察候選人的基礎(chǔ)知識(shí)掌握程度,但如果沒準(zhǔn)備的話容易一頭霧水,這次帶大家從頭到尾學(xué)習(xí)一遍,學(xué)完這一篇再也不怕面試官刨根問底了!

任務(wù)類型

談高并發(fā)服務(wù)模型選擇之前,我們先來(lái)看下程序的的任務(wù)類型,程序任務(wù)類型一般分為 CPU 密集型任務(wù)和 IO 密集型任務(wù),這兩種任務(wù)有各自的特點(diǎn),對(duì)程序的要求是不一樣的需要分開對(duì)待。

CPU密集型任務(wù)

一個(gè)程序任務(wù)大部分是計(jì)算類的,比如邏輯處理、數(shù)值比較和計(jì)算,我們就稱它是 CPU 密集型任務(wù)或計(jì)算密集型任務(wù)。CPU 密集型任務(wù)的特點(diǎn)是要進(jìn)行大量的計(jì)算,消耗 CPU 資源,比如計(jì)算圓周率、視頻編解碼這些靠的是 CPU 的運(yùn)算能力。

CPU 密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,任務(wù)之間切換的時(shí)間就越多,CPU 執(zhí)行效率反而更低,所以要最高效地利用 CPU,任務(wù)并行數(shù)應(yīng)當(dāng)?shù)扔?CPU 的核心數(shù),避免任務(wù)在 CPU 核之間頻繁切換。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
芯片線路 | 圖片來(lái) 源: www.hippo px.co m L ice ns CC0

IO密集型任務(wù)

一個(gè)程序涉及到大量網(wǎng)絡(luò)、磁盤等比較耗時(shí)的輸入輸出任務(wù),就稱它是 IO 密集型任務(wù),這類任務(wù)的特點(diǎn)是 CPU 消耗很少,任務(wù)的大部分時(shí)間都在等待 IO 操作完成(因?yàn)?IO 的速度遠(yuǎn)遠(yuǎn)低于 CPU 和內(nèi)存的速度,不是一個(gè)數(shù)量級(jí)的)。

對(duì)于 IO 密集型任務(wù),任務(wù)越多 CPU 效率越高,但也不是無(wú)限的開啟多任務(wù),如果任務(wù)過多頻繁切換的開銷也不可忽視。常見的大部分程序都是執(zhí)行 IO 密集型任務(wù),比如互聯(lián)網(wǎng)業(yè)務(wù)的 Web 服務(wù),數(shù)據(jù)庫(kù)操作等。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
五彩的以太網(wǎng)口  | 圖片來(lái) 源: www.hippo px.co L ice ns CC0

服務(wù)模型

不管是 CPU 密集型任務(wù)還是 IO 密集型任務(wù),要提高服務(wù)器處理能力,可以從軟件和硬件兩個(gè)層面來(lái)做文章。

先說軟件層面,單個(gè)任務(wù)處理能力有限,可以通過啟動(dòng)多個(gè)功能完全相同的服務(wù)實(shí)例,借此來(lái)提高服務(wù)整體處理性能,多服務(wù)實(shí)例的實(shí)現(xiàn)主流的技術(shù)有三種:多進(jìn)程、多線程、多協(xié)程。當(dāng)然除了用多實(shí)例的方式,還有 IO 多路復(fù)用、異步 IO 等技術(shù),為了文章主題明確,不在本文展開討論。

服務(wù)模型哪家強(qiáng)

既然有三種技術(shù)實(shí)現(xiàn),那么你可能會(huì)問,在三個(gè)模型里選一個(gè)最好的來(lái)實(shí)現(xiàn)服務(wù),該如何選擇一個(gè)適合的服務(wù)模型呢?

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

抱歉,小孩子才做選擇我全都要!哈哈,開個(gè)玩笑。

答案是沒有最好,服務(wù)模型選擇要結(jié)合自身服務(wù)處理的任務(wù)類型。任務(wù)類型就是我們上面說的 CPU 密集型和 IO 密集型,只有清楚的知道所處理業(yè)務(wù)的任務(wù)類型,才能在上述服務(wù)模型中選擇其一或多種模型組合,來(lái)搭建適合你的高性能服務(wù)框架。

多進(jìn)程服務(wù)模型

進(jìn)程概念

程序是一些保存在磁盤上的指令的有序集合,是靜態(tài)的。進(jìn)程是程序執(zhí)行的過程,包括了動(dòng)態(tài)創(chuàng)建、調(diào)度和消亡的整個(gè)過程,進(jìn)程是程序資源管理的最小單位。

多進(jìn)程模型

多進(jìn)程模型是啟動(dòng)多個(gè)服務(wù)進(jìn)程。原來(lái)由一個(gè)進(jìn)程做的事,當(dāng)一個(gè)進(jìn)程忙不過來(lái),創(chuàng)建幾個(gè)功能一樣的進(jìn)程來(lái)幫它一起干活,人多力量大。

由于多進(jìn)程地址空間不同,數(shù)據(jù)不能共享,一個(gè)進(jìn)程內(nèi)創(chuàng)建的變量在另一個(gè)進(jìn)程是無(wú)法訪問。操作系統(tǒng)看不下去了,憑什么同在一臺(tái)機(jī)器,彼此相愛的兩個(gè)進(jìn)程不能說說話呢?

于是操作系統(tǒng)提供了各種系統(tǒng)調(diào)用,搭建起各個(gè)進(jìn)程間通信的橋梁,這些方法統(tǒng)稱為進(jìn)程間通信 IPC (IPC InterProcess Communication)

常見進(jìn)程間通信方式

管道 Pipe

管道的實(shí)質(zhì)是一個(gè)內(nèi)核緩沖區(qū),進(jìn)程以先進(jìn)先出 FIFO 的方式從緩沖區(qū)存取數(shù)據(jù)。是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系(父子進(jìn)程間)的進(jìn)程間通信。

管道工作原理

  1. 管道一端的進(jìn)程順序的將數(shù)據(jù)寫入緩沖區(qū),另一端的進(jìn)程則順序的讀出數(shù)據(jù)。

  2. 緩沖區(qū)可以看做是一個(gè)循環(huán)隊(duì)列,一個(gè)數(shù)據(jù)只能被讀一次,讀出來(lái)后在緩沖區(qū)就不復(fù)存在了。

  3. 當(dāng)緩沖區(qū)為讀空或?qū)憹M,讀數(shù)據(jù)的進(jìn)程或?qū)憯?shù)據(jù)進(jìn)程進(jìn)入等待隊(duì)列。

  4. 空的緩沖區(qū)有新數(shù)據(jù)寫入,或者滿的緩沖區(qū)有數(shù)據(jù)讀出時(shí),喚醒等待隊(duì)列中的進(jìn)程繼續(xù)讀寫。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
管道圖解

命名管道 FIFO

上面介紹的管道也稱為匿名管道,只能用于親緣關(guān)系的進(jìn)程間通信。為了克服這個(gè)缺點(diǎn),出現(xiàn)了有名管道 FIFO 。有名管道提供了一個(gè)路徑名與之關(guān)聯(lián),以文件形式存在于文件系統(tǒng)中,這樣即使不存在親緣關(guān)系的進(jìn)程,只要可以訪問該路徑也能相互通信。

命名管道支持同一臺(tái)計(jì)算機(jī)的不同進(jìn)程之間,可靠的、單向或雙向的數(shù)據(jù)通信。30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

信號(hào) Signal

信號(hào)是Linux系統(tǒng)中用于進(jìn)程間互相通信或者操作的一種機(jī)制,信號(hào)可以在任何時(shí)候發(fā)給某一進(jìn)程,無(wú)需知道該進(jìn)程的狀態(tài)。如果該進(jìn)程當(dāng)前不是執(zhí)行態(tài),內(nèi)核會(huì)暫時(shí)保存信號(hào),當(dāng)進(jìn)程恢復(fù)執(zhí)行后傳遞給它。

如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)的傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給進(jìn)程。

信號(hào)在用戶空間進(jìn)程和內(nèi)核之間直接交互,內(nèi)核可以利用信號(hào)來(lái)通知用戶空間的進(jìn)程發(fā)生了哪些系統(tǒng)事件,信號(hào)事件主要有兩個(gè)來(lái)源:

  • 硬件來(lái)源:用戶按鍵輸入 Ctrl+C退出、硬件異常如無(wú)效的存儲(chǔ)訪問等。
  • 軟件終止:終止進(jìn)程信號(hào)、其他進(jìn)程調(diào)用 kill 函數(shù)、軟件異常產(chǎn)生信號(hào)。

消息隊(duì)列  Message Queue

消息隊(duì)列是存放在內(nèi)核中的消息鏈表,每個(gè)消息隊(duì)列由消息隊(duì)列標(biāo)識(shí)符表示, 只有在內(nèi)核重啟或主動(dòng)刪除時(shí),該消息隊(duì)列才會(huì)被刪除。

消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。另外,某個(gè)進(jìn)程往一個(gè)消息隊(duì)列寫入消息之前,并不需要另外讀進(jìn)程在該隊(duì)列上等待消息的到達(dá)。30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

共享內(nèi)存 Shared memory

共享內(nèi)存是一個(gè)進(jìn)程把地址空間的一段,映射到能被其他進(jìn)程所訪問的內(nèi)存,一個(gè)進(jìn)程創(chuàng)建、多個(gè)進(jìn)程可訪問,進(jìn)程就可以直接讀寫這一塊內(nèi)存而不需要進(jìn)行數(shù)據(jù)的拷貝,從而大大提高效率。

共享內(nèi)存使得多個(gè)進(jìn)程可以可以直接讀寫同一塊內(nèi)存空間,是最快的可用 IPC 形式,是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。共享內(nèi)存往往與其他通信機(jī)制,如信號(hào)量配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和互斥通信。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
共享內(nèi)存

套接字 Socket

套接字你可能沒聽過這個(gè)名字,但絕對(duì)是接觸的最多的一種進(jìn)程間通信方式。因?yàn)槲覀兪煜さ?TCP/IP 協(xié)議棧,也是建立在 socket 通信之上,TCP/IP 構(gòu)建起了當(dāng)前的互聯(lián)網(wǎng)通信網(wǎng)絡(luò)。

它是一種通信機(jī)制,憑借這種機(jī)制,既可以在本機(jī)進(jìn)程間通信,也可以跨網(wǎng)絡(luò)通過,因?yàn)?,套接字通過網(wǎng)絡(luò)接口將數(shù)據(jù)發(fā)送到本機(jī)的不同進(jìn)程或遠(yuǎn)程計(jì)算機(jī)的進(jìn)程。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
socket套接字

多線程服務(wù)模型

線程概念

線程是操作操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。線程被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位,一個(gè)進(jìn)程內(nèi)可以包含多個(gè)線程,線程是資源調(diào)度的最小單位。30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

多線程模型

啟動(dòng)多個(gè)相同功能的進(jìn)程能提高服務(wù)處理能力,但由于各個(gè)進(jìn)程的地址空間相互隔離,通信不便。

于是,多線程服務(wù)模型出場(chǎng)。通過前面的學(xué)習(xí)我們知道,一個(gè)進(jìn)程內(nèi)的多個(gè)線程可以共享進(jìn)程的全部系統(tǒng)資源。進(jìn)程內(nèi)創(chuàng)建的多個(gè)線程都可以訪問進(jìn)程內(nèi)的全局變量。

當(dāng)然沒有免費(fèi)的午餐,線程雖然能方便的訪問進(jìn)程資源,但也帶來(lái)了額外的問題。比如多線程訪公共資源帶來(lái)的同步與互斥問題,不同線程訪問資源的先后順序會(huì)相互影響,如果不做好同步和互斥會(huì)產(chǎn)生預(yù)期之外的結(jié)果,甚至死鎖。

什么是多線程同步

多線程同步是線程之間的一種直接制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的通知,當(dāng)它沒有得到另一個(gè)線程的通知時(shí)必須等待,直到消息到達(dá)時(shí)才被喚醒,即有很強(qiáng)的執(zhí)行先后關(guān)系。

比如你搭建了一個(gè)商城服務(wù)。這個(gè)服務(wù)的下單流程是這樣的:第一步必須要先挑選商品加入購(gòu)物車,第二步才能結(jié)賬計(jì)算訂單金額,假設(shè)這兩個(gè)步驟的操作分別由兩個(gè)線程去完成,則這兩個(gè)線程的操作順序很重要,必須是先下單再結(jié)賬,這就是線程同步。30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?                            購(gòu)物車||圖片來(lái)源:www.hippopx.com License CC0

什么是多線程互斥

多線程互斥指的是多線程對(duì)資源訪問的排他性。所謂排他性,就是當(dāng)有多個(gè)線程都要使用某一共享資源時(shí),任何時(shí)刻最多只允許一個(gè)線程獲得對(duì)這個(gè)共享資源的使用權(quán),當(dāng)共享資源被其中一個(gè)線程占有時(shí),其他未獲得資源的線程必須等待,直到占用資源的線程釋放資源。

打個(gè)比方,你們班只有一臺(tái)投影儀,當(dāng)一個(gè)同學(xué)在上面放電影的時(shí)候,如果老師進(jìn)來(lái)上課要用這個(gè)投影儀,那就只能由這個(gè)同學(xué)放棄投影儀的使用權(quán),交給老師上課投影使用,對(duì),教室里唯一的投影儀是共享資源,具有排他性,老師和學(xué)生比作是兩個(gè)線程的話,那這兩個(gè)線程是互斥的訪問共享資源(投影儀)。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
投影儀  | 圖片來(lái) 源: www.hippo px.co L ice ns CC0

多線程同步和互斥方法

Linux 系統(tǒng)提供以下幾種方法來(lái)解決多線程的同步和互斥問題,分別是:互斥鎖、條件變量、讀寫鎖、自旋鎖、條件變量。

互斥鎖

互斥鎖的作用是對(duì)臨界區(qū)加以保護(hù),以使任意時(shí)刻只有一個(gè)線程能夠執(zhí)行臨界區(qū)的代碼,實(shí)現(xiàn)了多線程對(duì)臨界資源的互斥訪問。

互斥鎖接口函數(shù):

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
互斥鎖api

條件變量

條件變量是用來(lái)等待而不是用來(lái)上鎖的。條件變量用來(lái)自動(dòng)阻塞一個(gè)線程,直到某特殊情況發(fā)生為止。適合多個(gè)線程等待某個(gè)條件的發(fā)生,不使用條件變量,那么每個(gè)線程就不斷嘗試互斥鎖并檢測(cè)條件是否發(fā)生,浪費(fèi)系統(tǒng)資源。

通常條件變量和互斥鎖同時(shí)使用。條件的檢測(cè)是在互斥鎖的保護(hù)下進(jìn)行的。如果一個(gè)條件為假,一個(gè)線程自動(dòng)阻塞,并釋放等待狀態(tài)改變的互斥鎖。如果另一個(gè)線程改變了條件,它發(fā)信號(hào)給關(guān)聯(lián)的條件變量,喚醒一個(gè)或多個(gè)等待它的線程,重新獲得互斥鎖,重新評(píng)價(jià)條件,可以用來(lái)實(shí)現(xiàn)線程間的同步。

條件變量系統(tǒng) API 如下:

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
條件變量API

讀寫鎖

互斥量要么是加鎖狀態(tài),要么是不加鎖狀態(tài),而且一次只有一個(gè)線程對(duì)其進(jìn)行加鎖。讀寫鎖可以有3種狀態(tài):讀加鎖狀態(tài)、寫加鎖狀態(tài)和不加鎖狀態(tài)。

一次只有一個(gè)線程可以占有寫模式讀寫鎖,但是可以有多個(gè)線程同時(shí)占有讀模式的讀寫鎖。因此,讀寫鎖適合于對(duì)數(shù)據(jù)結(jié)構(gòu)的讀次數(shù)比寫次數(shù)多得多的情況,且讀寫鎖比互斥量具有更高的并行性。

讀寫鎖加鎖規(guī)則

1:如果某線程申請(qǐng)了讀鎖,其它線程可以再申請(qǐng)讀鎖,但不能申請(qǐng)寫鎖;

2:如果某線程申請(qǐng)了寫鎖,其它線程不能申請(qǐng)讀鎖,也不能申請(qǐng)寫鎖。

讀寫鎖系統(tǒng) API

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
讀寫鎖API

自旋鎖

互斥鎖得不到鎖時(shí),線程會(huì)進(jìn)入休眠,引發(fā)任務(wù)上下文切換,任務(wù)切換涉及一系列耗時(shí)的操作,因此用互斥鎖一旦遇到阻塞切換代價(jià)是十分昂貴的。

而自旋鎖阻塞后不會(huì)引發(fā)上下文切換,當(dāng)鎖被其他線程占有時(shí),獲取鎖的線程便會(huì)進(jìn)入自旋,不斷檢測(cè)自旋鎖的狀態(tài),直到得到鎖,所謂的自旋就是循環(huán)等待的意思。

自旋鎖在用戶態(tài)使用的比較少,在內(nèi)核使用的比較多。自旋鎖適用于臨界區(qū)代碼比較短,鎖的持有時(shí)間比較短的場(chǎng)景,否則會(huì)讓其他線程一直等待造成饑餓現(xiàn)象。

自旋鎖 API 接口

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
自旋鎖API

信號(hào)量

信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來(lái)控制對(duì)公共資源的訪問。

信號(hào)量是一個(gè)特殊類型的變量,它可以被增加或者減少??筛鶕?jù)操作信號(hào)量值的結(jié)果判斷是否對(duì)公共資源具有訪問的權(quán)限,當(dāng)信號(hào)量值大于 0 時(shí),則可以訪問,否則將阻塞。但對(duì)其的訪問被保證是原子操作,即使在一個(gè)多線程程序中也是如此。

信號(hào)量類型:

  • 二進(jìn)制信號(hào)量,它只有0和1兩種取值。適用于臨界代碼每次只能被一個(gè)執(zhí)行線程運(yùn)行,就要用到二進(jìn)制信號(hào)量。

  • 計(jì)數(shù)信號(hào)量。它可以有更大的取值范圍,適用于臨界代碼允許有限數(shù)目的線程執(zhí)行,就需要用到計(jì)數(shù)信號(hào)量。

信號(hào)量 API

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
信號(hào)量API

協(xié)程服務(wù)模型

什么是協(xié)程

什么是協(xié)程呢?協(xié)程 Coroutines 是一種比線程更加輕量級(jí)的微線程。類比一個(gè)進(jìn)程可以擁有多個(gè)線程,一個(gè)線程也可以擁有多個(gè)協(xié)程,因此協(xié)程又稱微線程和纖程。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
協(xié)程圖解

可以粗略的把協(xié)程理解成子程序調(diào)用,每個(gè)子程序都可以在一個(gè)單獨(dú)的協(xié)程內(nèi)執(zhí)行。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
協(xié)程子程序模型

協(xié)程服務(wù)模型

為了說明什么是協(xié)程模型,先用多線程下的生產(chǎn)者消費(fèi)者模型舉個(gè)栗子。

啟動(dòng)兩個(gè)線程分別執(zhí)行兩個(gè)函數(shù)  Do_some_IODo_some_process ,第一個(gè)做耗時(shí)的 IO 處理操作,第二個(gè)對(duì) IO 操作結(jié)果做快速的處理計(jì)算工作。偽代碼如下:

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
函數(shù)偽代碼

多線程執(zhí)行過程是這樣的:

  1. 生產(chǎn)者線程先調(diào)用函數(shù) Do_some_IO 做比較耗時(shí)的 IO 操作,比如從網(wǎng)絡(luò)套接字中讀取數(shù)據(jù)這類操作。

  2. 在生產(chǎn)者線程執(zhí)行 Do_some_IO 完成數(shù)據(jù)讀取之前,消費(fèi)者線程要阻塞等待。

  3. 在消費(fèi)者線程執(zhí)行 Do_some_process 完成數(shù)據(jù)處理完成之前,生產(chǎn)者線程要阻塞等待。

  4. 在消費(fèi)者線程執(zhí)行 Do_some_process 完成數(shù)據(jù)處理完成之后,要通知生成者線程繼續(xù) Do_some_IO
    30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?                                          線程執(zhí)行時(shí)間線

可以看到,多線程模型為了保證各個(gè)線程并行工作,需要額外做很多線程間的同步和通知工作,而且線程頻繁的在阻塞和喚醒間切換,我們知道 Linux 下線程是輕量級(jí)線程 LWP ,每次線程切換涉及用戶態(tài)和內(nèi)核態(tài)的切換,還是很消耗性能的。

同樣的場(chǎng)景在協(xié)程模型里是怎么處理的呢?還是用前面的例子,說明協(xié)程模型的執(zhí)行流程。

Do_some_IO()       // IO處理協(xié)程
Do_some_process()  // 計(jì)算處理協(xié)程
  1. 分配生產(chǎn)者協(xié)程執(zhí)行 Do_some_IO 做 IO 處理操作,分配消費(fèi)者協(xié)程執(zhí)行 Do_some_process 計(jì)算處理操作。
  2. 在生產(chǎn)者協(xié)程工作期間,消費(fèi)者協(xié)程保持等待。
  3. 當(dāng)生產(chǎn)者協(xié)程完成 IO 處理,返回處理結(jié)果給消費(fèi)者,并把程序執(zhí)行權(quán)限交給消費(fèi)者協(xié)程向下執(zhí)行。
30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
協(xié)程執(zhí)行時(shí)間線

協(xié)程優(yōu)勢(shì)

  • 由于協(xié)程在線程內(nèi)實(shí)現(xiàn),因此始終都是一個(gè)線程操作共享資源,所以不存在多線程搶占資源和資源同步問題。

  • 生產(chǎn)者協(xié)程和消費(fèi)者協(xié)程,互相配合協(xié)作完成工作,而不是相互搶占,而且協(xié)程創(chuàng)建和切換的開銷比線程小得多。

硬件提升性能

前面講的多線程、多進(jìn)程、協(xié)程都還只是軟件層面的提高服務(wù)處理能力。真正硬核的是從硬件層面提高處理能力,增加 CPU 物理核心數(shù)目,當(dāng)然硬件都是有成本的,所以只有軟件層面已經(jīng)充分榨干性能才會(huì)考慮增加硬件。

不過,老板有錢買最好最貴的服務(wù)器另說,這是人民幣玩家和窮逼玩家的區(qū)別了,軟件工程師留下了貧困的淚水。30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

增加機(jī)器核心數(shù)

CPU領(lǐng)域有一條摩爾定律:大概 18 個(gè)月會(huì)將芯片的性能提高一倍。現(xiàn)在這個(gè)定律變的越來(lái)越難以突破,CPU 晶體管密度工作頻率很難再提高,轉(zhuǎn)而通過增加 CPU 核心數(shù)目的方式提高處理器性能。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
CPU  | 圖片來(lái) 源: www.hippo px.co L ice ns CC0

目前商用服務(wù)器架構(gòu)基本都是多核處理器,多核的處理器能夠真正做到程序并行運(yùn)行,處理效率大幅度提升,那該如何查看 CPU 核心數(shù)目呢?

對(duì)于 Windows 操作系統(tǒng),打開任務(wù)管理器,通過界面的「內(nèi)核」和「邏輯處理器」能看到。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
windows 查看核心

查看 cpu 核心數(shù)

對(duì)于 Linux 操作系統(tǒng),通過下面 2 種方式查看 CPU 核心相關(guān)信息。

1. 通過cpuinfo文件查看

使用cat /proc/cpuinfo查看 cpu 核心信息,如下兩個(gè)信息:

  • processor,指明第幾個(gè)cpu處理器
  • cpu cores,指明每個(gè)處理器的核心數(shù)

cpuinfo 輸出示例:

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
cpuinfo

2. 通過編程接口查看

除了上面以文件的形式查看 cpu 核心信息之外,系統(tǒng)還提供了編程接口可以查詢,系統(tǒng) API 如下。

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
查看核數(shù)API

CPU親和性

CPU 親和性是綁定某一進(jìn)程或線程到特定的 CPU 或 CPU 集合,從而使得該進(jìn)程或線程只能被調(diào)度運(yùn)行在綁定的 CPU或 CPU 集合上。

為什么要設(shè)置 CPU 親和性綁定 CPU 呢?理論上進(jìn)程上一次運(yùn)行后的上下文信息會(huì)保留在 CPU 的緩存中,如果下一次仍然將該進(jìn)程調(diào)度到同一個(gè) CPU 上,就能避免緩存未命中對(duì) CPU 處理性能的影響,從而使得進(jìn)程的運(yùn)行更加高效。

假如某些進(jìn)程或線程是 CPU 密集型的,不希望被頻繁調(diào)度,又或者你有其他特殊需求,不希望進(jìn)程或線程被調(diào)度在不同 CPU 之間頻繁切換,則可以將該進(jìn)程或線程綁定到特定的 CPU 上 ,可以在特定場(chǎng)景下優(yōu)化程序性能。

綁定進(jìn)程

在多進(jìn)程模型中,綁定進(jìn)程到特定的核心,下面是綁定進(jìn)程的系統(tǒng) API30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

綁定線程

在多線程模型中,綁定線程到特定的核心,下面是綁定線程的系統(tǒng) API

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?
設(shè)置線程親和性

總總結(jié)結(jié)

本文從程序任務(wù)類型出發(fā),區(qū)分任務(wù)為 CPU 密集型和 IO 密集型兩大類。接著分別說明提高基于這兩類任務(wù)的服務(wù)性能方法,分為軟件層面的方法和硬件層面的方法。

其中軟件層面主要講述利用多進(jìn)程、多線程以及協(xié)程模型,當(dāng)然現(xiàn)有的技術(shù)還有 IO 多路復(fù)用、異步 IO 、池化技術(shù)等方案,講到多線程和多進(jìn)程,順勢(shì)說明了進(jìn)程間通信和線程間同步互斥技術(shù)。

第二部分,講解了從硬件層面提高服務(wù)性能:提高機(jī)器核心數(shù),并教你如何查看 CPU 核心數(shù)的方法。最后,還可以通過軟硬結(jié)合的方式,把硬件核心綁定到指定進(jìn)程或者線程執(zhí)行,最大程度的利用 CPU 性能。

希望通過本文的學(xué)習(xí),讀者對(duì)高性能服務(wù)模型有個(gè)初步的了解,并能對(duì)服務(wù)優(yōu)化的方法和利弊舉例一二,就是本文的價(jià)值所在。


特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

長(zhǎng)按訂閱更多精彩▼

30 張圖解 | 高頻面試知識(shí)點(diǎn)總結(jié):面試官問我高并發(fā)服務(wù)模型哪家強(qiáng)?

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉