国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux復習 / 線程相關----線程概念與控制 Q&A梳理

這篇具有很好參考價值的文章主要介紹了Linux復習 / 線程相關----線程概念與控制 Q&A梳理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

本篇博客梳理關于線程相關的Q&A,包括了線程概念與線程的控制。若讀者也在復習這塊知識,或者正在學習這塊知識,可以通過這些Q&A檢測自己的知識掌握情況。此外,思維導圖已經(jīng)更新至我的gitee,Q&A之外的體系梳理還請移步思維導圖。

Q&A


線程概念

Q:線程和進程的區(qū)別?(為什么要有線程,從進程的角度說明這個問題)

A:Linux用task_struct結構體描述一個進程,可以說進程 = task_struct + 內存中的數(shù)據(jù)與代碼。而task_struct包含了進程頁表、進程地址空間等資源,創(chuàng)建一個進程就需要為它分配這些資源。值得思考的是:分配資源本身就需要消耗資源,進程是否能充分利用分配得到的資源?而且由于進程具有獨立性,進程間想要共享或發(fā)送數(shù)據(jù),就要進行進程間通信,但通信的成本過高,會消耗過多資源,降低系統(tǒng)的性能。

若操作系統(tǒng)只有進程,那么進程就是系統(tǒng)的基本執(zhí)行流。

  • 要執(zhí)行不同的程序,就要創(chuàng)建新的進程,但是創(chuàng)建進程會帶來資源的消耗,這是其一
  • 若一個進程要使用另一個進程的數(shù)據(jù),就要進行進程間通信,通信的代價也是額外資源的消耗,這是其二

為解決以上兩個問題(最主要的兩個),線程被引入,線程作為進程的一部分,和進程共享進程地址空間(資源),同時解決了進程間通信與反復創(chuàng)建進程帶來的資源消耗問題。

Q:Linux是如何設計線程的?

A:學習進程時,我們說:進程 = task_struct + 內存中的數(shù)據(jù)與代碼,這個說法默認了task_struct是進程控制塊,也就是說task_struct是為了進程而設計的結構。但是事實并不是這樣,準確的說task_struct是Linux中的一個執(zhí)行流。若一個進程下沒有線程(或者說唯一的線程就是自己),此時的進程就是一個執(zhí)行流。若一個進程下有多個線程,此時的進程就不再是執(zhí)行流,此時的執(zhí)行流是進程下的線程,進程是多個執(zhí)行流的集合。

所以task_struct即不是為進程設計的,也不是為線程設計的,它是為執(zhí)行流這個概念設計的,你也可以極端點,認為Linux下沒有進程與線程的概念,Linux只有執(zhí)行流的概念。提出進程和線程只是為了更好的理解操作系統(tǒng)。

回到問題,你可以認為Linux只有執(zhí)行流的概念,它對應的結構體為task_struct。但是為了使多個執(zhí)行流可以同時使用相同的資源而不沖突,Linux肯定是要對線程進行設計的。我們可以通過if else判斷fork的返回值,控制父子進程,使兩進程分別執(zhí)行不同的代碼塊(函數(shù)),從而使它們的函數(shù)棧分離,體現(xiàn)在進程地址空間上,兩進程就是使用了不同的空間。這樣的思想也體現(xiàn)在線程的設計中,Linux設計了thread_struct結構體,其中有一組變量維護了寄存器地址,這些寄存器則維護了一個函數(shù)棧。所以,每個線程都享有一個獨立的函數(shù)棧(地址空間),這樣就解決了線程間數(shù)據(jù)沖突的問題。
Linux復習 / 線程相關----線程概念與控制 Q&A梳理

總結一下:Linux用thread_struct結構體表示線程結構,該結構體中最重要的是一組寄存器地址,這些寄存器維護了線程的函數(shù)棧,使線程享有獨立的資源,互不沖突。

Q:學習了線程后,你能說說進程和線程最大的區(qū)別是什么嗎?

A:兩者最大的區(qū)別就是:承擔的職責不同

  • 進程是系統(tǒng)中資源分配的基本單位,系統(tǒng)分配進程地址空間、頁表等結構,消耗了大量資源
  • 線程是系統(tǒng)中調度的基本單位,系統(tǒng)分配資源給進程,線程使用進程的一部分資源,以執(zhí)行任務

進程和線程的比較

Q:線程使用進程的資源,它們之間的所有資源都是共享的嗎?有哪些資源不是共享的?

A:

  • 線程獨享的資源
  1. 線程ID:需要用不同的線程ID標識同一進程下的不同線程
  2. 一組寄存器與函數(shù)棧:為了防止線程之間發(fā)送數(shù)據(jù)沖突,線程需要維護自己的函數(shù)棧
  3. errno:每個線程必須獨享errno以便在程序崩潰時更快定位錯誤
  4. 信號屏蔽字:每個線程可以設置自己想要屏蔽的信號
  5. 調度優(yōu)先級:可以設置線程的優(yōu)先級以調整線程的執(zhí)行順序
  • 線程與進程共享的數(shù)據(jù)
  1. 文件描述符表:線程和進程打開的文件,彼此都能看到
  2. 信號的遞達方式:線程和進程設置的信號遞達方式也會彼此影響
  3. 當前工作路徑:進程與使用其資源的線程在同一工作路徑下運行
  4. 用戶id和組id:進程與使用其資源的線程擁有相同的owner和group
