成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

終于明白:有了線(xiàn)程,為什么還要有協(xié)程?

不知名網(wǎng)友 / 3722人閱讀

摘要:每個(gè)進(jìn)程的第一個(gè)線(xiàn)程都會(huì)隨著該進(jìn)程的啟動(dòng)而被創(chuàng)建,它們可以被稱(chēng)為其所屬進(jìn)程的主線(xiàn)程。因此,線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。與進(jìn)程調(diào)度類(lèi)似,在線(xiàn)程之間快速切換,制造了線(xiàn)程并行運(yùn)行的假象。也就是說(shuō),線(xiàn)程之間是沒(méi)有保護(hù)的。其中的指代的就是系統(tǒng)級(jí)線(xiàn)程。

并發(fā)的發(fā)展歷史

其實(shí),在早期計(jì)算機(jī)并沒(méi)有包含操作系統(tǒng),這個(gè)時(shí)候,這個(gè)計(jì)算機(jī)只跑一個(gè)程序,這個(gè)程序獨(dú)享計(jì)算機(jī)的所有資源,這個(gè)時(shí)候不存在什么并發(fā)問(wèn)題,但是對(duì)計(jì)算機(jī)的資源來(lái)說(shuō),確實(shí)是一種浪費(fèi)。早期編程都是基于單進(jìn)程來(lái)進(jìn)行,隨著計(jì)算機(jī)技術(shù)的發(fā)展,于是,操作系統(tǒng)出現(xiàn)了,操作系統(tǒng)改變了這種現(xiàn)狀,讓計(jì)算機(jī)可以運(yùn)行多個(gè)程序,并且不同的程序占用獨(dú)立的計(jì)算機(jī)資源,如內(nèi)存,CPU等。

操作系統(tǒng)出現(xiàn)后:

  • 資源利用率:可以在其他程序執(zhí)行過(guò)程出現(xiàn)等待的時(shí)候,去執(zhí)行其他程序,從而提高程序的利用率
  • 公平性:所有的程序可以共享計(jì)算機(jī)資源,一種有效的方式是通過(guò)時(shí)間片的方式來(lái)讓程序共享計(jì)算機(jī)資源
  • 任務(wù)通信:在編寫(xiě)多任務(wù)程序時(shí),可以一個(gè)程序執(zhí)行一個(gè)任務(wù),必要時(shí),程序之間進(jìn)行通信即可

當(dāng)計(jì)算機(jī)從單程序變成多程序之后,這個(gè)時(shí)候又發(fā)展出了多線(xiàn)程,線(xiàn)程是進(jìn)程里面的每個(gè)執(zhí)行控制流,或叫執(zhí)行路線(xiàn)。如果沒(méi)有明確的協(xié)同機(jī)制,那么每個(gè)線(xiàn)程將獨(dú)立運(yùn)行,共享著進(jìn)程的內(nèi)存及CPU資源,多進(jìn)程多線(xiàn)程之間雖然讓多任務(wù)并行處理的能力大大提升,但是本質(zhì)上還是分時(shí)系統(tǒng),并不是時(shí)間上真正的并行,解決這個(gè)問(wèn)題的方式顯而易見(jiàn),就是讓多個(gè)CPU能夠同時(shí)計(jì)算任務(wù),從而實(shí)現(xiàn)真正意義上的多任務(wù)并行。

并發(fā)的優(yōu)勢(shì)

并發(fā)可以滿(mǎn)足多任務(wù)任務(wù)需求,比如一邊寫(xiě)代碼一邊聽(tīng)音樂(lè),即使編寫(xiě)多線(xiàn)程程序具有挑戰(zhàn)性,但它仍在使用中,是因?yàn)樗梢詭?lái)如下的好處:

  • 更好的資源利用
  • 在某些場(chǎng)景下程序的設(shè)計(jì)會(huì)更簡(jiǎn)單
  • 提升程序的響應(yīng)性
  • 多進(jìn)程/多任務(wù):?jiǎn)蝹€(gè)CPU下的并發(fā),如在使用QQ的同時(shí)打開(kāi)愛(ài)奇藝看劇
  • 多線(xiàn)程/子任務(wù):?jiǎn)蝹€(gè)應(yīng)用下的并發(fā),如博客網(wǎng)站可以處理不同用戶(hù)的訪(fǎng)問(wèn)請(qǐng)求

