在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

你們知道Linux的進程是怎樣創建的嗎

Linux愛好者 ? 來源:CS指南 ? 作者:大白 ? 2021-11-09 10:46 ? 次閱讀

Linux的進程是怎樣創建的

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

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

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

可以看下面這段代碼:

#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;
}
//運行結果如下所示
p_num=1, c_num=0
pid=36101
p_num=0, c_num=1
pid=0

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

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

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

看下面這段代碼:

//process.c
#include
#include

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

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

//運行結果如下所示
This is parent process
This is child process

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

結合系統繼續看Linux的進程樹是什么樣的

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

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

/[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 用戶創建的進程 UID 就是 root,如果我自己創建的話就應該是我的用戶名,比如我的名字 "dabai")。

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

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

通過 0 號進程創建 1 號進程和 2 號進程,然后通過 1 號進程去創建用戶態進程,再通過 2 號進程創建內核態進程,就生成了 Linux 進程樹。

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

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

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

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

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

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

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

「為什么要區分用戶態和內核態?」

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

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

參考資料

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

【2】極客時間:《趣談Linux操作系統

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

    關注

    87

    文章

    11345

    瀏覽量

    210399
  • PID
    PID
    +關注

    關注

    35

    文章

    1473

    瀏覽量

    85825
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69054

原文標題:Linux 的進程是怎樣創建的

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

收藏 人收藏

    評論

    相關推薦

    hyper-v 備份,hyper-v怎樣進行虛擬機的創建

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

    Linux中的用戶與創建

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

    深入解析Linux程序與進程

    關于某個數據集合的一次運行活動。作為系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 程序與進程的關系 進程的狀態 基礎進程狀態 創建狀態:
    的頭像 發表于 12-18 11:01 ?158次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進程</b>

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

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

    深入Linux進程管理:提升效率與穩定性的關鍵方法

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

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

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

    linux常用性能優化方法

    占用一個本地端口號(與 TCP 協議端口號不一樣),相當于一個進程,便于與其它進程進行交互。而Linux內核的TCP/IP 協議實現模塊對本地端口號的范圍進行了限制。當端口號用盡,就會出現這種錯誤了。
    的頭像 發表于 10-23 13:51 ?191次閱讀

    Linux lsof命令的基本用法

    linux 系統中,一切皆文件。通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以 lsof 命令不僅可以查看進程打開的文件、目錄,還可以查看進程監聽的端口等 socket 相關的信息。本文將介紹 lsof 命令
    的頭像 發表于 10-23 11:52 ?427次閱讀
    <b class='flag-5'>Linux</b> lsof命令的基本用法

    Linux用戶身份與進程權限詳解

    在學習 Linux 系統權限相關的主題時,我們首先關注的基本都是文件的 ugo 權限。ugo 權限信息是文件的屬性,它指明了用戶與文件之間的關系。但是真正操作文件的卻是進程,也就是說用戶所擁有的文件
    的頭像 發表于 10-23 11:41 ?427次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進程</b>權限詳解

    飛凌嵌入式ElfBoard ELF 1板卡-Linux C接口編程入門之文件I/O

    。目錄:目錄也被視為文件,用于組織和存儲其他文件和目錄。通過目錄文件,可以進行文件的查找、創建、刪除和移動等操作。管道(Pipe)和套接字(Socket):Linux提供了管道和套接字機制,用于不同進程
    發表于 10-09 15:38

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux驅動開發主要是針對硬件設備進行編程,處于操作系統內核層,直接與硬件交互,為上層應用提供設備訪問的接口。Linux應用開發則是在操作系統
    的頭像 發表于 08-30 12:16 ?925次閱讀
    <b class='flag-5'>Linux</b> 驅動開發與應用開發,你<b class='flag-5'>知道</b>多少?

    深入探討Linux進程調度器

    Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個進程
    的頭像 發表于 08-13 13:36 ?994次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>調度器

    Linux添加磁盤創建分區、掛載

    Linux添加磁盤創建分區、掛載
    發表于 04-20 17:49 ?557次閱讀
    <b class='flag-5'>Linux</b>添加磁盤<b class='flag-5'>創建</b>分區、掛載

    linux下查詢進程占用的內存方法有哪些?

    linux下查詢進程占用的內存方法
    發表于 04-08 06:03

    聊聊怎樣挑選合適的二極管型號

    各位朋友,你們知道嗎,那些微不足道的小元件,比如二極管,是怎樣在電路中扮演著關鍵角色的?二極管,它可是電子世界中的“流量守門員”,確保電流只能朝著一個方向流動。
    的頭像 發表于 03-26 15:35 ?1015次閱讀
    聊聊<b class='flag-5'>怎樣</b>挑選合適的二極管型號
    主站蜘蛛池模板: 天天做夜夜做久久做狠狠 | 国产一级一级片 | 播播开心激情网 | 九九热免费观看 | 免费黄视频网站 | 午夜精| 国产男女交性视频播放免费bd | 国产精品11页| 国产综合色精品一区二区三区 | 四虎国产欧美成人影院 | 精品国产乱码一区二区三区 | 五月婷婷色综合 | 全亚洲最大的777io影院 | 黄色片视频网 | 久久精品国产免费观看99 | 色干干 | 特色毛片 | 天天躁天天爽 | 日韩欧美色| 日本jlzz | 四虎影在永久地址在线观看 | 欧洲妇女成人淫片aaa视频 | 免费的国语一级淫片 | 午夜一区二区免费视频 | 天堂网www在线资源中文 | 夜夜操夜夜| 久久性生活 | 婷婷深爱网| 午夜寂寞视频在线观看 | 亚洲激情网站 | 美女视频一区二区三区在线 | 国产成人精品影视 | 在线观看国产一级强片 | 一级一级特黄女人精品毛片 | 视频一本大道香蕉久在线播放 | 俄罗斯毛片基地 | 日本污视频网站 | 婷婷丁香在线观看 | 美女很黄很黄是免费的·无遮挡网站 | 国产国产人免费人成成免视频 | 久久久久久久久久久9精品视频 |