操作系统 - 多线程


什么是线程?

线程是通过进程代码的执行流,具有自己的程序计数器(用于跟踪下一条要执行的指令)、系统寄存器(用于保存其当前工作变量)以及堆栈(用于包含执行历史记录)。

线程与其对等线程共享很少的信息,例如代码段、数据段和打开的文件。当一个线程更改代码段内存项时,所有其他线程都会看到这一点。

线程也称为轻量级进程。线程提供了一种通过并行性提高应用程序性能的方法。线程代表一种通过减少开销来提高操作系统性能的软件方法,线程相当于经典进程。

每个线程都属于一个进程,任何线程都不能存在于进程之外。每个线程代表一个单独的控制流。线程已成功用于实现网络服务器和Web服务器。它们还为共享内存多处理器上的应用程序并行执行提供了合适的基础。下图展示了单线程和多线程进程的工作情况。

单线程与多线程进程

进程和线程的区别

序列号 过程 线
1 进程是重量级的或资源密集型的。 线程是轻量级的,比进程占用更少的资源。
2 进程切换需要与操作系统交互。 线程切换不需要与操作系统交互。
3 在多个处理环境中,每个进程执行相同的代码,但拥有自己的内存和文件资源。 所有线程可以共享同一组打开的文件、子进程。
4 如果一个进程被阻塞,那么在第一个进程被解除阻塞之前,其他进程都不能执行。 当一个线程被阻塞并等待时,同一任务中的第二个线程可以运行。
5 不使用线程的多个进程会使用更多资源。 多线程进程使用更少的资源。
6 在多个进程中,每个进程独立于其他进程运行。 一个线程可以读取、写入或更改另一线程的数据。

线程的优点

  • 线程最大限度地减少了上下文切换时间。
  • 线程的使用提供了进程内的并发性。
  • 高效沟通。
  • 创建和上下文切换线程更加经济。
  • 线程允许更大规模和更高效地利用多处理器架构。

螺纹类型

线程通过以下两种方式实现 -

  • 用户级线程- 用户管理的线程。

  • 内核级线程- 作用于内核(操作系统核心)的操作系统管理线程。

用户级线程

在这种情况下,线程管理内核并不知道线程的存在。线程库包含用于创建和销毁线程、在线程之间传递消息和数据、调度线程执行以及保存和恢复线程上下文的代码。应用程序以单线程启动。

用户级线程

优点

  • 线程切换不需要内核模式权限。
  • 用户级线程可以在任何操作系统上运行。
  • 调度可以是用户级线程中特定于应用程序的。
  • 用户级线程的创建和管理速度很快。

缺点

  • 在典型的操作系统中,大多数系统调用都是阻塞的。
  • 多线程应用程序无法利用多处理。

内核级线程

在这种情况下,线程管理由内核完成。应用程序区域没有线程管理代码。内核线程由操作系统直接支持。任何应用程序都可以编程为多线程。单个进程支持应用程序中的所有线程。

内核维护整个进程以及进程内各个线程的上下文信息。内核的调度是在线程的基础上完成的。内核在内核空间中执行线程的创建、调度和管理。内核线程的创建和管理速度通常比用户线程慢。

优点

  • 内核可以在多个进程上同时调度来自同一进程的多个线程。
  • 如果进程中的一个线程被阻塞,内核可以调度同一进程的另一个线程。
  • 内核例程本身可以是多线程的。

缺点

  • 内核线程的创建和管理速度通常比用户线程慢。
  • 将控制从同一进程中的一个线程转移到另一个线程需要切换到内核的模式。

多线程模型

某些操作系统提供组合的用户级线程和内核级线程设施。Solaris 是这种组合方法的一个很好的例子。在组合系统中,同一应用程序中的多个线程可以在多个处理器上并行运行,并且阻塞系统调用不需要阻塞整个进程。多线程模型分为三种

  • 多对多关系。
  • 多对一的关系。
  • 一对一的关系。

多对多模型

多对多模型将任意数量的用户线程复用到相同或更少数量的内核线程上。

下图显示了多对多线程模型,其中 6 个用户级线程与 6 个内核级线程复用。在此模型中,开发人员可以根据需要创建任意数量的用户线程,并且相应的内核线程可以在多处理器计算机上并行运行。该模型提供了最佳的并发准确性,并且当线程执行阻塞系统调用时,内核可以调度另一个线程执行。

多对多线程模型

多对一模型

多对一模型将许多用户级线程映射到一个内核级线程。线程管理是由线程库在用户空间完成的。当线程进行阻塞系统调用时,整个进程将被阻塞。一次只有一个线程可以访问内核,因此多个线程无法在多处理器上并行运行。

如果用户级线程库在操作系统中以系统不支持的方式实现,则内核线程使用多对一关系模式。

多对一线程模型

一对一模型

用户级线程与内核级线程是一对一的关系。该模型比多对一模型提供更多的并发性。当一个线程进行阻塞系统调用时,它还允许另一个线程运行。它支持多个线程在微处理器上并行执行。

这种模型的缺点是创建用户线程需要相应的内核线程。OS/2、Windows NT 和 Windows 2000 使用一对一的关系模型。

一对一线程模型

用户级线程和内核级线程之间的区别

序列号 用户级线程 内核级线程
1 用户级线程的创建和管理速度更快。 内核级线程的创建和管理速度较慢。
2 由用户级的线程库实现。 操作系统支持创建内核线程。
3 用户级线程是通用的,可以在任何操作系统上运行。 内核级线程是特定于操作系统的。
4 多线程应用程序无法利用多处理。 内核例程本身可以是多线程的。