99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么說(shuō)線(xiàn)程是輕量級(jí)的概念呢?守護(hù)線(xiàn)程是指什么?

冬至配餃子 ? 來(lái)源:多蘭多 ? 作者:Toranto ? 2022-08-19 10:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

線(xiàn)程-Thread

進(jìn)程是計(jì)算機(jī)中最小的資源分配單位,創(chuàng)建一個(gè)進(jìn)程,操作系統(tǒng)需要向其分配一定的內(nèi)存資源。所以進(jìn)程對(duì)于操作系統(tǒng)來(lái)說(shuō)還是有一定的負(fù)擔(dān)。

線(xiàn)程是計(jì)算機(jī)中被CPU調(diào)度的最小單位,進(jìn)程中的代碼是由線(xiàn)程來(lái)完成的,每個(gè)進(jìn)程可以有多個(gè)線(xiàn)程,但是至少要有一個(gè)線(xiàn)程。

poYBAGL-9e6AbR-PAABgWuObfCs448.png

線(xiàn)程是一個(gè)輕量級(jí)概念,它沒(méi)有屬于自己的資源。同一個(gè)進(jìn)程中的所有的線(xiàn)程的資源是共享的。在Python中,一個(gè)進(jìn)程中的多個(gè)線(xiàn)程無(wú)法并行,只能并發(fā)執(zhí)行(Java,C++, C#C語(yǔ)言中是可以的),主要是因?yàn)镻ython屬于解釋型語(yǔ)言,而Java,C語(yǔ)言屬于編譯型語(yǔ)言,Python中有獨(dú)有的GIL(Global Interpreter Lock)全局解釋器鎖。

編譯型語(yǔ)言:程序在執(zhí)行之前需要一個(gè)專(zhuān)門(mén)的編譯過(guò)程,把程序編譯成 為機(jī)器語(yǔ)言的文件,運(yùn)行時(shí)不需要重新翻譯,直接使用編譯的結(jié)果就行了。而相對(duì)的,解釋性語(yǔ)言編寫(xiě)的程序不進(jìn)行預(yù)先編譯,以文本方式存儲(chǔ)程序代碼。在發(fā)布程序時(shí),看起來(lái)省了道編譯工序。但是,在運(yùn)行程序的時(shí)候,解釋性語(yǔ)言必須先解釋再運(yùn)行。

線(xiàn)程和進(jìn)程之間的區(qū)別主要在于:

占用的資源

調(diào)度的效率

資源是否共享

創(chuàng)建線(xiàn)程與創(chuàng)建進(jìn)程的操作幾乎相同:

pYYBAGL-9gKARJgJAABIMAUAN68733.png

為什么說(shuō)線(xiàn)程是輕量級(jí)的概念呢?

poYBAGL-9iiAWB3OAAD6DyC2Fws210.pngpYYBAGL-9i6AExw_AAAaVw31UnA289.png

poYBAGL-9jSAEc6WAACvbpHmY30646.png

結(jié)果顯而易見(jiàn)的。

守護(hù)線(xiàn)程-setDaemon

守護(hù)線(xiàn)程是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線(xiàn)程。

守護(hù)線(xiàn)程的特性在進(jìn)程中已經(jīng)有過(guò)闡述,守護(hù)線(xiàn)程和守護(hù)進(jìn)程其實(shí)差不多,但還是有些許差別:

pYYBAGL-9liAEtjtAACZqwqIfM8039.png
poYBAGL-9l2AJ_P9AAEL_XMnQEs674.png

從結(jié)果可以看出,守護(hù)線(xiàn)程并沒(méi)有像進(jìn)程一樣,在主進(jìn)程的代碼結(jié)束之后便結(jié)束,反而等全部線(xiàn)程執(zhí)行完畢之后再結(jié)束。因?yàn)樵谕粋€(gè)進(jìn)程中,多個(gè)線(xiàn)程的資源是共享的,因此守護(hù)線(xiàn)程的守護(hù)對(duì)象應(yīng)該是全部線(xiàn)程而不是進(jìn)程(進(jìn)程的代碼也要靠線(xiàn)程來(lái)執(zhí)行)

當(dāng)同時(shí)滿(mǎn)足以下兩個(gè)條件時(shí),就會(huì)出現(xiàn)線(xiàn)程的安全問(wèn)題①多個(gè)線(xiàn)程在操作共享的數(shù)據(jù);②操作共享數(shù)據(jù)的線(xiàn)程代碼有多條。

