Linux——進程概念詳解

一、進程的基本概念

在給進程下定義之前,我們先了解一下進程:

我們在編寫完代碼并運行起來時,在我們的磁盤中會形成一個可執行文件,當我們雙擊這個可執行文件時(程序時),這個程序會加載到內存中,而這個時候我們不能把它叫做程序了,應該叫做進程。所以說,只要把程序(運行起來)加載到內存中,就稱之為進程。

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

二、進程描述—PCB

PCB:進程控制塊(結構體)
當一個程序加載到內存中,操作系統要為剛剛加載到內存的程序創建一個結構體(PCB),進程信息被放在這個結構體中(PCB),可以理解為PCB是進程的屬性的集合。

在Linux操作系統下的PCB是:task_struct
task_struct是Linux內核的一種數據結構,它會被裝載到RAM(內存)里并且包含著進程的信息
在進程執行時,任意時間內,進程對應的PCB都要以下內容:

  • 標示符:描述本進程的唯一標示符,用來區別其他進程
  • 狀態:任務狀態
  • 優先級:相對于其他進程的優先級
  • 程序計數器:程序中即將被執行的下一條指令的地址
  • 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊指針
  • 上下文數據:進程執行時處理器的寄存器中的數據
  • I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表
  • 記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等
  • 其他信息:…

優先級的理解:
由于CPU只要一個,進程可以有多個,所以CPU的資源有限,操作系統在調度進程到CPU時會根據進程的優先級來判斷。
程序計數器的理解:
CPU跑一個進程時,要執行它的代碼,而代碼是自上往下執行的(if、else、循環等除外),CPU先要取指令,然后分析指令,再然后執行指令。取完一個指令后,CPU中的寄存器(EIP指令寄存器)會保存當前指令的下一條指令的地址,方便下次取下一個指令。
所謂的函數跳轉、分支判斷、循環等,都是修改EIP完成的。
上下文數據的理解:
CPU在跑一個進程時,沒有跑完就開始切換其他進程,為了下次繼續跑完這個進程,會保留這個進程的上下文數據,當這個進程回來時,會把上下文數據移動到CPU內部繼續執行。

三、通過系統調用獲取進程標示符

#include<stdio.h>
#include<unistd.h>
int main()
{while(1){printf("i am process...pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}
return 0;}           

通過ps aux | grep 文件名來找
其中getpid()是找進程的標示符,getppid()找父進程的標示符

四、通過系統調用創建進程——fork

fork函數可以創建一個子進程

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id=fork();//創建子進程while(1){if(id==0){printf("i am process...child---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}else if(id>0){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}else{;}}return 0;                                                                                  
}

我們可以得出:這段代碼有兩個進程,并且它們的關系是父子關系。

什么是fork函數:在調用fork函數之前,只有一個進程(父進程),當這個進程調用fork函數之后,fork函數會復制一個進程(子進程),區別是PID不同,它們的關系是父子關系。

fork函數會返回兩次值:
——給父進程返回子進程的pid。
——給子進程返回0。
——失敗時,在父進程中返回-1,不創建子進程,并且errno被適當地設置。

五、進程的狀態

操作系統存在著五種狀態模型:

  • 新建態:剛剛創建的進程,操作系統還沒有把它加入可執行進程組中。
  • 就緒態:進程已經做好準備,只有有機會就會開始執行。
  • 運行態:該進程正在執行。
  • 阻塞態:進程在某些事件發生前不能執行,如I/O操作完成。
  • 退出態:操作系統從可執行進程組中釋放出進程,或者自身停止,或者是因為某些原因被取消。

R 可執行狀態

通過命令 ps aux 可以查看進程的狀態

【注意】此可執行狀態并非上面的運行態。
進程中的R狀態不代表正在運行,代表的可被調度,此運行相當于上面的就緒態。

操作系統會把進程中R狀態的進程全放在調度隊列中,方便調度。

S 睡眠狀態

(1)創建一個可執行態

#include<stdio.h>
#include<unistd.h>
int main() 
{while(1);return 0;
}

(2)創建休眠態進程

#include<stdio.h>
#include<unistd.h>
int main() 
{while(1)sleep(10);return 0;
}

S狀態是淺度睡眠,隨時可以被喚醒,也可以被殺掉。

D 磁盤休眠狀態

可以表示為深度睡眠,該進程不會被殺掉,即使你是操作系統,除非我自動喚醒,才可以恢復。

這種狀態(D)的進程殺不死。

T 暫停狀態

向進程發送SIGSTOP信號,該進程會響應該信號進入暫停狀態,
向該進程發送SIGCONT信號,該進程會從暫停狀態恢復到可執行狀態。

X 死亡狀態 & Z 僵尸狀態

僵尸狀態:一個處于僵尸狀態的進程,會等待它的父進程或操作系統對它的信息進行讀取,之后才會被釋放。

通過代碼來模擬僵尸狀態的進程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main()
{pid_t id=fork();int count=5;while(1){if(id==0){while(count){printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppi    d(),--count);sleep(1);}printf("child quit....\n");exit(1);}else if(id>0){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}}return 0;}

