Operating System 简明教程

Operating System - Multi-Threading

What is Thread?

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

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

一个线程也称为 lightweight process 。线程提供了一种通过并行性来提高应用程序性能的方法。线程代表了一种通过降低开销来提高操作系统性能的软件方法,线程相当于一个传统进程。

每一个线程都精确地属于一个进程,且没有一个线程能够存在于进程之外。每一个线程代表一个独立的控制流。线程已经在网络服务器和 Web 服务器的实现中得到了成功的应用。它们还为共享内存多处理机上应用程序的并行执行提供了一个合适的基石。下图显示了单线程和多线程进程的工作方式。

thread processes

Difference between Process and Thread

S.N.

Process

Thread

1

进程是重量级或资源密集型的。

线程是轻量级的,比进程占用更少的资源。

2

进程切换需要与操作系统交互。

线程切换不需要与操作系统交互。

3

在多个处理环境中,每个进程执行相同的代码,但有自己的内存和文件资源。

所有线程都可以共享同一组打开的文件、子进程。

4

如果一个进程被阻塞,那么在第一个进程未被解锁之前,其他进程都不能执行。

当一个线程被阻塞并等待时,同一个任务中的另一个线程可以运行。

5

不使用线程的多个进程使用更多的资源。

多线程进程使用更少的资源。

6

在多进程中,每个进程独立地运行于其他进程。

一个线程可以读取、写入或更改另一个线程的数据。

Advantages of Thread

  1. 线程最大程度地减少了上下文切换时间。

  2. 使用线程在进程内提供了并发性。

  3. Efficient communication.

  4. 创建和上下文切换线程更加经济。

  5. 线程允许更大规模、更高效地利用多处理器架构。

Types of Thread

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

  1. User Level Threads - 用户管理的线程。

  2. Kernel Level Threads - 在内核(操作系统核心)上工作的操作系统管理的线程。

User Level Threads

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

user threads

Advantages

  1. 线程切换不需要内核模式权限。

  2. 用户级线程可以在任何操作系统上运行。

  3. 调度可以在用户级线程中特定于应用程序。

  4. 用户级线程创建和管理起来很快。

Disadvantages

  1. 在典型的操作系统中,大多数系统调用都是阻塞的。

  2. 多线程应用程序无法利用多进程。

Kernel Level Threads

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

内核对进程整体和进程中的各个线程维护上下文信息。内核根据线程进行调度。内核在内核空间中执行线程创建、调度和管理。与用户线程相比,内核线程通常创建和管理的速度较慢。

Advantages

  1. 内核可以在多个进程上同时调度从同一进程中的多个线程。

  2. 如果进程中的一个线程被阻塞,则内核可以调度同一进程的另一个线程。

  3. 内核例程本身可以是多线程的。

Disadvantages

  1. 内核线程的创建和管理通常比用户线程的创建和管理更慢。

  2. 在同一进程中从一个线程将控制权转移到另一个线程需要切换到内核模式。

Multithreading Models

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

  1. Many to many relationship.

  2. Many to one relationship.

  3. One to one relationship.

Many to Many Model

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

下图显示了多对多线程模型,其中 6 个用户级线程与 6 个内核级线程进行复用。在这个模型中,开发者可以创建任意数量必要的用户线程,而对应的内核线程可以在多处理器机器上并行运行。此模型可以最准确地反映并发性,当一个线程执行阻塞系统调用时,内核可以调度另一个线程执行。

many to many

Many to One Model

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

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

many to one

One to One Model

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

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

one to one

Difference between User-Level & Kernel-Level Thread

S.N.

User-Level Threads

Kernel-Level Thread

1

用户级线程创建和管理的速度更快。

内核级线程创建和管理的速度较慢。

2

实现在用户级由线程库完成。

操作系统支持创建内核线程。

3

用户级线程是通用的,可以在任何操作系统上运行。

内核级线程特定于操作系统。

4

多线程应用程序无法利用多处理。

内核例程本身可以是多线程的。