Linux知識回顧總結----進程狀態

? ? ? ? 本章將會介紹進程的一些概念:馮諾伊曼體系結構、進程是什么,怎么用、怎么表現得、進程空間地址、物理地址、虛擬地址、為什么存在進程空間地址、如何感性得去理解進程空間地址、環境變量是如何使用的。

目錄

1. 馮諾伊曼體系結構

? ? ? ? 1.1 是什么

? ? ? ? 1.2 結論

? ? ? ? 1.3 操作系統

? ? ? ? 1.4 搞管理的軟件 + 計算機的結構

? ? ? ? 1.5 總結

2. 進程的基本概念

? ? ? ? 2.1 什么是進程????????

? ? ? ? 2.2 為什么會有進程

? ? ? ? 2.3 見見進程

? ? ? ? 2.4 通過系統調用查看

? ? ? ? 2.5 fork()函數

3. 進程的狀態

? ? ? ? 3.1 為什么?

? ? ? ? 3.2 需要了解的三個狀態

? ? ? ? ? ? ? ?3.2.1 運行狀態

? ? ? ? ? ? ? ? 3.2.2 阻塞狀態

? ? ? ? ? ? ? ? 3.2.3 進程狀態的本質

? ? ? ? ? ? ? ? 3.2.4 掛起狀態

? ? ? ? 3.3 在Linux下的進程狀態

? ? ? ? ?????3.3.1 規定的幾種狀態

????????? ? ?3.3.2?進程的查看與孤兒進程

? ? ? ? ? ? ?3.3.3?僵尸進程

4.總結


1. 馮諾伊曼體系結構

? ? ? ? 1.1 是什么

? ? ? ? ? ?這個體系結構在我們計算機如筆記本、服務器,都是遵守這個體系結構。主要就是三部分 CPU 、 存儲器(里面存放的是物理地址)、IO設備。

? ? ? ? 1.2 結論

? ? ? ? ? 通過理解了這個結構,我們需要知道,我們的 CPU 在進行計算的時候不是直接與輸入輸出設備進行連接交互,是與存儲器進行交互。所有的外設,有數據的載入,只能載入到內存當中。

? ? ? ? 1.3 操作系統

? ? ? ? ?概念:任何計算機系統都包含一個基本的程序集合,稱為操作系統(OS)。簡單來說就是進行軟硬件結合的軟件。對上服務用戶(提供一個良好的執行環境),對下管理好各種硬件。

? ? ? ? 1.4 搞管理的軟件 + 計算機的結構

? ? ? ? 如何理解他是搞管理的軟件?,舉一個例子:在學校里面,我們見不到校長,但是校長會對我們進行管理,如何理解這個管理?就是雖然沒有見面,但是校長手里有我們的各種數據、例如:學號、成績、宿舍號、專業、掛了幾科,這些數據是校長進行決策的一個依據。校長就是根據這些數據來進行決策,如果是掛的科比較多了,就要警告,處理。所以我們就相當是各種硬件(被管理者),然后校長(管理者)就是 CPU 進行決策。他是怎么拿到數據的就是通過輔導員拿到數據。

? ? ? ? 那么管理者如何拿到數據,通過輔導員,在計算機系統中相當于驅動。

? ? ? ? 然后我們操作系統對于用戶想要進行的操作需要經過 shell(因為操作系統不相信我們用戶是安全的),提供的接口來調用系統內部的函數(系統調用接口,在 LINUX 就是 c 式的接口)。對內保護自己,對外提供服務

? ? ? ? 1.5 總結

? ? ? ? 通過上面的例子,我可以推斷出。校長進行管理一個學生的時候需要對他的信息繼續描述變成一個結構體,然后將結構體通過鏈表或者是其他的數據結構連接到一起。所以對于同學的操作就變成對于結構體的操作。我們計算機也是需要這樣的。

? ? ? ? 所以!計算想要管理硬件需要兩步:1. 首先進行描述,將相關的內容變成(struct)結構體的形式存在 2.隨后進行組織,使用鏈表,其他高效的數據結構存放起來。

