Linux系統之----進程的概念

1.進程

1.1基本概念

課本概念 :進程是程序的一個執行實例,是正在執行的程序。當程序被執行時,系統會為其創建一個進程,包含程序代碼、數據以及運行時所需的資源。

內核觀點 :進程是擔當分配系統資源(CPU 時間、內存)的實體。操作系統內核通過進程來管理和調度系統資源,確保每個進程都能合理地使用 CPU、內存等硬件資源。

1.2 描述進程-PCB?

1.2.1 基本概念

進程控制塊(PCB) :進程的信息被存放在一個名為進程控制塊的數據結構中,它是進程屬性的集合,就好比一個檔案袋,里面裝著進程的各種信息,比如進程的狀態、優先級、內存分配情況等。

Linux 中的 PCB(task_struct :在 Linux 操作系統下,PCB 是通過 task_struct 這個結構體來實現的。

1.2.2 task_struct?相關內容

task_struct 的定義task_struct 是 Linux 內核中定義的一個復雜的數據結構,包含在內核源代碼的 include/linux/sched.h 文件中。它是內核用來表示和管理進程的核心數據結構,包含進程的各種信息,如進程標識符、狀態、內存管理信息、I/O 信息、調度參數等。

task_struct 的作用 :用于在 Linux 中描述進程的結構體,它承載著進程相關的各類信息,是內核管理和調度進程的關鍵依據。

存儲位置task_struct 是 Linux 內核的一種數據結構,會被裝載到 RAM(內存)里,這樣內核可以快速地訪問和修改進程的信息,以實現對進程的有效管理,比如進程的創建、切換、銷毀等操作都依賴于對 task_struct 的操作。

?1.2.3 內容分類

1)標示符

作用 :用于唯一標識一個進程,區分系統中的不同進程。

具體信息 :通常包括進程 ID(PID)、父進程 ID(PPID)等信息。

2)狀態

作用 :反映進程當前的執行狀態,以及進程退出時的相關信息。

具體信息 :包括進程是處于運行態、就緒態、等待態等,還有進程的退出代碼(用于表示進程正常結束或異常終止的原因)、退出信號(用于通知其他進程該進程已結束)等。

3)優先級

作用 :決定進程調度的優先順序,優先級高的進程更容易獲得 CPU 資源進行執行。

具體信息 :包括動態優先級和靜態優先級,不同的進程調度算法會根據優先級來安排進程的執行順序。

4)程序計數器

作用 :指示處理器當前正在執行的指令位置,控制程序的執行流程。

具體信息 :指向進程在程序中即將被執行的下一條指令的內存地址,當進程被調度執行時,處理器根據程序計數器的值來獲取并執行相應的指令。

5)內存指針

作用 :描述進程在內存中的布局和內存資源的使用情況,以及與其他進程共享內存的區域

具體信息 :包括指向進程的程序代碼段、數據段、堆、棧等內存區域的指針。還有指向與其他進程共享的內存塊的指針,用于實現進程間通信(IPC)和共享資源等功能。

6)上下文數據

作用 :保存進程執行時處理器的寄存器狀態,用于在進程切換時恢復進程的執行環境。

具體信息 :包括處理器的各種寄存器(如通用寄存器、控制寄存器、狀態寄存器等)的值,當進程被中斷或切換時,系統會保存當前的上下文數據,以便在該進程再次被調度執行時能夠恢復到之前的狀態繼續執行。

7)I/O 狀態信息

作用 :記錄進程的 I/O 操作相關信息,方便系統進行 I/O 管理和調度。

具體信息 :包括進程已發出的 I/O 請求、分配給進程的 I/O 設備(如磁盤、網絡設備等)以及進程打開和使用的文件列表等。

8)記賬信息

作用 :用于記錄進程的資源使用情況,可用于系統資源管理和計費等目的。

具體信息 :包括進程使用的處理器時間總和(如用戶態和內核態的 CPU 時間)、使用的時鐘數總和、時間限制(如超時時間)、記賬號等。

9)其他信息

作用 :包含一些其他與進程相關的信息,這些信息可能因不同的內核版本或特定的系統配置而有所不同。

具體信息 :例如進程的創建時間、所屬的用戶和組、安全上下文信息(在支持安全模塊的系統中)等。

1.3 進程的查看

1.3.1? ?PID與PPID

