亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux內核進程管理的基礎是怎樣的

發布時間:2021-09-27 17:01:10 來源:億速云 閱讀:160 作者:柒染 欄目:系統運維

本篇文章為大家展示了Linux內核進程管理的基礎是怎樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

內核通過 task_struct 描述進程

用命令 pstree 可以讓內核以樹形的結構把進程之間的關系列出來,如下圖:

Linux內核進程管理的基礎是怎樣的

這是進程在內核中的結構形式,那么內核是如何來以樹形結構管理描述這些進程的呢?用來描述進程的數據結構,可以理解為進程的屬性。比如進程的狀態、進程的標識(PID)等,都被封裝在了進程描述符  task_struct 這個數據結構中。

struct task_struct {   ......  /* -1 unrunnable, 0 runnable, >0 stopped: */  //任務狀態。<0是不運行狀態,=0是運行狀態,>0是停止狀態。  volatile long   state;  ......  //指向內核棧的指針  void    *stack;  ......  /*進程的調度策略,有6種。  *限期進程調度策略:SCHED_DEADLINE。  *實時進程調度策略:SCHED_FIFO,SCHED_RR。  *普通進程調度策略:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE。  */  unsigned int   policy;  ......  //進程內存管理信息  struct mm_struct  *mm;  struct mm_struct  *active_mm;  ......  //進程標識符,用來代表一個進程  pid_t pid;      ......  //線程鏈表  struct list_head  thread_group;  struct list_head  thread_node;   struct completion  *vfork_done;  ......  /* Filesystem information: */  //文件系統信息  struct fs_struct  *fs;   /* Open file information: */  //打開文件信息  struct files_struct  *files;  ......  /* CPU-specific state of this task: */  //進程的CPU狀態,切換時,要保存到停止進程的task_struct中  struct thread_struct  thread;  ...... };

內核就是通過list_head鏈表把各個進程關系以樹形結構管理起來的。

task_struct 結構體內容太多,這里只列出部分成員變量,感興趣的讀者可以去源碼 include/linux/sched.h頭文件查看。

task_struct 中的主要信息分類:

  1. 標示符:描述本進程的唯一標識符 pid,用來區別其他進程。

  2. 狀態:任務狀態,退出代碼,退出信號等

  3. 優先級:相對于其他進程的優先級

  4. 程序計數器:程序中即將被執行的下一條指令的地址

  5. 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針

  6. 上下文數據:進程執行時處理器的寄存器中的數據

  7. I/O狀態信息:包括顯示的I/O請求,分配的進程I/O設備和進程使用的文件列表

  8. 記賬信息:可能包括處理器時間總和,使用的時鐘總和,時間限制,記帳號等

  • ARM64不用通過struct thread_info thread_info獲取當前task_struct

static __always_inline struct task_struct *get_current(void) {         unsigned long sp_el0;          asm ("mrs %0, sp_el0" : "=r" (sp_el0));          return (struct task_struct *)sp_el0; }  #define current get_current()

可以看出 sp_el0 直接作為 task_struct  返回了。對于ARM64平臺,記錄當前進程的task_struct地址是利用sp0_el1寄存器,當內核執行進程切換時會把當前要運行的進程task_struct地址記錄到該寄存器中。因此我們current查找task_struct時也是很簡單了,不再用通過sp和thread_info去定位了。

  • volatile long state

-1是不運行的,=0是運行狀態,>0是停止狀態

Linux內核進程管理的基礎是怎樣的

Linux中的 ready 和 running 對應的都是TASK_RUNNING標志位,ready 表示進程正處在隊列中,尚未被調度;running  則表示進程正在CPU上運行;

Linux內核進程管理的基礎是怎樣的

  • void *stack

指向內核棧的指針,內核通過 dup_task_struct 為每個進程都分配內核棧空間,并記錄在此。

  • struct mm_struct *mm

與進程地址空間相關的信息。

Linux內核進程管理的基礎是怎樣的

task_struct 的分配和初始化

Linux內核進程管理的基礎是怎樣的

圖中可知,上層應用通過各種方式創建進程時,最終都會通過 _do_fork 新建一個 task_struct。

Linux內核進程管理的基礎是怎樣的

上述內容就是Linux內核進程管理的基礎是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

钟山县| 崇州市| 茌平县| 宜宾市| 尼勒克县| 常熟市| 胶州市| 株洲县| 桐柏县| 汝南县| 翼城县| 铜梁县| 商都县| 临沧市| 额济纳旗| 古浪县| 滨海县| 论坛| 双辽市| 理塘县| 建始县| 黄平县| 台山市| 黑水县| 大姚县| 渝中区| 达拉特旗| 枞阳县| 长沙县| 金门县| 康乐县| 拉孜县| 上林县| 淮阳县| 龙口市| 乌鲁木齐县| 武隆县| 敦化市| 呼图壁县| 靖西县| 鄂伦春自治旗|