用户级线程

由用户应用程序建立、调度和管理的线程称为「用户级线程」(ULT)。

用户级线程不依赖于操作系统内核,应用程序利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

用户级线程的线程调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态核心态切换,所以速度特别快。

系统调用阻塞

当用户级线程发起系统调用时,由于用户空间的线程库管理,操作系统内核对这些线程的存在一无所知。通常情况下,用户级线程库将所有用户级线程映射到单个内核级线程(或者少量内核线程),从内核的角度来看,内核只知道进程的存在,而不知道用户级线程的存在,所有用户级线程在内核看来都是单个进程的一部分。因此,内核只能调度这个进程,而不能调度进程内部的各个用户级线程。因此同一进程中的两个线程不能同时运行于两个处理器上。

当用户级线程发起阻塞系统调用(如 I/O 操作、sleep 等),这个调用会让执行线程进入等待状态,直到系统调用完成。由于用户级线程库无法通知内核哪个具体的用户级线程在执行系统调用,内核将整个进程视为一个执行单元,因此整个进程会进入阻塞状态,直到系统调用完成。

  • 内核不知道线程的活动,但仍然管理线程所属进程的活动
  • 当线程调用系统时,整个进程阻塞
  • 但对数据库来说,进程仍然是运行状态,即进程状态与线程状态是独立的。

特点

优点:

  • 线程切换不调用内核
  • 调度是应用程序特定的,可以选择最好的算法
  • ULT 可运行在任何操作系统上

缺点:

  • 大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程被阻塞。
  • 核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上。