国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】進程周邊001之進程概念

這篇具有很好參考價值的文章主要介紹了【Linux】進程周邊001之進程概念。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

??樊梓慕:個人主頁

???個人專欄:《C語言》《數據結構》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C++》《Linux》

??每一個不曾起舞的日子,都是對生命的辜負


目錄

前言

1.基本概念

2.描述進程-PCB

2.1task_struct-Linux中的PCB

2.2task_struct內容分類(成員)

3.查看進程

3.1通過系統(tǒng)目錄查看

3.2通過用戶級工具ps查看

4.通過系統(tǒng)調用獲取進程標識符(PID)

4.1PCB是屬于操作系統(tǒng)的還是屬于進程的?

?4.2使用getpid和getppid

5.通過系統(tǒng)調用創(chuàng)建進程(fork初識)

5.1fork函數創(chuàng)建子進程

5.2fork的返回值

5.3使用if進行分流


前言

上篇文章我們說學習系統(tǒng)我們要翻越三座大山:進程周邊、文件周邊以及線程周邊。

那今天我們就對第一座大山:進程周邊開啟攀登之旅??

本篇文章主要講解有關進程的基本概念,以及Linux系統(tǒng)下是如何管理進程的,還記得學習管理的六字真言么?沒錯,對于進程的管理也是先描述,再組織。

之后我們再來學習下如何查看進程以及進程的標識符PID、父進程的標識符PPID。

最后我們初步的認識下fork函數,并利用fork函數實現(xiàn)創(chuàng)建子進程等。

話不多說,直接進入我們今天的學習?


歡迎大家??收藏??以便未來做題時可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================文章來源地址http://www.zghlxwxcb.cn/news/detail-753615.html

GITEE相關代碼:??fanfei_c的倉庫??

=========================================================================


1.基本概念

較為官方的說法:

  • 課本概念:?程序的一個執(zhí)行實例,正在執(zhí)行的程序等。
  • 內核觀點:?擔當分配系統(tǒng)資源(CPU時間,內存)的實體。

輔助理解:

對代碼進行編譯鏈接產生的文件我們稱之為可執(zhí)行程序(.exe),執(zhí)行該程序,該程序會被加載到內存中,此時便稱之為進程


2.描述進程-PCB

上節(jié)課我們學習了管理的概念,并總結為六字真言:先描述,再組織。

那對于操作系統(tǒng)來說,管理進程的方式仍然歸結于這六字真言中。

我們也可以將進程描述起來,描述得到的就是進程控制塊PCB(process control block)。

PCB就是進程屬性的集合(數據結構),里面存儲的是進程信息。

管理不是直接管理人,而是管理人的信息;

管理不是直接管理進程,而是管理進程的信息(PCB)。

此時操作系統(tǒng)對進程的管理就轉化為對PCB對象的管理。

那對于某個數據結構的管理我們是很熟悉的,假如我們利用鏈表的方式進行組織,那對于進程的管理說白了就是對鏈表的增刪查改。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

換句話說:進程=PCB(內核數據結構)+可執(zhí)行程序?

未來,所有對進程的控制和操作,都只和進程的PCB有關,和進程的可執(zhí)行程序沒有關系。

如果愿意,你可以把PCB(Node節(jié)點)放到任意數據結構中去。


2.1task_struct-Linux中的PCB

task_struct就是在Linux中描述進程的結構體(Linux是C語言編寫)。

你可以理解為PCB是操作系統(tǒng)學科抽象的叫法,而在Linux中具體為task_struct。

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


2.2task_struct內容分類(成員)

  • 標示符(PID): 描述本進程的唯一標示符,用來區(qū)別其他進程(每次啟動都會變化)。
  • 狀態(tài): 任務狀態(tài),退出代碼,退出信號等。
  • 優(yōu)先級: 相對于其他進程的優(yōu)先級。
  • 程序計數器(pc): 程序中即將被執(zhí)行的下一條指令的地址。
  • 內存指針: 包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針。
  • 上下文數據: 進程執(zhí)行時處理器的寄存器中的數據。
  • I/O狀態(tài)信息: 包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。
  • 記賬信息: 可能包括處理器時間總和,使用的時鐘總和,時間限制,記賬號等。
  • 其他信息。

3.查看進程

3.1通過系統(tǒng)目錄查看

根目錄下的proc目錄,/proc下存儲著進程信息。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

