Linux下進程相關概念詳解

目錄

一、操作系統

概念

設計操作系統的目的

定位

如何理解“管理”

系統調用和庫函數概念

二、進程

概念

描述進程—PCB(process control block)

查看進程

進程狀態

進程優先級

?三、其它的進程概念


一、操作系統

概念

任何計算機系統都包含一個基本的程序集合,稱為操作系統(OS)。簡單的理解,操作系統包括:

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

設計操作系統的目的

  • 與硬件交互,管理所有的軟硬件資源
  • 為用戶程序(應用程序)提供一個良好的執行環境

定位

在整個計算機軟硬件架構中,操作系統的定位是:一款“搞管理”的軟件。

如何理解“管理”

答:先描述,再組織?

先描述:先用結構體確定其屬性

再組織:再用鏈表或者其它高效的數據結構將其關聯起來?

層狀結構圖?

系統調用和庫函數概念

  • 在開發角度,操作系統對外會表現一個整體,但是會暴露自己的部分接口,供上層開發使用,這部分由操作系統提供的接口,叫做系統調用。
  • 系統調用在使用上,功能比較基礎,對用戶的要求相對也比較高,所以,有心的開發者可以對部分系統調用進行適度,從而形成庫(c庫、c++庫等),有了庫,就方便上層用戶或者開發者進行二次開發。?

二、進程

在Windows中,我們啟動一個軟件,本質上是啟動了一個進程

而在Linux中,我們運行一條命令或者一個程序,其實就是在系統層面上創建了一個進程

概念

狹義的理解:進程是正在運行的程序的示例

廣義的理解:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動

內核的觀點:進程是擔當分配系統資源的實體

進程 = 對應的代碼和數據 + 進程對應的PCB結構體

描述進程—PCB(process control block)

PCB中存放著進程的信息,可以把PCB理解為是進程屬性的集合

不同的操作系統對PCB的命名可能不同,在Linux下,PCB是被命名為task_struct的結構體

task_struct是Linux中描述進程的結構體

task_struct是Linux內核的一種數據結構,它會被裝載到內存里并且包含著進程的信息

task_struct的內容劃分

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

查看進程

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

myproc.c?

#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("hello world\n");sleep(1);}                                                                                                                                                                       return 0;
}

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

  • ?進程ID(PID)
  • 父進程ID(PPID)

  #include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){while(1){pid_t pid = getpid();//自己進程的pidpid_t ppid = getppid();//父進程                                   printf("hello world,pid: %d, ppid: %d\n", pid, ppid);sleep(1);                                      }                                                return 0;                                        }    

?其中的這個父進程就是bash

進程狀態

先來看看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 */
};

關于內核源碼可以自行去官網下載

  • R運行狀態:并不意味這進程一定在運行中,它表明進程要么在運行中要么在運行隊列里
  • S睡眠狀態:意味著進程在等待事件完成(這里的睡眠有時候也叫可中斷睡眠)
  • D磁盤休眠狀態:有時候也叫不可中斷睡眠狀態,在這個狀態的進程通常會等待I/O結束
  • T(t)停止狀態:可以通過發送SIGSTOP信號給進程來停止進程。這個被暫停的進程可以通過發送SIGCONT信號讓進程繼續運行。
  • X死亡狀態(終止狀態):這個狀態只是一個返回狀態,是一瞬間的,你不會在任務列表里看到這個狀態

注:當你在查看你的進程狀態時后面可能會帶一個+號,表明這是一個前臺進程

如果要程序在后臺運行,可以在運行時加上&,如下

  • ?Z僵尸狀態:僵尸狀態是一個比較特殊的狀態。一個子進程已經退出,但是父進程沒有讀取到子進程退出的返回代碼,此時子進程就會變成僵尸狀態,這個進程也稱為僵尸進程。僵尸進程會以終止狀態保持在進程表中,并且會一直等待父進程讀取退出狀態碼。

代碼演示僵尸狀態

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){while(1){printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());sleep(3);break;}exit(0);}else {while(1){printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);} }return 0;
}

僵尸進程的危害

  1. 造成內存資源的浪費。因為進程退出了,但是還沒有被釋放,因此這個進程就還需要被維持下去,而維持這個狀態本身就是要用數據來維持,也屬于進程的基本信息,所以保存在PCB中,Z狀態一直不退出,PCB就要一直維護。
  2. 造成內存泄露。因為PCB是個結構體,而結構體是要在內存中開辟空間的。

孤兒進程

父進程先退出,子進程還沒退出,這時子進程就稱之為“孤兒進程”,孤兒進程會被1號init進程(系統本身)領養,當然也會被init進程回收。

代碼演示

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

進程優先級

?CPU資源分配的先后順序,就是指進程的優先級。優先級高的進程有優先執行的權利。

為什么要有優先級?

