06. Linux進程概念 1

Linux進程概念

馮諾依曼體系

馮諾依曼體系結構(Von Neumann Architecture)是現代計算機設計的奠基石,由數學家約翰·馮·諾依曼于1945年提出。這一架構徹底改變了早期計算機“硬件即程序”的設計方式,使得計算機可以靈活地運行不同程序,開啟了可編程計算時代。


🧠 核心思想:存儲程序原理

馮諾依曼結構的最大創新是將程序和數據統一存儲在同一個存儲器中,并通過控制器逐條讀取指令執行。這種設計使得程序可以像數據一樣被修改、傳輸和存儲。


🧱 五大組成部分

部件功能說明
運算器(ALU)執行算術和邏輯運算,如加減乘除、與或非等操作
控制器(CU)負責指令的讀取、譯碼和控制其他部件的操作流程
存儲器存儲程序指令和數據,通常是 RAM(內存)和 ROM(只讀存儲器)
輸入設備將外部信息輸入計算機,如鍵盤、鼠標、攝像頭等
輸出設備將計算結果輸出到外部,如顯示器、打印機、揚聲器等
五大組成部分結構體系圖
在這里插入圖片描述1. 這里的存儲器指的是內存(具有掉電遺失的性質),而磁盤是外設是擁有永久性存儲的能力 2. CPU是不會直接和外設進行交流,所有外設的輸入輸出數據只能寫入到內存之中去

🔁 工作流程介紹

  1. 從存儲器中取指令
  2. 控制器譯碼指令
  3. 根據指令操作數據
  4. 運算器執行運算
  5. 結果寫回存儲器或輸出設備

操作系統


🧠 操作系統概念

操作系統(Operating System,簡稱 OS)是計算機系統中最基本、最核心的系統軟件。它負責管理計算機的硬件資源,并為用戶和應用程序提供運行環境。

? 簡單定義:

操作系統是管理計算機硬件與軟件資源的中間層,它協調各個組件的運行,使用戶和程序能夠高效、安全地使用計算機。

  • 內核(進程管理,內存管理,文件管理,驅動管理)
  • 其他程序(函數庫,shell程序)

🎯 操作系統的設計目的

操作系統的設計目的可以從兩個方向理解:

🔽 對下:管理硬件資源(手段)
  • 管理 CPU:調度進程、分配時間片
  • 管理內存:分配空間、提供虛擬內存
  • 管理設備:通過驅動程序控制硬件
  • 管理文件系統:組織數據、提供訪問接口

操作系統屏蔽了底層硬件的復雜性,為上層應用提供統一的訪問方式。

🔼 對上:服務用戶和應用程序(目的)
  • 提供程序運行環境
  • 提供系統調用接口(如文件讀寫、進程創建)
  • 提供圖形界面或命令行交互方式
  • 提供安全性、穩定性和資源隔離

就像銀行柜員是用戶與后臺系統之間的橋梁,操作系統是用戶程序與硬件之間的“服務窗口”。
在這里插入圖片描述

  • 操作系統管理硬件的一個過程就是
  • 先將其利用結構體進行描述
  • 然后利用鏈表或者其他的更高效的數據結構進行管理組織

🧱 操作系統的定位

在整個計算機系統架構中,操作系統處于中間層:

用戶程序↑
系統調用 / 庫函數↑
操作系統(內核)↑
硬件(CPU、內存、設備)

🧩 小結

維度內容說明
概念管理軟硬件資源的系統軟件
設計目的對下管理硬件,對上服務用戶
定位計算機系統的中間層,是用戶與硬件之間的橋梁
核心功能進程管理、內存管理、文件系統、設備驅動、安全性

接下來我們來了解進程的概念

  1. 基本概念:就是一個執行的實例,一個正在運行的程序
  2. 內核觀點:擔當分配系統資源的實體,在這里我的理解是內存資源

描述進程PCB(process control block)