2. 進程的基本概念

? ? ? ? 2.1 什么是進程????????

? ? ? ? ? ? ? 進程是:一個運行起來(加載到內存)的程序/內存當中的程序。我們先來理解一下程序,就是寫在磁盤里的二進制程序。執行就要加載到內存當中。

? ? ? ? ? 一個cpu計算機可能許多的程序需要被執行,所以就需要進行描述 + 組織!繼續描述時需要通過 PCB(進程控制塊)struct task_struct{} 。在內存當中會對于沒有個程序提供一個進程控制塊。

? ? ? ? 通過上面的描述,我們對于進程的管理,轉化成對于鏈表的增刪查。進程 = 內核數據結構(表示當前進程的屬性,例如:掛起、阻塞、等待等狀態) + 進程對應的磁盤代碼以及數據(就是相關內容,拷貝到內存)。

? ? ? ? 2.2 為什么會有進程

? ? ? ? 一方面:需要進行管理,一個 cpu 只能執行一個進程,所以需要進行管理繼承。另外一方面

PCB 的作用就像一本進程的“身份檔案+進度卡,讓操作系統了解進程到達了程度了。

? ? ? ? 2.3 見見進程

? ? ? ? 簡單的進程,在Window里面。在Linux里面可以使用 ps ajx | grep '文件名'可以查看我已經打開的進程。

????????

在Linux 中我先書寫一個進程,然后再Xshell中顯示一下,如下圖所示:可以見簡單的看到有一個進程正在執行。

? ? ? ? 2.4 通過系統調用查看

? ? ? ? 可以使用兩個系統的函數,來查看當前進程的標識符 pid(當前進程進程) 與 ppid(父進程);??pid 很好理解,我們為什么需要有 ppid ,因為一個進程做的事情怎么樣了,肯定是需要有一個 leader 知道他干的怎么樣了,如何就需要給當前進程一個 ppid(父進程)。

? ? ? ? 2.5 fork()函數

? ? ? ? fork()是調用系統函數,實現創建一個子進程。他有兩個返回值一個,對應不同的進程有不同的返回值,例如:如果是子進程返回0,對于父進程返回他的子進程(為什么要這樣?因為父親就一個爹,所以不需要特別的說明,但是父進程有好幾個孩子,所以需要返回一個孩子的pid,說明是自己的大兒子,還是二兒子過來然我抱一下);

代碼表示的結果為:

#include <sys/types.h>
#include <unistd.h>
int main()
{// printf("pid: %d\n", getpid());// printf("ppid: %d\n", getppid());int ret = fork();if(ret == 0){printf("ret:%d\n", ret);printf("我是子進程,我的pid為:%d, ppid:%d\n",getpid(), getppid());}else{printf("ret:%d\n", ret);printf("我是父進程,我的 pid 為:%d, ppid為:%d\n",getpid(), getppid());}return 0;
}

到這里很多的同學,可能會有點疑惑為:為什么一個變量ret,會同時進行兩次打印,也就是為什么會有兩個結果。這個就跟進程有很大關系。

? ? ? ? 可以這么理解,我們的子進程,在創建的時候會進行寫時拷貝,開辟一模一樣一樣的空間,將父進程的部分內容拷貝過來,然后進行調用,通過管理PCB(struct結構體),經過頁表,就會單獨的進行子進程的代碼與數據。

3. 進程的狀態

? ? ? ? 3.1 為什么?

? ? ? ? 想要了解正在運行著的進程是什么意思?就要明白進程的狀態。我們為什么有要對進程有狀態的規定呢?

????????因為一個cpu只能進行一個進程其他的進程就需要進行等待的操作,所以其他的進程就要處于等待或者是其他的狀態。對于這個進程我們要能夠區分兩個概念,就是一個是操作系統哲學當中的進程狀態的概念,以及真正的在 Linux 當中使用的兩個概念。

? ? ? ? 3.2 需要了解的三個狀態

