91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你們知道Linux的進(jìn)程是怎樣創(chuàng)建的嗎

Linux愛好者 ? 來源:CS指南 ? 作者:大白 ? 2021-11-09 10:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux的進(jìn)程是怎樣創(chuàng)建的

Linux系統(tǒng)創(chuàng)建進(jìn)程都是由已存在的進(jìn)程創(chuàng)建的(除了0號(hào)進(jìn)程),被創(chuàng)建的進(jìn)程叫做子進(jìn)程,創(chuàng)建子進(jìn)程的進(jìn)程就做父進(jìn)程。這句話是不是有點(diǎn)熟悉,沒錯(cuò),Linux進(jìn)程串起來也是一顆樹的結(jié)構(gòu)。就像下面這樣:

01d5842e-3f30-11ec-9195-dac502259ad0.png

在Linux中,為了創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程用系統(tǒng)調(diào)用fork來創(chuàng)建子進(jìn)程。fork()其實(shí)就是把父進(jìn)程復(fù)制了一份(子進(jìn)程有自己的特性,比如標(biāo)識(shí)、狀態(tài)、數(shù)據(jù)空間等;子進(jìn)程和父進(jìn)程共同使用程序代碼、共用時(shí)間片等)。

可以看下面這段代碼:

#include
#include

