欧美国产高清污视频在线观看-欧美久久综合九色综合-国产黄色自拍网站在线-国产三级精品三级在专区精-97中文字幕一区二区-大吊操白虎学生妹逼-精品久久久久亚洲综合网-青青草原国产av一区欧美-国产在线一区二区三区在线

協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


什么是進(jìn)程和線程有一定基礎(chǔ)的小伙伴們肯定都知道進(jìn)程和線程 。
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


進(jìn)程是什么呢?直白地講,進(jìn)程就是應(yīng)用程序的啟動實(shí)例比如我們運(yùn)行一個游戲,打開一個軟件,就是開啟了一個進(jìn)程進(jìn)程擁有代碼和打開的文件資源、數(shù)據(jù)資源、獨(dú)立的內(nèi)存空間有人會認(rèn)為 , 要提升CPU的利用率 , 可以開多個進(jìn)程,但是開多個進(jìn)程的話,進(jìn)程間通訊是個比較麻煩的事情(進(jìn)程之間地址空間是獨(dú)立的,需要通過其他方式 , 例如:管道來解決) 。
相反,線程之間是可以實(shí)現(xiàn)數(shù)據(jù)共享的,因?yàn)榫€程之間使用的是同一個地址空間線程又是什么呢?線程又叫做輕量級進(jìn)程 , 是CPU調(diào)度的最小單位,線程從屬于進(jìn)程,是程序的實(shí)際執(zhí)行者一個進(jìn)程至少包含一個主線程 , 也可以有更多的子線程 。
多個線程共享所屬進(jìn)程的資源,同時線程也擁有自己的專屬資源、擁有自己的棧空間線程間通信主要通過共享內(nèi)存,上下文切換很快 , 資源開銷較少,但相比進(jìn)程不夠穩(wěn)定容易丟失數(shù)據(jù)線程和進(jìn)程一樣都是由操作系統(tǒng)的調(diào)度器來統(tǒng)一調(diào)度,線程本身的數(shù)據(jù)結(jié)構(gòu)需要占用內(nèi)存,頻繁創(chuàng)建和銷毀線程會加大系統(tǒng)的壓力 。
另外,線程太多,系統(tǒng)調(diào)度的開銷也會增大基于上面的情況,提出了線程池解決方案,在初始化的時候批量創(chuàng)建線程,然后用戶后續(xù)通過隊(duì)列等方式提交業(yè)務(wù)邏輯,線程池中的線程進(jìn)行邏輯的消費(fèi)工作,這樣就可以在操作的過程中降低線程創(chuàng)建和銷毀的開銷 , 但是調(diào)度的開銷還是存在的 。
有人給出了很好的歸納:對操作系統(tǒng)來說,線程是最小的執(zhí)行單元 , 進(jìn)程是最小的資源管理單元在多核場景下,如果是I/O密集型場景,就算開多個線程來處理,也未必能提升CPU的利用率,反而會增加線程切換的開銷另外 , 多線程之間假如存在臨界區(qū)或者共享數(shù)據(jù),那么同步的開銷也是不可忽視的 。
協(xié)程 , 正好可以解決上面的相關(guān)問題 。
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


這個時候我們的主角 協(xié)程 就要登場了協(xié)程,英文Coroutines , 是一種比線程更加輕量級的存在正如一個進(jìn)程可以擁有多個線程一樣,一個線程也可以擁有多個協(xié)程協(xié)程的調(diào)度完全由用戶控制協(xié)程擁有自己的寄存器上下文和棧 。
協(xié)程調(diào)度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復(fù)先前保存的寄存器上下文和棧,直接操作棧則基本沒有內(nèi)核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快協(xié)程與線程主要區(qū)別是它將不再被內(nèi)核調(diào)度,而是交給了程序自己而線程是將自己交給內(nèi)核調(diào)度,所以也不難理解golang中調(diào)度器的存在 。
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


協(xié)程定義:協(xié)程是輕量級線程在一個用戶線程上可以跑多個協(xié)程,這樣就提高了單核的利用率協(xié)程不像進(jìn)程或者線程 , 可以讓系統(tǒng)負(fù)責(zé)相關(guān)的調(diào)度工作,協(xié)程是處于一個線程中,系統(tǒng)是無感知的 , 所以需要在該線程中阻塞某個協(xié)程的話,就需要手工進(jìn)行調(diào)度 。
協(xié)程是一種用戶態(tài)的輕量級線程 , 協(xié)程的調(diào)度完全由用戶控制 。一個線程可以擁有多個協(xié)程,協(xié)程不是被操作系統(tǒng)內(nèi)核所管理,而完全是由程序所控制 。與其讓操作系統(tǒng)調(diào)度,不如我自己來,這就是協(xié)程
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


