聊聊Linux中线程和进程的联系与区别!

💡 原文中文,约9000字,阅读约需22分钟。
📝

内容提要

进程和线程是Linux中的核心概念,线程被称为轻量级进程,通过调用pthread_create函数在glibc库中创建。进程和线程都用task_struct结构表示,共享很多相同的字段。创建线程时,共享父进程的打开文件列表、目录信息和地址空间,而创建进程时这些是独立的。在Linux内核中,线程和进程都由task_struct管理,用户态的线程本质上是一个稍微轻量的进程。

🎯

关键要点

  • 进程和线程是Linux中的核心概念,线程被称为轻量级进程。
  • 在Linux中,进程和线程都用task_struct结构表示,共享很多相同的字段。
  • 创建线程时,共享父进程的打开文件列表、目录信息和地址空间,而创建进程时这些是独立的。
  • 线程的创建通过调用pthread_create函数实现,具体在glibc库中。
  • 在内核中,进程和线程的相似之处远大于不同之处,都是抽象成task任务。
  • 每个task_struct都有唯一的pid和tgid,tgid用于标识线程所属的进程。
  • 创建进程和线程的底层实现都使用do_fork函数,但传入的标记不同。
  • 创建线程时使用的clone_flags包括CLONE_VM、CLONE_FS、CLONE_FILES等。
  • 在创建线程时,内存地址空间、文件系统信息和打开文件列表都是共享的。
  • Linux内核中没有对线程做特殊处理,用户态的线程本质上还是一个进程。

延伸问答

Linux中进程和线程的主要区别是什么?

进程是独立的执行单位,而线程是轻量级进程,多个线程共享同一进程的地址空间和资源。

如何在Linux中创建线程?

在Linux中,可以通过调用pthread_create函数来创建线程,该函数在glibc库中实现。

在Linux内核中,进程和线程是如何表示的?

在Linux内核中,进程和线程都用task_struct结构表示,包含相同的字段。

创建线程时与创建进程时的底层实现有什么不同?

创建线程时使用clone系统调用,传入的标记包括CLONE_VM等,而创建进程时使用fork系统调用,标记为SIGCHLD。

为什么线程被称为轻量级进程?

因为线程共享父进程的地址空间、文件系统信息和打开文件列表,资源开销较小。

在Linux中,如何区分进程和线程?

通常通过是否有独立的地址空间来区分,拥有独立地址空间的是进程,没有的是线程。

➡️

继续阅读