? ? ? ? ? ? ? ?3.2.1 運行狀態

? ? ? ? ? ? ? ? ? 一個 cpu 就有一個運行狀態,一個進程以 PCB 的形式存放在這個cpu的運行隊列里面。

? ? ? ? ? ? ? ? 3.2.2 阻塞狀態

? ? ? ? ? ? ? ? ? CPU的運行隊列中,在運行一個程序的時候不只是需要訪問 CPU 還需要訪問外設,但是外設又因為速度相比 CPU 比較慢所有需要在外設中重新開辟一個隊列,將接下來可能會運行的程序存放到這個隊列里面,這樣的操作就叫做堵塞狀態。

? ? ? ? ? ? ? ? 3.2.3 進程狀態的本質

? ? ? ? ? ? ? ? ? ? ?本質就是進程 PCB 結構體在不同的隊列之中。我們所說的進程是運行狀態不是進程正在運行,而是存放在 Running 這個結構體里面(這個結構體有head*指針,指向進程控制塊)。在其他的狀態也是這樣。

? ? ? ? ? ? ? ? 3.2.4 掛起狀態

????????????????由于內存的空間是有限的所以,遇到內存空間爆滿的時候就需要,將一些 PCB 對應的核心代碼放到存盤。等到需要的時候再將它取出(概括來說就是數據的換入、換出。)。????????

? ? ? ? 3.3 在Linux下的進程狀態

? ? ? ? ?????3.3.1 規定的幾種狀態

? ? ? ? ? ? ? ? 為了方便好看,這里就不再進行碼字,直接放上這張圖片。Linux 里面的進程相當于是對于操作系統里面進程的詳細化,實例化。

????????????????

? ? ? ? ? ? ? ? 還有的狀態為:+R,+S。有沒有 + 號的區別在于?有 + :表示前臺進程,輸入其他命令不會顯示的命令行上,無 + : 表示后臺進程,當進程在進行的時候,可以在命令行上使用其他的指令。(相當于有 + 之后變成了高級模式不能執行其他的指令,個人理解可能有錯🐱)

????????3.3.2?進程的查看與孤兒進程

? ? ? ? ? ? 我們想要查看進程可以使用?ps axj | grep。進行查看狀態。接下來我會寫一個程序來體現進程狀態。我寫一個持續打印的代碼,其中的狀態是 S+,阻塞狀態,為什么會這樣?因為使用外設打印的非常的慢,所以當 CPU 發出指令的時候外設的打印對列布滿了進程,每個進程都處于等待的狀態之中。

? ? ? ? ? ?我們先來感性的理解一下什么是孤兒進程:從字面意思可以看出,孤兒就是沒有父親,也就是沒有ppid,這里的沒有是指父親創建子進程后父進程被殺掉了,但是他的子進程還在運行中等待著子進程的回收。但是我們的進程是由 PID = 1(是由操作系統提供的) 的所以這個子進程會被 PID = 1 進程進行領養(使用 kill -9 殺死父進程)。從圖中可以看到父進程消失了,然后子進程的ppid 變成 1,被領養了。此時這個子進程就變成了孤兒進程。

??????????3.3.3?僵尸進程

? ? ? ? ? ? ? ? 是什么:感性 + 理性理解:僵尸進程就是父進程創建了一個子進程,然后子進程去執行操作,但是子進程退出了,但是父進程沒有回收子進程的信息,也就是 Z 狀態。好比:父母讓我們去買醬油,最后父母是需要知道我到底買沒買上,我最后的結果是什么,如果不告訴的化就會造成僵尸進程。解決為使用 wait(),來回收子進程,判斷子進程的信息,比如是正常退出,還是有異常退出,信息都存放在wait對應的參數列表里面。

? ? ? ? ? ? ? ? ?這個僵尸狀態的解決,到后面會進行講解,此處不進行過多描述。從圖片中可以看出進入了僵尸狀態。

4.總結

