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

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

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

3天內不再提示

進程和線程的區別

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-11 16:46 ? 次閱讀

1.什么是進程?為什么要有進程?

進程有一個相當精簡的解釋:進程是對操作系統上正在運行程序的一個抽象。

這個概念確實挺抽象,仔細想想卻也挺精準。

我們平常使用計算機,都會在同一時間做許多事,比如邊看電影,邊微信聊天,順便打開瀏覽器百度搜索一下,我們所做的這么多事情背后都是一個個正在運行中的軟件程序;這些軟件想要運行起來,首先在磁盤上需要有各自的程序代碼,然后將代碼加載到內存中,CPU會去執行這些代碼,運行中會產生很多數據需要存放,也可能需要和網卡、顯卡、鍵盤等外部設備交互,這背后其實就涉及到程序對計算機資源的使用,存在這么多程序,我們當然需要想辦法管理程序資源的使用。并且CPU如果只有一個,那么還需要操作系統調度CPU分配給各個程序使用,讓用戶感覺這些程序在同時運行,不影響用戶體驗。

理所當然,操作系統會把每個運行中的程序封裝成獨立的實體,分配各自所需要的資源,再根據調度算法切換執行。這個抽象程序實體就是進程。

所以很多對進程的官方解釋中都會提到:進程是操作系統進行資源分配和調度的一個基本單位。

2.什么是線程?為什么要有線程?

在早期的操作系統中并沒有線程的概念,進程是擁有資源和獨立運行的最小單位,也是程序執行的最小單位。任務調度采用的是時間片輪轉的搶占式調度方式,而進程是任務調度的最小單位,每個進程有各自獨立的內存空間,使得各個進程之間內存地址相互隔離。

后來,隨著計算機行業的發展,程序的功能設計越來越復雜,我們的應用中同時發生著多種活動,其中某些活動隨著時間的推移會被阻塞,比如網絡請求、讀寫文件(也就是IO操作),我們自然而然地想著能不能把這些應用程序分解成更細粒度、能 準并行運行 多個順序執行實體,并且這些細粒度的執行實體可以共享進程的地址空間,也就是可以共享程序代碼、數據、內存空間等,這樣程序設計模型會變得更加簡單。

其實很多計算機世界里的技術演變,都是模擬現實世界。比如我們把一個進程當成一個項目,當項目任務變得復雜時,自然想著能不能將項目按照業務、產品、工作方向等分成一個個任務模塊,分派給不同人員各自并行完成,再按照某種方式組織起各自的任務成果,最終完成項目。

需要多線程還有一個重要的理由就是:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器,線程之間切換的開銷小。所以線程的創建、銷毀、調度性能遠遠優于進程。

在引入多線程模型后,進程和線程在程序執行過程中的分工就相當明確了,進程負責分配和管理系統資源,線程負責CPU調度運算,也是CPU切換時間片的最小單位。對于任何一個進程來講,即便我們沒有主動去創建線程,進程也是默認有一個主線程的。

3.它們在Linux內核中實現方式有何不同?

在Linux 里面,無論是進程,還是線程,到了內核里面,我們統一都叫任務(Task),由一個統一的結構 task_struct 進行管理,這個task_struct 數據結構非常復雜,囊括了進程管理生命周期中的各種信息

圖片

在Linux操作系統內核初始化時會創建第一個進程,即0號創始進程。隨后會初始化1號進程(用戶進程祖宗:/usr/lib/systemd/systemd),2號進程(內核進程祖宗:[kthreadd]),其后所有的進程線程都是在他們的基礎上fork出來的。

圖片

圖片

我們一般都是通過fork系統調用來創建新的進程,fork 系統調用包含兩個重要的事件,一個是將 task_struct 結構復制一份并且初始化,另一個是試圖喚醒新創建的子進程。

我們說無論是進程還是線程,在內核里面都是task,管起來不是都一樣嗎?到底如何區分呢?其實,線程不是一個完全由內核實現的機制,它是由內核態和用戶態合作完成的。

創建進程的話,調用的系統調用是 fork,會將五大結構 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct 都復制一遍,從此父進程和子進程各用各的數據結構。而創建線程的話,調用的是系統調用 clone,五大結構僅僅是引用計數加一,也即線程共享進程的數據結構。

