【Linux】進程(Process)

一、什么是進程

二、進程的創建

三、進程的狀態

四、僵尸進程

五、孤兒進程

六、進程的優先級 以及 并發/并行

七、進程的切換


一、什么是進程?

什么是進程呢(一)?

官方話來說:進程是一個執行實例、正在執行的程序、是系統資源分配的基本單位

按課本官方話可能有一點點的不好理解

通俗的講:當你電腦上的程序,比如qq 你雙擊運行起來,此時他啟動了,那么他現在就是一個進程

再深講:當你的代碼被編譯鏈接成為一個可執行程序,這個可執行程序本質上是一個文件,是被放到磁盤里的,當雙擊運行,這個程序會被加載到內存,也就是大家所說的內存條,當加載到內存,
此時程序的代碼會一條一條的被cpu執行,此時這個程序不再叫程序而是叫做進程

在Linux下通過指令ps aux 可以查看當前正在運行的進程

還可以通過系統目錄查看當前進程

什么是進程呢(二)?

看過我前面文章里的操作系統的話,我說到了操作系統的管理

操作系統要對進程進行管理如何管理的呢?

進程再往深講:進程就是一個結構體,這個結構體名字叫做PCB控制塊

PCB控制塊里面存放了進程屬性的集合

PCB在Linux下就是 task_struct 名字的結構體

所謂的進程記載到內存,實際上就是PCB結構體加載到了內存

在這個PCB結構體內存放了進程的各種屬性,比如進程狀態、優先級、標識符、父進程標識符

程序計數器、內存指針、上下文數據、其他信息等

這些PCB結構體會被以雙向鏈表的形式被操作系統進行管理

通過這樣,操作系統可以訪問所有的PCB,也就等于訪問到了所有的進程,對進程的管理也就轉換為了對PCB結構體的管理

當一個程序被啟動變為進程,進程的代碼和數據會加載到內存,然后操作系統會形成相應的PCB,

并把PCB放入鏈表中,而一個進程的退出,也就是從鏈表中刪除這個節點,然后對代碼和數據進行釋放

總結就是:操作系統對進程的管理實際上就變成了對鏈表的增刪改查、不管是對進程的管理,還是文件內存等,本質都是對一種數據結構的增刪改查

二、進程的創建

通過系統調用可以在一個進程中再創建一個子進程

fork函數創建子進程

運行結果是每次循環會打印兩行數據,第一行是該進程的Pid和PPid

第二行是子進程的Pid和PPid

我們可以發現這兩個進程是父子關系,子進程的PPid=該進程的Pid

每次出現一個進程,操作系統就會為其創建一個PCB,fork函數創建的進程也不例外

為什么子進程也執行跟父進程相同的代碼呢?

原因解釋:子進程被創建后會共享父進程的代碼數據,但是采用的是寫時拷貝

什么意思呢?子進程會執行和父進程相同的代碼,但是如果修改父進程的數據,他就不會共享該數據的地址了,而是為自己開辟一個空間放這個數據,這樣的設計減少來了內存的浪費,只有在需要的時候才分配內存

注意點??fork函數是返回兩個返回值的,因為在fork函數內部就已經創建了子進程,已經分配了PCB,并且放入了cpu的調度隊列,在fork函數內的return返回值前已經是兩個進程在跑了,所以父子進程的執行順序是不確定的,取決于操作系統的調度方式

如何讓子進程執行自己的代碼呢?

使用if進行分流即可,因為有兩個返回值,而兩個返回值明確區分了,=0代表是子進程,>0代表是父進程,通過if區別返回值,即可讓父子進程執行不同的代碼

如果返回值<0 代表創建進程失敗了,可能是因為沒有內存了,也可能進程創建數量達到了上限

三、進程的狀態

一個進程從創建到銷毀,會經歷很多不同的狀態

我這里直接總結了一下:

創建/新建狀態:

如果一個進程在被創建的時候,比如分配PCB,比如fork函數內,那么這個進程就處于新建狀態

什么是新建狀態呢?就是還沒有被執行

就緒狀態:

當分配完PCB并且放到了cpu的調度隊列,等待被cpu執行自己的代碼,此時就進入了就緒狀態

也就是等待被執行

運行狀態:

當真正被cpu調度的時候,開始執行自己的代碼,就進入了運行狀態

阻塞狀態:

當在程序運行中,因為某種原因阻塞,比如等待鍵盤輸入數據,此時操作系統識別到后,會把進程放入該等待外設設備的等待隊列中,然后進程進入阻塞狀態,直到鍵盤輸入數據,操作系統才會重新將進程重新放入運行隊列里去等待執行

阻塞掛起狀態:

什么是阻塞掛起狀態呢?當內存中由于進程數量過多,內存不夠的時候,操作系統會選擇將一部分進程的代碼和數據放入磁盤中,只在內存中保留PCB控制塊,這些代碼和數據會被放到磁盤中的swap分區中,這個分區的大小一般是內存的1.5倍或者2倍,當需要的時候就把代碼和數據再交換會內存進行調度,這就是阻塞掛起狀態