?while :; do ps aux |head -1&&ps aux|grep a.out; echo "#######################";sleep 1;done?來監控進程的狀態。

死亡狀態:進程被操作系統釋放了或者自己退出了

六、僵尸進程

當一個進程變為僵尸狀態的時候,該進程就變成了僵尸進程。

  • 僵死狀態(Zombies)是一個比較特殊的狀態。當進程退出并且父進程沒有讀取到子進程退出的返回代碼時就會產生僵死(尸)進程
  • 僵死進程會以終止狀態保持在進程表中,并且會一直在等待父進程讀取退出狀態代碼。
  • 所以,只要子進程退出,父進程還在運行,但父進程沒有讀取子進程狀態,子進程進入Z狀態。

僵尸進程的危害

七、孤兒進程

在Linux中,進程的關系主要是父子關系。

一對父子進程中的父進程退出了,子進程還在運行,就會形成孤兒進程。
如果沒有進程來回收該子進程的信息,那么會變成僵尸狀態,會存在內存泄漏的問題。

為了解決這個問題,該子進程會立即被1號init進程領養。

通過代碼來模擬孤兒狀態的進程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main()
{pid_t id=fork();int count=5;while(1){if(id==0){while(1){printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppid(),--count);sleep(1);}printf("child quit....\n");exit(1);}else if(id>0){while(count){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid()); count--;sleep(1);}exit(0);}}return 0;}

用?while :; do ps axj |head -1 && ps axj | grep a.out;echo "#######################";sleep 1;done?來監控進程的狀態。

觀察子進程的PPID

通過查看該子進程的信息,可以得知該進程被1號init進程領養。

八、進程優先級

基本概念

CPU中的資源是有限的,不可能多個進程一起在CPU上運行,利用優先級把進程有效的先后排好,改善了系統的性能。

  • cpu資源分配的先后順序,就是指進程的優先權(priority)
  • 優先權高的有優先執行權。

查看進程優先級

用?ps -l?可以查看到進程的優先級

PRI:表示這個進程被執行的優先級,其值越小越早執行
NI:表示這個進程的nice值

PIR and NI

nice值表示進程可被執行的優先級的修正值。
PIR=PIR(old)+nice。
當nice為負值時,那么該進程的優先級值會變小,優先級會變高,進程越快被執行。

當然,nice也是有范圍的,-20~19,一共40個級別。

用top命令更改已存在的進程的nice

top命令

接著按r然后輸入進程的PID輸入nice

其他

  • 競爭性:系統進程數目多,而CPU的資源有限,所以進程之間是具有競爭屬性的。為了高效完成任務,更合理的競爭相關資源,便有了優先級
  • 獨立性:多進程運行,需要獨享各種資源,多進程運行期間互不干擾
  • 并行:多個進程在多個CPU下分別,同時進行運行,這稱之為并行
  • 并發: 多個進程在一個CPU下采用進程切換的方式,在一段時間之內,讓多個進程都得以推進,稱之為并發

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

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