4.所以它們到底有哪些區別?

功能:進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位

開銷:每個進程都有獨立的內存空間,存放代碼和數據段等,程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,共享內存空間,每個線程都有自己獨立的運行棧和程序計數器,線程之間切換的開銷小。

運行環境:在操作系統中能同時運行多個進程;而在同一個進程(程序)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)

創建過程:在創建新進程的時候,會將父進程的所有五大數據結構復制新的,形成自己新的內存空間數據,而在創建新線程的時候,則是引用進程的五大數據結構數據,但是線程會有自己的私有數據、棧空間。

進程和線程其實在cpu看來都是task_struct結構的一個封裝,執行不同task即可,而且在cpu看來就是在執行這些task時候遵循對應的調度策略以及上下文資源切換定義,包括寄存器地址切換,內核棧切換。所以對于cpu而言,進程和線程是沒有區別的。

附:我們通常所說的上下文切換具體指什么?

操作系統抽象出一個進程的概念,讓應用程序專心于實現自己的業務邏輯既可,對應用程序屏蔽了CPU調度、內存管理等硬件細節,而且在有限的CPU上可以“同時”進行許多個任務。但是它為用戶帶來方便的同時,也引入了一些額外的開銷。

在操作系統中,由于CPU的時間片調度策略,從一個進程切換到另一個進程需要保存當前進程的狀態并恢復另一個進程的狀態:當前運行任務轉為就緒(或者掛起、刪除)狀態,另一個被選定的就緒任務成為當前任務。上下文切換包括保存當前任務的運行環境,恢復將要運行任務的運行環境。

在上下文切換過程中,CPU會停止處理當前運行的程序,并保存當前程序運行的具體位置以便之后繼續運行。從這個角度來看,上下文切換有點像我們同時閱讀幾本書,在來回切換書本的同時我們需要記住每本書當前讀到的頁碼。

在三種情況下可能會發生上下文切換:中斷處理,多任務處理,內核/用戶態切換。

在中斷處理中,其他程序”打斷”了當前正在運行的程序。當CPU接收到中斷請求時,會在正在運行的程序和發起中斷請求的程序之間進行一次上下文切換。

在多任務處理中,CPU會在不同程序之間來回切換,每個程序都有相應的處理時間片,CPU在兩個時間片的間隔中進行上下文切換。

在Linux中進行內核/用戶態切換也會進行上下文切換,進行系統調用時,CPU寄存器里原來用戶態的指令位置需要先保存起來。接著,為了執行內核態代碼,CPU寄存器需要更新為內核態指令的新位置。最后才是跳轉到內核態運行內核任務。而系統調用結束后,CPU寄存器需要恢復原來保存的用戶態,然后再切換到用戶空間,繼續運行進程,所以一次系統調用的過程,其實是發生了兩次CPU上下文切換。

CPU上下文切換,是保證Linux系統正常工作的核心功能之一,一般情況下不需要我們特別關注。

但過多的上下文切換,會把CPU時間消耗在寄存器、內核棧以及虛擬內存等數據的保存和恢復上,從而縮短進程真正運行的時間,導致系統的整體性能大幅下降。

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

    關注

    68

    文章

    10873

    瀏覽量

    212038
  • 操作系統
    +關注

    關注

    37

    文章

    6838

    瀏覽量

    123389
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19702
  • 進程
    +關注

    關注

    0

    文章

    203

    瀏覽量

    13964
