【Linux】進程狀態

進程狀態

  • 進程狀態的簡要介紹
  • 運行狀態
    • 進程排隊
  • 阻塞狀態
  • 掛起狀態
  • Linux中的進程狀態

進程狀態的簡要介紹

??進程狀態指的是一個操作系統中正在運行的進程當前所處的狀態。根據不同的操作系統,進程狀態可能會有一些細微的差別,但最主要的是以下三種狀態

  1. 運行狀態
  2. 阻塞狀態
  3. 掛起狀態

??下面我會對這三個狀態做一個詳細的介紹

運行狀態

??談到運行狀態我們常常會有一個誤區,那就是認為一個進程在運行中才能叫做運行狀態,其實不然,只要是進程在運行中或者是在運行隊列中都可以被稱作當前進程處于運行狀態
??那么此時又有了一個新的概念:運行隊列,什么是運行隊列?簡單來說,運行隊列就是操作系統中用來存儲和管理進程的數據結構,通過該隊類可以充分利用 CPU 資源并提高系統的響應速度。也可以這么認為,這么運行隊列和我們平常認識的隊列特殊就在于運行隊列中裝的都是進程,并且這個運行隊列是專門為CPU所服務的。
??我們想要運行進程,就需要CPU去參與運算,但是進程有很多,CPU卻只很少,大部分的電腦上只有一個CPU,所以為了高效率管理,操作系統就會幫CPU維護一個運行隊列,當我們想要加載一個進程時,首先操作系統就會讓這個進程的pcb對象去CPU的運行隊列中排隊,這個時候,有牽扯出了一個新的概念:進程排隊

進程排隊

??通過進程的初步認識一和進程的初步認識二我們知道,所謂的pcb對象,實際上就是一個結構體對象,所以,進程排隊,我們就可以簡單理解為將一個結構體對象push到隊列中。
??了解到了以上之后,我們再來看看這個pcb對象是如何push到隊列中的
在這里插入圖片描述

??可以看到,在pcb中嵌套了一個struct listnode類型的結構體對象,這個結構體對象的next指針指向的就是下一個結構體對象中的類型為struct listnode的結構體對象,并且一個pcb對象中包含了不止一個struct listnode的結構體對象,這樣就確保了該pcb對象可以同時被聯入不同的數據結構中。
補充
??雖然這樣的結構設計可以確保pcb同時在操作系統中的不同的數據結構中,但是next指針和prev指針始終只能指向下一個pcb對象中的struct listnode類型的結構體對象,我們找到pcb對象的主要目的就是訪問pcb對象的數據,通過這種方法卻只能訪問pcb對象中的某個成員變量,那要怎么去訪問整個pcb對象呢?
??我們可以簡化以下這個問題

struct A
{char x;int c;
};int main()
{struct A s;return 0;
}

??以該結構體為例,當我們知道了s的成員變量c的地址,要想知道結構體對象s的地址,通過結構體的內存對齊規則可以得出&c=&s+偏移量,現在拿到了c的地址,要知道s的地址,也就是&s=&c-偏移量,我們只需要知道偏移量即可
??要知道偏移量,我們可以對零地址(地址為0)進行強轉成struct A類型,然后對拿到的成員變量n進行取地址操作,由于結構體對象的地址為0,所以變量n的地址就是n相對于結構體對象地址的偏移量
??同理,當我們知道了pcb對象中的struct listnode類型的結構體對象的地址,我們也可以進行如上操作,即&s=(task_struct*)(&c-&((task_struct*)0->c))

阻塞狀態

??首先我們要知道,進程不是一直都在運行的,有時候進程需要等待某種硬件資源,比如在C語言程序中,我們會用到printf函數和scanf函數,printf函數就需要用到屏幕,而scanf就需要鍵盤,如果說進程沒有等到對應的硬件資源時,它就不會繼續運行。而是會做兩件事

  1. 將當前進程狀態由運行狀態改為阻塞狀態
  2. 將pcb對象連到對應資源的等待隊列中

??通過以上我們可以知道,不是只有CPU才有隊列,其他的設備也有自己的隊列。
??當一個程序中有scanf函數需要用到鍵盤,CPU此時無法繼續執行下去,操作系統就會將該程序對應進程pcb從CPU的運行隊列拿到鍵盤的等待隊列中去,當我們通過鍵盤按下一個按鍵的時候,操作系統會將該數據拿到并交給對應的進程,然后再將pcb從鍵盤的等待隊列中拿到CPU的運行隊列中去

掛起狀態

??掛起狀態的前提就是當前計算機的資源(主要是內存資源)已經十分吃緊了,而有個進程還在等待隊列中(阻塞狀態)
??也就是說當前進程無法繼續執行下去并且該進程對應的可執行程序仍然會占用內存空間,操作系統為了節省資源,就會將該進程的對應的程序和數據寫入磁盤中,這個時候該進程就是掛起狀態。等到該進程要再次被調度的時候操作系統再將對應的數據和程序加載到內存
補充
??操作系統一般會將進程所對應的代碼和數據放到磁盤中的一塊固定的區域,這塊區域叫做swap分區,這個區域是操作系統在資源緊張的時候和磁盤進行數據交換的地方
在這里插入圖片描述
??一般來說,swap分區不會太大,通常是內存大小的一般或者是等于內存大小,最多不會超過內存大小的兩倍,因為喚入和喚出其實是一個訪問外設的過程(將數據進行拷貝),這是比較慢的,用效率換取系統的穩定性,如果將swap分區設置的比較大,那么操作系統就會比較依賴這個swap分區最終帶來的結果就是整個系統和swap分區IO交互的頻率變高,使得系統的效率就變低了