相關文章

動手學深度學習6.3 填充和步幅-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;填充和步幅_嗶哩嗶哩_bilibili 代碼實現_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;6.3. 填充和…

如何在 Ubuntu 14.04 服務器上使用 Nginx 安裝和保護 phpMyAdmin

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 介紹 像 MySQL 這樣的關系型數據庫管理系統在許多網站和應用程序中都是必不可少的。然而&#xff0c;并非所有用戶都習慣通過命令行來管…

oracle數據庫,怎么分頁查詢

項目場景&#xff1a; 使用oracle數據庫&#xff0c;怎么分頁查詢 問題描述 平常使用的最多的是MySQL DB, 用的是 limit 語句&#xff1b;Oracle DB, 沒有 limit 語句&#xff1b; 原因分析&#xff1a; 解決方案&#xff1a; SELECT * FROM (SELECT t.*, ROWNUM rn FROM…

java算法day16

java算法day16 112 路徑總和404 左葉子之和513 找樹左下角的值 112 路徑總和 題型判定為自頂向下類型&#xff0c;并且為路徑和類型。 那就套模板。 自頂向下就是從上到下處理&#xff0c;那么就是前序遍歷的思想。 class Solution {boolean res false;public boolean hasP…

自建Web網站部署——案例分析

作者主頁: 知孤云出岫 目錄 作者主頁:如何自建一個Web網站一、引言二、需求分析三、技術選型四、開發步驟1. 項目初始化初始化前端初始化后端 2. 前端開發目錄結構示例代碼App.jsHome.js 3. 后端開發目錄結構示例代碼app.jsproductRoutes.jsProduct.js 4. 前后端連接安裝axio…

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司開發的協同管理應用平臺。泛微 e-cology v10.64.1的/services/接口默認對內網暴露&#xff0c;用于服務調用&#xff0c;未經身份認證的攻擊者可向 /services/WorkflowServiceXml 接口發送惡意的SOAP請求進行SQL注入&#xff0c;…

語音合成新篇章:Transformer模型的革新應用

語音合成新篇章&#xff1a;Transformer模型的革新應用 語音合成技術&#xff0c;又稱文本到語音&#xff08;Text-to-Speech, TTS&#xff09;技術&#xff0c;一直是人工智能領域的重要組成部分。隨著深度學習技術的飛速發展&#xff0c;Transformer模型憑借其卓越的處理序列…

飄雪的冬天,命運的交織

北風呼嘯,天空中飄著鵝毛般的大雪,這又是一個飄雪的冬天。京都醫院潔白的病床上躺著一個年輕女孩,她的臉上沒有一絲血色,眼睛深深地凹了進去,看上去已經病入膏肓。病房的窗口邊,一位身心俱疲的年輕男孩,望著病房外滿天飛舞的雪花,思緒不由回到了三年前的林州市…… 一…

使用JS和CSS制作的小案例(day二)

一、寫在開頭 本項目是從github上摘取&#xff0c;自己練習使用后分享&#xff0c;方便登錄github的小伙伴可以看本篇文章 50項目50天?編輯https://github.com/bradtraversy/50projects50dayshttps://github.com/bradtraversy/50projects50days有興趣的小伙伴可以自己去gith…

面向對象七大原則

學習目標 了解面向對象七大原則基本概念。 在之后實踐應用中&#xff0c;要給予七大原則去設計程序。 為什么有七大原則 七大原則總體要實現的目標是&#xff1a; 高內聚、低耦合。 使程序模塊的可重復性、移植性增強。 高內聚低耦合 從類角度來看&#xff0c;高內聚低…

如何在Linux上部署Ruby on Rails應用程序

在Linux上部署Ruby on Rails應用程序是一個相對復雜的過程&#xff0c;需要按照一系列步驟進行。下面是一個基本的部署過程&#xff0c;涵蓋了從安裝所需軟件到部署應用程序的所有步驟。 安裝必要的軟件 在部署Ruby on Rails應用程序之前&#xff0c;需要確保Linux系統上安裝了…