個人超詳細總結:

四、僵尸進程

還有一種狀態叫做僵尸狀態 - Z

當一個進程變成僵尸進程就陷入了僵尸狀態

僵尸進程:父子進程中,子進程退出,但是父進程沒有回收子進程的資源,導致子進程的PCB控制塊一直保留在內存,雖然子進程的代碼和數據已經釋放,但是PCB控制塊沒有釋放,導致內存泄露的問題,此時子進程變成僵尸進程,使用kill命令也無法殺死

為什么會有僵尸進程呢?

因為子進程的PCB控制塊內有返回值信息和狀態信息,還有自己的pid

這些信息可能對于父進程是有效的,所以系統不會主動釋放,而是等待父進程來回收這些資源才會

釋放

僵尸進程的危害?

如果一個父進程創建了很多子進程都不回收,造成嚴重內存泄露問題,可用資源越來越少

如何解決僵尸進程呢?

父進程調用系統調用來進行回收,或者通過捕捉信號的方式(涉及到信號的知識)

如果已經發生僵尸進程,需要殺死父進程來讓僵尸進程變為孤兒進程被系統自動領養回收

五、孤兒進程

前面提到了僵尸進程,那什么是孤兒進程呢?跟僵尸進程相反

如果父進程早于子進程退出了,此時子進程沒有父親了,就變成了孤兒進程

孤兒進程會被1號進程也就是系統領養,由系統管理回收

孤兒進程最終會被釋放,而僵尸進程危害較大

六、進程的優先級 以及 并發/并行

簡短總結:

七、進程的切換

簡短總結:

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

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

相關文章

銷售管理系統哪個好?14款軟件深度對比

本文將深入對比14款銷售管理系統&#xff1a;1.紛享銷客&#xff1b; 2.Zoho CRM&#xff1b; 3.神州云動 CRM&#xff1b; 4.勵銷云 CRM&#xff1b; 5.Microsoft Dynamics?365 CRM&#xff1b; 6.悟空 CRM&#xff1b; 7.泛微 CRM&#xff1b; 8.HubSpot CRM&#xff1b; 9.…

如何從 0 到 1 開發企業級 AI 應用:步驟、框架與技巧

本文來自作者 莫爾索 的 企業級 AI 應用開發與最佳實踐指南&#xff0c; 歡迎閱讀原文。 大家好&#xff0c;我之前出版的《LangChain 編程&#xff1a;從入門到實踐》一書獲得了良好的市場反響和讀者認可。近期推出了第二版&#xff0c;我對內容進行了大幅更新&#xff1a;近 …

【LLM】Openai之gpt-oss模型和GPT5模型

note gpt-oss模型代理能力&#xff1a;使用模型的原生功能進行函數調用、網頁瀏覽&#xff08;https://github.com/openai/gpt-oss/tree/main?tabreadme-ov-file#browser&#xff09;、Python 代碼執行&#xff08;https://github.com/openai/gpt-oss/tree/main?tabreadme-o…

Ubuntu 20.04 虛擬機安裝完整教程:從 VMware 到 VMware Tools

目錄 一、VMware的安裝 1. 資源獲取 1. 網盤提取 2. VMware官網&#xff0c;選擇自己合適的版本&#xff0c;我下載的是16.2版本 2.安裝步驟 二、Ubuntu的安裝 1. Ubuntu 鏡像文件官網下載 2. Ubuntu的安裝步驟 第一步&#xff1a;打開剛剛安裝好的VMware16.2.0&#…

【DL】最優化理論和深度學習

最優化理論是計算機科學中一個重要的概念&#xff0c;它用于幫助我們找到最優解&#xff08;即最小或最大值&#xff09;的算法。在深度學習中&#xff0c;最優化理論用于幫助深度學習模型找到最優解。訓練誤差&#xff08;Training Error&#xff09;&#xff1a;指模型在訓練…

商品分類拖拽排序設計

商品分類、菜單項以及其他需要排序的元素常常會用到拖拽排序功能。這個看似簡單的交互背后&#xff0c;其實涉及到一系列復雜的后端邏輯處理&#xff0c;尤其是在如何高效地更新數據庫記錄方面。本文將探討兩種常見的實現方案&#xff0c;并分析各自的優缺點&#xff0c;幫助你…

ROS機器人云實踐設計申報書-草稿

ROS機器人云實踐作品申報書 ROS機器人云實踐設計一、項目基本信息 項目名稱&#xff1a;基于ROS的移動機器人云實踐平臺設計與應用 申報單位&#xff1a;[具體單位名稱] 項目負責人&#xff1a;[具體參與人員] 申報日期&#xff1a;[填寫日期] 二、項目背景與目標 項目背景&…

Jira 根據問題類型 為 描述 字段添加默認值

