Linux进程是如何创建出来的?

💡 原文中文,约13300字,阅读约需32分钟。
📝

内容提要

本文通过以Nginx创建worker进程为例,深入分析进程的创建过程,介绍了进程的数据结构task_struct和fork过程的执行。学习本文可更深入了解进程的关键要素,如进程地址空间、当前目录、父子进程关系、进程打开的文件fd表、进程命名空间等。同时,还了解了内核在保存已使用的pid号时如何优化内存占用。

🎯

关键要点

  • 本文通过Nginx创建worker进程的例子深入分析进程创建过程。
  • 介绍了进程的数据结构task_struct和fork过程的执行。
  • 学习进程的关键要素,如进程地址空间、当前目录、父子进程关系、进程打开的文件fd表、进程命名空间等。
  • Nginx服务以多进程方式工作,通过fork系统调用创建worker进程。
  • task_struct用于实现Linux进程,包含进程状态、pid、父子进程关系、调度优先级、地址空间、文件系统信息、打开的文件信息和命名空间等。
  • fork系统调用在内核中实现,核心是copy_process函数,负责生成新的task_struct。
  • 创建新进程时,地址空间、文件系统信息和打开文件列表都需要独立拥有。
  • 内核使用bitmap管理已使用的pid号,以节约内存开销。
  • mm_struct是用户进程虚拟地址空间的核心数据结构,内核线程的mm值为null。
  • 未来将继续探讨Nginx主进程的加载执行过程。
➡️

继续阅读