task_struct-PCB的一種

  • 在Linux中描述進程的結構體叫做task_struct。
  • task_struct是Linux內核的一種數據結構,它會被裝載到RAM(內存)里并且包含著進程的信息。
    簡單理解就是,當我寫了一個小程序,此時執行,現在這個小程序是在內存之中被執行的,而他的可執行文件則在硬盤當中。
    但是電腦內存當中肯定不止這一個執行的程序也就是進程,有太多的加載進來的程序,操作系統肯定要進行管理。
    所以在這里使用task_struct,也就是先對其進行描述再進行管理
    所謂的對進程進行管理,也就轉變成了對PCB進行相關的管理
    而對進程管理-> 也就轉化成了對鏈表的增刪查改
  • 簡要介紹一下這個task_struct中存儲了以下信息

🧱 task_struct 的核心字段

分類字段示例說明
🔖 標識信息pid, tgid, ppid進程號、線程組號、父進程號
📍 狀態信息state, exit_code當前狀態(運行、等待、僵死等)
🎛? 調度信息priority, policy, counter優先級、調度策略、時間片
🧠 內存信息mm, active_mm指向進程的內存描述結構
🧵 線程信息thread保存寄存器上下文、棧指針等
📂 文件系統信息files, fs打開的文件、文件系統上下文
🔗 鏈接信息parent, children, sibling父子進程關系
🔔 信號處理signal, blocked, sigpending信號處理相關字段
📊 統計信息utime, stime, start_time用戶態/內核態時間、啟動時間

查看進程

  1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 int main()5 {6     // 引入子進程的概念,觀察進程現象7     pid_t id = fork();8     printf("我是一個進程,pid: %d, ppid:%d, id:%d\n",getpid(), getppid(), id);9     // 觀察進程狀態10     //while(1)11     //{12     //    printf("我是一個進程,pid: %d, ppid:%d\n",getpid(), getppid());13     //    sleep(1);                                                                                              14     //}15     return 0;16 }

在這里先忽略fork,可以看到執行的程序結果pid是16802,使用指令查看,在這張圖片里顯示的最后一個進程是我們使用了grep查找16802可以忽略
在這里插入圖片描述

  • 進程id (PID)
  • 父進程id(PPID)

🧠 fork()的概念

fork() 是 Linux 和類 Unix 系統中用于創建新進程的系統調用。它的核心作用是:

復制當前進程,生成一個幾乎完全一樣的子進程。

這個“復制”并不是簡單的拷貝,而是通過一種叫做 寫時復制(Copy-On-Write, COW) 的機制來優化性能。


🧱 基本語法

#include <unistd.h>pid_t fork(void);
  • 返回值:
    • > 0:父進程,返回的是子進程的 PID
    • = 0:子進程
    • < 0:創建失敗,返回 -1,并設置 errno

🧪 示例代碼

#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;} else if (pid == 0) {// 子進程printf("Hello from child! PID = %d\n", getpid());} else {// 父進程printf("Hello from parent! Child PID = %d\n", pid);}return 0;
}

🧾 輸出可能是:

Hello from parent! Child PID = 12345
Hello from child! PID = 12345

注意:父子進程的執行順序不確定,由操作系統調度決定。


🔍 fork 的工作原理

  • 復制進程上下文:包括代碼段、數據段、堆、棧等
  • 獨立 PID:子進程擁有自己的進程號
  • 共享文件描述符:初始時父子進程共享打開的文件
  • 地址空間獨立:雖然初始共享內存頁,但修改時會觸發復制(COW)

🧩 常見用途

  • 創建后臺任務或守護進程
  • 實現并行計算
  • exec() 結合,執行新程序(如 shell 命令)
  • 構建多進程服務器(如 Apache)

?? 注意事項

  • 必須處理返回值,否則容易邏輯混亂
  • 避免僵尸進程:父進程應使用 wait()waitpid() 等待子進程結束
  • 資源消耗:雖然 COW 優化了性能,但頻繁 fork 仍可能影響系統穩定性

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

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

相關文章

HTTP標頭全解析:保護你的Web應用!

在網絡攻擊頻發的時代&#xff0c;你的Web應用是否像一座沒有城墻的城堡&#xff0c;任由XSS、點擊劫持和中間人攻擊入侵&#xff1f;HTTP標頭&#xff0c;這些看似不起眼的響應頭&#xff0c;其實是Web安全的隱形守護者。想象一個電商網站&#xff0c;用戶數據被竊取&#xff…