int main()
{
int p_num = 0;
int c_num = 0;
int pid = fork();
if(pid == 0) //返回的pid為0為子進(jìn)程
{
c_num++;
}
else
{
p_num++; //返回的pid大于0為父進(jìn)程
}
printf("p_num=%d, c_num=%d
",p_num,c_num);
printf("pid=%d
",pid);
return 0;
}
//運(yùn)行結(jié)果如下所示
p_num=1, c_num=0
pid=36101
p_num=0, c_num=1
pid=0

大家看,代碼中調(diào)用了fork以后,之后的程序被執(zhí)行了兩遍。子進(jìn)程和父進(jìn)程各自的變量互相沒有受到干擾。不過子進(jìn)程和父進(jìn)程執(zhí)行的是相同的代碼,子進(jìn)程和父進(jìn)程資源占用情況如下圖所示:

02068b78-3f30-11ec-9195-dac502259ad0.png

大家可以看出,通過fork后,子進(jìn)程并沒有和父進(jìn)程獨(dú)立開,用的是相同的代碼。另外還有一個(gè)問題時(shí),這個(gè)時(shí)候子進(jìn)程的時(shí)間片是和父進(jìn)程一分為二來共享的。這樣我創(chuàng)建子進(jìn)程還有什么意義?為了徹底將父進(jìn)程和子進(jìn)程分離開來,就要用到一個(gè)系統(tǒng)調(diào)用 execv()。

看下面這段代碼:

//process.c
#include
#include

int main()
{
int pid = fork();
if(pid == 0)
{
execv("./test.o",NULL);  //test.o是一個(gè)經(jīng)過編譯的c語言文件,這里記得要放test.o的絕對(duì)路徑
}
printf("This is parent process
");
return 0;
}

//test.c
#include
int main()
{
printf("This is child process");
return 0;
}

//運(yùn)行結(jié)果如下所示
This is parent process
This is child process

通過上面的代碼可以看出,從系統(tǒng)調(diào)用 execv() 后,子進(jìn)程直接走自己的代碼了,沒有像前一段代碼一樣把后面的代碼執(zhí)行了兩次。通過調(diào)用 execv(),子進(jìn)程和父進(jìn)程就基本分離開了。

結(jié)合系統(tǒng)繼續(xù)看Linux的進(jìn)程樹是什么樣的

好了,通過上面的介紹,大家應(yīng)該對(duì)進(jìn)程是怎么創(chuàng)建的有一定的了解。想繼續(xù)學(xué)習(xí)的我們來接著上強(qiáng)度。

我們?cè)?Linux 系統(tǒng)上通過 ps - ef 命令查看系統(tǒng)目前的進(jìn)程:

/[root@localhost lucas]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  3 21:41 ?        00:02:38 /usr/lib/systemd/systemd --s
root           2       0  0 21:41 ?        00:00:07 [kthreadd]
root           3       2  0 21:41 ?        00:00:00 [rcu_gp]
root           4       2  0 21:41 ?        00:00:00 [rcu_par_gp]
...
rtkit       1151       1  0 21:41 ?        00:00:14 /usr/libexec/rtkit-daemon
root        1152       1  0 21:41 ?        00:00:00 /usr/sbin/ModemManager
avahi       1155       1  0 21:41 ?        00:00:06 avahi-daemon: running [linux
root        1159       1  0 21:41 ?        00:00:02 /usr/lib/systemd/systemd-mac

我來解釋上表是什么意思。

首先,每一個(gè)進(jìn)程都要所屬一個(gè)用戶,UID 就是用戶的標(biāo)識(shí)符(通過 root 用戶創(chuàng)建的進(jìn)程 UID 就是 root,如果我自己創(chuàng)建的話就應(yīng)該是我的用戶名,比如我的名字 "dabai")。

其次每一個(gè)進(jìn)程都要有一個(gè) ID 來表示這個(gè)進(jìn)程,PID 就表示的是當(dāng)前進(jìn)程的 id。

最后,上文提到除了 0 號(hào)進(jìn)程,每一個(gè)進(jìn)程都是由他的父進(jìn)程創(chuàng)建的,PPID 就表示當(dāng)前進(jìn)程的父進(jìn)程 id。

通過 0 號(hào)進(jìn)程創(chuàng)建 1 號(hào)進(jìn)程和 2 號(hào)進(jìn)程,然后通過 1 號(hào)進(jìn)程去創(chuàng)建用戶態(tài)進(jìn)程,再通過 2 號(hào)進(jìn)程創(chuàng)建內(nèi)核態(tài)進(jìn)程,就生成了 Linux 進(jìn)程樹。

0248cfec-3f30-11ec-9195-dac502259ad0.png

「什么是0號(hào)進(jìn)程、1號(hào)進(jìn)程以及2號(hào)進(jìn)程?」。

0號(hào)進(jìn)程:在內(nèi)核初始化的過程中,會(huì)先通過指令 struct task_struct init_task = INIT_TASK(init_task) 創(chuàng)建 0 號(hào)進(jìn)程。這是唯一一個(gè)沒有通過 fork 或者 kernel_thread 產(chǎn)生的進(jìn)程。是進(jìn)程列表的第一個(gè)。但是這個(gè)進(jìn)程不是實(shí)際意義上的進(jìn)程,類似與鏈表頭。所以雖然 0 號(hào)進(jìn)程是在內(nèi)核態(tài)創(chuàng)建的,但不能說 0 號(hào)進(jìn)程是內(nèi)核態(tài)的第一個(gè)進(jìn)程,反而要說 2 號(hào)進(jìn)程是內(nèi)核態(tài)的第一個(gè)進(jìn)程。

1號(hào)進(jìn)程:通過調(diào)用指令 kernel_thread(kernel_init, NULL, CLONE_FS) 從內(nèi)核態(tài)切換到用戶態(tài)來創(chuàng)建的,1號(hào)進(jìn)程是所有用戶態(tài)的祖先。

2號(hào)進(jìn)程:通過調(diào)用指令 kernel_thread(kthreadd, NULL, ClONE_FS | CLONE_FILES) 來創(chuàng)建,2號(hào)進(jìn)程負(fù)責(zé)所有內(nèi)核態(tài)的進(jìn)程的調(diào)度和管理,是內(nèi)核態(tài)所有進(jìn)程的祖先。(注意,內(nèi)核態(tài)不區(qū)分線程和進(jìn)程,所以說進(jìn)程和線程都可以,都是任務(wù))

「為什么要先創(chuàng)建 0 號(hào)進(jìn)程,而不直接創(chuàng)建 1 號(hào)進(jìn)程?」

現(xiàn)在對(duì)于為什么要先創(chuàng)建 0 號(hào)進(jìn)程而不直接創(chuàng)建1號(hào)和2號(hào)進(jìn)程有許多討論。我認(rèn)為...算了,我不認(rèn)為了,一展開講這篇文章又收不了尾了,以后可以專門寫一篇文章來論述這里。簡單來說就是Linux 的第一個(gè)進(jìn)程不適合是一個(gè)真進(jìn)程,需要一個(gè)沒有數(shù)據(jù)之類東西的假進(jìn)程。

「為什么要區(qū)分用戶態(tài)和內(nèi)核態(tài)?」

因?yàn)橛辛硕鄠€(gè)進(jìn)程,對(duì)于關(guān)鍵資源來說,就會(huì)產(chǎn)生爭用以及誤操作破壞資源等情況。這時(shí)就需要對(duì)資源的訪問權(quán)限進(jìn)行一定的限制。x86 提供了分層的權(quán)限機(jī)制,內(nèi)核態(tài)具有最高的訪問權(quán)限,而用戶態(tài)訪問核心資源時(shí)必須要切換到內(nèi)核態(tài)才可以訪問。

好了,我看了下字?jǐn)?shù),這篇文章已經(jīng)不少了,接下來我還會(huì)繼續(xù)去分享進(jìn)程和線程的更多細(xì)節(jié),也會(huì)根據(jù)讀者的反饋在已完成的文章上不斷完善,歡迎大家持續(xù)關(guān)注呀!