進(jìn)程的調(diào)度

單核的 CPU 一次只能執(zhí)行一個(gè)任務(wù),想要實(shí)現(xiàn)多任務(wù),需要把 CPU 的運(yùn)行時(shí)間切成一段一段的時(shí)間片,每個(gè)時(shí)間片運(yùn)行一個(gè)程序,循環(huán)的分配時(shí)間片給不同的應(yīng)用程序,由于時(shí)間片非常的短,在用戶(hù)看來(lái),就像是多個(gè)任務(wù)同時(shí)在運(yùn)行。

進(jìn)程的調(diào)度

在計(jì)算機(jī)的世界里,內(nèi)核把CPU的執(zhí)行時(shí)間切分成許多時(shí)間片,比如1秒鐘可以切分為100個(gè)10毫秒的時(shí)間片,每個(gè)時(shí)間片再分發(fā)給不同的進(jìn)程,通常,每個(gè)進(jìn)程需要多個(gè)時(shí)間片才能完成一個(gè)請(qǐng)求。這樣,雖然微觀上,比如說(shuō)就這10毫秒時(shí)間CPU只能執(zhí)行一個(gè)進(jìn)程,但宏觀上1秒鐘執(zhí)行了100個(gè)時(shí)間片,于是每個(gè)時(shí)間片所屬進(jìn)程中的請(qǐng)求也得到了執(zhí)行,這就實(shí)現(xiàn)了請(qǐng)求的并發(fā)執(zhí)行。

流水線(xiàn)

CPU就好像一個(gè)流水線(xiàn)上的工人,不斷的處理流水線(xiàn)上的各種信息包裹,打開(kāi)包裹讀取指令并執(zhí)行,遇到執(zhí)行慢的IO調(diào)用(或執(zhí)行時(shí)間片結(jié)束)則會(huì)暫時(shí)把它放到等候區(qū),繼續(xù)處理流水線(xiàn)上下一個(gè)等待處理的包裹。等候區(qū)有很多這樣的包裹,等待著系統(tǒng)的IO執(zhí)行完成,當(dāng)IO調(diào)用結(jié)束后,又開(kāi)始進(jìn)入到等待處理隊(duì)列。

進(jìn)程的缺點(diǎn):在操作系統(tǒng)中,每個(gè)進(jìn)程的內(nèi)存空間都是獨(dú)立的,這樣用多進(jìn)程實(shí)現(xiàn)并發(fā)就有兩個(gè)缺點(diǎn):一是內(nèi)核的管理成本高,二是無(wú)法簡(jiǎn)單地通過(guò)內(nèi)存同步數(shù)據(jù),很不方便于是多線(xiàn)程模式就出現(xiàn)了。

線(xiàn)程的調(diào)度

線(xiàn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線(xiàn)程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線(xiàn)程,每條線(xiàn)程并行執(zhí)行不同的任務(wù)。線(xiàn)程總是在進(jìn)程之內(nèi)的。一個(gè)進(jìn)程至少會(huì)包含一個(gè)線(xiàn)程。

如果一個(gè)進(jìn)程只包含了一個(gè)線(xiàn)程,那么它里面的所有代碼都只會(huì)被串行地執(zhí)行。每個(gè)進(jìn)程的第一個(gè)線(xiàn)程都會(huì)隨著該進(jìn)程的啟動(dòng)而被創(chuàng)建,它們可以被稱(chēng)為其所屬進(jìn)程的主線(xiàn)程。相對(duì)應(yīng)的,如果一個(gè)進(jìn)程中包含了多個(gè)線(xiàn)程,那么其中的代碼就可以被并發(fā)地執(zhí)行。除了進(jìn)程的第一個(gè)線(xiàn)程之外,其他的線(xiàn)程都是由進(jìn)程中已存在的線(xiàn)程創(chuàng)建出來(lái)的。所以,線(xiàn)程可以通過(guò)共享內(nèi)存地址空間,解決內(nèi)核的管理成本、內(nèi)存同步數(shù)據(jù)的問(wèn)題。

線(xiàn)程

由于線(xiàn)程運(yùn)行的本質(zhì)就是函數(shù)運(yùn)行,函數(shù)運(yùn)行時(shí)信息是保存在棧幀中的,因此 每個(gè)線(xiàn)程都有自己獨(dú)立的、私有的棧區(qū)。

代碼區(qū)

進(jìn)程地址空間中的代碼區(qū),這里保存的是什么呢?從名字中有的同學(xué)可能已經(jīng)猜到了,沒(méi)錯(cuò),這里保存的就是我們寫(xiě)的代碼,更準(zhǔn)確的是 編譯后的可執(zhí)行機(jī)器指令。

heap

heap很顯然,只要知道變量的地址,也就是指針,任何一個(gè)線(xiàn)程都可以訪(fǎng)問(wèn)指針指向的數(shù)據(jù),因此堆區(qū)也是線(xiàn)程共享的屬于進(jìn)程的資源。

stack

通常來(lái)說(shuō)棧區(qū)是線(xiàn)程私有,既然有通常就有不通常的時(shí)候,不通常是因?yàn)椴幌襁M(jìn)程地址空間之間的嚴(yán)格隔離,線(xiàn)程的棧區(qū)沒(méi)有嚴(yán)格的隔離機(jī)制來(lái)保護(hù),因此 如果一個(gè)線(xiàn)程能拿到來(lái)自另一個(gè)線(xiàn)程棧幀上的指針,那么該線(xiàn)程就可以改變另一個(gè)線(xiàn)程的棧區(qū),也就是說(shuō)這些線(xiàn)程可以任意修改本屬于另一個(gè)線(xiàn)程棧區(qū)中的變量。