收藏 人收藏

    評論

    相關推薦

    進程線程的概念及其區別

    今天浩道跟大家分享一篇關于進程線程之間關聯的硬核干貨,看看大神如何通過通俗易懂的圖文,讓大家更加深刻理解進程線程區別
    的頭像 發表于 11-21 10:50 ?929次閱讀
    <b class='flag-5'>進程</b>和<b class='flag-5'>線程</b>的概念及其<b class='flag-5'>區別</b>

    #硬聲創作季 程序員知識:【進程管理】進程線程區別

    計算機原理cpu/soc
    Mr_haohao
    發布于 :2022年09月16日 19:19:55

    Java語言核心基礎語法325-進程線程區別

    JAVA
    電子學習
    發布于 :2023年01月16日 16:00:48

    進程線程區別

    線程是指進程內的一個執行單元,也是進程內的可調度實體.與進程區別:(1)地址空間:進程內的一個
    發表于 12-12 09:28

    進程線程區別

    `1、進程線程區別和聯系進程(process)和線程(thread)是操作系統的基本概念,但是它們比較抽象,不容易掌握。計算機的核心是C
    發表于 11-30 14:06

    進程線程區別和聯系介紹

    發生了變化:它只是資源分配的單位,而不再是調度運行的單位 。在微內核系統中,真正調度運行的基本單位是線程。因此,實現并發功能的單位是線程線程概念   線程
    發表于 07-04 00:18

    Linux進程線程區別是什么?

    Linux進程線程區別是什么為什么要使用線程線程操作的函數
    發表于 03-11 06:13

    進程線程區別在哪?

    1、進程線程區別:1. 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;2. 一個進程
    發表于 07-07 06:53

    進程線程區別是什么

    有了提前批的失敗經驗,接下來不斷的總結鞏固和修正錯誤,這次發揮要比上次要好很多。一面(電話面)自我介紹進程線程區別線程同步和通信鎖機制以及死鎖條件和預防TCP/IP協議的一些基礎知識C++的構造
    發表于 12-23 07:28

    進程線程區別和聯系

    進程(process)和線程(thread)是操作系統的基本概念,但是它們比較抽象,不容易掌握。 最近,我讀到一篇材料,發現有一個很好的類比,可以把它們解釋地清晰易懂。 1、計算機的核心是 CPU
    的頭像 發表于 12-05 18:22 ?1052次閱讀

    進程切換與線程切換有啥區別

    注意這個題目問的是進程**切換**與線程**切換**的區別,不是進程線程區別。當然這里的**
    的頭像 發表于 02-24 14:16 ?589次閱讀

    進程線程區別

    每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程
    的頭像 發表于 05-09 11:06 ?6034次閱讀
    <b class='flag-5'>進程</b>和<b class='flag-5'>線程</b>的<b class='flag-5'>區別</b>

    程序中進程線程區別

    什么是進程 1、進程線程區別 進程是指正在運行的程序,它擁有獨立的內存空間和系統資源,不同進程
    的頭像 發表于 06-22 11:39 ?679次閱讀
    程序中<b class='flag-5'>進程</b>和<b class='flag-5'>線程</b>的<b class='flag-5'>區別</b>

    進程線程區別以及優缺點

    進程線程 1、什么是進程線程,有什么區別進程是資源(CPU、內存等)分配的基本單位,
    的頭像 發表于 07-21 11:02 ?1390次閱讀

    嵌入式進程線程區別

    需要進行大量計算的優先使用線程 所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。這種原則最常見的是圖像處理、算法處理。
    發表于 09-04 10:05 ?490次閱讀
    嵌入式<b class='flag-5'>進程</b>和<b class='flag-5'>線程</b>的<b class='flag-5'>區別</b>
    主站蜘蛛池模板: 伊人久久大香线蕉综合影| 4虎最新地址| 欧美日本俄罗斯一级毛片| 欧美男人天堂网| 欧美老汉色| 看久久| 国产精品1区2区3区在线播放| 国产色综合天天综合网| 五月婷婷六月丁香在线| 奇米影视四色7777| 久久久久大香线焦| 天天综合欧美| se视频在线观看| 午夜合集| 夜夜夜网| 国产精品李雅在线观看| 欧美性久久| 口述他拿舌头进去我下面好爽| 视频免费黄色| 一级做a爰片久久毛片免费| 亚洲人成人| 淫www| 手机免费黄色网址| 久久怡红院国产精品| 高清色本在线www| 丁香六月婷婷七月激情| 午夜视频在线观看国产www| 在线视频影院| 爱爱免费网站| 爱爱免费小视频| 手机在线看片国产| 欧美夜夜| 好黄好硬好爽好刺激| 中文字幕在线播放第一页| 日韩毛片在线| 成年大片免费视频播放手机不卡 | 成人aaa| 午夜视频网址| 天天久久影视色香综合网| 精品乩伦视频| 国产91小视频在线观看|