目錄名為數字的即為進程信息的目錄,每個目錄內存儲著他們對應的進程信息。

而這些數字對應著該進程的標識符PID。

比如查看標識符PID=1的進程信息:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

當我們新建一個普通的進程,并進入該進程所在目錄時:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

我們可以利用chdir系統(tǒng)調用接口修改工作目錄。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


3.2通過用戶級工具ps查看

實例:ps ajx/ps aux

該命令可以查看所有系統(tǒng)進程。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


現(xiàn)在我們來寫一段代碼并生成可執(zhí)行程序,執(zhí)行后變成進程我們如何查看呢?

(1)代碼:

#include<stdio.h>
#include<unistd.h>                                                                                                                  

int main()
{
	while(1)
	{
		printf("I am a process!\n");
		sleep(1);
	}
	return 0;
}

(2)編譯后執(zhí)行:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


?(3)打開多窗口方便我們觀察

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


?(4)如何查看單個進程?

首先我們已經知道如何查看系統(tǒng)中所有進程了,即ps ajx,那我們可以利用Linux之前學習的一些指令來顯示我們想要查看的單個指令。

實例:ps ajx | head -1 && ps ajx | grep test

對以上指令的解釋:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


我們來觀察一下是否是我們想要的結果:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


?我們發(fā)現(xiàn):test進程利用剛才的指令我們得到了該進程的相關信息,但是黃色框內是什么?

其實是grep命令:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


?這里也側面反映出幾乎所有獨立的指令,就是程序,運行起來也是進程。

這里grep實際也是進程,且該進程內包含有test的信息,所以也顯示出來了。

如何去掉這多余信息呢?

實例:ps ajx | head -1 && ps ajx | grep test | grep -v grep

-v選項是反向搜索的意思,即過濾掉包含有grep內容的信息。??

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


另外我們也可以通過指令對進程進行檢測,檢測他是否運行:

實例:while :; do?ps ajx | head -1 && ps ajx | grep test | grep -v grep; sleep 1;done

觀察進程創(chuàng)建和銷毀的過程:?

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


?所以我們發(fā)現(xiàn):進程是有生命的!


4.通過系統(tǒng)調用獲取進程標識符(PID)

4.1PCB是屬于操作系統(tǒng)的還是屬于進程的?

答案是屬于操作系統(tǒng)的,雖然PCB記錄的是進程的相關信息,但是PCB是由操作系統(tǒng)創(chuàng)建并維護的。

那既然PCB是屬于操作系統(tǒng)的,那我們如何查看PCB的信息呢?

在操作系統(tǒng)的那篇文章中我們提到過用戶想要獲取操作系統(tǒng)的信息,需要調用系統(tǒng)接口。

所以獲取進程標識符(PID)等PCB的信息我們需要通過系統(tǒng)調用來獲得,所以我們來認識下getpid()。

首先我們利用man getpid查看下命令手冊:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


我們發(fā)現(xiàn)getpid是在2號手冊中,利用man man我們知道2號手冊中記錄的就是系統(tǒng)調用接口。?


?4.2使用getpid和getppid

(1)編寫代碼:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
	pid_t id = getpid();
	while (1)
	{
		printf("I am a process!pid:%d\n", id);
		sleep(1);
	}
	return 0;
}

(2)執(zhí)行可執(zhí)行程序并觀察

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


那我們再來學習一下getppid(獲取父進程的進程標識符)。

一般在Linux中,普通進程,都有他的父進程。

每一個子進程都是由父進程創(chuàng)建出來的。?

子進程只能有一個父進程,父進程可以有多個子進程。

每次執(zhí)行可執(zhí)行程序,進程標識符會改變(因為每次都是新的進程)。?

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

那我們來觀察一下他的父進程:

(3)編寫代碼:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
	pid_t id = getpid();
    pid_t fid = getppid();
	while (1)
	{
		printf("I am a process!pid:%d ppid:%d\n", id, fid);
		sleep(1);
	}
	return 0;
}

(4)執(zhí)行可執(zhí)行程序并觀察?

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器


我們來查詢一下該進程的父進程究竟是什么??

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

我們發(fā)現(xiàn)該進程的父進程是bash(命令行解釋器)。

在命令行啟動的進程都是bash的子進程。


5.通過系統(tǒng)調用創(chuàng)建進程(fork初識)

./+可執(zhí)行程序的方式是一種手動創(chuàng)建進程的方式。fork則是通過系統(tǒng)調用創(chuàng)建進程。

