线程

线程引入以及线程相关实现

Posted by 邹盛富 on June 11, 2018

线程的引入

应用的需要

一个软件中同时工作多个任务,例如一个字处理软件需要同时需要编辑、排版、保存等线程同时工作

开销的考虑

  • 创建和撤销线程时间开销比较小
  • 两个线程切换花费的时间比较少
  • 线程之间的通信不需要内核介入

性能考虑

多处理器可以提高性能

线程

线程是进程的一个运行实体,是CPU的调度单位,称为轻量级进程

属性

  • 有唯一标识符
  • 有状态和状态转换
  • 不运行时需要保存上下文(程序计数器等寄存器)
  • 有自己的栈指针和栈
  • 共享所在进程地址空间中和其他资源
  • 创建或者撤销其他线程(进程刚创建的时候只有一个主线程,即单线程)

用户级线程

在用户空间建立线程库(例如:pthread库),提供一组管理线程的进程,线程的管理是通过运行时系统进行管理的,任何程序可以通过使用线程库被设计成多线程的程序。

优点

  • 线程切换比较快,不需要内核的支持,节省了两次状态转换(从用户态到内核态,再从内核态回到用户态)
  • 调度算法是应用程序特定的,可以定制的,不扰乱底层的操作系统调度
  • 用户线程可运行在任何操作系统上(只需要实现线程库)

缺点

  • 内核只将处理器分配给进程,同一个进程上的两个线程不能同时运行在两个处理器上,没有真正使用多处理技术
  • 大多数系统调用是阻塞的,因此,由于内核阻塞进程,所以内核中的所有线程都会被阻塞

针对上述的问题可以使用jacketing技术来解决

内核级线程

内核对所有线程进行管理,并向程序提供API接口,内核要维护线程和进程的上下文信息,线程的切换需要内核的支持,同时调度也是以线程为单位进行的。

优点

  • 可以同时把一个进程内的多个线程调度到多个处理器中,如果其中的一个线程被阻塞,内核可以调度同一个进程内的另一个线程
  • 内核例程自身可以使用多线程技术

缺点

  • 控制权从一个线程转换到另一个线程时需要通过内核转换

混合模型

  • 线程的创建在用户空间完成
  • 线程的调度在核心态完成
  • 一个应用程序的多个用户级线程被映射到一些内核级线程上

Solaris就是采用这种模型,用户级线程和内核线程的比例为1:1