【Linux系統編程】進程概念,進程狀態

目錄

一,操作系統(Operator System)

1-1概念

1-2設計操作系統的目的

1-3核心功能

1-4系統調用和庫函數概念?

二,進程(Process)

2-1進程概念與基本操作

?2-2task_struct結構體內容

2-3查看進程

2-4通過系統調用創建進程?

三,進程狀態

?運行狀態(running)

阻塞狀態(sleeping)

掛起狀態

z(zombie)僵尸狀態

僵尸進程危害

孤兒進程


一,操作系統(Operator System)

1-1概念

任何計算機內部都包含一個基本的程序集合,成為操作系統(OS)。

操作系統包括:

  • 內核(進程管理,進程調度,文件管理,驅動管理等)
  • 其他程序(例如函數庫,shell程序等)

1-2設計操作系統的目的

對下,與硬件交互,管理所有的軟硬件資源

對上,為用戶程序(應用層程序)提供一個良好的執行環境

1-3核心功能

操作系統“管理”硬件。

如何管理:

  • 先描述起來,用struct結構體描述信息
  • 再組織,用鏈表或者其他高效的數據結構將struct對象組織起來

1-4系統調用和庫函數概念?

在開發角度,操作系統對外會表現為一個整體,但是會暴露自身的部分接口,供上層開發使用,這部分由操作系統提供的接口,稱為系統調用。

系統調用在使用上,功能比較基礎,對用戶的要求相對較高,所以,有心的開發者會對部分系統調用做封裝,從而形成庫,有了庫,就很方便上層用戶和開發者進行二次開發。

二,進程(Process)

2-1進程概念與基本操作

概念:進程是指程序的一個執行實例,正在執行的程序等。

內核層面概念:每個進程擁有獨立的內存空間,系統資源和執行狀態,是操作系統進行資源分配和調度和核心對象。

操作系統描述進程的的數據結構—PCB(process control block)

PCB基本概念:進程信息被放在一個叫做進程控制塊的數據結構中,可以理解為進程屬性的集合。

  • 在Linux操作系統下的PCB是:task_struct
  • task_struct是Linux內核的?種數據結構,它會被裝載到RAM(內存)?并且包含著進程的信息。

進程=內核數據結構+自己的代碼和數據。

進程=task_struct+自己的代碼和數據。?

同一時刻,可能會有多個可執行程序被加載到內存,而操作系統要對這些可執行程序進行管理,?在操作系統層面上,就會在內部會建立一個task_stuct 對象,里面保存了該可執行程序的代碼地址,數據地址等各種信息。將這些task_struct使用鏈表或者其他數據結構管理起來,那么操作系統對進程的管理就轉化為對鏈表的管理。

?2-2task_struct結構體內容

  • 標識符:描述本進程的唯一標識符,用來區別其他進程
  • 狀態:任務狀態,退出碼,退出信號等。
  • 優先級:相對于其他進程的優先級
  • 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針
  • 上下文數據: 進程執?時處理器的寄存器中的數據
  • IO狀態信息: 包括顯?的IO請求,分配給進程的IO設備和被進程使用的文件列表。
  • 其他信息......

2-3查看進程

1,進程的信息可以通過/proc系統文件夾查看

如:要獲取PID為1的進程信息,你需要查看 /proc/1 這個文件夾。

2,大多數進程信息同樣可以使用top和ps這些用戶及工具來獲取

ps aux? #顯示所有進程信息

top? #動態查看進程資源占用

3,通過系統調用獲取進程標識符?

系統調用

getpid()? ?#當前進程ID(PID)

getppid() #父進程ID(PPID)

?

2-4通過系統調用創建進程?

  • fork有兩個返回值
  • 父子進程共享代碼,數據格子開辟空間,私有一份(采用寫時拷貝)
  • fork之后通常要用if進行分流

