最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

GPM調(diào)度模型

2022-10-18 23:59 作者:xin猿意碼  | 我要投稿

目錄

1.什么是進(jìn)程調(diào)度

2.并發(fā)與并行

3.進(jìn)程、線程與協(xié)程

4.Golang的調(diào)度機(jī)制——GPM模型

5.總結(jié)


1. 什么是進(jìn)程調(diào)度

想象一下,你正在玩游戲,團(tuán)戰(zhàn)激烈地進(jìn)行著。這時(shí),橫屏的手機(jī)頂部出現(xiàn)了一個(gè)電話呼叫標(biāo)志,聯(lián)系人的名字赫然顯示著三個(gè)字:“親愛的”。

接還是不接,我們暫時(shí)先略過。此時(shí)我們可以回顧一下,以往的智能機(jī),手機(jī)在玩游戲時(shí),如果中途來了電話,一般是直接斷網(wǎng):這時(shí)因?yàn)椋螂娫挼臅r(shí)候手機(jī)語音是通過 2G 信號(hào)傳輸?shù)?,所以通話過程中,系統(tǒng)會(huì)自動(dòng)從 4G 信號(hào)切換到 2G。

而最最原始的老年游戲機(jī),就更直接了,是不支持同時(shí)進(jìn)行通話和游戲(即便是單機(jī)版)的。那是因?yàn)?,以前不支持并發(fā)任務(wù)的單核處理器系統(tǒng),同一時(shí)刻只能有一個(gè)進(jìn)程工作。

但是隨著時(shí)代的發(fā)展,我們現(xiàn)在的手機(jī)、電腦,雖然在輸出硬件上(例如打印機(jī)等設(shè)備)只能支持一個(gè)工作進(jìn)行,但其它的電子設(shè)備基本上都是多核的了。也就是說,同一時(shí)刻,可以有多個(gè)進(jìn)程同時(shí)擁有處理器資源。

既然涉及到多個(gè)進(jìn)程,那么進(jìn)程之間的互相調(diào)度,就變得至關(guān)重要。早期,計(jì)算機(jī)的調(diào)度算法十分簡單,多個(gè)程序只需要按照順序方式運(yùn)行即可。但隨著處理器的速度越來越快,輸入和輸出設(shè)備的速度已經(jīng)限制了程序的運(yùn)行,所以,多個(gè)程序之間的調(diào)度算法,成了提升設(shè)備性能的關(guān)鍵。

而進(jìn)程調(diào)度,就是從進(jìn)程的就緒狀態(tài)中按照一定的算法,選擇一個(gè)進(jìn)程并分配 CPU 到運(yùn)行態(tài)的過程。


2. 并發(fā)與并行

當(dāng)處理器從單核變成了多核,我們的設(shè)備就可以從各個(gè)進(jìn)程(多個(gè)應(yīng)用)之間無縫切換。

當(dāng)一個(gè)進(jìn)程運(yùn)行時(shí),其它的進(jìn)程就變了阻塞態(tài);當(dāng)運(yùn)行狀態(tài)的進(jìn)程發(fā)生了阻塞事件(比如系統(tǒng)中斷等異常情況或人為的主動(dòng)干預(yù)),該進(jìn)程就由運(yùn)行狀態(tài)變成了阻塞態(tài);當(dāng)進(jìn)程分配的時(shí)間片用完后,進(jìn)程就由運(yùn)行態(tài)轉(zhuǎn)為就緒態(tài),此時(shí),其它就緒的進(jìn)程就可以通過進(jìn)程調(diào)度,從就緒態(tài)轉(zhuǎn)變?yōu)檫\(yùn)行態(tài):


并發(fā),就是在很短的時(shí)間內(nèi),完成了多個(gè)任務(wù)。這種通過一個(gè)內(nèi)核,在多個(gè)進(jìn)程任務(wù)之間快速的切換,讓我們可以把它看做是多個(gè)進(jìn)程任務(wù)一起完成的過程,相當(dāng)于我們的錄像,當(dāng)視頻幀數(shù)夠高時(shí)(即一秒內(nèi)切換多張圖片),我們的肉眼就會(huì)把它當(dāng)成是一個(gè)連續(xù)而流暢的視頻。