Q:線程的優(yōu)缺點分別是什么?

A:

  • 優(yōu)點:
  1. 充分使用進程的資源,盡可能的減少不必要進程的創(chuàng)建,提高系統(tǒng)性能
  2. 線程之間數(shù)據(jù)共享,比起進程間通信,這是一種更高效的通信方式
  3. 創(chuàng)建線程的代價小于進程,因為系統(tǒng)不要為線程分配頁表、進程地址空間這樣的資源
  4. 切換線程的代價小于進程,因為系統(tǒng)不需要重新加載頁表、進程地址空間,只需要重新加載task_struct結構體以及線程的函數(shù)棧
  5. 充分利用多處理器的可并行數(shù)量
  6. 在含有慢速IO的進程中,可以創(chuàng)建線程等待慢速IO的結束,使進程可以執(zhí)行其他任務,不必等待慢速IO的結束
  7. 在密集IO的進程中,可以創(chuàng)建多個線程等待IO的結束,使等待時間重疊,有效提高了程序的運行效率
  • 缺點:
  1. 健壯性較差:線程崩潰退出會導致進程的退出
  2. 調試難度大:多線程程序下的錯誤難以定位

線程操作

Q:線程終止的三種方式分別是什么?

A:

  1. 直接return,不過返回的對象要強轉為(void*)
  2. 調用int pthread_exit(void* retval)退出,該函數(shù)的參數(shù)是一個類型為void*的變量
  3. 調用int pthread_cancel(pthread_t thread)向指定線程發(fā)送cancel信號,該線程的返回值為-1
Q:為什么pthread_self()的返回值和LWP不一樣?