線(xiàn)程的調(diào)度與缺點(diǎn):

在同一個(gè)進(jìn)程中并行運(yùn)行多個(gè)線(xiàn)程,是對(duì)在同一臺(tái)計(jì)算機(jī)上并行運(yùn)行多個(gè)進(jìn)程的模擬。因此,線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。與進(jìn)程調(diào)度類(lèi)似,CPU在線(xiàn)程之間快速切換,制造了線(xiàn)程并行運(yùn)行的假象。由于各個(gè)線(xiàn)程都可以訪(fǎng)問(wèn)進(jìn)程地址空間的每一個(gè)內(nèi)存地址,所以一個(gè)線(xiàn)程可以讀、寫(xiě),甚至清除另一個(gè)線(xiàn)程的堆棧。也就是說(shuō),線(xiàn)程之間是沒(méi)有保護(hù)的。但要注意的是,每個(gè)線(xiàn)程都有自己的堆棧、程序計(jì)數(shù)器、寄存器等信息,這些不是共享的。

上下文切換

線(xiàn)程的切換是由內(nèi)核控制的,什么時(shí)候會(huì)切換線(xiàn)程呢?不只時(shí)間片用盡,當(dāng)調(diào)用阻塞方法時(shí),內(nèi)核為了CPU 充分工作,也會(huì)切換到其他線(xiàn)程執(zhí)行。一次上下文切換的成本在幾十納秒到幾微秒間,當(dāng)線(xiàn)程繁忙且數(shù)量眾多時(shí),這些切換會(huì)消耗絕大部分的CPU運(yùn)算能力。

協(xié)程的調(diào)度

協(xié)程就是用戶(hù)態(tài)的線(xiàn)程。通常創(chuàng)建協(xié)程時(shí),會(huì)從進(jìn)程的堆中分配一段內(nèi)存作為協(xié)程的棧。線(xiàn)程的棧有8MB,而協(xié)程棧的大小通常只有幾十 KB。而且,C庫(kù)內(nèi)存池也不會(huì)為協(xié)程預(yù)分配內(nèi)存,它感知不到協(xié)程的存在。這樣,更低的內(nèi)存占用空間為高并發(fā)提供了保證,畢竟十萬(wàn)并發(fā)請(qǐng)求,就意味著10萬(wàn)個(gè)協(xié)程。

兩級(jí)線(xiàn)程模型中用戶(hù)線(xiàn)程與內(nèi)核線(xiàn)程是一對(duì)一關(guān)系

每個(gè)協(xié)程有獨(dú)立的棧,而棧既保留了變量的值,也保留了函數(shù)的調(diào)用關(guān)系、參數(shù)和返回值,CPU中的棧寄存器SP指向了當(dāng)前協(xié)程的棧,而指令寄存器IP保存著下一條要執(zhí)行的指令地址。因此,從協(xié)程1切換到協(xié)程2時(shí),首先要把SP、IP寄存器的值為線(xiàn)程1保存下來(lái),再?gòu)膬?nèi)存中找出協(xié)程2上一次切換前保存好的寄存器值,寫(xiě)入CPU的寄存器,這樣就完成了協(xié)程切換。

