日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍

發(fā)布時(shí)間:2025/3/20 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.什么是線程

  • 在傳統(tǒng)操作系統(tǒng)中,每個(gè)進(jìn)程有一個(gè)地址空間,而且默認(rèn)就有一個(gè)控制線程
  • 進(jìn)程: 劃分空間,加載資源,靜態(tài)的,資源單位
  • 線程: 執(zhí)行代碼,執(zhí)行能力,動(dòng)態(tài)的,執(zhí)行單位
  • 進(jìn)程只是用來(lái)把資源集中到一起(進(jìn)程只是一個(gè)資源單位,或者說(shuō)資源集合),而線程才是cpu上的執(zhí)行單位
  • 線程是依賴于進(jìn)程,一個(gè)進(jìn)程可以包含多個(gè)線程,但是一定有一個(gè)主線程.線程才是CPU執(zhí)行的最小單元
  • 多進(jìn)程: 同一時(shí)刻開(kāi)啟多個(gè)進(jìn)程并發(fā)/并行的執(zhí)行
  • 多線程: 同一時(shí)刻開(kāi)啟多個(gè)線程并發(fā)/并行的執(zhí)行

二.線程與進(jìn)程的區(qū)別

  • 線程共享創(chuàng)建它的進(jìn)程的地址空間; 進(jìn)程有自己的地址空間
  • 線程可以直接訪問(wèn)其進(jìn)程的數(shù)據(jù)段(同進(jìn)程內(nèi)數(shù)據(jù)共享); 進(jìn)程有自己的父進(jìn)程數(shù)據(jù)段副本(數(shù)據(jù)隔離)
  • 線程可以直接與其進(jìn)程的其他線程通信;進(jìn)程必須使用進(jìn)程間通信與兄弟進(jìn)程通信
  • 新線程很容易創(chuàng)建(創(chuàng)建的開(kāi)銷很少,速度很快);新進(jìn)程需要父進(jìn)程的重復(fù)(需要開(kāi)辟空間,復(fù)制資源,開(kāi)銷比開(kāi)啟線程多10-100倍)
  • 線程可以對(duì)同一進(jìn)程的線程進(jìn)行相當(dāng)大的控制; 進(jìn)程只能對(duì)子進(jìn)程進(jìn)行控制
  • 對(duì)主線程的更改(取消、優(yōu)先級(jí)更改等)可能會(huì)影響進(jìn)程的其他線程的行為; 對(duì)父進(jìn)程的更改不會(huì)影響子進(jìn)程.

三. 為什么要使用多線程

多線程指的是,在一個(gè)進(jìn)程中開(kāi)啟多個(gè)線程,簡(jiǎn)單的講: 如果多個(gè)任務(wù)共用一塊地址空間,那么必須在一個(gè)進(jìn)程內(nèi)開(kāi)啟多個(gè)線程.詳細(xì)的講分為4點(diǎn):

  • 多線程共享一個(gè)進(jìn)程的地址空間
  • 線程比進(jìn)程更輕量級(jí),線程比進(jìn)程更容易創(chuàng)建和撤銷,在許多操作系統(tǒng)中,創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程要快10-100倍,在有大量線程需要?jiǎng)討B(tài)和快速修改時(shí),這一特性很有用
  • 若多個(gè)線程都是cpu密集型的,那么并不能獲得性能上的增強(qiáng),但是如果存在大量的計(jì)算和大量的I/O處理,擁有多個(gè)線程允許這些活動(dòng)彼此重疊運(yùn)行,從而會(huì)加快程序執(zhí)行的速度.
  • 在多cpu系統(tǒng)中,為了最大限度的利用多核,可以開(kāi)啟多個(gè)線程,比開(kāi)進(jìn)程開(kāi)銷要小的多.(這一條并不適用于python)

四.多線程的應(yīng)用

例如:

開(kāi)啟一個(gè)文字處理軟件進(jìn)程,該進(jìn)程肯定需要辦不止一件事情,比如監(jiān)聽(tīng)鍵盤輸入,處理文字,定時(shí)自動(dòng)將文字保存到硬盤,這三個(gè)任務(wù)操作的都是同一塊數(shù)據(jù),因而不能用多進(jìn)程.只能在一個(gè)進(jìn)程里并發(fā)地開(kāi)啟三個(gè)線程,如果是單線程,那就只能是: 鍵盤輸入時(shí),不能處理文字和自動(dòng)保存,自動(dòng)保存時(shí)又不能輸入和處理文字.所以要使用多線程

五. 經(jīng)典的線程模型

  • 多個(gè)線程共享同一個(gè)進(jìn)程的地址空間中的資源,是對(duì)一臺(tái)計(jì)算機(jī)上多個(gè)進(jìn)程的模擬,有時(shí)也稱線程為輕量級(jí)的進(jìn)程
  • 而對(duì)一臺(tái)計(jì)算機(jī)上多個(gè)進(jìn)程,則共享物理內(nèi)存、磁盤、打印機(jī)等其他物理資源
  • 多線程的運(yùn)行也與多進(jìn)程的運(yùn)行類似,是cpu在多個(gè)線程之間的快速切換
  • 不同的進(jìn)程之間是充滿敵意的,彼此是搶占,競(jìng)爭(zhēng)cpu的關(guān)系,如迅雷會(huì)和QQ搶資源.而同一個(gè)進(jìn)程內(nèi)的線程是合作關(guān)系,一個(gè)線程可以訪問(wèn)另外一個(gè)線程的內(nèi)存地址
  • 類似于進(jìn)程,每個(gè)線程也有自己的堆棧
  • 不同于進(jìn)程,線程庫(kù)無(wú)法利用時(shí)鐘中斷強(qiáng)制線程讓出CPU,可以調(diào)用thread_yield使運(yùn)行線程自動(dòng)放棄cpu,讓另外一個(gè)線程運(yùn)行
  • 線程通常是有益的,但是帶來(lái)了不小程序設(shè)計(jì)難度,線程的問(wèn)題是:
    1父進(jìn)程有多個(gè)線程,那么開(kāi)啟的子線程是否需要同樣多的線程
    2在同一個(gè)進(jìn)程中,如果一個(gè)線程關(guān)閉了文件,而另外一個(gè)線程正準(zhǔn)備往該文件內(nèi)寫內(nèi)容呢

六. PO SIX線程

為了實(shí)現(xiàn)可移植的線程程序,IEEE在IEEE標(biāo)準(zhǔn)1003.1c中定義了線程標(biāo)準(zhǔn),它定義的線程包叫Pthread.大部分UNIX系統(tǒng)都支持該標(biāo)準(zhǔn),簡(jiǎn)單介紹如下

線程調(diào)用描述
Pthread_create創(chuàng)建一個(gè)新線程
Pthread_exit結(jié)束調(diào)用的線程
Pthread_join等待一個(gè)特定的線程退出
Pthread_yield釋放CPU來(lái)運(yùn)行另外一個(gè)線程
Pthread_attr_init創(chuàng)建并初始化一個(gè)線程的屬性結(jié)構(gòu)
Pthread_attr_destroy刪除一個(gè)線程的屬性結(jié)構(gòu)

七. 在用戶空間實(shí)現(xiàn)的線程

線程的實(shí)現(xiàn)可以分為兩類: 用戶級(jí)線程(User-Level Thread)和內(nèi)核級(jí)線程(Kernel-Level Thread),后者又稱為內(nèi)核支持的線程或輕量級(jí)進(jìn)程.在多線程操作系統(tǒng)中,各個(gè)系統(tǒng)的實(shí)現(xiàn)方式并不相同,在有的系統(tǒng)中實(shí)現(xiàn)了用戶級(jí)線程,有的系統(tǒng)中實(shí)現(xiàn)了內(nèi)核級(jí)線程.用戶級(jí)線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換,不需要內(nèi)核干涉,少了進(jìn)出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu,目前Linux Pthread大體是這么做的.