A:LWP(light weight process),輕量級進程,使用ps -aL可以查看線程的LWP。而pthread_self()的返回值(線程ID)遠遠大于LWP,其原因是:

  • Linux沒有提供線程的操作接口,或者說這些接口不夠簡便,需要自己設置于管理線程的屬性。我們的線程操作基于第三方庫,第三方庫幫助我們設置與管理線程的屬性

  • 第三方庫使用struct thread_info結構體存儲線程的信息,而這些結構存儲在進程地址空間的共享區(qū),線程ID的值就等于這些結構體的首地址

  • 可以通過程序驗證,線程ID的值小于棧區(qū)地址,大于堆區(qū)地址
    Linux復習 / 線程相關----線程概念與控制 Q&A梳理

  • LWP是內核的一個概念,內核用LWP對輕量級進程進行管理

  • 線程ID是地址空間的一個概念,通過線程ID可以找到線程的屬性,從而對線程進程管理(這是我們通過線程庫對線程的間接管理

Q:為什么要進行線程分離?

A:主線程創(chuàng)建的子線程默認具有joinable屬性,若主線程不主動join子線程,會造成資源泄漏與線程句柄的耗盡。線程分離后,主線程不用join子線程,子線程結束,其資源會自動釋放。

這個問題也能理解為:為什么要join子線程?兩個原因:一個是回收子線程的資源,一個是得到子線程的返回值,前者是必要的,而后者是非必要的。當主線程不再關心子線程的返回信息時,主線程可以主動分離該線程。

Q:為什么要由主線程分離子線程?不能子線程自己分離?

A:這是為了防止一些bug的產(chǎn)生,也是一種編程規(guī)范。若子線程調用pthread_detach分離自己,主線程無法確定子線程什么時候被分離,如果主線程在在子線程調用pthread_detach之前調用pthread_join該線程,那么主線程會陷入阻塞,但由于該線程被分離,不會向主線程返回,所以主線程會陷入永久的阻塞,程序因此產(chǎn)生bug。

所以不能讓子線程調用pthread_detach分離自己,這會帶來一些不確定性。同時我們也要確保主線程不要對將要分離或已經(jīng)分離的子線程做任何操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-412972.html

到了這里,關于Linux復習 / 線程相關----線程概念與控制 Q&A梳理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 『Linux』第九講:Linux多線程詳解(一)_ 線程概念 | 線程控制之線程創(chuàng)建 | 虛擬地址到物理地址的轉換

    『Linux』第九講:Linux多線程詳解(一)_ 線程概念 | 線程控制之線程創(chuàng)建 | 虛擬地址到物理地址的轉換

    「前言」文章是關于Linux多線程方面的知識,講解會比較細,下面開始! 「歸屬專欄」Linux系統(tǒng)編程 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 「楓葉先生有點文青病」「每篇一句」? 我與春風皆過客, 你攜秋水攬星河。 ——網(wǎng)絡流行語,詩詞改版 用現(xiàn)在的話來說:我不

    2024年02月04日
    瀏覽(16)
  • 【Linux驅動開發(fā)】013 與gpio相關的OF函數(shù) 一、前言

    在上節(jié),我們提供了驅動中gpio子系統(tǒng)相關的API函數(shù),主要用來申請釋放gpio、設置gpio輸入輸出、獲取設置gpio的值。 我們進行上述設置的前提是:在驅動程序中需要讀取 gpio 屬性內容。為此,Linux 內核提供了幾個與 GPIO 有關的 OF 函數(shù)。 用于統(tǒng)計設備樹某個屬性里面定義了幾個

    2024年02月14日
    瀏覽(21)
  • C#多線程學習(一) 多線程的相關概念

    什么是進程? 當一個程序開始運行時,它就是一個進程,進程包括運行中的程序和程序所使用到的內存和系統(tǒng)資源。 而一個進程又是由多個線程所組成的。 什么是線程? 線程是程序中的一個執(zhí)行流,每個線程都有自己的專有寄存器(棧指針、程序計數(shù)器等), 但代碼區(qū)是共享

    2023年04月13日
    瀏覽(22)
  • 【Python】多線程編程 ① ( 線程相關概念 | 進程 | 線程 | 協(xié)程 / 纖程 | 管程 )

    進程 與 操作系統(tǒng) : 進程 是 操作系統(tǒng) 中 能夠獨立運行的單元 , 是 操作系統(tǒng) 對 正在運行的 應用程序 的 抽象結構 描述 ; 操作系統(tǒng) 中 運行的每個 應用程序 就是一個進程 ; 一個操作系統(tǒng)中可以運行 多個 進程 ; 每個 應用程序 都會被 操作系統(tǒng) 分配一個 進程 ID ; 多個進程之間

    2024年02月15日
    瀏覽(24)
  • 【線程概念和線程控制】

    【線程概念和線程控制】

    教材觀點是這樣的: 線程是一個執(zhí)行分支,執(zhí)行力度比進程更細,調度的成本更低。 Linux內核觀點: 進程是系統(tǒng)分配資源的基本單位,線程是CPU調度的基本單位。 這兩種說法都是正確的,但是我們究竟該如何理解線程呢? 在一個程序里的一個執(zhí)行路線就叫做線程(thread)。

    2024年02月16日
    瀏覽(19)
  • cpp多線程(二)——對線程的控制和鎖的概念

    cpp多線程(二)——對線程的控制和鎖的概念

    這篇文章是筆者學習cpp多線程操作的第二篇筆記,沒有閱讀過第一篇的讀者可以移步此處: Cpp多線程(一)-CSDN博客 如果讀者發(fā)現(xiàn)我的文章里有問題,歡迎交流哈! ? 一、如何控制線程呢? c++11在std::this_thread名稱空間(顯然,這是一個嵌套在大名稱空間里的小名稱空間)內

    2024年01月20日
    瀏覽(15)
  • CPU相關概念:物理cpu數(shù)、核數(shù)、邏輯cpu數(shù),12核20線程實例分析

    CPU相關概念:物理cpu數(shù)、核數(shù)、邏輯cpu數(shù),12核20線程實例分析

    學習多線程的時候,需要了解CPU和線程的相關概念,但是網(wǎng)上給出的概念讓我實際操作時產(chǎn)生了混淆。 本文與其他文章不一樣的點在于,解釋為什么邏輯CPU數(shù)不是核數(shù)的2倍(比較新的處理器會有這種情況),能夠解答非計算機專業(yè)人士的問題。 CPU信息的查詢方法參見本文第

    2024年02月13日
    瀏覽(40)
  • 【Linux】線程-線程概念

    【Linux】線程-線程概念

    實際上,線程是一個進程內部的控制序列,一個程序的一個執(zhí)行線路就是一個線程。 并且一個進程中至少有一個線程,本質上,一個進程內部如果有多個線程,那么這些線程實際上是指向同一塊地址空間的。而不論進程還是線程,從CPU看來都是一個PCB,只是說線程的PCB要比進

    2023年04月25日
    瀏覽(40)
  • Linux 多線程 ( 多線程概念 )

    Linux 多線程 ( 多線程概念 )

    在一個程序里的一個執(zhí)行路線叫做線程 thread ),更準確的定義為:“線程是一個進程內部的控制序列\(zhòng)\\"。 一切進程至少有一個執(zhí)行線程。 線程在進程內部運行,本質上是在進程地址空間中運行。 在linux系統(tǒng)中,CPU看到的PCB比傳統(tǒng)的進程更加輕量化。 透過進程虛擬地址空間,可

    2024年02月09日
    瀏覽(34)
  • Linux之多線程(上)——Linux下的線程概念

    Linux之多線程(上)——Linux下的線程概念

    本文介紹了地址空間和二級頁表、Linux下的線程、線程的優(yōu)缺點以及線程與進程的關系等概念。 地址空間是進程能看到的資源窗口 :一個進程可以看到代碼區(qū)、堆棧區(qū)、共享區(qū)、內核區(qū)等,大部分的資源是在地址空間上看到的。 頁表決定進程真正有用資源的情況 :進程認為

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包