博客 / 詳情

返回

進程概念

馮諾依曼體系結構

  • 大多數的計算機、服務器等都遵循馮諾依曼體系結構
  • 存儲器用於快慢設備之間的緩衝作用,提高系統的效率(內存可以預先裝載數據)

    • 處理數據時,必須先將數據預裝載到內存中(一次性裝載多條數據,由操作系統完成)
  • 在硬件和數據層面上:CPU只和內存進行交流,外設也只與內存進行交流。
  • 寄存器不僅只存在於CPU中,其他的外設中也存在。
  • 各硬件之間是用總線進行鏈接(IO總線、系統總線)
    image.png

操作系統概念

  • 操作系統實質上是一款專門搞管理的軟件。
  • 操作系統包括內核(進程管理、文件管理、驅動管理)和其他程序(庫函數、shell程序等)

進程控制塊PCB

  • PCB:為了便於系統描述和管理進程的運行,內核為每個進程專門創建的一個結構體對象。(一個PCB對應一個進程)
  • PCB是進程實體的一部分,用於存儲進程所需的所有信息。
  • CPU在執行進程時,是找的PCB,再通過PCB去調用程序代碼和數據。
  • Linux中PCB的結構體是 struct task_struct{ }
  • 系統中PCB是採用雙鏈表的形式鏈接起來的。
  • PCB主要存儲的信息:

    • 標示符:描述此進程的唯一標示符,用於區分其他進程(PID等)
    • 狀態:休眠狀態S、運行狀態R
    • 如果進程是前台運行時,則會標識為 R+
    • 如果進程是後台運行時,則會標識為 R
    • 優先級
    • 程序計數器(PC指針):保存程序中即將被執行的下一條指令的地址。
    • 內存指針:程序代碼和進程相關的數據指針,和其他進程共享的內存塊指針
    • 上下文數據:進程執行時處理器的寄存器中的數據。

      • 例如:當前進程被打斷,去執行另一個進程,當另一個進程執行完後要如何回到之前進程被打斷的位置呢?上下文數據就是用來保存這類數據。
      • 上下文數據是保存在PCB中的。
    • IO狀態信息

查看存儲進程信息的文件

  • 進程信息可以通過 /proc 系統文件夾查看(文件夾的名稱就是該進程的PID)
    image.png

進程狀態

進程的5種狀態

  • 就緒態R :等待被運行。(等待CPU調度)
  • 運行態R :正在運行。(佔用CPU)(運行態包含就緒態,所以運行態可以同時有多個)
  • )殭屍態Z :父進程還在運行,子進程結束還未被回收時,子進程相關信息任然被保存着。
  • 等待態(休眠態)(淺度睡眠 & 深度睡眠):等待一定條件進入就緒態,等待態下即使給它CPU也無法運行。

    • 淺度睡眠S:等待時可以被喚醒(即使沒有等到某個條件,收到信號也可以被喚醒)
    • 深度睡眠D:等待時已經不能被喚醒了,只有等到某個條件才能自動喚醒(收到信號也不能被喚醒),並且該進程不能被殺死,即使是操作系統也不行。
  • 停止態T :進程只是被暫時停止了,還是可以恢復的(不是進程結束了)
  • 死亡態X :進程死亡,這個狀態只是一個返回狀態,任務列表中是看不到這個狀態的。

殭屍進程

  • 子進程先於父進程結束。子進程已經結束了,但是父進程還未幫子進程收屍(即父進程沒有讀取到子進程退出時返回的代碼),這一個子進程就被稱為殭屍進程。
  • 回收殭屍子進程方法一:

    • 父進程可以通過使用wait或waitpid來顯示回收子進程,並且獲取子進程退出的狀態。
  • 回收殭屍子進程方法二:

    • 父進程自己結束時,會自動回收子進程的資源。

    孤兒進程

  • 父進程先於子進程結束,此時子進程就變成了孤兒進程。
  • Linux系統規定:所有的孤兒進程都自動成為一個特殊進程(進程1,也就是init進程)的子進程。

進程優先級

優先級的計算

  • Linux中可以使用 ps -la 顯示系統進程PID和優先級
  • Linux中實際優先級 = PRI + NI (在執行這個算法時,PRI一直都是最初始的優先級)

    • PRI 代表這個進程的優先級,值越小越先執行。
    • NI 代表這個進程的 nice 值(它是優先級的修正值,取值範圍 -20 ~ 19,默認為0)
    • 所以調整進程優先級是調整 nice 值。

image.png

優先級的更改

  • 終端中使用命令 sudo top 進入更改狀態
  • 進入top後按 r 進入輸入狀態
  • 輸入進程PID 然後回車
  • 再輸入新的 nice 值即可

進程相關性質

  • 競爭性:CPU資源很少,而進程較多,所以進程之間是具有競爭性的,為了高效完成任務,合理分配資源,於是有了優先級。
  • 獨立性:多進程運行是相互獨立的,獨享各種資源,進程之間互不干擾。
  • 並行:多個進程在多個CPU下同時運行。
  • 併發:多個進程在同一個CPU下采用進程切換的方式,讓多進程在宏觀上實現同時運行。

環境變量

  • 環境變量實質就是一個系統級別的全局變量。
  • PATH:指定命令的默認搜索路徑
  • 將路徑導入PATH環境變量: echo PATH=$PATH: 路徑
  • HOME:指定用户的主工作目錄(即用户登錄到Linux時進入的默認目錄)

環境變量相關命令

  • echo $環境變量 (查詢相關環境變量)(echo $? 返回最近一次程序執行後的返回值)
  • env (顯示所有環境變量)
  • unset (刪除環境變量)
  • set (顯示本地定義的 shell 變量和環境變量)(本地變量只在本進程中有效)
  • export (導入新的全局的環境變量)

main函數帶的參數(argv、argv、envp)

  • argc:命令行參數個數
  • argv:命令行參數列表
  • envp:環境變量
    image.png

進程地址空間

  • 注意:進程地址空間不是實際的物理內存,而是映射出的虛擬地址(不同進程的虛擬地址是相同的,但是實際映射的物理內存是不同的地址)
  • 每個進程都有自己的進程地址空間和對應的頁表(用於表示映射關係)
  • 進程地址空間實質是物理內存中的一種內核數據結構(mm_struct)
    image.png

使用進程地址空間的優勢

  • 避免了野指針的出現(野指針在頁表中沒有映射)
  • 避免系統級別的越界訪問,頁表只會映射當前進程的物理內存,不會映射到其他地址。
  • 統一進程的排布,即所有進程在進程地址空間中排布方式都是相同的,並且空間範圍也是相同的。
  • 每個進程都相當於獨立出來的,更好的實現進程獨立及合理使用內存空間。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.