色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來到小浪云!


Linux進程管理之如何創建和銷毀進程


avatar
小浪云 2025-01-06 141

一、進程與線程的概念

進程是多程序設計中操作系統的基本概念,用于描述程序執行的實體。在linux等多用戶多進程的操作系統中,通常將這個執行實體稱為進程,有時也被稱為線程或任務。

Linux操作系統中,為何進程和線程有時候會互相稱呼呢?下面將通過對進程創建和銷毀的流程進行闡述,可以更加自然地理解這一點。

1. 創建進程的入口函數

首次遇到進程創建是在Linux啟動過程中,rest_init函數調用kernel_thread函數創建了兩個內核進程:kernel_init和kthreadd。Linux進程管理之如何創建和銷毀進程

1.1 kernel_thread的原型

定義在kernel/fork.c文件內,是調用_do_fork實現的,源碼如下:Linux進程管理之如何創建和銷毀進程

我們知道kthreadd進程負責創建所有內核線程,那么它是如何創建的呢?循著鏈表kthread_create_list,可以找到鏈表是__kthread_create_on_node函數內插入的,進而我們引出了kthread_create、kthread_run等函數。

1.2 kthread_create的原型

定義在include/linux/kthread.h文件內,是個宏定義。Linux進程管理之如何創建和銷毀進程

kthread_create_on_node函數定義在kernel/kthread.c文件內,內部是調用__kthread_create_on_node實現。Linux進程管理之如何創建和銷毀進程

當看到EXPORT_SYMBOL標識時,可以知道kthread_create_on_node是對全部內核代碼公開的,內核和驅動都可以調用,調用時只需extern該函數聲明或包含頭文件即可,實際操作中,更多的是使用kthread_create宏。

我們繼續看kthread_create_on_node的主要實現函數是__kthread_create_on_node,line 299顯示task的數據結構體是struct task_sttruct, 便是進程描述符。Linux進程管理之如何創建和銷毀進程

1.3 kthread_run的原型

kthread_run是定義在include/Linux/kthread.h頭文件的宏,可以看出內部也是調用kthread_create函數實現的。Linux進程管理之如何創建和銷毀進程

1.4 對比三個內核創建進程函數

  1. kernel_thread直接調用_do_fork創建進程,但不對外開放。
  2. kthread_create創建了進程由kthread進程具體完成創建,間接調用_do_fork實現,但它對所有內核開放。
  3. kthread_run調用kthread_create創建了進程,并立即喚醒去執行。

2、用戶進程該如何創建

Linux應用編程的時候我們常用三個函數,fork、vfork和pthead__create,區別與內核進程的創建,用戶態不能直接調用內核態的進程創建函數,必須經由系統調用system call機制(system call不是本文重點,后面單獨一篇詳述)。

2.1 fork函數

fork函數調用_do_fork函數創建進程。

Linux進程管理之如何創建和銷毀進程

2.2 vfork函數

vfork函數調用_do_fork函數創建進程。不同于fork函數,args內多了flags的賦值。

Linux進程管理之如何創建和銷毀進程Linux進程管理之如何創建和銷毀進程

2.3 clone函數

clone函數也是調用_do_fork函數創建進程。不同于fork、vfork函數,args內多了更多參數的賦值。

Linux進程管理之如何創建和銷毀進程Linux進程管理之如何創建和銷毀進程

2.4 小節

創建內核進程的接口有kernel_thread、kthread_create和kthread_run。

創建用戶進程的接口有fork、vfork和pthread__create。

這六個接口最終都是調用_do_fork實現的。

Linux進程管理之如何創建和銷毀進程

3、創建進程的具體實現之_do_fork

用戶態和內核態創建進程最終都是直接或間接調用_do_fork實現的。可見_do_fork函數的重要性,內部實現是調用copy_process來創建進程描述符以及子進程執行所需要的所有其他數據結構

Linux進程管理之如何創建和銷毀進程Linux進程管理之如何創建和銷毀進程

4、進程描述符之Struct task_struct

調用copy_process來創建進程描述符,描述符的數據結構是struct task_struct,定義在include/linux/sched.h文件內。

我們可以簡單一撇結構體內的成員變量(有大量刪減),單獨講每個成員變量沒有意義,后續我們在實際內核功能中理解它們。

Linux進程管理之如何創建和銷毀進程

5、進程銷毀

當一個進程運行結束或者因為異常而終止退出時,該如何操作呢?在用戶態常用exit函數來終止,在內核態直接調用do_exit()。

最終都會調用內核函數do_exit(), 該函數可以理解為進程創建的逆過程,即把進程創建的資源一一釋放,并調整與其父子進程的關系。具體實現過程不再分析,直接看源碼。

Linux進程管理之如何創建和銷毀進程

6、總結與下一篇計劃

本篇主要講解內核態和用戶態創建和銷毀進程的接口函數,并側重介紹了創建過程函數_do_fork。

本篇中講到用戶態調用內核態的函數需要用到系統調用,下一篇著重講解系統調用的過程。

相關閱讀

主站蜘蛛池模板: 美女被躁免费视频网站大全桃色 | 一级毛片一级毛片一级毛片aaav | 久久95 | sihu国产精品永久免费 | 日本高清视频在线的 | 成人精品第一区二区三区 | 欧美亚洲人成网站在线观看刚交 | 国产毛片在线视频 | 亚洲男人天堂 | 免费一级毛片无毒不卡 | 另类国产精品一区二区 | 人人玩人人添天天爽 | 色综合色狠狠天天久久婷婷基地 | 午夜一级影院 | 久久综合九色综合网站 | 一区二区三区欧美日韩 | 国产精品久久久久久久专区 | 亚洲欧美日韩在线一区 | 国产精品久久久久久亚洲小说 | 精品国产系列 | 成人精品一区久久久久 | 免费视频精品一区二区 | 狠狠综合欧美综合欧美色 | 99综合精品久久 | 四虎影视黄色 | 香港台湾经典三级a视频 | 日韩高清在线日韩大片观看网址 | 色一伦一情一区二区三区 | 国产剧情演绎对白 | 日本视频www色 | 在线观看免费视频网站色 | 色噜噜噜噜噜在线观看网站 | 私人影院aaaaa毛片 | 狠狠色噜噜狠狠狠狠888奇米 | 福利一区三区 | 日韩欧美中文字幕在线播放 | 欧美怡春院一区二区三区 | 亚洲原创区 | 色综合久久五月 | 91九色视频| 韩国免费特一级毛片 |