1) PID(Process ID)
  1. 定義

    • PID 是操作系統分配給每個進程的唯一標識符,用于區分系統中的不同進程,是進程存在的標志。

  2. 作用

    • 唯一標識進程 :在 Linux 系統中,每個進程都有一個唯一的 PID,通過 PID 可以準確地識別和操作特定的進程。

    • 進程管理 :系統和用戶可以根據 PID 對進程進行管理,如發送信號、終止進程、獲取進程信息等。

    • 資源分配 :操作系統利用 PID 來管理進程的資源分配,如內存、CPU 時間等。

  3. 范圍

    • 在 Linux 系統中,PID 是一個正整數。傳統的 PID 范圍是 1 到 32768,但具體范圍可能因系統配置而有所不同。可以通過查看 /proc/sys/kernel/pid_max 文件來確定系統中 PID 的最大值。

2) PPID(Parent Process ID)
  1. 定義

    • PPID 是創建該進程的父進程的 ID。每個進程(除了 init 進程)都有一個父進程,PPID 用于標識這個父進程。

  2. 作用

    • 父子進程關系 :PPID 建立了進程之間的父子關系,有助于理解進程的層次結構和來源。例如,通過查看 PPID 可以知道某個進程是由哪個父進程啟動的。

    • 進程管理 :在進程管理中,父進程可以利用 PPID 來管理和控制其子進程,如等待子進程結束、獲取子進程狀態等。

    • 孤兒進程處理 :當父進程終止時,其子進程將成為孤兒進程。系統會將孤兒進程的 PPID 改為 1,由 init 進程(PID 為 1)收養這些孤兒進程,確保它們能夠正常結束?

3)?創建子進程的方式

在 Linux 系統中,父進程通過 fork() 系統調用創建子進程。

fork() 的功能是創建一個與父進程幾乎完全相同的子進程。子進程會復制父進程的地址空間、環境變量、打開的文件等。

1.3. 2?查看進程的可執行文件

1)使用 /proc 文件系統

/proc 文件系統提供了關于進程的信息,每個進程在 /proc 中有一個以 PID 命名的目錄。可以使用 ls -l /proc/<PID>/exe 查看進程對應的可執行文件的鏈接。?

2)示例:

假設有一個名為 myprocess 的進程,其 PID 為 1234,可以使用以下命令查看其可執行文件:

ls -l /proc/1234/exe

輸出可能如下:

lrwxrwxrwx 1 root root 0 Mar 31 20:03 /proc/1234/exe -> /home/user/bin/myprocess

這表明進程 1234 的可執行文件位于 /home/user/bin/myprocess

1.3.3 查看進程及父進程

使用?getpid?和?getppid?函數

  • 功能

  • getpid 函數返回當前進程的 ID(PID)。

  • getppid 函數返回當前進程的父進程 ID(PPID)。

?函數原型:

#include <sys/types.h>
#include <unistd.h>pid_t getpid(void);
pid_t getppid(void);

?應用:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {pid_t pid = getpid();    // 獲取當前進程的 PIDpid_t ppid = getppid();  // 獲取當前進程的 PPIDprintf("Current process ID: %d\n", pid);printf("Parent process ID: %d\n", ppid);return 0;
}

?最后附上老師板書:

1.3.4 fork

?1)?基本概念

fork 的作用是創建一個新進程,這個新進程稱為子進程,而調用 fork 的進程稱為父進程。子進程是父進程的副本,它繼承了父進程的幾乎所有資源和狀態。

2)工作原理

復制父進程資源

fork 被調用時,操作系統會創建一個新進程,并將父進程的代碼段、數據段、堆、棧等資源復制到子進程中。子進程在創建時幾乎與父進程完全相同,包括代碼、變量、文件描述符、環境變量等。但是,子進程有自己獨立的進程標識符(PID),并且它與父進程是兩個獨立的進程實體

寫時拷貝

現代操作系統通常采用“寫時復制”技術來優化 fork 的性能。在 fork 調用時,操作系統并不會立即復制父進程的所有資源,而是將父進程的資源標記為“共享”。只有當父進程或子進程對這些資源進行寫操作時,操作系統才會真正復制被修改的部分資源,從而避免了不必要的復制操作,節省了時間和內存。

3)?返回值

fork 的返回值用于區分父進程和子進程

在父進程中

fork 返回子進程的進程標識符(PID),這是一個正整數。父進程可以通過這個 PID 來監控子進程的狀態,例如使用 waitwaitpid 等系統調用等待子進程結束。

在子進程中

fork 返回 0。子進程可以通過返回值為 0 來判斷自己是子進程,并執行相應的邏輯。

出錯時

如果 fork 調用失敗(例如系統資源不足或超出進程限制),它會返回 -1,并設置錯誤碼 errno

?4)代碼示例
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() 
{pid_t pid = fork(); // 調用 fork 創建子進程if (pid < 0) {// fork 失敗perror("fork failed");return 1;}else if (pid == 0) {// 子進程printf("I am the child process, my PID is %d\n", getpid());} else {// 父進程printf("I am the parent process, my PID is %d, my child's PID is %d\n", getpid(), pid);            wait(NULL); // 等待子進程結束}return 0;
}