舉例:

poYBAGL-9pWARoH8AADC8qOIQm0381.png

從一百到十萬(wàn)結(jié)果基本上都是0,但是當(dāng)循環(huán)次數(shù)擴(kuò)大到100萬(wàn)的時(shí)候,問(wèn)題就開(kāi)始顯現(xiàn)了:

pYYBAGL-9qqAK9btAACECgNbUeg416.png

和進(jìn)程修改共享數(shù)據(jù)的原理是一樣的,多個(gè)線(xiàn)程多個(gè)代碼對(duì)同一個(gè)共享數(shù)據(jù)進(jìn)行修改,次數(shù)足夠大時(shí)難免會(huì)出現(xiàn)同時(shí)操作的現(xiàn)象,自然而然就會(huì)產(chǎn)生數(shù)據(jù)的誤差的問(wèn)題。所以可以引入線(xiàn)程鎖Lock的概念方法,進(jìn)程鎖Lock的原理為同一時(shí)刻只允許一個(gè)進(jìn)程對(duì)數(shù)據(jù)進(jìn)行修改,線(xiàn)程鎖Lock的原理就是同一時(shí)刻只允許一個(gè)線(xiàn)程對(duì)數(shù)據(jù)進(jìn)行修改。

poYBAGL-9tOAMKJuAADhflZ64zI074.pngpYYBAGL-9tmAb5xUAAAugfDMaA8606.pngpoYBAGL-9t6AbSU4AAC4B03wYso423.png

這樣就保護(hù)了數(shù)據(jù)安全,但是時(shí)間相對(duì)來(lái)說(shuō)就長(zhǎng)了很多很多

遞歸鎖-RLock

遞歸鎖的講解需要引入“哲學(xué)家吃面問(wèn)題”


poYBAGL-9viAX70ZAACpDeTiA1M018.png

所謂哲學(xué)家吃面問(wèn)題就是每個(gè)哲學(xué)家必須要搶到叉子和面條才能夠繼續(xù)使程序繼續(xù)進(jìn)程,否則程序就會(huì)陷入死鎖狀態(tài)。也就是有兩把鎖,線(xiàn)程需要同時(shí)拿到兩把才能夠程序繼續(xù)運(yùn)行,否則一把鎖被一個(gè)線(xiàn)程拿到,另一把鎖被另一個(gè)線(xiàn)程拿到,這樣兩把鎖就無(wú)法同時(shí)解鎖,就進(jìn)入死鎖狀態(tài)。

寫(xiě)一個(gè)死鎖程序:

pYYBAGL-9yGAGzVCAAGI8nklWz4996.pngpoYBAGL-9yaAPJnuAABbjpV7BcQ034.pngpoYBAGL-9yuAFTlPAAD9XHPn8Rk162.png

當(dāng)eat1激活了noodle_lock之后,eat2的noodle_lock必須等到ea1釋放才能激活。而eat1代碼順序?yàn)橄让鏃l后叉子,eat2代碼順序?yàn)橄炔孀雍竺鏃l,所以在相同反應(yīng)的情況下,哲學(xué)家2搶到面條的同時(shí),哲學(xué)家3搶到了叉子,兩個(gè)人同時(shí)搶到更靠近自己的東西,誰(shuí)也不放手,表現(xiàn)為程序無(wú)法進(jìn)行下去,也就是死鎖現(xiàn)象。(為什么要用eat1和eat2兩個(gè)方法,而不是只用eat1一個(gè)方法?是因?yàn)樾枰幸粋€(gè)偏向值,eat1更偏向面條,所以哲學(xué)家1和2更容易搶到面條,eat2更偏向叉子,所以哲學(xué)家3和4更容易搶到叉子。如果只用一個(gè)eat,那么表現(xiàn)為哲學(xué)家們按順序吃面條(同步))

而且解鎖的順序也頗為講究,采用后進(jìn)先出法,具體表現(xiàn)為以下的圖,第一道門(mén)開(kāi)了鎖進(jìn)去,再開(kāi)第二道鎖再進(jìn)去,那么出來(lái)的時(shí)候需要鎖門(mén),鎖門(mén)就要先鎖里面的門(mén),不然都出來(lái)了還怎么鎖里面的門(mén)呢?