創建一個子進程,將父進程的task_struct會拷貝一份給子進程,但是會有部分的數據時需要修改的,比如進程的唯一標識符pid。子進程會共享父進程的代碼數據,相當于發生了淺拷貝。

?pid_t pid = fork();
if (pid == 0) {
? ? // 子進程代碼
} else {
? ? // 父進程代碼
}

三,進程狀態

操作系統中會存在多個進程。每個進程可能會存在不同的狀態,有的進程正在運行,有的進程正在被調度,有的進程處于掛起等等。CPU要執行這些進程,這些進程的task_struct中會保存指向代碼和數據的指針。操作系統會維護一個運行隊列(running queue),存放要運行的task_struct,這個隊列就叫做調度隊列,其中的一個個task_struct就是要被調度的進程。

本質上,進程狀態就是task_struct結構體中的一個變量,用來記錄當前進程的狀態,在操作系統內部通過宏定義的方式,標識不同的狀態。

例如,下面的狀態在Kernel源代碼的定義:

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 */

};

  • R運行狀態(running): 并不意味著進程一定在運行中,它表明進程要么是在運?中要么在運? 隊列里。
  • S睡眠狀態(sleeping): 可中斷休眠,淺度睡眠,就是阻塞狀態。該狀態下的進程是可以被殺掉的。
  • D(Disk sleep):不可中斷休眠,Disk是磁盤的意思。該狀態下的進程是無法被殺掉的。比如一些進程在進行IO的時候,是不允許被殺掉的。在這個 狀態的進程通常會等待IO的結束。
  • T停止狀態(stopped): 可以通過發送 SIGSTOP 信號給進程來停?(T)進程。這個被暫停的 進程可以通過發送 SIGCONT 信號讓進程繼續運行。
  • X死亡狀態(dead):這個狀態只是?個返回狀態,你不會在任務列表里看到這個狀態。
  • t(trancing stop):追蹤狀態,對我們的程序進行debug調試時的狀態。打端點,進程就被暫停了。

?運行狀態(running)

只要進程在調度隊列中,都處于運行狀態。

阻塞狀態(sleeping)

以scanf為例,當執行scanf從鍵盤讀取數據時,未輸入數據時,操作系統會將當前進程的task_struct從調度隊列中移除,放入設備的阻塞隊列中,此時,該進程就處于阻塞狀態。直到鍵盤響應,會將該進程重新放入調度隊列的尾部,繼續運行。

掛起狀態

在磁盤上,會存在一塊特定的分區,叫做swap分區。當內存資源嚴重不足時,操作系統會將一些不會被調度的進程的代碼和數據交換到磁盤的swap分區,在操作系統內部只保留task_struct部分。此時的狀態稱為掛起狀態。

阻塞掛起狀態:將阻塞隊列中的進程 喚出到磁盤的swap分區上

阻塞運行狀態: 將運行隊列末端的進程喚出到磁盤的swap分區上

z(zombie)僵尸狀態

我們創建子進程的目的,是為了讓子進程完成某種工作的。子進程完成后,父進程需要直到完成的信息。所以子進程在執行完后,必須要等待父進程獲取它的退出信息,獲取之前,該子進程的狀態就是Z狀態,僵尸狀態。

當一個進程結束后,它的代碼和數據就會被釋放,所以它的退出信息只會保存在task_struct中。

僵尸進程危害

維護退出狀態本?就是要?數據維護,也屬于進程基本信息,所以保存在task_struct(PCB)中,
換句話說,Z狀態?直不退出,PCB?直都要維護。
那?個父進程創建了很多?進程,就是不回收,就會造成內存資源的浪費。
因為數 據結構對象本?就要占用內存。

孤兒進程

父進程如果提前退出,那么?進程后退出,進入Z狀態之后,那該如何處理呢?
父進程先退出,子進程就稱之為“孤兒進程”。
孤兒進程被1號進程領養,就是要被操作系統領養。此時的子進程會成為后臺進程。

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

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

