本文从linux中的进程、线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本。
linux中的进程与线程
首先明确进程与进程的基本概念:
- 进程是资源分配的基本单位
- 线程是CPU调度的基本单位
- 一个进程下可能有多个线程
- 线程共享进程的资源
基本原理
linux用户态的进程、线程基本满足上述概念,但内核态不区分进程和线程。可以认为,内核中统一执行的是进程,但有些是“普通进程”(对应进程process),有些是“轻量级进程”(对应线程pthread或npthread),都使用task_struct结构体保存保存。
使用fork创建进程,使用pthread_create创建线程。两个系统调用最终都都调用了do_dork,而do_dork完成了task_struct结构体的复制,并将新的进程加入内核调度。
进程是资源分配的基本单位、线程共享进程的资源
普通进程需要深拷贝虚拟内存、文件描述符、信号处理等;而轻量级进程之所以“轻量”,是因为其只需要浅拷贝虚拟内存等大部分信息,多个轻量级进程共享一个进程的资源。
线程是CPU调度的基本单位、一个进程下可能有多个线程
linux加入了线程组的概念,让原有“进程”对应线程,“线程组”对应进程,实现“一个进程下可能有多个线程”:
- 操作系统中存在多个进程组
- 一个进程组下有多个进程(1:n)
- 一个进程对应一个线程组(1:1)
- 一个线程组下有多个线程(1:n)