聊聊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中,如何区分进程和线程?
通常通过是否有独立的地址空间来区分,拥有独立地址空间的是进程,没有的是线程。
🏷️
标签
➡️