18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

可以看下面這段代碼:

#include
#include

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

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

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

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

看下面這段代碼:

//process.c
#include
#include

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

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

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

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

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

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

我們在 Linux 系統(tǒng)上通過 ps - ef 命令查看系統(tǒng)目前的進程:

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

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

首先,每一個進程都要所屬一個用戶,UID 就是用戶的標識符(通過 root 用戶創(chuàng)建的進程 UID 就是 root,如果我自己創(chuàng)建的話就應該是我的用戶名,比如我的名字 "dabai")。

其次每一個進程都要有一個 ID 來表示這個進程,PID 就表示的是當前進程的 id。

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

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

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

「什么是0號進程、1號進程以及2號進程?」。

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

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

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

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

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

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

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

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

參考資料:

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

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

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

    關(guān)注

    88

    文章

    11581

    瀏覽量

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

    關(guān)注

    37

    文章

    1487

    瀏覽量

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

    關(guān)注

    30

    文章

    4927

    瀏覽量

    72499

原文標題:Linux 的進程是怎樣創(chuàng)建的

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    知道板卡廠商參與芯片研發(fā)的α階段意味著什么?

    大家都知道芯片很重要,但你是否知道一顆芯片從設計構(gòu)思到最終量產(chǎn),需要經(jīng)歷怎樣一個漫長的過程嗎?
    的頭像 發(fā)表于 09-24 17:08 ?7050次閱讀
    你<b class='flag-5'>知道</b>板卡廠商參與芯片研發(fā)的α階段意味著什么?

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

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

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

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

    Linux權(quán)限體系解析

    你真的了解Linux權(quán)限嗎?大多數(shù)人只知道rwx,但Linux的權(quán)限體系遠比你想象的復雜和強大。今天我們深入探討Linux的12位權(quán)限體系,這是每個運維工程師都應該掌握的核心知識。
    的頭像 發(fā)表于 07-23 16:57 ?498次閱讀

    Linux常用命令大全

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

    Linux后臺進程管理詳解

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

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

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

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

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

    hyper-v 備份,hyper-v怎樣進行虛擬機的創(chuàng)建

    虛擬機技術(shù)打破了傳統(tǒng)計算機的限制,為我們帶來了全新的計算機模式。今天給大家介紹hyper-v怎樣進行虛擬機的創(chuàng)建? ? ?hyper-v怎樣進行虛擬機的創(chuàng)建? ? ?使用PowerSh
    的頭像 發(fā)表于 02-05 14:54 ?697次閱讀
    hyper-v 備份,hyper-v<b class='flag-5'>怎樣</b>進行虛擬機的<b class='flag-5'>創(chuàng)建</b>

    Linux中的用戶與創(chuàng)建

    Linux中的用戶與創(chuàng)建 用戶的類型 超級管理用戶: 權(quán)限最高的用戶(uid:0) #uid:是用戶的身份證號,Linux系統(tǒng)只認uid 普通用戶: 權(quán)限受限的用戶(uid:1000-60000
    的頭像 發(fā)表于 12-20 14:24 ?1063次閱讀
    <b class='flag-5'>Linux</b>中的用戶與<b class='flag-5'>創(chuàng)建</b>

    深入解析Linux程序與進程

    關(guān)于某個數(shù)據(jù)集合的一次運行活動。作為系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。 程序與進程的關(guān)系 進程的狀態(tài) 基礎(chǔ)進程狀態(tài) 創(chuàng)建狀態(tài):
    的頭像 發(fā)表于 12-18 11:01 ?746次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進程</b>

    Hyper-V創(chuàng)建虛擬機配置IP等網(wǎng)絡配置原理(Linux、Windows為例)

    大家知道Windows系統(tǒng)里面內(nèi)置了Hyper-V管理器,用來創(chuàng)建和管理本地虛擬機環(huán)境。今天我創(chuàng)建了兩臺虛擬機,一臺是CentOS7.9(Linux),另一臺是Windows 11,然
    的頭像 發(fā)表于 12-09 10:24 ?5348次閱讀
    Hyper-V<b class='flag-5'>創(chuàng)建</b>虛擬機配置IP等網(wǎng)絡配置原理(<b class='flag-5'>Linux</b>、Windows為例)

    深入Linux進程管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    目錄 Linux進程管理 8.1 IO負載 8.2 實時進程監(jiān)控 5.1 作業(yè)與會話 5.2 作業(yè)分類 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發(fā)表于 11-22 11:05 ?996次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    操作系統(tǒng)進行管理; 父進程號:(PPID:Parent Process ID):用于描述一個進程的直接父進程的標識符,每個進程創(chuàng)建時都會
    發(fā)表于 11-04 15:15

    Linux網(wǎng)絡基礎(chǔ)知識總結(jié)

    同 CPU、內(nèi)存以及 I/O 一樣,網(wǎng)絡也是 Linux 系統(tǒng)最核心的功能。 網(wǎng)絡是一種把不同計算機或網(wǎng)絡設備連接到一起的技術(shù),它本質(zhì)上是一種進程間通信方式,特別是跨系統(tǒng)的進程間通信,必須要通過網(wǎng)絡才能進行。
    的頭像 發(fā)表于 10-28 10:42 ?884次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡基礎(chǔ)知識總結(jié)