色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

什么是線程?線程與進程與有什么關(guān)系?

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Linux愛好者 ? 2020-12-11 16:08 ? 次閱讀

什么是線程

什么是線程?線程與進程與有什么關(guān)系?這是一個非常抽象的問題,也是一個特別廣的話題,涉及到非常多的知識。我不能確保能把它講的話,也不能確保講的內(nèi)容全部都正確。即使這樣,我也希望盡可能地把他講通俗一點,講的明白一點,因為這是個一直困擾我很久的,撲朔迷離的知識領(lǐng)域,希望通過我的理解揭開它一層一層神秘的面紗。

任務(wù)調(diào)度

線程是什么?要理解這個概念,須要先了解一下操作系統(tǒng)的一些相關(guān)概念。

大部分操作系統(tǒng)(如Windows、Linux)的任務(wù)調(diào)度是采用時間片輪轉(zhuǎn)的搶占式調(diào)度方式,也就是說一個任務(wù)執(zhí)行一小段時間后強制暫停去執(zhí)行下一個任務(wù),每個任務(wù)輪流執(zhí)行。任務(wù)執(zhí)行的一小段時間叫做時間片,任務(wù)正在執(zhí)行時的狀態(tài)叫運行狀態(tài),任務(wù)執(zhí)行一段時間后強制暫停去執(zhí)行下一個任務(wù),被暫停的任務(wù)就處于就緒狀態(tài)等待下一個屬于它的時間片的到來。

這樣每個任務(wù)都能得到執(zhí)行,由于CPU的執(zhí)行效率非常高,時間片非常短,在各個任務(wù)之間快速地切換,給人的感覺就是多個任務(wù)在“同時進行”,這也就是我們所說的并發(fā)(別覺得并發(fā)有多高深,它的實現(xiàn)很復(fù)雜,但它的概念很簡單,就是一句話:多個任務(wù)同時執(zhí)行)。多任務(wù)運行過程的示意圖如下:

圖1:操作系統(tǒng)中的任務(wù)調(diào)度

進程

我們都知道計算機的核心是CPU,它承擔了所有的計算任務(wù);而操作系統(tǒng)是計算機的管理者,它負責任務(wù)的調(diào)度、資源的分配和管理,統(tǒng)領(lǐng)整個計算機硬件;應(yīng)用程序側(cè)是具有某種功能的程序,程序是運行于操作系統(tǒng)之上的。

進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行的過程,是操作系統(tǒng)進行資源分配和調(diào)度的一個獨立單位,是應(yīng)用程序運行的載體。

進程是一種抽象的概念,從來沒有統(tǒng)一的標準定義。進程一般由程序、數(shù)據(jù)集合和進程控制塊三部分組成。

程序用于描述進程要完成的功能,是控制進程執(zhí)行的指令集;數(shù)據(jù)集合是程序在執(zhí)行時所需要的數(shù)據(jù)和工作區(qū);程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的唯一標志。

進程具有的特征:

動態(tài)性:進程是程序的一次執(zhí)行過程,是臨時的,有生命期的,是動態(tài)產(chǎn)生,動態(tài)消亡的;

并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行;

獨立性:進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位;

結(jié)構(gòu)性:進程由程序、數(shù)據(jù)和進程控制塊三部分組成。

線程

在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。

任務(wù)調(diào)度采用的是時間片輪轉(zhuǎn)的搶占式調(diào)度方式,而進程是任務(wù)調(diào)度的最小單位,每個進程有各自獨立的一塊內(nèi)存,使得各個進程之間內(nèi)存地址相互隔離。

后來,隨著計算機的發(fā)展,對CPU的要求越來越高,進程之間的切換開銷較大,已經(jīng)無法滿足越來越復(fù)雜的程序的要求了。于是就發(fā)明了線程,線程是程序執(zhí)行中一個單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。

