Linux --- 進程

一、進程概念

在 Linux 系統中,??進程(Process)?? 是程序執行的動態實例,是操作系統進行資源分配和調度的基本單位。
??1. 程序 vs 進程??
??程序(Program)??:是靜態的代碼集合(如二進制可執行文件 /bin/ls),存儲在磁盤上,不占用系統資源(如 CPU、內存)。
??進程(Process)??:是程序被加載到內存后??動態運行??的狀態,是操作系統管理的“活”的實體。同一程序可被多次執行,生成多個獨立的進程(如同時打開多個 bash 終端)。

二、進程的核心特性

??1. 動態性??:進程是程序執行的動態過程,有生命周期(創建→運行→終止)。
??2. 并發性??:多個進程可在同一時間段內交替運行(宏觀并行,微觀串行),由操作系統調度實現。
??3. 獨立性??:每個進程擁有獨立的資源空間(如內存、文件句柄),通過內核隔離,一個進程崩潰不影響其他進程(除非涉及共享資源)、一個進程也無法直接訪問其他進程內存的資源。
??4. 異步性??:進程的執行順序由操作系統調度決定,具有不確定性(受優先級、資源競爭等因素影響)。

三、進程狀態與切換

Linux 進程的狀態反映了其當前的活動情況,常見狀態包括:
在這里插入圖片描述
狀態轉換示例??:

  1. 新進程通過 fork() 創建 → 進入 R(就緒)或直接運行(若 CPU 空閑)。
  2. 進程因 I/O 請求進入 S(可中斷睡眠),I/O 完成后被喚醒回 R。
  3. 進程收到 SIGKILL 信號 → 強制終止,釋放資源(避免變為僵尸)。
  4. 父進程未調用 wait() 回收子進程 → 子進程終止后變為 Z(僵尸)。

四、進程的描述:進程控制塊(PCB)??

Linux 內核通過 ??task_struct 結構體??(進程控制塊,PCB)描述進程的所有信息,存儲于內核內存中。關鍵字段包括:

??1. 標識信息??:進程 ID(PID,進程的唯一標識)、父進程 ID(PPID)、用戶 ID(UID)、組 ID(GID)。
2. ??狀態信息??:當前狀態(如 R/S/Z)、退出狀態碼(終止原因)。
??3. 資源信息??:虛擬內存映射(mm_struct)、打開的文件描述符表(files_struct)、信號處理方式(signal_struct)。
??4. 調度信息??:優先級(nice 值)、CPU 占用時間(utime/stime)、調度策略(如 CFS 公平調度)。
??5. 上下文信息??:寄存器值(如程序計數器 PC、棧指針 SP)、浮點運算狀態(用于進程切換時保存現場)。

??五、進程的創建與終止??

??1. 進程創建??
Linux 中進程通過 fork() 系統調用創建,遵循“??寫時復制(Copy-On-Write)??”原則:

父進程調用 fork() 后,內核復制父進程的 PCB 和內存頁表(初始時共享物理內存),生成子進程。
子進程從 fork() 的返回值開始往后執行(fork()系統調用,在父進程的代碼是返回子進程 PID,在子進程的代碼中則是返回 0)。
實際內存復制僅在子進程修改內存時發生(提高效率)。

明明是父進程調用了fork,為什么fork在子進程中也返回了一直值?而且值是0,和父進程的不一樣?
解釋: 從內核源碼(如 Linux 的 fork() 實現)來看,fork() 的返回值是通過??修改調用者的寄存器狀態??實現的:

  1. 當父進程調用 fork() 時,內核會復制父進程的上下文到子進程,并分別設置兩個進程的“返回寄存器”:

  2. 父進程的返回寄存器被設置為子進程的 PID(正數)。子進程的返回寄存器被設置為 0(表示無錯誤且是子進程)。因此,父進程和子進程在 fork() 后從同一條指令繼續執行,但由于寄存器中的返回值不同,它們的后續邏輯會分道揚鑣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cgroup 控制組學習(三)在容器中使用 CGroups

一、CGroups 關于mememory的限制操作 cgroup關于cpu操作 關于memeory cgroup的幾個要點 ① memeory限額類 1、memory.limit_bytes:硬限制--> 限制最大內存使用量,單位有k、m、g三種,填-1則代表無限制,默認是字節2、memory.soft_limi…

SpringBoot面試基礎知識

SpringBoot 是面試中后端開發崗位的高頻考點,以下是核心考點整理:1. SpringBoot 基礎概念- 定義:SpringBoot 是 Spring 框架的簡化版,通過“自動配置”“起步依賴”等特性,簡化 Spring 應用的搭建和開發,減…

Java面試全方位解析:從基礎到AI的技術交鋒

Java面試全方位解析:從基礎到AI的技術交鋒 面試場景:互聯網大廠Java工程師崗位面試 面試官:您好,我是今天的面試官,接下來我們將進行三輪技術面試。 謝飛機:您好您好!我是謝飛機,特別…

Web Worker:解鎖瀏覽器多線程,提升前端性能與體驗

目錄 一、Web Worker 是什么? 核心特性 類型 二、為什么需要 Web Worker?(單線程的痛點) 三、Web Worker 的典型使用場景 四、一個簡單的代碼示例 (專用 Worker) 五、使用 Web Worker 的注意事項 六、總結 一、Web Worker 是什么? 簡…

LabVIEW命令行調用與傳參功能

