Linux进程管理之如何创建和销毁进程

💡 原文中文,约2500字,阅读约需6分钟。
📝

内容提要

本文介绍了Linux操作系统中进程和线程的概念,以及它们的创建和销毁过程。进程和线程在Linux中有时会互相称呼。文章还讲解了进程的入口函数和用户进程的创建方法,以及进程描述符的结构和销毁过程。下一篇将重点介绍系统调用的过程。

🔎

延伸解读

内核进程创建接口的层次与选用

文章对比了kernel_thread、kthread_create和kthread_run三个内核进程创建接口。kernel_thread直接调用_do_fork,但不对外开放;kthread_create通过kthreadd间接调用_do_fork,且对所有内核代码开放;kthread_run则进一步封装,创建后立即唤醒进程。因此,内核开发者应根据是否需要立即执行以及调用环境来选择合适接口,通常优先使用kthread_create或kthread_run。

用户态进程创建的系统调用桥梁

用户态不能直接调用内核态的进程创建函数,必须通过系统调用机制。fork、vfork和pthread_create最终都调用_do_fork,但vfork和clone在参数中设置了不同的flags,这影响了资源复制和父子进程的执行顺序。理解这些差异有助于在应用编程中选择合适的创建方式,例如vfork适用于子进程立即执行exec的场景。

进程描述符与销毁的逆向关系

所有进程创建最终都通过_do_fork调用copy_process来创建进程描述符struct task_struct,该结构体包含大量成员变量,是进程存在的核心数据结构。而进程销毁时,用户态调用exit,内核态调用do_exit,最终都执行do_exit函数。文章指出do_exit可视为进程创建的逆过程,负责释放资源并调整父子进程关系,这体现了创建与销毁在资源管理上的对称性。

❓

Q&A

Linux中进程和线程有什么区别?

在Linux中,进程是描述程序执行的实体,有时也被称为线程或任务。它们的主要区别在于进程是资源分配的基本单位,而线程是进程内的执行单元。

如何在Linux中创建用户进程?

在Linux中,用户进程可以通过fork、vfork和pthread_create函数创建,这些函数需要通过系统调用机制来实现。

进程的创建入口函数是什么?

进程的创建入口函数是rest_init,它调用kernel_thread函数来创建内核进程。

进程描述符的结构是什么?

进程描述符的结构体为struct task_struct,包含多个成员变量,用于描述进程的状态和资源。

如何销毁一个进程?

进程的销毁可以通过用户态的exit函数或内核态的do_exit函数来实现,这些函数会释放资源并调整进程关系。

Linux中创建内核进程的主要接口有哪些?

创建内核进程的主要接口有kernel_thread、kthread_create和kthread_run,这些接口最终都会调用_do_fork函数。

🏷️

标签

➡️

继续阅读