5.1fork函數創(chuàng)建子進程

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	printf("before fork : I am a process,pid:%d,ppid:%d\n", getpid(), getppid());

	fork();

	printf("after fork : I am a process,pid:%d,ppid:%d\n", getpid(), getppid());
	sleep(2);
	return 0;
}

現(xiàn)象:【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

?確實如我們所料,fork執(zhí)行后,創(chuàng)建出了一個子進程。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

并且我們發(fā)現(xiàn)fork后面的語句執(zhí)行了兩次。

也就是說fork之后,代碼共享,從一個進程分為兩個分支,一為父,一為子。

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

?那我們如何知道誰是父誰是子呢?

這就要研究一下fork函數的返回值問題了。

5.2fork的返回值

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

意思是返回給父進程的是子進程的PID,返回給子進程的是0.

為什么?

  • 因為父:子= 1:n,子找父是很容易的,而父找子必須有子的pid。

兩個返回值么?

我們來驗證一下:

【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

執(zhí)行結果:?【Linux】進程周邊001之進程概念,Linux,linux,運維,服務器

也就是說父進程使用該變量就返回子進程的pid,子進程使用就返回0。


提問:fork函數為什么會返回兩次??

當一個函數運行到了最后執(zhí)行return的時候,這個函數的核心邏輯已經執(zhí)行完成了!

而fork函數中必然會有創(chuàng)建子進程這一操作,所以在fork函數返回值之前,子進程已經存在了。

所以fork函數會返回兩次值寫入到變量中。


提問:id怎么可能同一個變量既等于0又等于pid??

一個進程崩潰會不會影響其他進程呢?答案是不會。

注:任意進程之間是具有獨立性的,互相不能影響,即便是父子進程。

子進程被創(chuàng)建時,會繼承大部分父進程的屬性,即子進程的創(chuàng)建是以父進程為模板的。

模擬場景:父進程或子進程對一共享數據進行修改會發(fā)生什么?

前面我們剛說到任意進程之間具有獨立性,互相不能影響,所以操作系統(tǒng)必須保證這一點。

假如為子進程修改該數據:子進程會從父進程那拷貝一份到自己這里進行修改,這一行為稱之為寫時拷貝。

父進程修改該數據也如此。

id就是這一共享數據,返回的本質就是寫入。

  • linux中可以使用同一變量名,表示不同的內存。

提問:我們創(chuàng)建子進程的目的是什么?

一般而言:我們想讓父子做不同的工作。

所以我們就可以利用返回值的不同使用if進行分流


5.3使用if進行分流

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int ret = fork();
	if (ret < 0) {
		perror("fork");
		return 1;
	}
	else if (ret == 0) { 
        //child的工作代碼段
	}
	else { 
		//father的工作代碼段
	}
	sleep(1);
	return 0;
}

本篇內容就到這里,其中有些知識需要學習到進程地址空間才能深入研究,博主會持續(xù)更新Linux系列文章,歡迎大家關注哈!

=========================================================================

如果你對該系列文章有興趣的話,歡迎持續(xù)關注博主動態(tài),博主會持續(xù)輸出優(yōu)質內容

??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動力??

??~ 點贊收藏+關注 ~??

=========================================================================

