线程是进程内的单个序列流。线程具有与进程相同的属性,因此它们被称为轻量级进程。线程一个接一个地执行,但给人一种好像它们是并行执行的错觉。每个线程都有不同的状态。每个线程都有
- 程序计数器
- 寄存器组
- 一个堆栈空间
线程不是相互独立的,因为它们共享代码、数据、操作系统资源等。
线程和进程之间的相似性——
- 一次只有一个线程或进程处于活动状态
- 在进程内都执行顺序
- 两者都可以创造孩子
线程和进程之间的差异 –
- 线程不是独立的,进程是。
- 线程旨在互相帮助,进程可能会也可能不会这样做
线程类型:
- 用户级线程 (ULT) –
在用户级库中实现,它们不是使用系统调用创建的。线程切换不需要调用操作系统,也不需要对内核造成中断。内核不知道用户级线程并将它们作为单线程进程进行管理。ULT的优势——
- 可以在不支持多线程的操作系统上实现。
- 简单表示,因为线程只有程序计数器、寄存器集、堆栈空间。
- 由于无需内核干预,因此易于创建。
- 线程切换很快,因为不需要进行操作系统调用。
ULT 的缺点 –
- 线程和内核之间没有或很少协调。
- 如果一个线程导致页面错误,整个进程就会阻塞。
- 内核级线程 (KLT) –
内核知道并管理线程。内核本身具有线程表(主控表),而不是每个进程中的线程表,用于跟踪系统中的所有线程。此外内核还维护了传统的进程表来跟踪进程。操作系统内核提供系统调用来创建和管理线程。KLT的优势——
- 由于内核完全了解系统中的线程,调度程序可能会决定为具有大量线程的进程提供更多时间。
- 适用于经常阻塞的应用程序。
KLT的缺点——
- 缓慢而低效。
- 它需要线程控制块,所以它是一个开销。
概括:
- 每个 ULT 都有一个进程,该进程使用 Thread 表跟踪线程。
- 每个 KLT 都有线程表 (TCB) 以及进程表 (PCB)。