因為CPU是有限的,而進程太多,需要通過某種方式來競爭資源。

Linux中的優先級的做法是

優先級 = 老的優先級 + nice值

ps -l:查看系統進程?

PRI就是進程的優先級,其值越小進程的優先級別越高

NI就是nice值,其表示進程可被執行的優先級的修正數值

加入nice值之后,此時PRI = PRI(老)+ nice

當nice值為負值時,該程序的優先級值將會變小,即其優先級會變高。因此調整進程優先級在linux下就是調整進程的nice值。

nice的取值范圍是-20至19,一共40個級別

更改進程的優先級

  1. ?在命令行輸入top
  2. 進入top后按“r”
  3. 輸入進程的PID
  4. 輸入nice值

設置有限的nice值而不直接改PRI的原因是:操作系統設置nice值的本質就是更好的平衡進程對系統資源的占用,如果直接改PRI可能產生一個進程長時間占用系統資源的現象。

三、其它的進程概念

獨立性:多進程運行,需要獨享各種資源,多進程運行期間互不干擾。

競爭性:系統進程數目眾多,而CPU資源有限,所以進程之間是具有競爭屬性的。

并行:多個進程在多個CPU下同時進行運行。

并發:多個進程在一個CPU下采用進程切換的方式,在一段時間內,讓多個進程都得以推進。

上下文數據:一個進程在被運行時,CPU里的寄存器保存的一定是這個進程的臨時數據,而這個臨時數據就叫做上下文。上下文是絕對不可以被丟去的。在進程時間片到了要被切換時,要連同上下文一起打包帶走。上下文可以有多份,分別對應不同的進程


內容如有錯誤,還望批評指正。如果你覺得內容有用的話,就給博主一鍵三連吧,你的支持將會是我的動力。?

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

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

相關文章

【Easyx】easyx從入門到精通 — 初步入門

