Python线程


一般来说,正如我们所知,线是一种非常薄的扭曲线,通常是棉或丝织物,用于缝制衣服等。同一术语线程也用于计算机编程领域。现在,我们如何将用于缝制衣服的线程与用于计算机编程的线程联系起来?这两个线程执行的角色类似。在衣服中,线将布料保持在一起,在另一侧,在计算机编程中,线程保持计算机程序并允许程序一次执行顺序动作或许多动作。

线程 是操作系统中最小的执行单元。它本身不是一个程序,而是在一个程序中运行。换句话说,线程不是彼此独立的,而是与其他线程共享代码段,数据段等。这些线程也称为轻量级进程。

线程状态

为了深入理解线程的功能,我们需要了解线程的生命周期或不同的线程状态。通常,线程可以以五种不同的状态存在。不同的州显示如下 -

新线程

新线程在新状态下开始其生命周期。但是,在这个阶段,它还没有开始,也没有分配任何资源。我们可以说它只是一个对象的实例。

可运行

当新生的线程启动时,线程变为可运行,即等待运行。在此状态下,它具有所有资源但仍未安排任务计划程序运行。

运行

在此状态下,线程进行并执行任务,任务调度程序选择该任务来运行。现在,线程可以进入死状态或非可运行/等待状态。

非运行/待机

在此状态下,线程暂停,因为它正在等待某些I / O请求的响应或等待其他线程的执行完成。

死锁

可运行线程在完成任务或以其他方式终止时进入终止状态。

下图显示了线程的完整生命周期 -

死锁

线程类型

在本节中,我们将看到不同类型的线程。类型如下所述 -

用户级线程

这些是用户管理的线程。

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

用户级线程的示例是 -

  • Java线程
  • POSIX线程

死锁

用户级线程的优点

以下是用户级线程的不同优点 -

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

用户级线程的缺点

以下是用户级线程的不同缺点 -

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

内核级线程

操作系统托管线程作用于内核,内核是操作系统核心。

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

内核维护整个流程和流程中各个线程的上下文信息。内核调度是基于线程完成的。内核在内核空间中执行线程创建,调度和管理。内核线程的创建和管理速度通常比用户线程慢。内核级线程的示例是Windows,Solaris。

死锁

内核级线程的优点

以下是内核级线程的不同优点 -

  • 内核可以在多个进程上同时调度来自同一进程的多个线程。

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

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

内核级线程的缺点

  • 内核线程的创建和管理速度通常比用户线程慢。

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

线程控制块 - TCB

线程控制块(TCB)可以定义为操作系统内核中主要包含线程信息的数据结构。存储在TCB中的特定于线程的信息将突出显示有关每个进程的一些重要信息。

考虑以下与TCB中包含的线程相关的要点 -

  • 线程标识 - 它是分配给每个新线程的唯一线程标识(tid)。

  • 线程状态 - 它包含与 线程 的状态(Running,Runnable,Non-Running,Dead)相关的信息。

  • 程序计数器(PC) - 它指向线程的当前程序指令。

  • 寄存器组 - 它包含分配给它们的线程寄存器值以进行计算。

  • 堆栈指针 - 它指向进程中线程的堆栈。 它包含线程范围内的局部变量。

  • 指向PCB 的指针 - 它包含指向创建该线程的进程的指针。

PCB

进程和线程之间的关系

在多线程中,进程和线程是两个非常密切相关的术语,它们具有相同的目标,使计算机能够一次完成多个任务。进程可以包含一个或多个线程,但相反,线程不能包含进程。但是,它们仍然是两个基本的执行单位。一个程序,执行一系列指令,启动进程和线程。

下表显示了进程和线程之间的比较 -

Sr.No. Process Thread
1 流程重量大或资源密集。 线程是轻量级的,比进程占用更少的资源。
2 进程切换需要与操作系统交互。 线程切换不需要与操作系统交互。
3 在多个处理环境中,每个进程执行相同的代码,但具有自己的内存和文件资源。 所有线程都可以共享同一组打开的文件,子进程。
4 如果一个进程被阻止,则在第一个进程被解除阻塞之前不能执行任何其他进程。 当一个线程被阻塞并等待时,同一任务中的第二个线程可以运行。
5 不使用线程的多个进程使用更多资源。 多线程进程使用较少的资源。
6 在多个流程中,每个流程独立于其他流程运行。 一个线程可以读取,写入或更改另一个线程的数据。
7 如果父进程有任何更改,则它不会影响子进程。 如果主线程中有任何更改,那么它可能会影响该进程的其他线程的行为。
8 要与兄弟进程通信,进程必须使用进程间通信。 线程可以直接与该进程的其他线程通信。

多线程的概念

正如我们之前所讨论的那样,多线程是CPU通过并发执行多个线程来管理操作系统使用的能力。多线程的主要思想是通过将进程划分为多个线程来实现并行性。以更简单的方式,我们可以说多线程是通过使用线程概念实现多任务处理的方式。

在以下示例的帮助下,可以理解多线程的概念。

假设我们正在运行一个进程。这个过程可能是为了写一些东西而打开MS字。在这样的过程中,将分配一个线程来打开MS字,并且需要另一个线程来写。现在,假设我们想要编辑某些内容,则需要另一个线程来执行编辑任务,依此类推。

下图帮助我们了解内存中存在多个线程 -

多线程

我们可以在上面的图中看到,在一个进程中可以存在多个线程,其中每个线程都包含自己的寄存器集和局部变量。除此之外,进程中的所有线程共享全局变量。

多线程的优点

现在让我们看一下多线程的一些优点。优点如下

  • 通信速度 - 多线程提高了计算速度,因为每个核心或处理器同时处理单独的线程。

  • 程序保持响应 - 它允许程序保持响应,因为一个线程等待输入而另一个线程同时运行GUI。

  • 访问全局变量 - 在多线程中,特定进程的所有线程都可以访问全局变量,如果全局变量有任何变化,那么其他线程也可以看到它。

  • 资源利用 - 在每个程序中运行多个线程可以更好地利用CPU,并且CPU的空闲时间变得更少。

  • 共享数据 - 每个线程不需要额外的空间,因为程序中的线程可以共享相同的数据。

多线程的缺点

现在让我们看一下多线程的一些缺点。缺点如下

  • 不适用于单处理器系统 - 与多处理器系统的性能相比,多线程发现难以在单处理器系统上实现计算速度方面的性能。

  • 安全问题 - 我们知道程序中的所有线程共享相同的数据,因此始终存在安全问题,因为任何未知线程都可以更改数据。

  • 复杂性增加 - 多线程可能会增加程序的复杂性,并且调试变得困难。

  • 导致死锁状态 - 多线程可能导致程序达到死锁状态的潜在风险。

  • 需要同步 - 需要 同步以避免互斥。这会导致更多内存和CPU利用率。