成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 內核進程管理之基礎

系統 Linux
沒有廢話,內存管理暫時告一段落,正式進入進程管理的內容。task_struct 結構體內容太多,這里只列出部分成員變量,感興趣的讀者可以去源碼 include/linux/sched.h頭文件查看。

[[393208]]

本文轉載自微信公眾號「人人都是極客」,作者布道師Peter。轉載本文請聯系人人都是極客公眾號。

沒有廢話,內存管理暫時告一段落,正式進入進程管理的內容。

內核通過 task_struct 描述進程

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

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

  1. struct task_struct { 
  2.   ...... 
  3.  /* -1 unrunnable, 0 runnable, >0 stopped: */ 
  4.  //任務狀態。<0是不運行狀態,=0是運行狀態,>0是停止狀態。 
  5.  volatile long   state; 
  6.  ...... 
  7.  //指向內核棧的指針 
  8.  void    *stack; 
  9.  ...... 
  10.  /*進程的調度策略,有6種。 
  11.  *限期進程調度策略:SCHED_DEADLINE。 
  12.  *實時進程調度策略:SCHED_FIFO,SCHED_RR。 
  13.  *普通進程調度策略:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE。 
  14.  */ 
  15.  unsigned int   policy; 
  16.  ...... 
  17.  //進程內存管理信息 
  18.  struct mm_struct  *mm; 
  19.  struct mm_struct  *active_mm; 
  20.  ...... 
  21.  //進程標識符,用來代表一個進程 
  22.  pid_t pid;     
  23.  ...... 
  24.  //線程鏈表 
  25.  struct list_head  thread_group; 
  26.  struct list_head  thread_node; 
  27.  
  28.  struct completion  *vfork_done; 
  29.  ...... 
  30.  /* Filesystem information: */ 
  31.  //文件系統信息 
  32.  struct fs_struct  *fs; 
  33.  
  34.  /* Open file information: */ 
  35.  //打開文件信息 
  36.  struct files_struct  *files; 
  37.  ...... 
  38.  /* CPU-specific state of this task: */ 
  39.  //進程的CPU狀態,切換時,要保存到停止進程的task_struct中 
  40.  struct thread_struct  thread; 
  41.  ...... 
  42. }; 

內核就是通過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
  1. static __always_inline struct task_struct *get_current(void) 
  2.         unsigned long sp_el0; 
  3.  
  4.         asm ("mrs %0, sp_el0" : "=r" (sp_el0)); 
  5.  
  6.         return (struct task_struct *)sp_el0; 
  7.  
  8. #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中的 ready 和 running 對應的都是TASK_RUNNING標志位,ready 表示進程正處在隊列中,尚未被調度;running 則表示進程正在CPU上運行;

  • void *stack

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

  • struct mm_struct *mm

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

task_struct 的分配和初始化

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

 

責任編輯:武曉燕 來源: 人人都是極客
相關推薦

2011-01-11 13:47:27

Linux管理進程

2023-03-05 16:12:41

Linux進程線程

2023-03-02 23:50:36

Linux進程管理

2023-03-03 00:03:07

Linux進程管理

2021-04-22 07:47:46

Linux進程管理

2021-06-15 08:02:55

Linux 進程管理

2021-07-26 07:47:36

數據庫

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2023-03-05 15:28:39

CFSLinux進程

2021-07-20 08:02:41

Linux進程睡眠

2021-12-15 15:03:51

Linux內核調度

2021-05-12 07:50:02

CFS調度器Linux

2021-05-17 18:28:36

Linux CFS負載均衡

2023-05-08 12:03:14

Linux內核進程

2011-01-14 14:49:05

2019-04-10 13:43:19

Linux內核進程負載

2017-01-13 15:39:29

Linux進程基礎介紹

2010-02-25 10:28:43

Linux進程管理

2012-05-14 14:09:53

Linux內核調度系統

2009-10-23 17:35:16

linux進程管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频中文字幕 | 国产精品美女久久久久久久网站 | 国产精品国产三级国产aⅴ浪潮 | 欧美日韩一区二区在线观看 | 日本粉嫩一区二区三区视频 | 亚洲视频免费在线看 | 国产精品久久视频 | 91精品国产综合久久久动漫日韩 | 美女黄网站 | 国产电影一区二区三区爱妃记 | 国产不卡一 | 欧美国产精品一区二区 | 伊人狠狠干 | 天天舔天天 | 久久亚洲国产 | 亚洲欧美一区二区三区1000 | 999精品在线 | 国产一区欧美 | 日韩a在线 | 欧美日韩精品免费观看 | 欧美一区二区三区视频 | 一区视频在线 | 欧美亚洲一区二区三区 | 成人免费观看男女羞羞视频 | 国产精品99久 | 免费一级欧美在线观看视频 | av高清 | 日韩欧美国产精品 | 亚洲精品一区久久久久久 | 中文字幕精品视频 | 精品国产一区二区国模嫣然 | a级片在线观看 | 欧美日韩视频在线 | 亚洲国产一区二区三区, | 女同久久另类99精品国产 | 久久精品国产免费看久久精品 | 精品久久国产 | 久久国产精品视频 | 最新黄色毛片 | 国产视频h | 久久国产精品一区二区三区 |