pYYBAGL-9z2ABTFVAAA6yqcn7IM453.png

為了解決死鎖現(xiàn)象,threading模塊中還提供了RLock遞歸鎖的方法,

poYBAGL-92WAHgiNAAF8jn9_U2Q744.pngpYYBAGL-92uAINWZAACMOrYbLN8859.pngpYYBAGL-93CAf3xAAADrsjiSmws218.png

當(dāng)多個(gè)線(xiàn)程同時(shí)搶多把鎖的時(shí)候就會(huì)出現(xiàn)死鎖的現(xiàn)象。其實(shí)遞歸鎖也不是一個(gè)很好地解決方案,死鎖現(xiàn)象的發(fā)生不是互斥鎖的原因,而是程序猿/媛的邏輯出現(xiàn)了問(wèn)題。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11083

    瀏覽量

    217195
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7667

    瀏覽量

    90868
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7154

    瀏覽量

    125648
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141874
  • 線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20244
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux多線(xiàn)程編程基礎(chǔ)知識(shí)解析

    線(xiàn)程輕量級(jí)的進(jìn)程(`LWP: Light Weight Process`),在`Linux`環(huán)境下線(xiàn)程的本質(zhì)仍是`進(jìn)程`,進(jìn)程是資源分配的`最小單位`,線(xiàn)程是操作系統(tǒng)調(diào)度執(zhí)行的`最小
    發(fā)表于 07-14 16:41 ?1165次閱讀
    Linux多<b class='flag-5'>線(xiàn)程</b>編程基礎(chǔ)知識(shí)解析

    什么是守護(hù)線(xiàn)程?守護(hù)線(xiàn)程的底層原理和使用示例

    大家好,今天這篇文章來(lái)梳理一下有關(guān)守護(hù)線(xiàn)程的相關(guān)問(wèn)題,這也是之前曾經(jīng)有被問(wèn)到過(guò)的面試題,在此之前我們先看一看守護(hù)線(xiàn)程的使用示例。
    的頭像 發(fā)表于 01-05 11:01 ?1897次閱讀
    什么是<b class='flag-5'>守護(hù)</b><b class='flag-5'>線(xiàn)程</b>?<b class='flag-5'>守護(hù)</b><b class='flag-5'>線(xiàn)程</b>的底層原理和使用示例

    Java守護(hù)線(xiàn)程和本地線(xiàn)程的區(qū)別

    java中的線(xiàn)程分為兩種:守護(hù)線(xiàn)程(Daemon)和用戶(hù)線(xiàn)程(User)。
    發(fā)表于 08-07 08:10

    嵌入式Linux多任務(wù)編程、進(jìn)程、線(xiàn)程分別是什么意思

    ,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單元*//*線(xiàn)程:線(xiàn)程是進(jìn)程內(nèi)獨(dú)立的一條運(yùn)行路線(xiàn),也可以稱(chēng)為輕量級(jí)進(jìn)程。線(xiàn)程可以對(duì)進(jìn)程的內(nèi)存空間和資源進(jìn)行訪(fǎng)問(wèn),一個(gè)進(jìn)程可以擁有多個(gè)
    發(fā)表于 12-22 07:43

    多核架構(gòu)及多線(xiàn)程編程

    線(xiàn)程(thread)是進(jìn)程上下文(context)中執(zhí)行的代碼序列,又被稱(chēng)為輕量級(jí)進(jìn)程(light weight process)? 在支持多線(xiàn)程的系統(tǒng)中,進(jìn)程成為資源分配和保護(hù)的實(shí)體,而線(xiàn)程
    發(fā)表于 09-11 16:12 ?10次下載
    多核架構(gòu)及多<b class='flag-5'>線(xiàn)程</b>編程

    解決線(xiàn)程安全問(wèn)題技巧匯總

    線(xiàn)程,有時(shí)被稱(chēng)為輕量級(jí)進(jìn)程,是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線(xiàn)程線(xiàn)程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線(xiàn)程是進(jìn)程中
    發(fā)表于 12-01 13:42 ?1638次閱讀

    什么是線(xiàn)程

    線(xiàn)程輕量級(jí)進(jìn)程;使用線(xiàn)程節(jié)省了 CPU 周期的浪費(fèi),同時(shí)提高了應(yīng)用程序的效率
    的頭像 發(fā)表于 01-20 15:17 ?2821次閱讀
    什么是<b class='flag-5'>線(xiàn)程</b>

    什么是多線(xiàn)程

    被定義為程序的執(zhí)行路徑,也叫執(zhí)行單元 線(xiàn)程輕量級(jí)進(jìn)程;使用線(xiàn)程節(jié)省了 CPU 周期的浪費(fèi),同時(shí)提高了應(yīng)用程序的效率 進(jìn)程 是Windows系統(tǒng)中的一個(gè)基本概念,它包含著一個(gè)運(yùn)行
    的頭像 發(fā)表于 02-28 09:56 ?2029次閱讀
    什么是多<b class='flag-5'>線(xiàn)程</b>

    詳解Linux線(xiàn)程線(xiàn)程與異步編程、協(xié)程與異步

    協(xié)程不是系統(tǒng)級(jí)線(xiàn)程,很多時(shí)候協(xié)程被稱(chēng)為“輕量級(jí)線(xiàn)程”、“微線(xiàn)程”、“纖程(fiber)”等。簡(jiǎn)單來(lái)說(shuō)可以認(rèn)為協(xié)程是線(xiàn)程里不同的函數(shù),這些函數(shù)
    的頭像 發(fā)表于 03-16 15:49 ?1445次閱讀

    進(jìn)程和線(xiàn)程的區(qū)別

    每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷(xiāo);線(xiàn)程可以看做輕量級(jí)的進(jìn)程,同一類(lèi)線(xiàn)程共享代碼和數(shù)據(jù)空間,每個(gè)線(xiàn)程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),
    的頭像 發(fā)表于 05-09 11:06 ?6360次閱讀
    進(jìn)程和<b class='flag-5'>線(xiàn)程</b>的區(qū)別

    什么是虛擬線(xiàn)程?虛擬線(xiàn)程到底是做什么用的?

    虛擬線(xiàn)程是在Java并發(fā)領(lǐng)域添加的一個(gè)新概念,那么虛擬線(xiàn)程到底是做什么用的
    的頭像 發(fā)表于 10-29 10:23 ?3629次閱讀
    什么是虛擬<b class='flag-5'>線(xiàn)程</b>?虛擬<b class='flag-5'>線(xiàn)程</b>到底是做什么用的<b class='flag-5'>呢</b>?

    線(xiàn)程池基本概念與原理

    一、線(xiàn)程池基本概念與原理 1.1 線(xiàn)程概念及優(yōu)勢(shì) C++線(xiàn)程池簡(jiǎn)介 線(xiàn)程池是一種并發(fā)編程技術(shù),
    的頭像 發(fā)表于 11-10 10:24 ?982次閱讀

    線(xiàn)程池的基本概念

    線(xiàn)程池的基本概念 不管線(xiàn)程池是什么東西!但是我們必須知道線(xiàn)程池被搞出來(lái)的目的就是:提高程序執(zhí)行效率而設(shè)計(jì)出來(lái)的; 了解了線(xiàn)程池的目的后:我們
    的頭像 發(fā)表于 11-10 16:37 ?778次閱讀
    <b class='flag-5'>線(xiàn)程</b>池的基本<b class='flag-5'>概念</b>

    如何查看一個(gè)線(xiàn)程的ID

    1.什么是線(xiàn)程? linux內(nèi)核中是沒(méi)有線(xiàn)程這個(gè)概念的,而是輕量級(jí)進(jìn)程的概念:LWP。一般我們所說(shuō)的線(xiàn)程
    的頭像 發(fā)表于 11-13 14:38 ?1832次閱讀
    如何查看一個(gè)<b class='flag-5'>線(xiàn)程</b>的ID

    mcu線(xiàn)程和進(jìn)程的區(qū)別是什么

    是程序執(zhí)行的基本單位,它是進(jìn)程中的一個(gè)實(shí)體,是進(jìn)程內(nèi)的一條執(zhí)行路徑。線(xiàn)程是CPU調(diào)度的最小單位,它可以看作是輕量級(jí)的進(jìn)程,不擁有獨(dú)立的地址空間。線(xiàn)程共享進(jìn)程的資源(如堆、文件描述符等),同一進(jìn)程內(nèi)的多個(gè)
    的頭像 發(fā)表于 01-04 10:45 ?1227次閱讀