在用戶空間模擬操作系統(tǒng)對(duì)進(jìn)程的調(diào)度,來(lái)調(diào)用一個(gè)進(jìn)程中的線程,每個(gè)進(jìn)程中都會(huì)有一個(gè)運(yùn)行時(shí)系統(tǒng),用來(lái)調(diào)度線程.此時(shí)當(dāng)該進(jìn)程獲取cpu時(shí),進(jìn)程內(nèi)再調(diào)度出一個(gè)線程去執(zhí)行,同一時(shí)刻只有一個(gè)線程執(zhí)行.

八. 在內(nèi)核空間實(shí)現(xiàn)的線程

內(nèi)核級(jí)線程: 切換由內(nèi)核控制,當(dāng)線程進(jìn)行切換的時(shí)候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài).切換完畢要從內(nèi)核態(tài)返回用戶態(tài); 可以很好的利用smp,即利用多核cpu.windows線程就是這樣的

九. 用戶級(jí)與內(nèi)核級(jí)線程的對(duì)比

區(qū)別:

  • 內(nèi)核級(jí)線程是OS內(nèi)核可感知的,而用戶級(jí)線程是OS內(nèi)核不可感知的
  • 用戶級(jí)線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語(yǔ)言(如Java)這一級(jí)處理的; 而內(nèi)核級(jí)線程的創(chuàng)建、撤消和調(diào)度都需OS內(nèi)核提供支持,而且與進(jìn)程的創(chuàng)建、撤消和調(diào)度大體是相同的
  • 用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí),只導(dǎo)致該線程被中斷
  • 在只有用戶級(jí)線程的系統(tǒng)內(nèi),CPU調(diào)度還是以進(jìn)程為單位,處于運(yùn)行狀態(tài)的進(jìn)程中的多個(gè)線程,由用戶程序控制線程的輪換運(yùn)行; 在有內(nèi)核級(jí)線程的系統(tǒng)內(nèi),CPU調(diào)度則以線程為單位,由OS的線程調(diào)度程序負(fù)責(zé)線程的調(diào)度
  • 用戶級(jí)線程的程序?qū)嶓w是運(yùn)行在用戶態(tài)下的程序,而內(nèi)核級(jí)線程的程序?qū)嶓w則是可以運(yùn)行在任何狀態(tài)下的程序

內(nèi)核線程的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn): 當(dāng)有多個(gè)處理機(jī)時(shí),一個(gè)進(jìn)程的多個(gè)線程可以同時(shí)執(zhí)行
  • 缺點(diǎn): 由內(nèi)核進(jìn)行調(diào)度

用戶線程的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 線程的調(diào)度不需要內(nèi)核直接參與,控制簡(jiǎn)單
  • 可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)
  • 創(chuàng)建和銷毀線程、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多
  • 允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活
  • 線程能夠利用的表空間和堆棧空間比內(nèi)核級(jí)線程多

缺點(diǎn):

  • 資源調(diào)度按照進(jìn)程進(jìn)行,多個(gè)處理機(jī)下,同一個(gè)進(jìn)程中的線程只能在同一個(gè)處理機(jī)下分時(shí)復(fù)用

混合實(shí)現(xiàn)

  • 用戶級(jí)與內(nèi)核級(jí)的多路復(fù)用,內(nèi)核統(tǒng)一調(diào)度內(nèi)核線程,每個(gè)內(nèi)核線程對(duì)應(yīng)n個(gè)用戶線程

結(jié)尾給大家推薦一個(gè)非常好的學(xué)習(xí)教程,希望對(duì)你學(xué)習(xí)Python有幫助!

Python基礎(chǔ)入門教程推薦:更多Python視頻教程-關(guān)注B站:Python學(xué)習(xí)者
https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web

Python爬蟲(chóng)案例教程推薦:更多Python視頻教程-關(guān)注B站:Python學(xué)習(xí)者
https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web

總結(jié)

以上是生活随笔為你收集整理的什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。