rt-linux下__slab_alloc里的另外一處可能睡眠的邏輯

一、背景 在之前的博客 tasklet上下文內存分配觸發might_alloc檢查及同步回收調用鏈 里&#xff0c;我們講了一處內存分配時會引起睡眠的調用鏈&#xff08;這個引起睡眠的這個調用鏈它是在普通linux里也是存在的&#xff09;。這篇博客里&#xff0c;我們講一處內存分配路徑下…

基于STM32F103C8T6的智能環境監測系統:DHT11溫濕度檢測與OLED顯示實現

引言 你是否曾想實時握身邊環境的溫濕度變化&#xff1f;無論是居家種植需要精準調控環境&#xff0c;還是實驗室存放敏感材料需監控條件&#xff0c;亦或是智能座艙場景下的環境感知&#xff0c;智能環境監測系統正成為連接物理世界與數字管理的重要橋梁。而在眾多嵌入式開發…

動態規劃在子數組/子串問題

目錄 一、最大子數組和&#xff08;LeetCode 53&#xff09; 二、環形子數組的最大和&#xff08;LeetCode 918&#xff09; 三、乘積最大子數組&#xff08;LeetCode 152&#xff09; 四、乘積為正數的最長子數組長度&#xff08;LeetCode 1567&#xff09; 五、等差數列…

微信小程序開發筆記(01_小程序基礎與配置文件)