要在用戶線程上實(shí)現(xiàn)協(xié)程是一件很難受的事情 , 原理類似于調(diào)度器根據(jù)條件的改變不停地調(diào)用各個協(xié)程的callback機(jī)制,但是前提是大家都在一個用戶線程下要注意,一旦有一個協(xié)程阻塞,其他協(xié)程也都不能運(yùn)行了因此要處理好協(xié)程 。
最重要的是,協(xié)程不是被操作系統(tǒng)內(nèi)核所管理,而完全是由程序所控制(也就是在用戶態(tài)執(zhí)行) 。這樣帶來的好處就是性能得到了很大的提升 , 不會像線程切換那樣消耗資源 。
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


這段代碼十分簡單,即使沒用過python的小伙伴應(yīng)該也能基本看懂代碼中創(chuàng)建了一個叫做consumer的協(xié)程,并且在主線程中生產(chǎn)數(shù)據(jù) , 協(xié)程中消費(fèi)數(shù)據(jù)其中yield 是python當(dāng)中的語法當(dāng)協(xié)程執(zhí)行到y(tǒng)ield關(guān)鍵字時,會暫停在那一行 , 等到主線程調(diào)用send方法發(fā)送了數(shù)據(jù),協(xié)程才會接到數(shù)據(jù)繼續(xù)執(zhí)行 。
但是,yield讓協(xié)程暫停 , 和線程的阻塞是有本質(zhì)區(qū)別的協(xié)程的暫停完全由程序控制,線程的阻塞狀態(tài)是由操作系統(tǒng)內(nèi)核來進(jìn)行切換因此,協(xié)程的開銷遠(yuǎn)遠(yuǎn)小于線程的開銷協(xié)程的應(yīng)用有哪些編程語言應(yīng)用到了協(xié)程呢?我們舉幾個栗子: 。
Lua語言Lua從5.0版本開始使用協(xié)程 , 通過擴(kuò)展庫coroutine來實(shí)現(xiàn)Python語言正如剛才所寫的代碼示例,python可以通過 yield/send 的方式實(shí)現(xiàn)協(xié)程在python 3.5以后,async/await 成為了更好的替代方案 。
Go語言Go語言對協(xié)程的實(shí)現(xiàn)非常強(qiáng)大而簡潔,可以輕松創(chuàng)建成百上千個協(xié)程并發(fā)執(zhí)行Java語言如上文所說,Java語言并沒有對協(xié)程的原生支持 , 但是某些開源框架模擬出了協(xié)程的功能,有興趣的小伙伴可以看一看Kilim框架
的源碼:總結(jié):多進(jìn)程的出現(xiàn)是為了提升CPU的利用率,特別是I/O密集型運(yùn)算 , 不管是多核還是單核,開多個進(jìn)程必然能有效提升CPU的利用率而多線程則可以共享同一進(jìn)程地址空間上的資源,為了降低線程創(chuàng)建和銷毀的開銷,又出現(xiàn)了線程池的概念,最后 , 為了提升用戶線程的最大利用效率,又提出了協(xié)程的概念 。
通信方式:
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


線程的生命周期創(chuàng)建:線程從創(chuàng)建到被cpu執(zhí)行之前的這個階段就緒:指線程已具備各種執(zhí)行條件,一旦獲取cpu便可執(zhí)行運(yùn)行:表示線程正獲得cpu在運(yùn)行阻塞:指線程在執(zhí)行中因某件事而受阻 , 處于暫停執(zhí)行的狀態(tài),阻塞的線程不會去競爭cpu 。
終止:線程執(zhí)行完畢,接下來會釋放線程占用的資源 。
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


進(jìn)程調(diào)度算法
協(xié)程和線程的區(qū)別 協(xié)程硬核推薦


【協(xié)程和線程的區(qū)別 協(xié)程硬核推薦】本文來自博客園,作者:孫龍-程序員,轉(zhuǎn)載請注明原文鏈接:https://www.cnblogs.com/sunlong88/p/16267055.html

    猜你喜歡