在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

一文深入淺出了解進程和線程

如意 ? 來源:CSDN ? 作者:Peter盼 ? 2020-06-20 10:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

No.1

執行流

這里先說一說執行流,有助于線程的理解。

程序計數器中的下一條指令地址組成的軌跡稱為程序的執行流。執行流是邏輯上獨立的指令區域,是人為給處理器安排的處理單元。指令指導處理器的執行方向,從處理器的角度看,執行的指令形成一條路徑,稱為執行流。執行流可大可小,可以是整個程序文件,也可以是一個函數。

一個代碼段想要突然去執行另外一個代碼段的指令,比如call指令或者因中斷去執行中斷處理程序,只要先將調用前或中斷前的上下文環境保存好就可以在iret或中斷返回后繼續執行原代碼段的指令。所以說當我們為任何一段指令提供它所需要的上下文環境,那么這段指令就可以在獨立的上CPU運行,也就是說這段指令成為了一個單獨的執行流。這里說的上下文環境指的是指令所使用的寄存器映像、棧、內存等資源。可以獨立在CPU上運行的代碼段,哪怕被中斷也可以返回繼續執行,因為它所需要的資源得到了維護。

在任務調度器的眼里,執行流是調度單元,即處理器上運行的每個任務都是調度器分配的執行流。換句話說,實現任務調度,就是換不同的執行流在CPU上運行。我們要說的線程就是一個執行流。進程和線程有很多相似的地方,當一個進程中只有一個線程時,我們稱之為單線程進程,它比線程就只多了處理的資源。我們可以認為線程和進程都是由執行流實現的。

No.2

線程

回想創建線程的過程,我們先聲明并定義一個函數作為線程的處理函數,該函數的返回值為void*參數也是void*,然后調用pthread_create()函數創建線程。可以理解為線程就是去執行一個函數,但線程和普通的函數的區別在于線程擁有獨立的上下文環境成為了獨立的執行流,也就成為了獨立的調度單元,可以獨立在CPU上運行。在一般的函數調用中,函數隨著程序的執行流被順便執行。給每個執行流分配的時間是有限的,一個普通函數要等到該它運行的時候才可以在CPU上運行,前面有再多的函數它都要等著,還沒有到它運行的時候可能該執行流就被換下CPU了。而線程則因為成了單獨的執行流,可以獨自享用分配的CPU時間,這才是線程真正優勢的地方。

只有理解了線程的優勢,在使用線程的時候才能恰到好處,現在再回想自己寫的多線程程序是否真的需要使用多線程。將要處理的單獨一類事件放在一個執行流等待就好了,沒有必要寫成多線程,在調度器調度的時候反而會花費額外的時間。

線程是一套機制,給一段代碼塊構建它依賴的上下文環境,從而讓代碼塊稱為單獨的執行流,也就成為了調度器的調度單元可以直接在CPU運行。

線程中調用的函數讓所運行的函數以調度單元的身份獨立運行在CPU上,當函數運行時,可以讓程序中多個函數(執行流)以偽并行的方式運行,為程序提速。

No.3

線程與進程

進程是運行中的程序。對于處理器來說,進程是執行流的集合,至少包含一個執行流,執行流之間相互獨立,但它們共享進程的所有資源。

Linux早期版本(Linux 0.11),其中并沒有操作系統書籍說到的有關線程的代碼,比如thread_info結構體和創建線程的函數。那時CPU調度的單元是進程,進程就是各個執行流(調度單元),這里想說明的是進程和線程都是概念上的。在線程出現之前依然能夠實現并發處理,線程在進程的基礎上實現了二次并發,目的是提高效率。進程與線程的區別,一個是上面所說的進程中可以有多個線程。第二個就是線程沒有自己的資源,沒有自己的地址空間,必須要依附于進程的地址空間中才可以運行。

No.4

進程線程的狀態

上面說了進程和線程是概念上的,真正實現時都是人為創造的代碼塊,因此執行流的狀態也是人為劃分的。比如因為有的線程在讀寫磁盤時需要等待,那么就需要該線程為阻塞狀態,當線程可以上CPU運行時該線程就叫就緒態,在CPU運行時就稱為運行態。在有其他需求的時候可能還會由別的狀態出現,只要合理就可以,說明狀態都是因為某種需求而出現的,然后當狀態滿足后就說明線程符合了某些條件,比如線程由阻塞態變為就緒態說明現在線程可能正在等待的資源已經等到了可以上CPU運行了。

No.5

程序控制塊PCB