并行,是指在同一時(shí)刻,兩個(gè)或兩個(gè)以上的進(jìn)程任務(wù)同時(shí)執(zhí)行。簡單來說就是有多個(gè)內(nèi)核的支持,大家不用摳摳搜搜地用同一個(gè)內(nèi)核去處理任務(wù)了。單核轉(zhuǎn)多核的設(shè)備,進(jìn)程就可以并行運(yùn)行。

這樣,我們?cè)谕嬗螒驎r(shí),就可以一邊接電話,一邊激烈團(tuán)戰(zhàn)而互不影響了。所以,大家可以猜一下我們的大腦,是并發(fā)還是并行運(yùn)行的呢?


3.進(jìn)程、線程與協(xié)程

1)進(jìn)程

當(dāng)并發(fā)工作中的某一個(gè)任務(wù)完成后,會(huì)從一段程序切換到另一段程序上執(zhí)行,而上一段程序運(yùn)行的一系列狀態(tài),如果不保存,就會(huì)丟失(所以,在一些單核處理器的手機(jī)上,當(dāng)接了個(gè)電話回來后,游戲進(jìn)度就被清空了),因此引入了進(jìn)程來進(jìn)行資源隔離。

進(jìn)程是用來劃分程序運(yùn)行時(shí)所需的基本的資源單位,它擁有獨(dú)立的地址空間,獨(dú)立的堆棧,當(dāng)進(jìn)程切換時(shí),就可以保證各自的數(shù)據(jù)存儲(chǔ)不受影響(電話結(jié)束后,就可以及時(shí)恢復(fù)游戲進(jìn)度)。

由于進(jìn)程涉及到大量資源的消耗,所以由計(jì)算機(jī)操作系統(tǒng)嚴(yán)格管控(可以理解為:每個(gè)省市的土地資源審批,都是十分謹(jǐn)慎的,特別是一線城市,所以由 ZF 統(tǒng)一管控),因此,進(jìn)程的切換都發(fā)生在內(nèi)核態(tài),由計(jì)算機(jī)核心程序來統(tǒng)一調(diào)度。

小知識(shí):操作系統(tǒng)分為內(nèi)核態(tài)與用戶態(tài),處于內(nèi)核態(tài)的核心處理器(又叫核心處理單元,Central Processing Unit,簡稱CPU,下同)可以訪問任意的數(shù)據(jù),也包括網(wǎng)卡、硬盤等外圍設(shè)備,并且在占用的 CPU 不會(huì)發(fā)生搶占的情況;而處于用戶態(tài)的 CPU 只能受限地訪問內(nèi)存,不允許訪問外圍設(shè)備,用戶態(tài)下的 CPU 可能會(huì)被其它程序搶占。


2)線程

當(dāng)進(jìn)程切換時(shí),由于要切換內(nèi)核狀態(tài),因此資源消耗比較大,對(duì)此又引入了線程的概念。

線程本身幾乎不占用任何資源,它們共享進(jìn)程里的資源,所以調(diào)度時(shí)耗費(fèi)比較小。線程和本進(jìn)程的其它線程共享地址空間,共享堆,但是它擁有獨(dú)立 CPU 上下文(包括 CPU 寄存器、程序計(jì)數(shù)器等)。

相當(dāng)于線程與同一個(gè)進(jìn)程里面的線程共享同一片土地資源,但是線程有各自的辦公樓,線程之間切換時(shí)也是由操作系統(tǒng)統(tǒng)一調(diào)度;

小知識(shí):線程分為內(nèi)核態(tài)線程與用戶態(tài)線程,用戶態(tài)線程必須要綁定到內(nèi)核態(tài)線程中,才可運(yùn)行。


3)協(xié)程

協(xié)程和線程類似,擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時(shí),會(huì)將寄存器上下文和棧保存起來,切換回來時(shí),會(huì)恢復(fù)原先的運(yùn)行信息。和線程一樣,協(xié)程共享堆,不共享?xiàng)!?/p>

協(xié)程的切換一般由程序員在代碼中主動(dòng)控制,這是它與線程的明顯區(qū)別。而在 Go 語言中,goroutine 原生支持了協(xié)程調(diào)度的實(shí)現(xiàn),使得我們?cè)陂_發(fā)時(shí)可以不用花費(fèi)太多精力去進(jìn)行管理。

這讓我們可以輕松地對(duì)協(xié)程進(jìn)行控制,只需要一個(gè)簡單的關(guān)鍵字 "go" 即可進(jìn)行調(diào)度。它的生命周期由 goruntime 管理,當(dāng)某個(gè) goroutine 阻塞時(shí),自動(dòng)讓出 CPU 給其他 goroutine。


