文章目录
  1. 线程模型
  2. Linux线程库

线程模型

说到线程,又会提下老生常谈的一段话:线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境与调度者的身份,线程可分为内核线程(运行在内核空间,由内核调度)与用户线程(运行在用户空间,由线程库调度);

当进程的一个内核线程获得CPU的使用权后,它会加载并运行一个用户线程。可见,内核线程相当于用户线程运行的”容器”。一个进程可以拥有M个内核线程与N个用户线程(M<=N)。在一个系统的所有进程中,M与N的比值都是固定的,按照M与N的比值,线程的实现分为3种模式:(1)完全在用户空间实现(N=1);(2)完全由内核调度(M=N);(3)双层调度(1<N<M)。

Linux线程库

Liunx上有名的线程库NPTL采取完全由内核调度的模式。

从Linux内核版本2.6开始,提供真正的内核线程。新的线程库NPTL也应运而生。NPTL的优势如下。

  • 内核线程不再是一个进程(避免了很多用进程模拟内核线程导致的语义问题);
  • 不再使用管理线程;终止线程、回收线程堆栈等工作均由内核完成;同时,由于不再使用管理线程。因此一个进程的线程可以运行在不同的CPU上。从而充分利用了多处理器系统的优势;
  • 线程的同步由内核完成,隶属于不同进程的线程之间也能共享互斥锁,从而实现跨进程的线程同步;

注:内核线程独立运行在内核空间,相比于普通进程,内核线程没有独立的地址空间(mm指针为NULL);内核线程只在内核空间运行,从来不会切换到用户空间中去;内核线程也能被调用、抢占。