參考資料:

【1】Linux進(jìn)程的創(chuàng)建與管理:https://blog.csdn.net/qq_38410730/article/details/81193118

【2】極客時(shí)間:《趣談Linux操作系統(tǒng)

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218996
  • PID
    PID
    +關(guān)注

    關(guān)注

    38

    文章

    1499

    瀏覽量

    91133
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73937

原文標(biāo)題:Linux 的進(jìn)程是怎樣創(chuàng)建的

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    Linux系統(tǒng)中,有些基本命令能夠查看到進(jìn)程的信息。例如ps、top、pgrep、pstree等;這些命令為用戶提供了查看和管理Linux進(jìn)程信息的多種功能。通過合理使用這些命令,用
    發(fā)表于 03-02 08:49

    Linux進(jìn)程管理不用愁!這6個(gè)工具幫你搞定90%場景

    Linux 系統(tǒng)中,進(jìn)程是資源分配的基本單位,無論是服務(wù)器運(yùn)維、程序調(diào)試還是日常使用,掌握進(jìn)程管理工具都是必備技能。今天就帶大家梳理 6 個(gè)最常用的進(jìn)程管理工具,從查看
    的頭像 發(fā)表于 02-04 16:23 ?1423次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理不用愁!這6個(gè)工具幫你搞定90%場景

    Linux進(jìn)程樹分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化Linux系統(tǒng))

    Linux 系統(tǒng)開發(fā)與運(yùn)維中,理解進(jìn)程的運(yùn)行狀態(tài)和相互關(guān)系是排查問題、優(yōu)化性能的基礎(chǔ)。pstree 作為一款輕量高效的進(jìn)程樹可視化工具,能直觀展示系統(tǒng)中所有進(jìn)程的父子關(guān)系,為系統(tǒng)分
    的頭像 發(fā)表于 02-04 16:21 ?711次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>樹分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化<b class='flag-5'>Linux</b>系統(tǒng))

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    的開始和結(jié)束在 Linux 操作系統(tǒng)中,程序是靜態(tài)的可執(zhí)行文件,而進(jìn)程是動(dòng)態(tài)的實(shí)體。從程序變?yōu)?b class='flag-5'>進(jìn)程的過程涉及多個(gè)步驟,其中還包括系統(tǒng)資源的管理和初始化。1.當(dāng)用戶在 Shell 中輸入命令時(shí),Shell
    發(fā)表于 01-26 08:42

    進(jìn)程概念和特征

    進(jìn)程的基本情況和運(yùn)行狀態(tài),進(jìn)而控制和管理進(jìn)程。相應(yīng)地,由程序段、相關(guān)數(shù)據(jù)段和PCB三部分構(gòu)成了進(jìn)程映像(進(jìn)程實(shí)體)。所謂創(chuàng)建
    發(fā)表于 01-15 06:39

    進(jìn)程的控制

    進(jìn)程控制的主要功能是對(duì)系統(tǒng)中的所有進(jìn)程實(shí)施有效的管理,它具有創(chuàng)建進(jìn)程、撤銷已有進(jìn)程、實(shí)現(xiàn)進(jìn)程
    發(fā)表于 01-15 06:05

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個(gè)進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的
    的頭像 發(fā)表于 12-24 07:05 ?4286次閱讀
    深入<b class='flag-5'>Linux</b>內(nèi)核:<b class='flag-5'>進(jìn)程</b>調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    解析Linux進(jìn)程、線程和協(xié)程

    系統(tǒng)的穩(wěn)定性和安全性。 (3)創(chuàng)建與銷毀:Linux使用fork()系統(tǒng)調(diào)用來創(chuàng)建進(jìn)程,通過exit()來終止進(jìn)程。 線程(Thread
    發(fā)表于 12-22 11:00

    Linux進(jìn)程間通信(IPC)全解析:從管道到?Socket,一篇講透

    在?Linux?世界里,進(jìn)程并非孤立存在。無論是后臺(tái)服務(wù)協(xié)作(如?Web?服務(wù)器與數(shù)據(jù)庫)、命令行工具聯(lián)動(dòng)(如ps | grep),還是復(fù)雜應(yīng)用的模塊通信,都離不開 進(jìn)程間通信(IPC
    的頭像 發(fā)表于 11-14 21:38 ?1.3w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>間通信(IPC)全解析:從管道到?Socket,一篇講透

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    任務(wù),并行是多個(gè)處理器或多核處理器同時(shí)執(zhí)行不同的任務(wù)。 Linux系統(tǒng)中進(jìn)行多線程編程時(shí),會(huì)涉及到主線程和子線程的操作: 1)主線程是程序的執(zhí)行入口,它是程序中第一個(gè)創(chuàng)建的線程。 2)子線程,是主線
    發(fā)表于 09-01 21:31

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux 進(jìn)程創(chuàng)建

    Linux進(jìn)程通信方式有這幾種: 1。管道 2。信號(hào)量 3。消息隊(duì)列 4。共享內(nèi)存 在本帖子中,我會(huì)講解fork(),exit()系統(tǒng)調(diào)用的實(shí)踐。通過應(yīng)用編程來實(shí)現(xiàn)系統(tǒng)調(diào)用。 1,進(jìn)程創(chuàng)建
    發(fā)表于 09-01 20:49

    Linux常用命令大全

    Linux常用命令是指在Linux操作系統(tǒng)中廣泛使用的命令工具,這些命令工具可以完成各種不同的任務(wù),如管理文件和目錄、操作進(jìn)程、網(wǎng)絡(luò)通信、軟件安裝等。
    的頭像 發(fā)表于 05-03 18:08 ?1855次閱讀

    Linux后臺(tái)進(jìn)程管理詳解

    當(dāng)我們?cè)诮K端或控制臺(tái)工作時(shí),可能不希望由于運(yùn)行一個(gè)作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對(duì)于密集訪問磁盤的進(jìn)程,我們更希望它能夠在每天的非負(fù)荷高峰時(shí)間段運(yùn)行(例如凌晨)。為了使這些進(jìn)程能夠在后臺(tái)運(yùn)行,也就是說不在終端屏幕上運(yùn)行,有幾種選擇方法可
    的頭像 發(fā)表于 04-25 11:04 ?1003次閱讀
    <b class='flag-5'>Linux</b>后臺(tái)<b class='flag-5'>進(jìn)程</b>管理詳解

    Linux系統(tǒng)進(jìn)程管理入門指南

    Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對(duì)于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?1127次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門指南

    Linux進(jìn)程狀態(tài)詳解

    進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程在調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一個(gè)隊(duì)列,設(shè)備也是一個(gè)隊(duì)列,當(dāng)我們讀磁盤,讀網(wǎng)
    的頭像 發(fā)表于 04-01 09:46 ?1150次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>狀態(tài)詳解