4. 協(xié)程的調(diào)度機(jī)制--GPM模型

通過上面的說明,我們可以發(fā)現(xiàn)。協(xié)程是最輕量級(jí)的資源隔離,在 Golang 語言里,我們可以用 goroutine 高效地實(shí)現(xiàn)協(xié)程調(diào)度,那它是怎么實(shí)現(xiàn)的呢?

首先 Golang 讓一組可復(fù)用的函數(shù),運(yùn)行在線程之上。這時(shí),即便有協(xié)程因?yàn)闀r(shí)間片用完而變成了非運(yùn)行態(tài),其余協(xié)程也會(huì)被調(diào)度到其它空閑的線程上運(yùn)行。然后通過對(duì)運(yùn)行時(shí)長(runtime)的控制,自動(dòng)去調(diào)度協(xié)程以高效地實(shí)現(xiàn)資源共享。

以此可知,協(xié)程的特點(diǎn)是:占用內(nèi)存?。◣譑B),調(diào)度很快。而 Golang 通過 GPM 模型將協(xié)程的特點(diǎn)發(fā)揮到了極致,接著我們來看它是怎么工作的。


GPM 模型包括:

  • G,Goroutine,即并發(fā)的最小執(zhí)行單位;

  • P,執(zhí)行的上下文,最大數(shù)由 GOMAXPROCS 限制,默認(rèn)情況下 GOMAXPROCS 被設(shè)置為內(nèi)核數(shù);

  • M,內(nèi)核線程,必須和 P 綁定才能執(zhí)行 G,最多會(huì)有 GOMAXPROCS 個(gè)活躍線程能夠正常運(yùn)行。

Golang 的 GMP 調(diào)度模型如圖所示:


調(diào)度過程:

  • 調(diào)度器需要保證所有的 P 都有 G 在執(zhí)行,以保證并行度。

  • 當(dāng)使用 "go" 關(guān)鍵字時(shí),新的 G 便被加入到運(yùn)行隊(duì)列的尾部(若 P 的本地隊(duì)列已滿,則把新創(chuàng)建的 G 和隊(duì)列中一半的 G 放到全局隊(duì)列中,等待調(diào)度)。

  • 一旦某個(gè) G 達(dá)到一個(gè)調(diào)度點(diǎn),Goruntine 調(diào)度器便從運(yùn)行隊(duì)列中取出一個(gè) G,設(shè)置好棧和指針以便后續(xù)恢復(fù),然后運(yùn)行新的 G。


5.總結(jié)

學(xué)習(xí)了計(jì)算機(jī)的調(diào)度進(jìn)制后,我們發(fā)現(xiàn):當(dāng)機(jī)器的硬件(比如:輸入輸出設(shè)備)成為性能瓶頸時(shí),我們?cè)谠O(shè)計(jì)過程中,就會(huì)用并發(fā)或者并行調(diào)度來提高資源的使用率,進(jìn)而提升整體性能。

在后端架構(gòu)的部署設(shè)計(jì)上,為了讓服務(wù)器的承載能力進(jìn)一步提升,以有效地承載越來越大的訪問壓力,我們也沿用了類似的調(diào)度機(jī)制:

首先,我們來看一下沒有調(diào)度器時(shí),以往使用的集群架構(gòu)模式:


工作時(shí):當(dāng)用戶將域名解析請(qǐng)求通過網(wǎng)關(guān)的層層訪問,到達(dá)我們這里的 DNS 服務(wù)器時(shí),DNS 服務(wù)器會(huì)把用戶請(qǐng)求的域名解析到 3 臺(tái)服務(wù)器中某一臺(tái)服務(wù)器的 IP 地址上。

它的缺點(diǎn)很明顯:當(dāng) DNS 服務(wù)器解析完成并返回 IP 地址后,用戶的本地 DNS 服務(wù)器會(huì)將請(qǐng)求域名和 IP 地址做一個(gè)映射關(guān)系并保存下來。當(dāng)用戶再次訪問該域名時(shí),通過本地 DNS 服務(wù)器保存的映射關(guān)系,最后的訪問請(qǐng)求都會(huì)到達(dá)先前服務(wù)器的 IP 地址上。這會(huì)導(dǎo)致該域名服務(wù)器組下所有用戶都會(huì)訪問同一臺(tái)服務(wù)器,導(dǎo)致不同服務(wù)器間的負(fù)載不均衡。