????????以上是對于進程狀態的回顧,下一章將會講解進程的優先級以及進程的切換🥵🥵🥵。這個文章用于我的學習記錄,如果是有其他的錯誤還請批評指正。如果對你有幫助還請給我點個贊👍👍👍。?????

????????

?????????

????????????????

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

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

相關文章

微信小程序之bind和catch

這兩個呢&#xff0c;都是綁定事件用的&#xff0c;具體使用有些小區別。 官方文檔&#xff1a; 事件冒泡處理不同 bind&#xff1a;綁定的事件會向上冒泡&#xff0c;即觸發當前組件的事件后&#xff0c;還會繼續觸發父組件的相同事件。例如&#xff0c;有一個子視圖綁定了b…

Android Test3 獲取的ANDROID_ID值不同

Android Test3 獲取的ANDROID_ID值不同 這篇文章來說明上一篇文章中說到的一個現象&#xff1a;在同一個項目中&#xff0c;創建不同的 app module&#xff0c;運行同一段測試代碼&#xff0c;獲取到的 ANDROID_ID 的值不同。 我也是第一次認真研究這個現象&#xff0c;這個還…

JSON 和 LabVIEW Data Types 互相轉換

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本對應關系怎么看?

docker和docker-compose的版本對應關系怎么看&#xff1f;最近在安裝這兩個工具&#xff0c;像知道他們的版本對應關系&#xff0c;查了不少資料才找到。 雖然 Docker 和 Docker Compose 的版本并不嚴格綁定&#xff0c;但是在某些情況下&#xff0c;新版本的 Docker Compose …

郵科ODM攝像頭:多維度護航高鐵安全系統方案解析

?高鐵作為現代交通的重要支柱&#xff0c;其安全穩定運行依賴于高效的監控體系。攝像頭系統作為高鐵安全管理的“視覺感知中樞”&#xff0c;憑借多場景覆蓋、智能分析以及環境適應性設計&#xff0c;在行車安全、設備維護、乘客服務等方面發揮著不可或缺的作用。本文將從技術…

盒模型小全

CSS盒子模型詳解 1. 定義 CSS盒子模型是用于描述HTML元素在頁面中布局和表現的核心概念之一。在CSS中&#xff0c;所有HTML元素都被視為一個矩形的盒子&#xff0c;這些盒子封裝了周圍的HTML元素&#xff0c;并允許在其他元素和周圍元素邊框之間的空間放置內容。 2. 組成部分…

自定義鼠標效果 - 瀏覽器擴展使用教程

自定義鼠標效果 - 瀏覽器擴展使用教程 這里寫目錄標題 自定義鼠標效果 - 瀏覽器擴展使用教程功能特點安裝方法Chrome/Edge瀏覽器 使用指南1. 更改鼠標光標樣式2. 啟用鼠標軌跡效果3. 自定義軌跡效果點狀/彩虹/漸隱軌跡&#xff1a;表情軌跡&#xff1a; 管理自定義光標支持的文…

基于SpringBoot實現的課程答疑系統設計與實現【源碼+文檔】

基于SpringBootVue實現的課程答疑系統采用前后端分離架構方式&#xff0c;系統設計了管理員、學生、老師三種角色&#xff0c;系統實現了用戶登錄與注冊、個人中心、學生管理、老師管理、科目類型管理、學生問題管理、老師回答管理、老師信息管理、關注列表管理、交流區、輪播圖…

御微半導體面試總結

前一陣子在公司干的難受&#xff0c;所以再合肥這邊面試了幾家公司&#xff0c;挑一個御微半導體來說一下吧&#xff0c;公司主要是做半導體晶元測量的&#xff0c;具體啥我也不太明白。 公司產品線多&#xff0c;每條產品線配有獨立的軟件、結構、光學控制等人員開發語言和框…

Android Compose 自定義圓形取色盤