Linux中的進程狀態

??那么,進程狀態究竟是什么呢?實際上進程狀態實際上就是整形變量,就像下面這樣

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char* const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

??以上為狀態在kernel原代碼中的定義。

R 運行狀態:
??運行狀態并不代表著進程正在運行中,它表明進程要么是在運行中要么在運行隊列里隨時做好了被調度的準備
在這里插入圖片描述
補充:前臺進程和后臺進程
Linux中,前臺進程和后臺進程是指進程與終端(Terminal)之間的關系。

前臺進程:前臺進程是指當前正在終端上活躍運行的進程,它會接收終端輸入并向終端輸出信息。用戶可以直接與前臺進程進行交互,而且前臺進程通常會占用終端的顯示區域。當一個進程在前臺運行時,用戶可以通過鍵盤輸入命令來控制該進程的行為。

后臺進程:后臺進程是指在終端上運行,但不會占用終端顯示區域或接收終端輸入的進程。用戶可以將一個前臺進程轉為后臺進程,從而讓其在后臺靜默運行,不影響用戶在終端上的其他操作。后臺進程通常用于執行一些需要長時間運行的任務,或者不需要用戶直接交互的程序。

??T在Linux中,可以使用特定的命令和符號來控制進程的前臺和后臺運行。例如,使用 & 符號可以將一個命令放到后臺運行;使用 fg 命令可以將一個后臺進程切換到前臺運行。這些功能使得用戶能夠更靈活地管理和控制系統中的進程。

S 睡眠狀態:
??睡眠狀態意味著在等待某個事件的完成(這個睡眠也叫做可中斷睡眠),當我們在C語言文件中加入sleep函數也可以使進程變為睡眠狀態
在這里插入圖片描述

在這里插入圖片描述
??在以上代碼中,因為進程一直在等待從鍵盤中拿數據,所以該進程處于鍵盤的等待隊列中,此時的狀態就是直接講到的阻塞狀態,在Linux中,將其之為睡眠狀態

D 磁盤休眠狀態
??有時候也叫不可中斷睡眠狀態,在這個狀態下的進程通常會等待IO的結束(操作系統在內存嚴重不足時會殺死進程,但是不會中斷狀態為D的進程)

T 停止狀態
??T停止狀態(stopped): 可以通過發送 SIGSTOP 信號給進程來停止(T)進程。這個被暫停的進程可以通過發送 SIGCONT 信號讓進程繼續運行。
在這里插入圖片描述
注意:一旦將一個進程停止,這個進程就變成了后臺進程

X死亡狀態
這個狀態只是一個返回狀態,你不會在任務列表里看到這個狀態

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

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

相關文章

Java——方法的使用

目錄 一.方法的概念及使用 1 什么是方法(method) 2.方法定義 3 方法調用的執行過程 4 實參和形參的關系(重要) 5.沒有返回值的方法 二.方法重載 1.為什么需要方法重載 2.方法重載概念 3.方法簽名 三.遞歸 1.遞歸的概念 2.遞歸執行過程分析 3. 遞歸練習 一.方法的…

貓頭虎分享已解決Bug || 容器編排問題:OrchestrationFailure, ContainerManagementError

博主貓頭虎的技術世界 🌟 歡迎來到貓頭虎的博客 — 探索技術的無限可能! 專欄鏈接: 🔗 精選專欄: 《面試題大全》 — 面試準備的寶典!《IDEA開發秘籍》 — 提升你的IDEA技能!《100天精通鴻蒙》 …

代碼隨想錄算法訓練營第四十二天|122. 買賣股票的最佳時機 II