該功能一方面借助 Formatinto String 構建命令行字符串,實現LabVIEW 環境下命令行調用 VI 并傳參;另一方面,針對 Mac 平臺,通過解析應用 Info.plist 文件,處理 LabVIEW 可執行文件路徑,完善跨平臺命令行調用…

使用FRP搭建內網穿透工具,自己公網服務器獨享內外網端口轉發

內網穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。簡單來說,就是讓互聯網(外網)設備能訪問局域網(內網)設備提…

JavaWeb01——基礎標簽及樣式(黑馬視頻筆記)

1.如何用VScode寫html代碼 1. 首先在vscode上安裝一些插件,插件如下: 2.打開你要寫入的html文件的文件夾,然后右擊“ 新建文件”,命名 “xxx.html”, 3.如果是寫 css文件,那么也是右擊“新建文件”,命名“x…

在2G大小的文件中,找出高頻top100的單詞

將 2GB 的大文件分割為 2048 個大小為 512KB 的小文件,采用流式讀取方式處理,避免一次性加載整個文件導致內存溢出。初始化一個長度為 2048 的哈希表數組,用于分別統計各個小文件中單詞的出現頻率。利用多線程并行處理機制遍歷所有 2048 個小…

基于LNMP分布式個人云存儲

1.準備工作a.關閉兩臺虛擬機的安全軟件客戶端:[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指針運算全攻略:加減、比較與排序

常見的指針指針運算說明1.指針與整數的加減運算對指針可以進行加法運算&#xff0c;即p n或者p - n。其結果依舊是一個是一個指針&#xff0c;新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型)&#xff09;個字節。示例&#xff1a;#include<stdio.…

物聯網安裝調試-物聯網網關

物聯網網關作為連接終端設備與云平臺的核心樞紐,其分類與選型需結合功能定位、硬件性能、連接方式及應用場景等多維度考量。以下從分類體系和產品推薦兩方面系統梳理,助您高效決策: ?? 一、物聯網網關分類體系 1. 按功能定位劃分 類型 核心能力 典型場景 代表產品 邊緣計…

Jenkins教程(自動化部署)

Jenkins教程(自動化部署) 1. Jenkins是什么&#xff1f; Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具&#xff0c;廣泛用于項目開發&#xff0c;具有自動化構建、測試和部署等功能。Jenkins用Java語言編寫&#xff0c;可在Tomcat等流行的servlet容器中運行&…

linux 驅動驗證是否成功 之 查看moudle信息

這些是 Linux 內核模塊&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通過如下方式查看&#xff1a;? 1. 使用 modinfo 命令查看已加載或已編譯模塊信息 示例&#xff1a; modinfo aw2013.ko輸出內容大概如下&#xff1a; filename:…

瀏覽器關閉之前請求接口到后端

2025.07.24今天我學習了如何在瀏覽器關閉之前請求一個接口返回到后端。可以用performance.navigation判斷是瀏覽器關閉&#xff0c;還是瀏覽器刷新&#xff0c;因為我這邊只需要瀏覽器關閉的時候才去觸發1. 利用performance API&#xff08;刷新檢測&#xff09; 刷新頁面時&am…

MySQL批量數據處理與事務管理

MySQL是一種廣泛應用的關系型數據庫管理系統&#xff0c;尤其在數據分析和業務邏輯處理方面具有重要地位。在數據量龐大的業務場景中&#xff0c;批量數據處理和事務管理是提高效率和保障數據一致性的重要手段。掌握高效的批量數據操作方法與事務管理技巧&#xff0c;不僅能夠提…

iOS網絡之異步加載

為什么你的圖片要異步加載&#xff1f;在仿寫天氣預報時&#xff0c;我們常常需要從網絡加載天氣圖標&#xff0c;例如顯示某個小時的天氣狀態圖標。這看似簡單的事情&#xff0c;如果處理不當&#xff0c;卻很容易造成界面卡頓&#xff0c;甚至影響整個 App 的用戶體驗。錯誤做…

C#值類型屬性的典型問題

問題復現&#xff1a;值類型屬性的副本問題以下代碼展示了值類型屬性的典型問題&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用屬性修改結構體&#xff08;無效&#xff01;&#xff09; var obj new MyC…

機器學習基礎-k 近鄰算法(從辨別水果開始)

一、生活中的 "分類難題" 與 k 近鄰的靈感 你有沒有這樣的經歷&#xff1a;在超市看到一種從沒見過的水果&#xff0c;表皮黃黃的&#xff0c;拳頭大小&#xff0c;形狀圓滾滾。正當你猶豫要不要買時&#xff0c;突然想起外婆家的橘子好像就是這個樣子 —— 黃色、圓…

【WPF】NumericUpDown的用法

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;NumericUpDown 控件并不是內置的標準控件之一&#xff0c;但它是一個非常常用的控件&#xff0c;用于讓用戶輸入一個數值&#xff08;整數或浮點數&#xff09;&#xff0c;并提供上下箭頭來遞增或…

Kotlin位運算

Kotlin 提供了幾種用于操作整數各個位&#xff08;bit&#xff09; 的運算符。這些操作是由處理器直接支持的&#xff0c;速度快且操作簡單。在底層編程中非常重要&#xff0c;比如設備驅動、低級圖形處理、網絡通信、加密和壓縮等。 盡管計算機通常都有高效的硬件指令來執行算…