操作系统 - 多线程



什么是线程?

线程是进程代码中的一条执行流,它拥有自己的程序计数器(跟踪接下来要执行的指令)、系统寄存器(保存其当前工作变量)和堆栈(包含执行历史记录)。

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

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

每个线程都属于且只属于一个进程,并且没有任何线程可以存在于进程之外。每个线程都代表一个单独的控制流。线程已成功用于实现网络服务器和Web服务器。它们也为在共享内存多处理器上并行执行应用程序提供了合适的框架。下图显示了单线程和多线程进程的工作方式。

Single vs Multithreaded Process

进程和线程的区别

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

线程的优点

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

线程类型

线程的实现方式如下:

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

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

用户级线程

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

User level thread

优点

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

缺点

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

内核级线程

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

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

优点

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

缺点

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

多线程模型

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

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

多对多模型

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

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

Many to many thread model

多对一模型

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

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

Many to one thread model

一对一模型

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

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

One to one thread model

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

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