android 嵌套webview,軟鍵盤遮擋輸入框

實際項目中&#xff0c;android需要加載h5&#xff0c;經常遇到軟鍵盤遮蓋輸入框的情況&#xff0c;h5測試的時候&#xff0c;是沒問題的&#xff0c;但是在APP中是不能把頁面推上去。經測試完美解決了這個問題。 1. oncreate *************************** try {web();layout…

掌握Xcode Storyboard:iOS UI設計的可視化之旅

掌握Xcode Storyboard&#xff1a;iOS UI設計的可視化之旅 在iOS應用程序開發的世界中&#xff0c;用戶界面&#xff08;UI&#xff09;設計是吸引用戶的關鍵。Xcode的Storyboard功能為開發者提供了一個強大的可視化工具&#xff0c;通過拖放的方式快速構建和管理UI。本文將深…

AI網絡爬蟲023:用deepseek批量提取天工AI的智能體數據

文章目錄 一、介紹二、輸入內容三、輸出內容一、介紹 天工AI的智能體首頁: F12查看真實網址和響應數據: 翻頁規律: https://work.tiangong.cn/agents_api/square/sq_list_by_category?category_id=7&offset=0 https://work.tiangong.cn/agents_api/square/sq_list_b…

08 模型演化根本 深度學習推薦算法的五大范式

易經》“九三&#xff1a;君于終日乾乾&#xff1b;夕惕若&#xff0c;厲無咎”。九三是指陽爻在卦中處于第三位&#xff0c;已經到達中位&#xff0c;惕龍指這個階段逐漸理性&#xff0c;德才已經顯現&#xff0c;會引人注目&#xff1b;但要反思自己的不足&#xff0c;努力不…

基于 SSH 的任務調度系統的設計與實現

點擊下載源碼 基于SSH的任務調度系統的設計與實現 摘 要 隨著科學技術的飛速發展和各行各業的分工愈發明細化&#xff0c;對于改革傳統的人工任務調度方式的呼聲越來越大。得益于快速發展的計算機技術&#xff0c;我們看到了改革的方向。本系統是針對企業或者事業單位甚至一個…

Golang | Leetcode Golang題解之第234題回文鏈表

題目&#xff1a; 題解&#xff1a; func reverseList(head *ListNode) *ListNode {var prev, cur *ListNode nil, headfor cur ! nil {nextTmp : cur.Nextcur.Next prevprev curcur nextTmp}return prev }func endOfFirstHalf(head *ListNode) *ListNode {fast : headslo…

camtasia怎么剪掉不用的部分 屏幕錄制的視頻怎么裁剪上下不要的部分 camtasia studio怎么裁剪視頻時長 camtasia怎么剪輯視頻教程

有時我們錄制的屏幕內容&#xff0c;并不一定全部需要。那么&#xff0c;屏幕錄制的視頻怎么裁剪上下不要的部分&#xff1f;可以使用視頻剪輯軟件&#xff0c;或者微課制作工具來進行裁剪。屏幕錄制的視頻怎么旋轉&#xff1f;錄制視頻的旋轉也是一樣的&#xff0c;均在編輯步…

萬字長文之分庫分表里如何優化分頁查詢?【后端面試題 | 中間件 | 數據庫 | MySQL | 分庫分表 | 分頁查詢】

分庫分表的一般做法 一般會使用三種算法&#xff1a; 哈希分庫分表&#xff1a;根據分庫分表鍵算出一個哈希值&#xff0c;根據這個哈希值選擇一個數據庫。最常見的就是數字類型的字段作為分庫分表鍵&#xff0c;然后取余。比如在訂單表里&#xff0c;可以按照買家的ID除以8的…

【Flutter】 webview_flutter避坑

webview_flutter webview_flutter沒有SSL Error接口&#xff0c;也就是說等你的網頁出現SSL 錯誤的時候這個插件無法捕捉處理&#xff0c;除非你改它的源碼。 下面這段是webview_flutter官網的例子&#xff0c;它有onHttpError、onWebResourceError、但沒有任何捕捉 SSL 錯誤…