674. 最長連續遞增序列 public static int findLengthOfLCIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for (int i 1; i < nums.length; i) {dfs(nums, dp, i);}Arrays.sort(dp);return dp[dp.length - 1];}public static void dfs(int[] nums, int[] dp, i…

【Python】【VS Code】VS Code中python.json和setting.json文件配置說明

目錄 1. python.json配置 2. setting.json配置 3. 解決中文亂碼 4. 實現效果 1. python.json配置 python.json 獲取步驟&#xff1a;文件 -> 首選項 -> 配置用戶代碼片段 -> python 此為VS Code的頭文件設置&#xff0c;復制以下內容到 python.json {"HEADER…

個人做抖店如何能夠快速起店?掌握好技巧是關鍵!建議收藏!

大家好&#xff0c;我是電商小布。 相信我們每個朋友在店鋪開通后&#xff0c;最關心的事情就是小店成功起店了。 那么個人做抖店想要快速起店&#xff0c;該怎么來進行操作呢&#xff1f; 接下來&#xff0c;小布重點給大家說三點&#xff1a; 首先來說一下小店的主體類型…

git常用命令記錄

1、第一次初始化 git init git add . git commit -m ‘first commit’ git remote add origin gitgithub.com:帳號名/倉庫名.git git pull origin master git push origin master # -f 強推 git clone gitgithub.com:git帳號名/倉庫名.git 2、工作基本操作 git checkout master…

dell r740服務器黃燈閃爍維修現場解決

1&#xff1a;首先看一下這款DELL非常主力的PowerEdge R740服務器長啥樣&#xff0c;不得不說就外觀來說自從IBM拋棄System X系列服務器后&#xff0c;也就戴爾這個外觀看的比較順眼。 圖一&#xff1a;是DELL R740前視圖&#xff08;這款是8盤機型&#xff09; 圖二&#xff…

QT 數據庫的增加操作和畫圖 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…

springboot集成JWT實現token權限認證

vuespringboot登錄與注冊功能的實現 注&#xff1a;對于JWT的學習&#xff0c;首先要完成注冊和登錄的功能&#xff0c;本篇博客是基于上述博客的進階學習&#xff0c;代碼頁也是在原有的基礎上進行擴展 ①在pom.xml添加依賴 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及運行原理 和 權限

一. Shell命令及原理 Linux操作系統狹義上是Linux內核&#xff0c;廣義上是指Linux內核Linux外殼(Shell)和對應的配套程序 Linux外殼&#xff1a;Linux 外殼是用戶與內核之間的接口&#xff0c;用戶通過外殼與操作系統進行交互和操作。在 Linux 系統中&#xff0c;用戶可以選…

C語言——static的三大用法

被稱為面試愛考愛問題的它到底有何奧義 它難度不大并且非常常用&#xff0c;話不多說&#xff0c;直接開始 一、局部靜態變量 定義 在函數內部使用static修飾的變量被稱為局部靜態變量&#xff0c;與普通的局部變量不同&#xff0c;局部靜態變量在使用后不會被銷毀&#xff…

pycharm 遠程運行報錯 Failed to prepare environment

什么也沒動的情況下&#xff0c;遠程連接后運行是沒問題的&#xff0c;突然在運行時就運行不了了&#xff0c;解決方案 清理緩存&#xff1a; 有時候 PyCharm 的內部緩存可能出現問題&#xff0c;可以嘗試清除緩存&#xff08;File > Invalidate Caches / Restart&#xff0…

mysql優化指南之原理篇

之前碰到一個線上問題&#xff0c;在接手一個同事的項目后&#xff0c;因為工期比較趕&#xff0c;我還沒來得及了解業務背景和大致實現&#xff0c;只是了解了上線發布的順序和驗證方式就進行了上線&#xff0c;在上線進行金絲雀的時候系統還沒發生什么異常&#xff0c;于是我…

【面試題】談談MySQL的事務

事務是啥 MySQL的事務就是把多個sql語句操作打包在一起執行&#xff0c;要么全部執行&#xff0c;要么一個都別執行。這種操作稱為“原子性”&#xff0c;是事務最核心的特征。當某個sql操作出錯時&#xff0c;就會進行“回滾/rollback”操作&#xff0c;即把執行過的操作逆向…

MySQL數據庫進階第二篇(索引,SQL性能分析,使用規則)

文章目錄 一、索引概述二、索引結構三、結構 - B-Tree四、結構 - BTree五、結構 - Hash六、索引分類七、索引語法1.案例代碼 八、SQL性能分析1.查看SQl執行頻率2.慢查詢日志3.PROFILES詳情4.EXPLAIN執行計劃 九、 索引使用規則十、SQL 提示十一、覆蓋索引十二、前綴索引十三、單…

滾動加載react-infinite-scroll-component

react-infinite-scroll-component 當請求數據量過大時&#xff0c;接口返回數據時間會很長&#xff0c;數據回顯時間長&#xff0c;Dom 的渲染會有很大的性能壓力。 antd的List組件中有提到一個滾動加載的組件庫react-infinite-scroll-component 實現滾動加載 Antd&#xff1…

考研高數(高階導數的計算)

1.歸納法 常見高階導數 2.泰勒展開式 3.萊布尼茲公式 4.用導數定義證明導函數在某一點連續的例題

【kubernetes】二進制部署k8s集群之cni網絡插件flannel和calico工作原理(中)

↑↑↑↑接上一篇繼續部署↑↑↑↑ 目錄 一、k8s集群的三種接口 二、k8s的三種網絡模式 1、pod內容器之間的通信 2、同一個node節點中pod之間通信 3、不同的node節點的pod之間通信 Overlay Network VXLAN 三、flannel網絡插件 1、flannel插件模式之UDP模式&#xff0…

java對象所占內存大小輸出

如何計算java對象所占內存大小&#xff0c;可以使用下述三種方法。 使用jdk8自帶API 使用下面語句打印對象所占內存大小&#xff1a;需要保證jdk版本是jdk8。System.out.println(ObjectSizeCalculator.getObjectSize(3L)); 借助org.apache.lucene工具類 引入maven坐標 <…