PCB(Process Control Block)是進程的身份證,記錄了與進程相關的所有信息,比如進程狀態、PID、優先級等。每個進程都有自己的一個PCB。所有PCB放到一張表格中維護,就是進程表,調度器根據這張表選擇上處理器運行的進程。PCB的內容取決于操作系統功能的復雜程度。PCB可以確定處理器要執行的任務,記錄程序運行時所需要的數據資源、給任務分配的時間大小、上下文信息的存儲地址、進程狀態、進程地址空間等信息。

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

    關注

    0

    文章

    507

    瀏覽量

    20119
  • 進程
    +關注

    關注

    0

    文章

    207

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入淺出解析低功耗藍牙協議棧

    深入Bluetooth LE協議棧各個組成部分之前,我們先看下Bluetooth LE協議棧整體架構。 如上圖所述,要實現個Bluetooth LE應用,首先需要個支持Bluet
    的頭像 發表于 04-09 14:49 ?450次閱讀
    <b class='flag-5'>深入淺出</b>解析低功耗藍牙協議棧

    進程線程、協程傻傻分不清?帶你徹底扒光它們的\"底褲\"!

    它們就像程序界的「三國演義」: 進程:曹魏政權(獨占資源,穩如老狗) 線程:孫劉聯軍(共享資源,相愛相殺) 協程:諸葛亮北伐(人帶十軍,靠的是「空城計」) 第章:
    發表于 03-26 09:27

    《零基礎開發AI Agent——手把手教你用扣子做智能體》

    《零基礎開發AI Agent——手把手教你用扣子做智能體》是本為普通人量身打造的AI開發指南。它不僅深入淺出地講解了Agent的概念和發展,還通過詳細的工具介紹和實戰案例,幫助讀者快速掌握
    發表于 03-18 12:03

    請問如何在Python中實現多線程與多進程的協作?

    大家好!我最近在開發個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程和多進程的組合來實現并發,但遇到了些問題。 具體來說,我有兩個任務,
    發表于 03-11 06:57

    深入解析Linux程序與進程

    什么是程序 組計算機能識別和執行的指令,用于指導計算機執行特定任務或解決特定問題。程序通常由代碼、數據和資源文件組成,涉及語法、算法和數據結構。為二進制文件 什么是進程個具有獨立功能的程序
    的頭像 發表于 12-18 11:01 ?440次閱讀
    <b class='flag-5'>深入</b>解析Linux程序與<b class='flag-5'>進程</b>

    掌握基礎電路,嵌入式開發深入淺出

    1. 電路知識 1.1.?驅動能力 IC是數字邏輯芯片,其輸出的是邏輯電平。邏輯電平0表示輸出電壓低于閾值電壓,邏輯1表示輸出電壓高于閾值電壓。負載則是被驅動的電路或元件,負載大小則指負載的電阻大小。 驅動能力主要表現在幾個方面: 負載能力:負載過大表現為外部負載的阻值過小,在電壓不變的情況下,過小的阻值會導致電流過大,可能會燒壞器件。負載過小,表現為外部負載的阻值達大,在電壓不變的情況下,過大的阻值會導致電流過小,信
    的頭像 發表于 12-03 10:36 ?848次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>掌握基礎電路,嵌入式開發<b class='flag-5'>深入淺出</b>

    深入淺出RISC-V調試

    、JTAG簡介 目前RISC-V官方支持的調試方式是JTAG(Joint Test Action Group),而ARM支持的調試方式有JTAG和SWD(Serial Wire Debug)這兩種
    發表于 11-28 22:00

    socket 多線程編程實現方法

    是指在同進程中運行多個線程,每個線程可以獨立執行任務。線程共享進程的資源,如內存空間和文件句
    的頭像 發表于 11-12 14:16 ?947次閱讀

    搞懂Linux進程的睡眠和喚醒

    。通過PPID,可以追蹤進程的來源,并了解進程之間的關系。 在PCB中記錄的進程狀態,不過是些整數,這個整數是多少就代表
    發表于 11-04 15:15

    Python中多線程和多進程的區別

    Python作為種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之。在本文中,我們將探討Python中多線程
    的頭像 發表于 10-23 11:48 ?959次閱讀
    Python中多<b class='flag-5'>線程</b>和多<b class='flag-5'>進程</b>的區別

    深入了解PCI轉XMC載板轉接卡

    電子發燒友網站提供《深入了解PCI轉XMC載板轉接卡.docx》資料免費下載
    發表于 09-06 14:35 ?0次下載

    CPU線程和程序線程的區別

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

    深入探討Linux的進程調度器

    Linux操作系統作為個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個
    的頭像 發表于 08-13 13:36 ?1233次閱讀
    <b class='flag-5'>深入</b>探討Linux的<b class='flag-5'>進程</b>調度器

    深入淺出系列之代碼可讀性

    原創聲明:該文章是個人在項目中親歷后的經驗總結和分享,如有搬運需求請注明出處。 這是“深入淺出系列”文章的第篇,主要記錄和分享程序設計的些思想和方法論,如果讀者覺得所有受用,還請“
    的頭像 發表于 08-09 16:00 ?481次閱讀

    掌握Python多線程

    使用線程可以把占據長時間的程序中的任務放到后臺去處理。
    的頭像 發表于 08-05 15:46 ?1216次閱讀
    主站蜘蛛池模板: 天堂网最新| 亚洲成网站| 亚洲成熟 | a天堂影院 | 美女被视频网站在线看九色 | 亚洲第一区二区快射影院 | 日本免费高清 | 在线伊人网 | 亚洲精品福利视频 | 57pao成人永久免费视频 | 性夜影院爽黄a爽在线看香蕉 | 天天摸夜夜添夜夜添国产 | 亚洲深爱 | 国产二三区 | 午夜小影院 | 超级乱淫视频播放日韩 | 欧美猛妇色xxxxxbbbb | 男人日女人视频免费看 | 天堂资源最新版在线官网 | 午夜激情啪啪 | 日韩亚洲人成在线综合 | 综合欧美一区二区三区 | 性生活毛片| 成人精品一区二区不卡视频 | 欧美熟色妇 | 国产色产综合色产在线观看视频 | 久久青草91免费观看 | 欧美最猛黑人xxxx黑人猛交黄 | 日本一区二区三区欧美在线观看 | 亚洲free| 国产精品视频第一区二区三区 | 五月婷婷六月丁香激情 | 欧美极品色影院 | 亚洲色图图片专区 | 亚洲精品老司机综合影院 | 痴女中文字幕在线视频 | 国产女人水多白浆 | 国模大胆一区二区三区 | 中文字幕一区二区三区乱码aⅴ | 又粗又大又爽又色又过瘾视频 | 欧美日韩在线成人免费 |