ZZHow(ZZHow1024) 參考課程: 【尚硅谷微信小程序開發教程】 [https://www.bilibili.com/video/BV1LF4m1E7kB] 009_文件和目錄結構介紹新建頁面與調試基礎庫 一個完整的小程序項目分為兩個部分&#xff1a;主體文件、頁面文件 主體文件又稱全局文件&#xff0c;能夠作用于整…

NLP Subword 之 BPE(Byte Pair Encoding) 算法原理

本文將介紹以下內容&#xff1a; 1. BPE 算法核心原理2. BPE 算法流程3. BPE 算法源碼實現DemoBPE最早是一種數據壓縮算法&#xff0c;由Sennrich等人于2015年引入到NLP領域并很快得到推廣。該算法簡單有效&#xff0c;因而目前它是最流行的方法。GPT-2和RoBERTa使用的Subword算…

CSS 偽類選擇器

偽類選擇器&#xff08;pseudo-class selector&#xff09;是一種用于選擇HTML元素特定狀態或特征的關鍵字&#xff0c;它允許開發者基于文檔樹之外的信息&#xff08;如用戶交互、元素位置或狀態變化&#xff09;來選擇元素并應用樣式。偽類選擇器以冒號(:)開頭&#xff0c;附…

Electron 新特性:2025 版本更新解讀

引言&#xff1a;Electron 新特性在 2025 版本更新中的解讀核心價值與必要性 在 Electron 框架的持續演進中&#xff0c;新特性的引入是推動桌面開發創新的核心動力&#xff0c;特別是 2025 年的版本更新&#xff0c;更是 Electron 項目從成熟生態到前沿技術的躍進之鑰。它不僅…

MyBatis從入門到面試:掌握持久層框架的精髓

MyBatis從入門到面試&#xff1a;掌握持久層框架的精髓 前言 在Java企業級應用開發中&#xff0c;持久層框架的選擇至關重要。MyBatis作為一款優秀的半自動化ORM框架&#xff0c;以其靈活的SQL定制能力和良好的性能表現&#xff0c;成為了眾多開發者的首選。本文將帶你從MyBa…

5.Three.js 學習(基礎+實踐)

Three.js 是 “WebGL 的封裝庫”&#xff0c;幫你屏蔽了底層的著色器 / 緩沖區細節&#xff0c;專注于 “3D 場景搭建”&#xff0c;開發效率高&#xff0c;是通用 3D 開發的首選。他的核心是 “場景 - 相機 - 渲染器” 的聯動邏輯&#xff0c;先掌握基礎組件&#xff0c;再學進…

消火栓設備工程量計算 -【圖形識別】秒計量

消火栓設備工程量計算 -【圖形識別】秒計量 消防系統的消火栓設備水槍、水帶和消火栓組成&#xff0c;根據清單定額規則計算消火栓設備工程量。通過CAD快速看圖的圖形識別框選圖紙就能自動數出消火栓數量&#xff0c;省時又準確&#xff0c;是工程人做消防算量的好幫手。 一、…

Docker 與 VSCode 遠程容器連接問題深度排查與解決指南

Docker 與 VSCode 遠程容器連接問題深度排查與解決指南 引言 Visual Studio Code 的 Remote - Containers 擴展極大地提升了開發體驗&#xff0c;它將開發環境容器化&#xff0c;保證了環境的一致性&#xff0c;并允許開發者像在本地一樣在容器內進行編碼、調試和運行。然而&…

愛圖表:鏑數科技推出的智能數據可視化平臺

本文轉載自&#xff1a;https://www.hello123.com/aitubiao ** 一、? AI 圖表&#xff1a;智能數據可視化好幫手 愛圖表是鏑數科技旗下的一款智能數據可視化工具&#xff0c;它能讓復雜的數字和報表變得直觀又好懂。接入了先進的DeepSeek 系列 AI 模型&#xff0c;它不僅會做…

ENVI系列教程(四)——圖像幾何校正

目錄 1 概述 1.1 控制點選擇方式 1.2 幾何校正模型 1.3 控制點的預測與誤差計算 2 詳細操作步驟 2.1 掃描地形圖的幾何校正 2.1.1 第一步:打開并顯示圖像文件 2.1.2 第二步:啟動幾何校正模塊 2.2 Landsat5 影像幾何校正 2.2.1 第一步:打開并顯示圖像文件 2.2.2 第…

STM32-FreeRTOS操作系統-消息隊列

引言在嵌入式開發領域&#xff0c;STM32與FreeRTOS的結合應用極為廣泛。本文將探討如何在STM32上使用FreeRTOS實現消息隊列功能&#xff0c;助力高效任務通信與系統協作。消息隊列定義消息隊列是一種在 FreeRTOS 中用于任務間通信的機制。它允許任務將消息發送到隊列中&#xf…

【開題答辯全過程】以 C語言程序設計課程網站為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

手機上有哪些比較好用的待辦事項提醒工具

在快節奏的現代工作中&#xff0c;我們每天都要面對大量的任務與事務。從項目截止日期、客戶會議&#xff0c;到日常的工作安排&#xff0c;瑣碎的事項容易讓人顧此失彼。 手機待辦事項工具早已突破傳統“記事本”的局限&#xff0c;成為移動辦公場景下的效率核心。它們通過任務…

Mysql數據庫事務全解析:概念、操作與隔離級別

MySQL系列 文章目錄MySQL系列一、什么是事務1.1事務的核心概念1.2、 事務的四大屬性&#xff08;ACID&#xff09;1.2.1 原子性&#xff08;Atomicity&#xff09;1.2.2 一致性&#xff08;Consistency&#xff09;1.2.3 隔離性&#xff08;Isolation&#xff09;1.2.4 持久性&…

【MCU EEPROM開發教程】

簡單來說把eeprom芯片當成一個傳感器來使用&#xff0c;通過IIC/SPI等協議對芯片進行讀寫操作&#xff0c;具體的讀寫操作涉及到一些算法—怎么樣讀寫更加快速&#xff0c;以及一些異常錯誤處理。 應用場景&#xff1a; 對于一些掉電也不能丟失的數據要存在eeprom/flash中&…

Docker將鏡像搬移到其他服務上的方法

導出/加載鏡像&#xff08;保留分層、標簽&#xff09;和導出/導入容器快照&#xff08;僅文件系統&#xff0c;丟失鏡像歷史與標簽&#xff09;。 一、把鏡像打包帶走&#xff08;推薦&#xff09; 適合把一個或多個鏡像搬到離線/內網機器&#xff0c;保留分層與標簽。 在源服…