背景: jira 8.16 想要為問題類型為 需求 的問題默認增加描述字段默認值 想都沒想直接根據之前添加缺陷類型時描述默認值的方式去添加(系統字段--描述--上下文和默認值--添加上下文), 結果不隨我愿, 系統默認的這個功能不能根據問題類型切換而切換不同的默認值, 只能設置 1 個…

深度學習(5):激活函數

ss激活函數的作用是在隱藏層引入非線性&#xff0c;使得神經網絡能夠學習和表示復雜的函數關系&#xff0c;使網絡具備非線性能力&#xff0c;增強其表達能力。一、常見激活函數1、sigmoid激活函數的作用是在隱藏層引入非線性&#xff0c;使得神經網絡能夠學習和表示復雜的函數…

洛谷 小 Y 拼木棒 貪心

題目背景上道題中&#xff0c;小 Y 斬了一地的木棒&#xff0c;現在她想要將木棒拼起來。題目描述有 n 根木棒&#xff0c;現在從中選 4 根&#xff0c;想要組成一個正三角形&#xff0c;問有幾種選法&#xff1f;答案對 1097 取模。輸入格式第一行一個整數 n。第二行往下 n 行…

飛算JavaAI的“盾牌”計劃:手撕Spring Security + JWT認證鏈

一、飛算JavaAI&#xff1a;智能時代Java開發的“全能引擎” 1.1 飛算JavaAI&#xff1a;重新定義Java安全開發的“技術革命”在數字化浪潮席卷全球的今天&#xff0c;Java作為企業級應用開發的首選語言&#xff0c;其安全性需求隨著業務復雜度的提升而呈指數級增長——從用戶認…

大語言模型提示工程與應用:大語言模型進階提示工程技術

高級提示詞使用 學習目標 掌握大語言模型中進階提示工程技術的原理與應用&#xff0c;包括零樣本/少樣本提示、思維鏈推理、知識生成等核心方法&#xff0c;提升復雜任務解決能力。 相關知識點 零樣本與少樣本提示思維鏈提示技術高級推理技術 學習內容 1 零樣本與少樣本提…

【從零開始java學習|第五篇】項目、模塊、包、類的概念與聯系

目錄 一、概念與作用&#xff1a;從宏觀到微觀的層級拆分 1. 項目&#xff08;Project&#xff09;&#xff1a;最外層的 "大容器" 2. 模塊&#xff08;Module&#xff09;&#xff1a;項目的 "功能子單元" 3. 包&#xff08;Package&#xff09;&…

kernel pwn 入門(四) ret2dir詳細

介紹 ret2dir 是哥倫比亞大學網絡安全實驗室在 2014 年提出的一種輔助攻擊手法&#xff0c;主要用來繞過 smep、smap、pxn 等用戶空間與內核空間隔離的防護手段&#xff0c; 原論文見此處&#xff1a; ret2dir原文論文 參考&#xff1a;kernel pwn入門到大神 ret2dir ret2di…

n階常系數齊次線性微分方程的含義

微分方程 (Differential Equation): 含義&#xff1a; 包含未知函數及其導數&#xff08;或微分&#xff09;的方程。例子&#xff1a; dy/dx 2x&#xff08;未知函數是 y(x)&#xff0c;導數是 dy/dx&#xff09;, dy/dt 2 dy/dt y 0&#xff08;未知函數是 y(t)&#xff…

hexo + github 搭建個人博客

hexo github 搭建個人博客環境配置部署環境配置部署 所需環境&#xff1a; 跳過github郵箱注冊。 右鍵點擊桌面空白處&#xff0c;選擇 “Git Bash Here”&#xff0c;輸入以下命令設置用戶名和郵箱&#xff1a; git config --global user.name "GitHub用戶名" g…

ERFA庫全面指南:從基礎概念到實踐應用

ERFA庫全面指南&#xff1a;從基礎概念到實踐應用 ERFA&#xff08;Essential Routines for Fundamental Astronomy&#xff09;作為天文學計算領域的重要開源庫&#xff0c;為開發者提供了處理天文時間、坐標系轉換和星體位置計算等核心功能。本文將深入探討ERFA庫的技術細節…

STM32 HAL庫串口的功能實現與改進

目錄 概述 1 CubeMX配置串口參數 1.1 STM32CUB配置參數 1.2 生成代碼 2 核心代碼介紹 2.1 初始化函數 2.2 中斷函數 2.3 重要的用戶函數 2.4 實現用戶接口函數 3 接收數據函數的優化 3.1 HAL庫接收函數的缺陷 3.2 改進接收函數 概述 在STM32開發中使用HAL庫操作串…

DBA | SQL 結構化查詢語言介紹與學習環境準備

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ]&#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一名深耕安全運維開發&#xff08;SecOpsDev&#xff09;領域的技術從業者&#xff0c;致力于探索DevOps與安全的融合&#xff08;Dev…

day39_2025-08-13

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 展平操作&#xff1a;除第一個維度batchsize外全部展平 dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練…