假設父進程的 PID 是 1234,子進程的 PID 是 1235,程序的輸出可能是:

?也許此時會有人疑惑,為什么if和else都進去了??難道是程序出錯了嗎?還是說我們碰到了編程領域的量子力學了??實際上,這里是多線程編程,可以同時都進的。

?5)代碼詳解

fork 調用后,程序會分為兩部分繼續執行:一部分在父進程中運行,另一部分在子進程中運行。因此,ifelse 語句分別對應父進程和子進程的邏輯。

當程序執行到 pid_t pid = fork(); 時,操作系統會創建一個子進程。在調用 fork 之前,父進程和子進程是同一個進程,共享相同的代碼和數據。調用 fork 之后,程序會分為兩部分繼續執行:父進程和子進程。

在父進程中,fork 返回子進程的進程標識符(PID),這是一個正整數。因此,pid > 0,程序會進入 else 分支。

在子進程中,fork 返回 0。因此,pid == 0,程序會進入 else if 分支。

實際上,ifelse 并不是同時進入的,而是分別在父進程和子進程中執行不同的分支。

父進程 執行 else 分支。子進程 執行 else if 分支。

從程序的整體運行角度來看,ifelse 的邏輯分別在兩個不同的進程中執行,因此看起來像是“都進去了”,但實際上它們是在不同的上下文中運行的

有一點值得注意的是:當我們創建出子進程后,父子兩個進程,誰先運行不確定,具體由OS的調度原則來確定。

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

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

相關文章

Shell腳本中的字符串截取和規則變化

文章目錄 前言if通配符判斷if判斷多個條件規則變化字符串的兩個示例改變中間段數字改變末尾段數字 總結 前言 科技的發展會帶來習慣的改變&#xff0c;特別是對于我們這批敲代碼的&#xff0c;之前還積累一些奇巧淫技&#xff0c;想著在必要的時候賣弄一下&#xff0c;自從生成…

c語言修煉秘籍 - - 禁(進)忌(階)秘(技)術(巧)【第七式】程序的編譯

c語言修煉秘籍 - - 禁(進)忌(階)秘(技)術(巧)【第七式】程序的編譯 【心法】 【第零章】c語言概述 【第一章】分支與循環語句 【第二章】函數 【第三章】數組 【第四章】操作符 【第五章】指針 【第六章】結構體 【第七章】const與c語言中一些錯誤代碼 【禁忌秘術】 【第一式】…

Feign 深度解析:Java 聲明式 HTTP 客戶端的終極指南

Feign 深度解析&#xff1a;Java 聲明式 HTTP 客戶端的終極指南 Feign 是由 Netflix 開源的 ?聲明式 HTTP 客戶端&#xff0c;后成為 Spring Cloud 生態的核心組件&#xff08;現由 OpenFeign 維護&#xff09;。它通過注解和接口定義簡化了服務間 RESTful 通信&#xff0c;并…

如何Ubuntu 22.04.5 LTS 64 位 操作系統部署運行SLAM3! 詳細流程

以下是在本地部署運行 ORB-SLAM3 的詳細步驟&#xff0c;基于官方 README.md 和最佳實踐整理&#xff0c;適用于 Ubuntu 16.04/18.04/20.04/22.04 系統&#xff1a; 一、系統要求與依賴項安裝 1. 基礎系統要求 操作系統&#xff1a;Ubuntu 16.04/18.04/20.04/22.04&#xff…

USB 共享神器 VirtualHere 局域網內遠程使用打印機與掃描儀

本文首發于只抄博客,歡迎點擊原文鏈接了解更多內容。 前言 很久之前,有分享過使用 CUPS 和路由器來實現局域網內共享打印機,但由于 SANE 支持的打印機較少以及掃描驅動的缺失,試了很多種方法都沒有辦法成功遠程使用打印機的掃描功能。 后面偶然發現 VirtualHere 可以曲線…

一洽智能硬件行業解決方案探索與實踐

一、智能硬件行業發展現狀剖析 在數字化浪潮推動下&#xff0c;智能硬件行業呈現蓬勃發展態勢。軟硬件一體化的深度融合&#xff0c;構建起智能化服務的核心架構&#xff0c;而移動應用作為連接用戶與設備的重要橋梁&#xff0c;其作用愈發關鍵。深入研究該行業&#xff0c;可…

【C++ 類和數據抽象】構造函數

目錄 一、構造函數的基本概念 1.1 構造函數核心特性 1.2 構造函數的作用 1.3 構造函數類型體系 二、構造函數的類型 2.1 默認構造函數 2.2 帶參數的構造函數 2.3 拷貝構造函數 2.4 移動構造函數&#xff08;C11 及以后&#xff09; 三、初始化關鍵技術 3.1 成員初始…