一個進程可以有一個或多個線程,各個線程之間共享程序的內(nèi)存空間(也就是所在進程的內(nèi)存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內(nèi)存空間(代碼、數(shù)據(jù)、進程空間、打開的文件)和一個或多個線程組成。

進程與線程的區(qū)別

前面講了進程與線程,但可能你還覺得迷糊,感覺他們很類似。的確,進程與線程有著千絲萬縷的關(guān)系,下面就讓我們一起來理一理:

1.線程是程序執(zhí)行的最小單位,而進程是操作系統(tǒng)分配資源的最小單位;

2.一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執(zhí)行路線;

3.進程之間相互獨立,但同一進程下的各個線程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進程級的資源(如打開文件和信號),某進程內(nèi)的線程在其它進程不可見;

4.調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。

線程與進程關(guān)系的示意圖:

圖2:進程與線程的資源共享關(guān)系

圖3:單線程與多線程的關(guān)系

總之,線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程都可用于實現(xiàn)并發(fā)。

在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。它相當于一個進程里只有一個線程,進程本身就是線程。

所以線程有時被稱為輕量級進程(Lightweight Process,LWP)。

圖4:早期的操作系統(tǒng)只有進程,沒有線程

后來,隨著計算機的發(fā)展,對多個任務(wù)之間上下文切換的效率要求越來越高,就抽象出一個更小的概念——線程,一般一個進程會有多個(也可是一個)線程。

圖5:線程的出現(xiàn),使得一個進程可以有多個線程

多線程與多核

上面提到的時間片輪轉(zhuǎn)的調(diào)度方式說一個任務(wù)執(zhí)行一小段時間后強制暫停去執(zhí)行下一個任務(wù),每個任務(wù)輪流執(zhí)行。很多操作系統(tǒng)的書都說“同一時間點只有一個任務(wù)在執(zhí)行”。那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

其實“同一時間點只有一個任務(wù)在執(zhí)行”這句話是不準確的,至少它是不全面的。那多核處理器的情況下,線程是怎樣執(zhí)行呢?這就需要了解內(nèi)核線程。

多核(心)處理器是指在一個處理器上集成多個運算核心從而提高計算能力,也就是有多個真正并行計算的處理核心,每一個處理核心對應(yīng)一個內(nèi)核線程。

內(nèi)核線程(KernelThread,KLT)就是直接由操作系統(tǒng)內(nèi)核支持的線程,這種線程由內(nèi)核來完成線程切換,內(nèi)核通過操作調(diào)度器對線程進行調(diào)度,并負責將線程的任務(wù)映射到各個處理器上。一般一個處理核心對應(yīng)一個內(nèi)核線程,比如單核處理器對應(yīng)一個內(nèi)核線程,雙核處理器對應(yīng)兩個內(nèi)核線程,四核處理器對應(yīng)四個內(nèi)核線程。

現(xiàn)在的電腦一般是雙核四線程、四核八線程,是采用超線程技術(shù)將一個物理處理核心模擬成兩個邏輯處理核心,對應(yīng)兩個內(nèi)核線程,所以在操作系統(tǒng)中看到的CPU數(shù)量是實際物理CPU數(shù)量的兩倍,如你的電腦是雙核四線程,打開“任務(wù)管理器性能”可以看到4個CPU的監(jiān)視器,四核八線程可以看到8個CPU的監(jiān)視器。

圖6:雙核四線程在Windows8下查看的結(jié)果

超線程技術(shù)就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級并行計算,進而兼容多線程操作系統(tǒng)和軟件,減少了CPU的閑置時間,提高的CPU的運行效率。

這種超線程技術(shù)(如雙核四線程)由處理器硬件的決定,同時也需要操作系統(tǒng)的支持才能在計算機中表現(xiàn)出來。

程序一般不會直接去使用內(nèi)核線程,而是去使用內(nèi)核線程的一種高級接口——輕量級進程(LightWeightProcess,LWP),輕量級進程就是我們通常意義上所講的線程(我們在這稱它為用戶線程),由于每個輕量級進程都由一個內(nèi)核線程支持,因此只有先支持內(nèi)核線程,才能有輕量級進程。

用戶線程與內(nèi)核線程的對應(yīng)關(guān)系有三種模型:一對一模型、多對一模型、多對多模型,在這以4個內(nèi)核線程、3個用戶線程為例對三種模型進行說明。

一對一模型

對于一對一模型來說,一個用戶線程就唯一地對應(yīng)一個內(nèi)核線程(反過來不一定成立,一個內(nèi)核線程不一定有對應(yīng)的用戶線程)。這樣,如果CPU沒有采用超線程技術(shù)(如四核四線程的計算機),一個用戶線程就唯一地映射到一個物理CPU的線程,線程之間的并發(fā)是真正的并發(fā)。一對一模型使用戶線程具有與內(nèi)核線程一樣的優(yōu)點,一個線程因某種原因阻塞時其他線程的執(zhí)行不受影響;此處,一對一模型也可以讓多線程程序在多處理器的系統(tǒng)上有更好的表現(xiàn)。

但一對一模型也有兩個缺點:1.許多操作系統(tǒng)限制了內(nèi)核線程的數(shù)量,因此一對一模型會使用戶線程的數(shù)量受到限制;2.許多操作系統(tǒng)內(nèi)核線程調(diào)度時,上下文切換的開銷較大,導(dǎo)致用戶線程的執(zhí)行效率下降。

7417affa-348a-11eb-a64d-12bb97331649.png

圖7:一對一模型

多對一模型

多對一模型將多個用戶線程映射到一個內(nèi)核線程上,線程之間的切換由用戶態(tài)的代碼來進行,因此相對一對一模型,多對一模型的線程切換速度要快許多;此外,多對一模型對用戶線程的數(shù)量幾乎無限制。但多對一模型也有兩個缺點:1.如果其中一個用戶線程阻塞,那么其它所有線程都將無法執(zhí)行,因為此時內(nèi)核線程也隨之阻塞了;2.在多處理器系統(tǒng)上,處理器數(shù)量的增加對多對一模型的線程性能不會有明顯的增加,因為所有的用戶線程都映射到一個處理器上了。

7430848a-348a-11eb-a64d-12bb97331649.png

圖8:多對一模型

多對多模型

多對多模型結(jié)合了一對一模型和多對一模型的優(yōu)點,將多個用戶線程映射到多個內(nèi)核線程上。多對多模型的優(yōu)點有:1.一個用戶線程的阻塞不會導(dǎo)致所有線程的阻塞,因為此時還有別的內(nèi)核線程被調(diào)度來執(zhí)行;2.多對多模型對用戶線程的數(shù)量沒有限制;3.在多處理器的操作系統(tǒng)中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。

在現(xiàn)在流行的操作系統(tǒng)中,大都采用多對多的模型。

74ae2c32-348a-11eb-a64d-12bb97331649.png

圖9:多對多模型

查看進程與線程

一個應(yīng)用程序可能是多線程的,也可能是多進程的,如何查看呢?在Windows下我們只須打開任務(wù)管理器就能查看一個應(yīng)用程序的進程和線程數(shù)。按“Ctrl+Alt+Del”或右鍵快捷工具欄打開任務(wù)管理器。

查看進程數(shù)和線程數(shù):

74d32168-348a-11eb-a64d-12bb97331649.png

圖10:查看線程數(shù)和進程數(shù)

在“進程”選項卡下,我們可以看到一個應(yīng)用程序包含的線程數(shù)。如果一個應(yīng)用程序有多個進程,我們能看到每一個進程,如在上圖中,Google的chrome瀏覽器就有多個進程。同時,如果打開了一個應(yīng)用程序的多個實例也會有多個進程,如上圖中我打開了兩個cmd窗口,就有兩個cmd進程。如果看不到線程數(shù)這一列,可以在點擊“查看選擇列”菜單,增加監(jiān)聽的列。

查看CPU和內(nèi)存的使用率:

在性能選項卡中,我們可以查看CPU和內(nèi)存的使用率,根據(jù)CPU使用記錄的監(jiān)視器的個數(shù)還能看出邏輯處理核心的個數(shù),如我的雙核四線程的計算機就有四個監(jiān)視器。

圖11:查看CPU和內(nèi)存的使用率

線程的生命周期

當線程的數(shù)量小于處理器的數(shù)量時,線程的并發(fā)是真正的并發(fā),不同的線程運行在不同的處理器上。但當線程的數(shù)量大于處理器的數(shù)量時,線程的并發(fā)會受到一些阻礙,此時并不是真正的并發(fā),因為此時至少有一個處理器會運行多個線程。

在單個處理器運行多個線程時,并發(fā)是一種模擬出來的狀態(tài)。操作系統(tǒng)采用時間片輪轉(zhuǎn)的方式輪流執(zhí)行每一個線程。現(xiàn)在,幾乎所有的現(xiàn)代操作系統(tǒng)采用的都是時間片輪轉(zhuǎn)的搶占式調(diào)度方式,如我們熟悉的Unix、Linux、Windows及MacOSX等流行的操作系統(tǒng)。

我們知道線程是程序執(zhí)行的最小單位,也是任務(wù)執(zhí)行的最小單位。在早期只有進程的操作系統(tǒng)中,進程有五種狀態(tài),創(chuàng)建、就緒、運行、阻塞(等待)、退出。早期的進程相當于現(xiàn)在的只有單個線程的進程,那么現(xiàn)在的多線程也有五種狀態(tài),現(xiàn)在的多線程的生命周期與早期進程的生命周期類似。

圖12:早期進程的生命周期

進程在運行過程有三種狀態(tài):就緒、運行、阻塞,創(chuàng)建和退出狀態(tài)描述的是進程的創(chuàng)建過程和退出過程。

創(chuàng)建:進程正在創(chuàng)建,還不能運行。操作系統(tǒng)在創(chuàng)建進程時要進行的工作包括分配和建立進程控制塊表項、建立資源表格并分配資源、加載程序并建立地址空間;

就緒:時間片已用完,此線程被強制暫停,等待下一個屬于他的時間片到來;

運行:此線程正在執(zhí)行,正在占用時間片;

阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;

退出:進程已結(jié)束,所以也稱結(jié)束狀態(tài),釋放操作系統(tǒng)分配的資源。

圖13:線程的生命周期

創(chuàng)建:一個新的線程被創(chuàng)建,等待該線程被調(diào)用執(zhí)行;

就緒:時間片已用完,此線程被強制暫停,等待下一個屬于他的時間片到來;

運行:此線程正在執(zhí)行,正在占用時間片;

阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;

退出:一個線程完成任務(wù)或者其他終止條件發(fā)生,該線程終止進入退出狀態(tài),退出狀態(tài)釋放該線程所分配的資源。

責任編輯:lq

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

    關(guān)注

    68

    文章

    10899

    瀏覽量

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

    關(guān)注

    37

    文章

    6875

    瀏覽量

    123574
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19720

原文標題:編程思想之多線程與多進程

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    socket 多線程編程實現(xiàn)方法

    是指在同一個進程中運行多個線程,每個線程可以獨立執(zhí)行任務(wù)。線程共享進程的資源,如內(nèi)存空間和文件句柄,但每個
    的頭像 發(fā)表于 11-12 14:16 ?430次閱讀

    一文搞懂Linux進程的睡眠和喚醒

    一、常見的進程狀態(tài)與理解 在操作系統(tǒng)內(nèi)部,專門用來管理進程的結(jié)構(gòu)體,叫做struct task_struct,也稱作進程控制塊(PCB),主要包含描述
    發(fā)表于 11-04 15:15

    Python中多線程和多進程的區(qū)別

    Python作為一種高級編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區(qū)別以及如何使用
    的頭像 發(fā)表于 10-23 11:48 ?455次閱讀
    Python中多<b class='flag-5'>線程</b>和多<b class='flag-5'>進程</b>的區(qū)別

    CPU線程和程序線程的區(qū)別

    CPU的線程與程序的線程在概念、作用、實現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對兩者區(qū)別的詳細闡述,旨在深入探討這一技術(shù)話題。
    的頭像 發(fā)表于 09-02 11:18 ?1116次閱讀

    探索虛擬線程:原理與實現(xiàn)

    虛擬線程的引入與優(yōu)勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現(xiàn)的,這些線程被稱為平臺線程。 然而,平臺
    的頭像 發(fā)表于 06-24 11:35 ?339次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現(xiàn)

    鴻蒙開發(fā):【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務(wù)池)創(chuàng)建任務(wù)或取消任務(wù)、啟動和終止Worker線程
    的頭像 發(fā)表于 06-13 16:38 ?437次閱讀
    鴻蒙開發(fā):【<b class='flag-5'>線程</b>模型】

    一句話讓你理解線程進程

    今天給大家分享一下線程進程,主要包含以下幾部分內(nèi)容:一句話說明線程進程操作系統(tǒng)為什么需要進程為什么要引入
    的頭像 發(fā)表于 06-04 08:04 ?1280次閱讀
    一句話讓你理解<b class='flag-5'>線程</b>和<b class='flag-5'>進程</b>

    java實現(xiàn)多線程的幾種方式

    Java實現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序
    的頭像 發(fā)表于 03-14 16:55 ?767次閱讀

    python中5種線程鎖盤點

    線程安全是多線程或多進程編程中的一個概念,在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機制保證各個
    發(fā)表于 03-07 11:08 ?1648次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤點

    基于RTOS的應(yīng)用進程中的典型線程

    RTOS中的關(guān)鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應(yīng)速度或可預(yù)測性,而不是它在給定時間段內(nèi)可以執(zhí)行的工作量。
    發(fā)表于 03-05 09:32 ?685次閱讀
    基于RTOS的應(yīng)用<b class='flag-5'>進程</b>中的典型<b class='flag-5'>線程</b>

    嵌入式系統(tǒng)中的線程進程與任務(wù)概念與區(qū)別

    每個線程與主程序共用地址空間,受限于2GB地址空間; 2)線程之間的同步和加鎖控制比較麻煩;一個線程的崩潰可能影響到整個程序的穩(wěn)定性
    發(fā)表于 03-04 15:03 ?1437次閱讀
    嵌入式系統(tǒng)中的<b class='flag-5'>線程</b>、<b class='flag-5'>進程</b>與任務(wù)概念與區(qū)別

    什么是動態(tài)線程池?動態(tài)線程池的簡單實現(xiàn)思路

    因此,動態(tài)可監(jiān)控線程池一種針對以上痛點開發(fā)的線程池管理工具。主要可實現(xiàn)功能有:提供對 Spring 應(yīng)用內(nèi)線程池實例的全局管控、應(yīng)用運行時動態(tài)變更線程池參數(shù)以及
    的頭像 發(fā)表于 02-28 10:42 ?682次閱讀

    RTThread中main線程個循環(huán),如果main線程異常退出了,什么辦法可以監(jiān)測到?

    RTThread中main線程個循環(huán),如果main線程異常退出了,什么辦法可以監(jiān)測到?
    發(fā)表于 02-22 08:15

    linux多線程編程實例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?508次閱讀
    linux多<b class='flag-5'>線程</b>編程實例

    線程是什么的基本單位 進程線程的本質(zhì)區(qū)別

    線程是操作系統(tǒng)中處理器調(diào)度的基本單位,它代表著獨立的執(zhí)行流。在一個進程中,可以包含多個線程,這些線程共享相同的進程資源,如內(nèi)存空間、文件描述
    的頭像 發(fā)表于 02-02 16:30 ?987次閱讀
    主站蜘蛛池模板: 日韩内射美女人妻一区二区三区| 被窝伦理午夜电影网| 狠狠综合久久综合88亚洲| 亚洲国产精品免费线观看视频| 极品少妇高潮啪啪无码吴梦 | 农民工老头在出租屋嫖老熟女| gogogo高清在线观看| 羞羞影院男女爽爽影院尤物| 久久久国产精品免费A片3D| 啊灬啊别停灬用力啊老师| 亚洲精品久久久WWW游戏好玩| 男人J放进女人P全黄网站| 国产极品白嫩超清在线观看| 制服的微热| 甜性涩爱在线播放| 老熟女重囗味GRANNYBBW| 国产电影尺度| 最新中文字幕在线视频| 视频成人永久免费看| 麻豆精品国产剧情观看| 国产午夜精品久久久久婷婷| 99久久精品免费看国产一区二区三区| 爽娇妻快高h| 麻豆国产精品va在线观看约| 国产不卡一卡2卡三卡4卡网站 | 把腿张开再深点好爽宝贝动态图 | 久久无码人妻中文国产| 国产99久久久国产精品免费看 | 一本道本线中文无码| 少妇无码太爽了视频在线播放| 老司机亚洲精品影院| 国产亚洲精品久久精品69| 办公室的秘密2中文字幕| 亚洲精品国产在线观看| 洗濯屋H纯肉动漫在线观看| 日韩人妻无码精品-专区| 一区二区视频在线观看高清视频在线 | 牛牛自拍国产免费视频| 国产在线播放不卡| 大学生第一次破女在线观看| 中文字幕无码一区二区免费|