在GO語(yǔ)言中,語(yǔ)言的運(yùn)行時(shí)系統(tǒng)會(huì)幫助我們自動(dòng)地創(chuàng)建和銷(xiāo)毀系統(tǒng)級(jí)的線(xiàn)程。這里的系統(tǒng)級(jí)線(xiàn)程指的就是我們剛剛說(shuō)過(guò)的操作系統(tǒng)提供的線(xiàn)程。而對(duì)應(yīng)的用戶(hù)級(jí)協(xié)程指的是架設(shè)在系統(tǒng)級(jí)線(xiàn)程之上的,由我們編寫(xiě)的程序完全控制的代碼執(zhí)行流程。用戶(hù)級(jí)協(xié)程的創(chuàng)建、銷(xiāo)毀、調(diào)度、狀態(tài)變更以及其中的代碼和數(shù)據(jù)都完全需要我們的程序自己去實(shí)現(xiàn)和處理。這帶來(lái)了很多優(yōu)勢(shì),比如,因?yàn)樗鼈兊膭?chuàng)建和銷(xiāo)毀并不用通過(guò)操作系統(tǒng)去做,所以速度會(huì)很快,又比如,由于不用等著操作系統(tǒng)去調(diào)度它們的運(yùn)行,所以往往會(huì)很容易控制并且可以很靈活。

  • G - Goroutine,Go協(xié)程,是參與調(diào)度與執(zhí)行的最小單位
  • M - Machine,指的是系統(tǒng)級(jí)線(xiàn)程
  • P - Processor,指的是邏輯處理器,P關(guān)聯(lián)了的本地可運(yùn)行G的隊(duì)列(也稱(chēng)為L(zhǎng)RQ),最多可存放256個(gè)G。

其中的M指代的就是系統(tǒng)級(jí)線(xiàn)程。而P指的是一種可以承載若干個(gè)G,且能夠使這些G適時(shí)地與M進(jìn)行對(duì)接,并得到真正運(yùn)行的中介。

當(dāng)一個(gè)正在與某個(gè)M對(duì)接并運(yùn)行著的G,需要因某個(gè)事件(比如等待 I/O或鎖的解除)而暫停運(yùn)行的時(shí)候,調(diào)度器總會(huì)及時(shí)地發(fā)現(xiàn),并把這個(gè)G與那個(gè)M分離開(kāi),以釋放計(jì)算資源供那些等待運(yùn)行的G使用。而當(dāng)一個(gè)G需要恢復(fù)運(yùn)行的時(shí)候,調(diào)度器又會(huì)盡快地為它尋找空閑的計(jì)算資源(包括M)并安排運(yùn)行。另外,當(dāng)M不夠用時(shí),調(diào)度器會(huì)幫我們向操作系統(tǒng)申請(qǐng)新的系統(tǒng)級(jí)線(xiàn)程,而當(dāng)某個(gè)M已無(wú)用時(shí),調(diào)度器又會(huì)負(fù)責(zé)把它及時(shí)地銷(xiāo)毀掉。所以Go程序總是能高效地利用操作系統(tǒng)和計(jì)算機(jī)資源。程序中的所有g(shù)oroutine也都會(huì)被充分地調(diào)度,其中的代碼也都會(huì)被并發(fā)地運(yùn)行,即使這樣的goroutine有數(shù)以十萬(wàn)計(jì),也仍然可以如此。

小 結(jié)

進(jìn)程、線(xiàn)程、協(xié)程的區(qū)別主要體現(xiàn)在執(zhí)行體的顆粒度上。最初的執(zhí)行體任務(wù)比較簡(jiǎn)單,用一個(gè)進(jìn)程就能滿(mǎn)足需求,隨著執(zhí)行體做的事情越來(lái)越復(fù)雜,就出現(xiàn)了進(jìn)程內(nèi)多任務(wù)的需求。

進(jìn)程和線(xiàn)程都屬于系統(tǒng)級(jí)的任務(wù),切換進(jìn)程、線(xiàn)程都需要經(jīng)歷用戶(hù)態(tài)躍遷內(nèi)核態(tài),切換成功后再由內(nèi)核態(tài)切回用戶(hù)態(tài)。