相關文章

基于TradingView和CTPBee的自動化期貨交易系統實現

引言 在量化交易領域,TradingView因其強大的技術分析工具和豐富的指標庫而廣受歡迎,但是其不支持國內期貨自動化交易,CTPBee則是一個優秀的國產Python期貨交易接口。本文將介紹如何將兩者結合,實現一個完整的自動化交易系統。 本…

初始ARM

ARM最基礎的組成單元。 最小系統:能系統能夠正常工作的最少器件構成的系統 。 一、CPU基礎定義 ALU(運算單元): 負責執行算術和邏輯運算,是處理器的核心部分。 寄存器(R0, R1, R12)&#xff…

通信數據記錄儀-產品概念ID

總結: 1、支持高速CAN、支持容錯CAN、支持單線CAN(理解是支持不同的協議,CANFD、CAN2.0和LIN?) 2、 通過上位機設計時間

Qt QTableView QAbstractTableModel實現復選框+代理實現單元格編輯

話不多說&#xff0c;直接看代碼 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…

JavaWeb學習--MyBatis-Plus整合SpringBoot的ServiceImpl方法(增加,修改與刪除部分)

接下來是常用的增加&#xff0c;修改以及刪除部分 首先是增加部分&#xff0c;增加一個新的數據 Testpublic void testInsert() {// 添加一個新用戶記錄Student s new Student();s.setName("NewStudent");s.setAge(25);boolean saved studentService.save(s);//可以…

明清兩朝全方位對比

目錄 一、政治制度二、民族與社會三、經濟與對外四、文化與思想五、軍事與邊疆六、滅亡原因總結 明清兩朝是中國歷史上最后兩個封建王朝&#xff0c;在政治、經濟、文化等方面存在顯著差異&#xff0c;以下為主要區別&#xff1a; 一、政治制度 皇權集中程度 明朝&#xff1a;…

Linux系統時間

1. Linux系統時間 jiffies是linux內核中的一個全局變量&#xff0c;用來記錄以內核的節拍時間為單位時間長度的一個數值。 jiffies變量開機時有一個基準值&#xff0c;然后內核每過一個節拍時間jiffies就會加1。 一個時間節拍的時間取決于操作系統的配置&#xff0c;Linux系統一…

高并發系統架構設計的深度解析與實施指南【大模型總結】

以下是對高并發系統架構設計的深度解析與實施指南&#xff0c;通過技術分層拆解和場景化案例說明&#xff0c;呈現完整的系統設計方法論&#xff1a; 一、容錯優先思維的系統級實現 1. 混沌工程落地框架 # 混沌實驗設計模板 class ChaosExperiment:def __init__(self, scope,…

leetcode-代碼隨想錄-鏈表-翻轉鏈表

題目 鏈接&#xff1a;206. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1]class Solution { public:ListNode* rev…

spring boot 集成redis 中RedisTemplate 、SessionCallback和RedisCallback使用對比詳解,最后表格總結

對比詳解 1. RedisTemplate 功能&#xff1a;Spring Data Redis的核心模板類&#xff0c;提供對Redis的通用操作&#xff08;如字符串、哈希、列表、集合等&#xff09;。使用場景&#xff1a;常規的Redis增刪改查操作。特點&#xff1a; 支持序列化配置&#xff08;如String…

Linux紅帽:RHCSA認證知識講解(九)標準輸入輸出、重定向、過濾器與管道

Linux紅帽&#xff1a;RHCSA認證知識講解&#xff08;九&#xff09;標準輸入輸出、重定向、過濾器與管道 前言一、標準輸入與輸出、重定向&#xff0c;使用過濾器篩選文件信息1.1 Linux 的標準輸入與輸出1.2 什么是輸入重定向1.3 輸出重定向1.4 標準錯誤輸出重定向1.5 使用過濾…

搭建完全分布式系統時,為何必須同步服務器時間?