到了這里,關于【Linux】進程周邊001之進程概念的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Linux】進程周邊005之環(huán)境變量

    【Linux】進程周邊005之環(huán)境變量

    ? ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數據結構》 《藍橋杯試題》 《LeetCode刷題筆記》 《實訓項目》 《C++》 《Linux》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言 1.環(huán)境變量是什么? 1.1查看環(huán)境變量的方法 1.2常見的環(huán)境變量 1.2.1PATH 1.2.2USER

    2024年02月04日
    瀏覽(19)
  • 【Linux】進程周邊004之進程的調度與切換(領略Linux系統(tǒng)進程調度算法的神奇)

    【Linux】進程周邊004之進程的調度與切換(領略Linux系統(tǒng)進程調度算法的神奇)

    ? ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數據結構》 《藍橋杯試題》 《LeetCode刷題筆記》 《實訓項目》 《C++》 《Linux》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言 1.進程切換 2.進程調度 2.1Linux系統(tǒng)的進程調度算法如何實現(xiàn)兼顧進程優(yōu)先級的設計

    2024年02月04日
    瀏覽(19)
  • 【Linux深造日志】運維工程師必會Linux常見命令以及周邊知識!

    【Linux深造日志】運維工程師必會Linux常見命令以及周邊知識!

    ?? 鴿芷咕 :個人主頁 ??? 個人專欄 : 《linux深造日志》《粉絲福利》 ??生活的理想,就是為了理想的生活! ??哈嘍各位寶子們好啊!我是博主鴿芷咕。日志這個東西我相信大家都不陌生,在 linxu/Windows 系統(tǒng)中每天運行都會產生各種系統(tǒng)日志。而咱們每天學習知識也是一

    2024年04月17日
    瀏覽(23)
  • 【樹莓派烤肉 001】從 0 開始用自己的樹莓派搭建服務器:運維篇

    【樹莓派烤肉 001】從 0 開始用自己的樹莓派搭建服務器:運維篇

    沒錯,我承認這個標題寫的很好吃…… 話說我家里那只樹莓派 4B 8GB 放了兩年了,除了吃灰還是吃灰~ 于是我想用它做一些非同尋常的事情,比如搭服務器。之前建網站都是用的 GitHub Pages,這次我們整個真實的 LAMP 環(huán)境。話不多說,下面開始搭建運行環(huán)境~ (不用擔心樹莓派

    2024年02月09日
    瀏覽(23)
  • 運維 | 查看 Linux 服務器 IP 地址

    大多數在操作 Linux 系統(tǒng)時,我們經常需要知道服務器的 IP 比便于后續(xù)的一系列操作,這時候有快速查看主機 IP 的命令行操作,能夠有效的幫助我們 本章節(jié)主要記錄一些常用查看服務器 IP 的命令,希望對大家有所幫助。 查看 Linux 服務器的 IP 地址的命令大體上有以下幾種。

    2024年04月27日
    瀏覽(104)
  • 【運維】Linux 跨服務器復制文件文件夾

    如果是云服務 建議用內網ip scp是secure copy的簡寫,用于在Linux下進行遠程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨服務器,而且scp傳輸是加密的??赡軙晕⒂绊懸幌滤俣?。當你服務器硬盤變?yōu)橹蛔x read only system時,用scp可以幫你把文件移出來

    2024年02月08日
    瀏覽(109)
  • 【Linux 服務器運維】定時任務 crontab 詳解 | 文末送書

    【Linux 服務器運維】定時任務 crontab 詳解 | 文末送書

    本文思維導圖概述的主要內容: 1.1 什么是 crontab Crontab 是一個在 Unix 和 Linux 操作系統(tǒng)上 用于定時執(zhí)行任務 的工具。它允許用戶創(chuàng)建和管理計劃任務,以便在特定的時間間隔或時間點自動運行命令或腳本。Crontab 是 cron table 的縮寫, cron 指的是 Unix 系統(tǒng)中的一個后臺進程,它

    2024年02月08日
    瀏覽(129)
  • linux并發(fā)服務器 —— 多進程并發(fā)(四)

    linux并發(fā)服務器 —— 多進程并發(fā)(四)

    程序是包含一系列信息的文件,描述了如何在運行時創(chuàng)建一個進程; 進程是正在運行的程序的實例,可以用一個程序來創(chuàng)建多個進程; 用戶內存空間包含程序代碼以及代碼所使用的變量,內核數據結構用于維護進程狀態(tài)信息; 進程控制塊(PCB):維護進程相關的信息,tas

    2024年02月11日
    瀏覽(27)
  • 【Linux運維】shell腳本檢查服務器內存和CPU利用率

    在管理服務器時候寫了一個 shell腳本,在服務上實現(xiàn)每天凌晨3點查系統(tǒng)的指定文件夾下的容量大小,如果超過10G就要刪除3天前的內容,還要時刻查詢內存和cpu利用率,如果超過80%就要提示用戶出現(xiàn)過載 將以上代碼保存為一個.sh文件,然后通過crontab在每天凌晨3點運行即可:

    2024年02月09日
    瀏覽(33)
  • Linux服務器上查詢進程 ps aux

    在Linux服務器上查詢進程,有以下幾種方法: 使用ps命令。這個命令用于報告當前系統(tǒng)的進程狀態(tài)。可以用以下方式使用ps命令來查看進程信息: ps aux:顯示系統(tǒng)中所有進程的信息。 ps -e:顯示所有進程的信息。 ps -f:顯示進程的所有信息。 ps -l:以長格式顯示進程信息。

    2024年02月05日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包