成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

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

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

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

其實(shí),在早期計(jì)算機(jī)并沒有包含操作系統(tǒng),這個(gè)時(shí)候,這個(gè)計(jì)算機(jī)只跑一個(gè)程序,這個(gè)程序獨(dú)享計(jì)算機(jī)的所有資源,這個(gè)時(shí)候不存在什么并發(fā)問題,但是對計(jì)算機(jī)的資源來說,確實(shí)是一種浪費(fèi)。早期編程都是基于單進(jìn)程來進(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í)行過程出現(xiàn)等待的時(shí)候,去執(zhí)行其他程序,從而提高程序的利用率
  • 公平性:所有的程序可以共享計(jì)算機(jī)資源,一種有效的方式是通過時(shí)間片的方式來讓程序共享計(jì)算機(jī)資源
  • 任務(wù)通信:在編寫多任務(wù)程序時(shí),可以一個(gè)程序執(zhí)行一個(gè)任務(wù),必要時(shí),程序之間進(jìn)行通信即可

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

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

并發(fā)可以滿足多任務(wù)任務(wù)需求,比如一邊寫代碼一邊聽音樂,即使編寫多線程程序具有挑戰(zhàn)性,但它仍在使用中,是因?yàn)樗梢詭砣缦碌暮锰帲?/p>

  • 更好的資源利用
  • 在某些場景下程序的設(shè)計(jì)會更簡單
  • 提升程序的響應(yīng)性
  • 多進(jìn)程/多任務(wù):單個(gè)CPU下的并發(fā),如在使用QQ的同時(shí)打開愛奇藝看劇
  • 多線程/子任務(wù):單個(gè)應(yīng)用下的并發(fā),如博客網(wǎ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í)間片非常的短,在用戶看來,就像是多個(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è)請求。這樣,雖然微觀上,比如說就這10毫秒時(shí)間CPU只能執(zhí)行一個(gè)進(jìn)程,但宏觀上1秒鐘執(zhí)行了100個(gè)時(shí)間片,于是每個(gè)時(shí)間片所屬進(jìn)程中的請求也得到了執(zhí)行,這就實(shí)現(xiàn)了請求的并發(fā)執(zhí)行。

流水線

CPU就好像一個(gè)流水線上的工人,不斷的處理流水線上的各種信息包裹,打開包裹讀取指令并執(zhí)行,遇到執(zhí)行慢的IO調(diào)用(或執(zhí)行時(shí)間片結(jié)束)則會暫時(shí)把它放到等候區(qū),繼續(xù)處理流水線上下一個(gè)等待處理的包裹。等候區(qū)有很多這樣的包裹,等待著系統(tǒng)的IO執(zhí)行完成,當(dāng)IO調(diào)用結(jié)束后,又開始進(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)核的管理成本高,二是無法簡單地通過內(nèi)存同步數(shù)據(jù),很不方便于是多線程模式就出現(xiàn)了。

線程的調(diào)度

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

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

線程

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

代碼區(qū)

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

heap

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

stack

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

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

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

上下文切換

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

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

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

兩級線程模型中用戶線程與內(nèi)核線程是一對一關(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寄存器的值為線程1保存下來,再從內(nèi)存中找出協(xié)程2上一次切換前保存好的寄存器值,寫入CPU的寄存器,這樣就完成了協(xié)程切換。

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

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

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

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

小 結(jié)

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125630.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    wudengzan 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<