由于緩沖的存在,以及請(qǐng)求的不確定性,即使設(shè)置了 TTL (Time To Live,即緩存的生存時(shí)間)值,負(fù)載仍然會(huì)不均衡,高可用性也很差。如果某臺(tái)實(shí)際工作的服務(wù)器宕機(jī)或者服務(wù)器程序掛掉,所有的訪問 IP 映射到這臺(tái)機(jī)器的用戶都會(huì)在一段時(shí)間內(nèi)無法訪問服務(wù)器。

我們發(fā)現(xiàn),如果沒有備用服務(wù)器,任何的服務(wù)器出現(xiàn)宕機(jī)都會(huì)立刻讓用戶感知到,而這樣的架構(gòu)顯然是沒法滿足日常用戶需求的。在沒有調(diào)度器時(shí),則只能給每臺(tái)實(shí)際服務(wù)器單獨(dú)加一個(gè)備份服務(wù)器以保證可以隨時(shí)提供服務(wù),但是成本會(huì)很高,也沒有必要。

現(xiàn)在來看看加上調(diào)度器的情況,如下所示:


在這種情況下,域名對(duì)應(yīng)的 IP 都會(huì)解析到調(diào)度器,調(diào)度器根據(jù)轉(zhuǎn)發(fā)策略和服務(wù)器狀態(tài),選擇將請(qǐng)求轉(zhuǎn)發(fā)到某臺(tái)服務(wù)器上。

調(diào)度器通過定時(shí)探測,來判斷服務(wù)器是否正常運(yùn)行,一旦某一臺(tái)服務(wù)器出現(xiàn)宕機(jī),調(diào)度器會(huì)很快探測到。接下來有新的請(qǐng)求訪問該服務(wù)器時(shí),調(diào)度器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到其他機(jī)器進(jìn)行處理,保證用戶的請(qǐng)求不受影響。只有在實(shí)際服務(wù)器全部宕機(jī)的情況下,才會(huì)無法響應(yīng)用戶的請(qǐng)求,相當(dāng)于是多臺(tái)實(shí)際服務(wù)器互備,實(shí)現(xiàn)了服務(wù)器之間的高可用性。

后續(xù)優(yōu)化時(shí),調(diào)度器也可以根據(jù)轉(zhuǎn)發(fā)到每臺(tái)工作服務(wù)器的請(qǐng)求數(shù)量,以及服務(wù)器的響應(yīng)能力來進(jìn)行負(fù)載均衡,以避免某些機(jī)器獲取了過多的請(qǐng)求,導(dǎo)致資源分配不平衡產(chǎn)生問題。

存在調(diào)度器的架構(gòu)上,用戶是否能訪問服務(wù)器依賴于調(diào)度器是否能正常工作。所以通常都會(huì)給主調(diào)度器再準(zhǔn)備一臺(tái)備份服務(wù)器,以便在主調(diào)度器不能服務(wù)器時(shí)來接管,保證了主調(diào)度器的高可用性。

我們可以看到,用調(diào)度器的方式將負(fù)載均分到不同的服務(wù)器上,充分提高了單臺(tái)服務(wù)器的利用率,不過也造成了硬件和軟件的冗余。但是,這種冗余帶來的好處也是巨大的,對(duì)保證服務(wù)質(zhì)量非常有必要。

所以,這也是為什么在數(shù)以億萬計(jì)的訪問量到達(dá)服務(wù)器時(shí),它們?nèi)匀豢梢钥棺毫Α_@里面,調(diào)度機(jī)制帶來的高可用設(shè)計(jì)功不可沒。



GPM調(diào)度模型的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
满城县| 洞头县| 台山市| 郯城县| 赣榆县| 藁城市| 鹤庆县| 枣庄市| 塔河县| 永宁县| 青浦区| 曲靖市| 峨边| 高陵县| 祁阳县| 吉安县| 容城县| 陕西省| 杭锦后旗| 逊克县| 雅江县| 榆中县| 龙山县| 和田县| 孟连| 武穴市| 荆门市| 宜都市| 富源县| 景谷| 阜阳市| 新邵县| 咸阳市| 共和县| 巨鹿县| 会同县| 贵州省| 焉耆| 进贤县| 四平市| 家居|