val Dp.toPx: Floatget() {var scale 3f // MyApplication.context.resources.displayMetrics.apply { // scale density // }return value * scale}val colors List(360) { i ->Color.hsv(360f - i, 1f, 1f) // 360到1的所有HSV顏色 }Preview …

vscode 配置 latex

下載插件 安裝插件前自行安裝 texlive, 按照 https://tug.org/texlive/ 要求安裝 找到 settings 打開 json 文件 在 json 文件中添加如下配置 "latex-workshop.latex.tools": [{"name": "latexmk","command": "latexmk",&qu…

安寶特方案丨船舶智造的“AR+AI+作業標準化管理解決方案”(質檢)

船舶質檢管理現狀&#xff1a;質檢環節部分依賴人工檢測&#xff0c;質檢員依據質量標準對產品進行抽檢或全檢。人工質檢受質檢員主觀因素影響較大&#xff0c;不同質檢員對標準的把握可能存在差異。 一、痛點與需求 1 Arbigtec 人工經驗依賴嚴重&#xff1a; 質檢員的檢測準確…

jenkins gerrit-trigger插件配置

插件gerrit-trigger下載好之后要在Manage Jenkins -->Gerrit Trigger-->New Server 中新增Gerrit Servers 配置好保存后點擊“狀態”查看是否正常

ubuntu24.04下 zookeeper3.8.4 集群的配置

1、環境 1.1 三臺機器網絡互通&#xff0c;并做hosts解析 準備三臺及以上ubuntu24.04主機&#xff08;奇數&#xff09; rootzk-node01:~# hostname zk-node01rootzk-node01:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 u24-server10.0.49.215 zk-node01 10.0.4…

火山引擎 veFuser:面向擴散模型的圖像與視頻生成推理服務框架

資料來源&#xff1a;火山引擎-開發者社區 DiT 模型與推理挑戰 近年來&#xff0c;擴散模型&#xff08;Diffusion Models&#xff09;在生成式人工智能領域取得了突破性進展&#xff0c;尤其是在圖像和視頻生成方面表現卓越。基于 Transformer 的擴散模型&#xff08;DiT, D…

動態多目標進化算法:VARE(Vector Autoregressive Evolution)求解DF1-DF14,提供完整MATLAB代碼

一、VARE簡介 VARE&#xff08;Vector Autoregressive Evolution&#xff09;算法是2023年提出的一種新型的動態多目標優化&#xff08;DMO&#xff09;算法&#xff0c;旨在有效處理隨時間變化的多目標優化問題。它通過結合向量自回歸&#xff08;VAR&#xff09;模型和環境感…

【JavaEE】-- HTTPS

文章目錄 1. HTTPS是什么&#xff1f;2. 加密是什么&#xff1f;2.1 引入對稱加密&#xff08;效率高&#xff09;2.2 引入非對稱加密&#xff08;效率低&#xff09;2.3 引入證書2.3.1 數據簽名2.3.2 通過證書解決中間人攻擊 1. HTTPS是什么&#xff1f; HTTP也是一個應用層協…

撰寫腳本,通過發布/joint_states話題改變機器人在Rviz中的關節角度

撰寫腳本&#xff0c;通過發布/joint_states話題改變機器人在Rviz中的關節角度 提問 為我寫一個改變關節base_spherical_center_high_joint角度的python腳本吧。適用于ROS2的humble 回答 下面是一個適用于 ROS 2 Humble 的 Python 腳本&#xff0c;它會以指定頻率持續發布 …

Redis : Hash類型

哈希類型 哈希類型的命令 hset 設置key指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09; 也可以設置多組field和value hget 獲得哈希中指定字段的值 如果該字段為空或者key為空則返回nil hexists 判斷哈希中是否有該字段的值 如果有則會返回1…

【Chipyard】 conda 環境安裝與使用

一、Conda 安裝&#xff08;以 Miniconda 為例&#xff09; Conda 是一個強大的環境管理工具&#xff0c;可用于創建、隔離和管理不同的 Python/R 環境。以下是在 Ubuntu 上安裝和使用的完整流程&#xff1a; 1. 下載 Miniconda 安裝包 bash # 下載最新版 Miniconda3&#…