easyx 初步入門 1 安裝easyx圖形庫2 如何使用Easyx3 效果初試4 基本圖形繪制4.1 繪制點4.2 繪制直線4.3 繪制圓形4.4 繪制矩形4.5 繪制橢圓4.6 繪制圓角矩形4.7 繪制扇形 Thanks?(&#xff65;ω&#xff65;)&#xff89;謝謝閱讀&#xff01;&#xff01;&#xff01;下一篇…

Java學習—字符流

在 Java 中&#xff0c;字符流主要用于處理字符數據&#xff0c;比如文本文件。字符流直接以字符為單位進行讀寫操作&#xff0c;自動處理字符與底層字節之間的轉換&#xff0c;因此非常適合處理包含文本數據的文件。Java 中處理字符流的核心抽象類是 Reader 和 Writer。 Read…

C#面:是否可以從一個 static 方法內部發出對非 static 方法的調用

不可以&#xff1b; 不能直接從一個靜態方法內部調用非靜態方法。 這是因為靜態方法是屬于類的&#xff0c;而非靜態方法是屬于類的實例的。 靜態方法可以在沒有創建類的實例的情況下被調用&#xff0c;而非靜態方法需要通過類的實例來調用。 如果想要從靜態方法內部調用非…

算法入門-二分搜索(長期更新)

文章目錄 情景一 : 二分查找情景二 : 找出一個 > num 的最左側的位置情景三 : 找出一個 < num 的最右側的位置leetcode 162 :尋找峰值leetcode 69 : x 的平方根 首先來簡介一下二分搜索算法,二分搜索是一種每次砍半的算法,最經典的案例當然是我們的二分查找算法,但是大部…

【JAVA重要知識 | 第一篇】一篇文章讀懂HashMap(存儲、擴容、初始化過程)

文章目錄 1.一篇文章讀懂HashMap&#xff08;存儲、擴容、初始化過程&#xff09;1.1HashMap簡介1.1.1特點1.1.2優點1.1.3缺點 1.2深入解讀HashMap1.2.1常用常量和變量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用變量 1.2.2存儲過程&#xff08;1&#xf…

診所門診電子處方軟件操作教程及試用版下載,醫務室處方箋管理系統模板教程

診所門診電子處方軟件操作教程及試用版下載&#xff0c;醫務室處方箋管理系統模板教程 一、前言 以下軟件程序教程以 佳易王診所電子處方軟件V17.0為例說明 軟件文件下載可以點擊最下方官網卡片——軟件下載——試用版軟件下載 如上圖&#xff0c;點擊基本信息設置——處方配…

Acwing---1208. 翻硬幣

翻硬幣 1.題目2.基本思想3.代碼實現 1.題目 小明正在玩一個“翻硬幣”的游戲。 桌上放著排成一排的若干硬幣。我們用 * 表示正面&#xff0c;用 o 表示反&#xff08;是小寫字母&#xff0c;不是零&#xff09;。 比如&#xff0c;可能情形是&#xff1a;**oo***oooo 如果同…

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片 環境&#xff1a;Pycharm Mac OS 源碼如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查詢.html)if __name__ __…

文心一言 Python編程之

給一個包含n個整數的數組nums&#xff0c;判斷nums中是否存在三個元素a,b,c&#xff0c;使得abc0?請你找出所有和為0且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 示例1&#xff1a; 輸入&#xff1a;nums[-1,0,1,2,-1,-4] 輸出&#xff1a;[[-1,-1,2…

中介者模式

定義&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09;又稱為調節者模式或調停者模式。用一個中介對象封裝一系列的對象交互&#xff0c;中介者使各對象不需要顯式的相互作用&#xff0c;從而使其耦合松散&#xff0c;而且可以獨立地改變它們之間的交互。 適用…

如何正確選擇一臺大路燈?2024五大出眾品牌大路燈推薦,附超全科普知識整理

大路燈的使用操作非常簡便&#xff0c;而且能夠提供最適合目前用眼的光線環境。但如今市場中卻有一些劣質大路燈&#xff0c;它們的使用體驗不佳&#xff0c;很多客戶反饋說可能會出現光線不穩定、刺眼等問題&#xff0c;甚至會有讓用戶有損傷視力的風險。那么如何選擇一臺大路…

華碩ROG玩家國度幻16air 2024原裝系統恢復安裝教程方法

華碩ROG玩家國度幻16air 2024原裝系統恢復安裝教程方法 重建ASUSRECOVERY恢復功能 支持型號&#xff1a; GU605MI&#xff0c;GU605MY&#xff0c;GU605MZ GU605MV&#xff0c;GU605MU 分3種安裝方法 遠程恢復安裝&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1…

Spring對IoC的實現

個人名片&#xff1a; &#x1f43c;作者簡介&#xff1a;一名大三在校生&#xff0c;喜歡AI編程&#x1f38b; &#x1f43b;???個人主頁&#x1f947;&#xff1a;落798. &#x1f43c;個人WeChat&#xff1a;hmmwx53 &#x1f54a;?系列專欄&#xff1a;&#x1f5bc;?…

Qt使用QSettings類來讀寫ini

在Qt中&#xff0c;可以使用QSettings類來讀寫ini文件。QSettings提供了一個簡單的接口&#xff0c;用于訪問和修改ini文件中的鍵值對。 下面是使用QSettings類來寫入ini文件的示例代碼&#xff1a; #include <QCoreApplication> #include <QSettings>int main(i…

前端monorepo大倉共享復雜業務組件最佳實踐

一、背景 在 Monorepo 大倉模式中&#xff0c;我們把組件放在共享目錄下&#xff0c;就能通過源碼引入的方式實現組件共享。越來越多的應用愿意走進大倉&#xff0c;正是為了享受這種組件復用模式帶來的開發便利。這種方式可以滿足大部分代碼復用的訴求&#xff0c;但對于復雜…

JAVA *數據庫連接池 * 接JDBC

一.介紹: 數據庫連接池實際上就是一個 " 容器 " 當有多個擁護需要訪問數據庫的時候, 一個用戶會打開一個數據庫連接, 但是!當用戶離開的時候,就會斷開數據庫連接,那么數據庫連接就作廢了,之后如果還有用戶需要進行訪問,需要再建立一個數據庫連接......循環往復, …

【Mybatis】快速入門 基本使用 第一期

文章目錄 Mybatis是什么&#xff1f;一、快速入門&#xff08;基于Mybatis3方式&#xff09;二、MyBatis基本使用2.1 向SQL語句傳參2.1.1 mybatis日志輸出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 數據輸入2.2.1 Mybatis總體機制概括2.2.2 概念說明2.2.3 單個簡單類型參數2.2.4 實體…

Web組態可視化編輯器 快速繪制組態

隨著工業智能制造的發展&#xff0c;工業企業對設備可視化、遠程運維的需求日趨強烈&#xff0c;傳統的單機版組態軟件已經不能滿足越來越復雜的控制需求&#xff0c;那么實現Web組態可視化界面成為了主要的技術路徑。 行業痛點 對于軟件服務商來說&#xff0c;將單機版軟件轉變…

計算機視覺基礎知識(十六)--圖像識別

圖像識別 信息時代的一門重要技術;目的是讓計算機代替人類處理大量的物理信息;隨著計算機技術的發展,人類對圖像識別技術的認識越來越深刻;圖像識別技術利用計算機對圖像進行處理\分析\理解,識別不同模式的目標和對象;過程分為信息的獲取\預處理\特征抽取和選擇\分類器設計\分…

重拾C++之菜鳥刷算法第6篇---棧與隊列

棧與隊列 一、用棧實現隊列 題目 請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 實現 MyQueue 類&#xff1a; void push(int x) 將元素 x 推到隊列的末尾int pop() 從隊列的開頭移除…