圖數據庫nebula測試指南

概述 Nebula是一個開源的分布式圖數據庫系統&#xff0c;專為處理超大規模關聯數據而設計。可以將復雜的關聯關系存在nebula圖數據庫中&#xff0c;提供可視化平臺用于案件關聯查詢及調查。測試的前提是了解nebula圖數據庫&#xff0c;會使用基本的插入語句和查詢語句&#xf…

dispaly: inline-flex 和 display: flex 的區別

display: inline-flex 和 display: flex 都是 CSS 中用于創建彈性盒子布局&#xff08;Flexbox&#xff09;的屬性值&#xff0c;但它們之間有一些關鍵的區別&#xff0c;主要體現在元素如何在頁面上被渲染和它們對周圍元素的影響。 主要區別 1&#xff0c;塊級 vs 行內塊級 d…

Sqlserver安全篇之_Sqlcmd命令使用windows域賬號認證sqlserver遇到問題如何處理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的數據庫連接字符串必須有對應的有效的SPN信息&#xff0c;否則會報錯SSPI Provider: Server not found in Kerberos database. 正常連接 1、…

電腦硬盤常見的幾種接口類型

一、傳統接口&#xff08;機械硬盤為主&#xff09; 1. SATA 接口&#xff08;Serial ATA&#xff09; 特點&#xff1a; 最主流的機械硬盤&#xff08;HDD&#xff09;接口&#xff0c;廣泛用于臺式機和筆記本電腦。傳輸速度較慢&#xff0c;理論最大帶寬為 6 Gbps&#xff…

【前端HTML生成二維碼——MQ】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 前端HTML生成二維碼——MQ 前言本文將介紹前端HTML如何更具用戶輸入的內容生成對應的二維碼,附頁面代碼、實現函數、js腳本。一、自定義顯示頁面1、效果圖二、使用步驟1、引入庫2、實現函數3、頁面及函數代…

研發效率破局之道閱讀總結(3)工程優化

研發效率破局之道閱讀總結(3)工程優化 Author: Once Day Date: 2025年4月22日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 程序的藝術_Once-Day…

C# MP3 伴奏

使用建議&#xff1a; 參數調節指南&#xff1a; 低頻人聲殘留&#xff1a;降低CenterFrequency(800-1500Hz) 高頻人聲殘留&#xff1a;提高CenterFrequency(2500-3500Hz) 消除力度不足&#xff1a;提高EliminationStrength(0.9-1.0) 伴奏失真&#xff1a;降低EliminationSt…

大模型面經 | 春招、秋招算法面試常考八股文附答案(四)

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

Springboot 集成 RBAC 模型實戰指南

RBAC 模型核心原理 詳情可參考之前的筆記&#xff1a;https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定義與優勢 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的訪問控制&#xff09;** 是一種通過角色關聯…

如何收集用戶白屏/長時間無響應/接口超時問題

想象一下這樣的場景:一位用戶在午休時間打開某電商應用,準備購買一件心儀已久的商品。然而,頁面加載了數秒后依然是一片空白,或者點擊“加入購物車”按鈕后沒有任何反饋,甚至在結算時接口超時導致訂單失敗。用戶的耐心被迅速消耗殆盡,關閉應用,轉而選擇了競爭對手的產品…

用戶需求報告、系統需求規格說明書、軟件需求規格說明的對比分析

用戶需求報告、系統需求規格說明書&#xff08;SyRS&#xff09;和軟件需求規格說明書&#xff08;SRS&#xff09;是需求工程中的關鍵文檔&#xff0c;分別對應不同層次和視角的需求描述。以下是它們的核心區別對比&#xff1a; ??1. 用戶需求報告&#xff08;User Requirem…

iostat指令介紹

文章目錄 1. 功能介紹2. 語法介紹3. 應用場景4. 示例分析 1. 功能介紹 iostat (input/output statistics)&#xff0c;是 Linux/Unix 系統中用于監控 CPU 使用率和 磁盤 I/O 性能的核心工具&#xff0c;可實時展示設備負載、吞吐量、隊列狀態等關鍵指標。 可以使用 man iostat查…

神經網絡 “疑難雜癥” 破解指南:梯度消失與爆炸全攻略(六)

引言 在神經網絡的發展歷程中&#xff0c;梯度消失和梯度爆炸如同兩座難以翻越的大山&#xff0c;阻礙著深層神經網絡發揮其強大的潛力。尤其是在處理復雜任務時&#xff0c;這兩個問題可能導致模型訓練陷入困境&#xff0c;無法達到預期的效果。本文將深入探討梯度消失和梯度…