文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux 内核进程管理之基础

2024-12-03 06:36

关注

本文转载自微信公众号「人人都是极客」,作者布道师Peter。转载本文请联系人人都是极客公众号。

没有废话,内存管理暂时告一段落,正式进入进程管理的内容。

内核通过 task_struct 描述进程

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

这是进程在内核中的结构形式,那么内核是如何来以树形结构管理描述这些进程的呢?用来描述进程的数据结构,可以理解为进程的属性。比如进程的状态、进程的标识(PID)等,都被封装在了进程描述符 task_struct 这个数据结构中。

  1. struct task_struct { 
  2.   ...... 
  3.   
  4.  //任务状态。<0是不运行状态,=0是运行状态,>0是停止状态。 
  5.  volatile long   state; 
  6.  ...... 
  7.  //指向内核栈的指针 
  8.  void    *stack; 
  9.  ...... 
  10.   
  11.  unsigned int   policy; 
  12.  ...... 
  13.  //进程内存管理信息 
  14.  struct mm_struct  *mm; 
  15.  struct mm_struct  *active_mm; 
  16.  ...... 
  17.  //进程标识符,用来代表一个进程 
  18.  pid_t pid;     
  19.  ...... 
  20.  //线程链表 
  21.  struct list_head  thread_group; 
  22.  struct list_head  thread_node; 
  23.  
  24.  struct completion  *vfork_done; 
  25.  ...... 
  26.   
  27.  //文件系统信息 
  28.  struct fs_struct  *fs; 
  29.  
  30.   
  31.  //打开文件信息 
  32.  struct files_struct  *files; 
  33.  ...... 
  34.   
  35.  //进程的CPU状态,切换时,要保存到停止进程的task_struct中 
  36.  struct thread_struct  thread; 
  37.  ...... 
  38. }; 

内核就是通过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. 记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记帐号等
  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去定位了。

-1是不运行的,=0是运行状态,>0是停止状态

Linux中的 ready 和 running 对应的都是TASK_RUNNING标志位,ready 表示进程正处在队列中,尚未被调度;running 则表示进程正在CPU上运行;

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

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

task_struct 的分配和初始化

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

 

来源:人人都是极客内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