為了實(shí)現(xiàn)高性能,我們應(yīng)該盡可能的減少異步線(xiàn)程。因?yàn)閰f(xié)程沒(méi)有局部存儲(chǔ),相對(duì)來(lái)說(shuō)空間成本就小很多,同時(shí)它又能滿(mǎn)足需求。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/125630.html

相關(guān)文章

  • Java多線(xiàn)程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

    摘要:因?yàn)槎嗑€(xiàn)程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線(xiàn)程的使用。舉個(gè)例子如果說(shuō)服務(wù)器的帶寬只有,某個(gè)資源的下載速度是,系統(tǒng)啟動(dòng)個(gè)線(xiàn)程下載該資源并不會(huì)導(dǎo)致下載速度編程,所以在并發(fā)編程時(shí),需要考慮這些資源的限制。 最近私下做一項(xiàng)目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項(xiàng)目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門(mén): Java多線(xiàn)程學(xué)習(xí)(一)Java多線(xiàn)程入門(mén) Jav...

    yimo 評(píng)論0 收藏0
  • Java多線(xiàn)程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

    摘要:相比與其他操作系統(tǒng)包括其他類(lèi)系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€(xiàn)程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線(xiàn)程的使用。很多編程語(yǔ)言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門(mén): Java多線(xiàn)程學(xué)習(xí)(一)Java多線(xiàn)程入門(mén) Java多線(xiàn)程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線(xiàn)程學(xué)習(xí)(二)syn...

    dingding199389 評(píng)論0 收藏0
  • 聊聊 2018 年后端技術(shù)趨勢(shì)

    摘要:現(xiàn)在在后端業(yè)務(wù)開(kāi)發(fā)編程方面,技術(shù)力量強(qiáng)的團(tuán)隊(duì)已經(jīng)開(kāi)始將技術(shù)棧從同步模式切換為異步了。使用這些技術(shù)方案是無(wú)法兼容已有程序的。影響了異步回調(diào)技術(shù)棧的普及。將會(huì)成為未來(lái)后端開(kāi)發(fā)領(lǐng)域的主流技術(shù)方案。 今天太忙,少寫(xiě)一點(diǎn),后面再補(bǔ)充。 異步模式 Go 語(yǔ)言越來(lái)越熱門(mén),很多大型互聯(lián)網(wǎng)公司后端正在轉(zhuǎn)向 GO 。Java 圈知名的服務(wù)化框架 Dubbo 也宣布轉(zhuǎn)型異步模式。這是一個(gè)大趨勢(shì),異步模式已經(jīng)...

    Miyang 評(píng)論0 收藏0
  • JVM并發(fā)編程模型覽

    摘要:本文介紹和點(diǎn)評(píng)上的等并發(fā)編程模型。異步更適合并發(fā)編程。同步使線(xiàn)程阻塞,導(dǎo)致等待?;灸P瓦@是最簡(jiǎn)單的模型,創(chuàng)建線(xiàn)程來(lái)執(zhí)行一個(gè)任務(wù),完畢后銷(xiāo)毀線(xiàn)程。響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程模式。起源于電信領(lǐng)域的的編程模型。 本文介紹和點(diǎn)評(píng)JVM上的Thread, Thread Pool, Future, Rx, async-await, Fiber, Actor等并發(fā)編程模型。本人經(jīng)驗(yàn)...

    cppowboy 評(píng)論0 收藏0
  • JVM并發(fā)編程模型覽

    摘要:本文介紹和點(diǎn)評(píng)上的等并發(fā)編程模型。異步更適合并發(fā)編程。同步使線(xiàn)程阻塞,導(dǎo)致等待?;灸P瓦@是最簡(jiǎn)單的模型,創(chuàng)建線(xiàn)程來(lái)執(zhí)行一個(gè)任務(wù),完畢后銷(xiāo)毀線(xiàn)程。響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程模式。起源于電信領(lǐng)域的的編程模型。 本文介紹和點(diǎn)評(píng)JVM上的Thread, Thread Pool, Future, Rx, async-await, Fiber, Actor等并發(fā)編程模型。本人經(jīng)驗(yàn)...

    wudengzan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<