千家信息网

Linux内核进程管理的基础是怎样的

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内核通过 task_struct 描述进程用命令 pst
千家信息网最后更新 2026年11月03日Linux内核进程管理的基础是怎样的

本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

内核通过 task_struct 描述进程

用命令 pstree 可以让内核以树形的结构把进程之间的关系列出来,如下图:

这是进程在内核中的结构形式,那么内核是如何来以树形结构管理描述这些进程的呢?用来描述进程的数据结构,可以理解为进程的属性。比如进程的状态、进程的标识(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中的 ready 和 running 对应的都是TASK_RUNNING标志位,ready 表示进程正处在队列中,尚未被调度;running 则表示进程正在CPU上运行;

  • void *stack

指向内核栈的指针,内核通过 dup_task_struct 为每个进程都分配内核栈空间,并记录在此。

  • struct mm_struct *mm

与进程地址空间相关的信息。

task_struct 的分配和初始化

图中可知,上层应用通过各种方式创建进程时,最终都会通过 _do_fork 新建一个 task_struct。

上述内容就是Linux内核进程管理的基础是怎样的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

进程 内核 状态 信息 结构 管理 指针 数据 调度 地址 文件 策略 运行 内存 内容 寄存器 标识 树形 程序 分配 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 亿人帮互联网科技有限公司 美国互联网保险保险科技 疫情对互联网科技公司影响 互联网与科技发展 科技服务与互联网 猪兼强互联网科技 科技类的互联网平台 滨湖区互联网智能科技产品供应 恒生科技互联网指数分析 济南和联互联网科技有限公司 江苏南京365互联网科技 昭通云南众福互联网科技有限公司 浙南科技城互联网大厦建设工程 长沙互联网科技 中国互联网有什么科技 互联网金融运营模式中的金融科技 杭州科技互联网公司有哪些 互联网领先科技成果宣传视频 青岛互联网科技园 广东万易互联网科技有限公司惠州分公司 互联网科技公司起名 科技创新与互联网经济 亿人帮互联网科技 和信科技工业互联网 广西互联网科技孵化中心 深圳无忧互联网科技 互联网科技年终奖 江苏互联网智能科技产品出厂价 长沙易易互联网科技有限公司
0