在構建完全分布式系統時&#xff0c;時間同步是保障系統一致性和可靠性的基石。本文將從完全分布式系統的核心特點、時間同步的必要性、不同步可能引發的災難性后果、主流時間同步協議對比及最佳實踐方案五個角度展開分析&#xff0c;幫助開發者深入理解時間同步的關鍵作用。 一…

MonkeyDev 如何創建一個root級級別的app,并執行root命令獲取iphone設備序列號serialNumber(ios15.8)

前提條件:有越獄的手機,XCode中已經安裝了Monkeydev 1. 和普通應用一個創建一個ios的工程 2. 在App的TARGETS>build setting> 中設置Apple Development 3. 設置User-Defined的配置 CODE_SIGNING_ALLOWED = NO MonkeyDevBuildPackageOnAnyBuild = NO MonkeyDevClearUi…

每日一題(小白)模擬娛樂篇13

今天題目比較簡單&#xff0c;直接分析。小藍想知道2024這個數字中有幾個1&#xff0c;計算機組成學習好的同學肯定可以直接長除法或者瞪眼法得出答案&#xff1a; 202411111101000&#xff08;B&#xff09;也就是說2024中有一共有六個1 接下來用代碼實現 &#xff0c;我們也…

【藍橋杯】算法筆記2

這篇文章主要記錄動態規劃方面的學習。 動態規劃的核心思想: 把大問題分解成小問題,記住小問題的解,避免重復計算。 動態規劃(DP)的三大特點: ①最優子結構:大問題的最優解可以由小問題的最優解推導出來 ②重疊子問題:在求解過程中會反復遇到相同的小問題 ③無后效…

MINIQMT學習課程Day9

獲取qmt賬號的持倉情況后&#xff0c;我們進入下一步&#xff0c;如何獲得當前賬號的委托狀況 還是之前的步驟&#xff0c;打開qmt&#xff0c;選擇獨立交易&#xff0c; 之后使用pycharm&#xff0c;編寫py文件 導入包&#xff1a; from xtquant import xtdata from xtqua…

雜篇-行業分類一二-2(通、專用設備制造,汽車制造)

接上篇&#xff0c; 本篇列舉制造業中另外幾個細分行業&#xff1a;通用設備制造&#xff0c;專用設備制造&#xff0c;汽車制造業。 一、通用設備制造 分類 序號 類別名稱 說明 1 鍋爐及原動設備制造 1 鍋爐及輔助設備制造 指各種蒸汽鍋爐、汽化鍋爐&#xff0c;以及…

DHCP協議和win server2022無腦配置DHCP

DHCP(動態主機配置協議)用于分配IP地址的過程。這個過程也被稱為DORA,它是四個步驟首字母的縮寫。讓我們詳細看看每個步驟: 客戶機請求IP(Discover):當一個設備(客戶機)連接到網絡并需要獲取網絡配置(如IP地址、子網掩碼、默認網關等)時,它會發送一個DHCP Discover…

Visio | 將(.vsdx)導出為更清楚/高質量的圖片(.png) | 在Word里面的visio圖

此時大家在用Visio畫完圖直接復制到word里面后&#xff0c;如果后期需要重新保存高清圖片&#xff0c;但是此時圖片在word&#xff0c;是不是很多人會選擇直接crtlA截圖復制&#xff0c;這樣出來的圖又不清晰又小&#xff0c;完全不符合你導的審美&#xff0c;接下來跟著我&…

LLM面試題六

NLP方向CRF算法面試題 什么是CRF?CRF的主要思想是什么&#xff1f; 設X與Y是隨機變量&#xff0c;P(Y | X)是給定條件X的條件下Y的條件概率分布&#xff0c;若隨機變量Y構成一個由無向圖G(V,E)表示的馬爾科夫隨機場。則稱條件概率分布P(X | Y)為條件隨機場。CRF的主要思想統計…