📜  Python的并发性-线程

📅  最后修改于: 2020-11-08 08:42:37             🧑  作者: Mango


在一般情况下,我们知道,线程是一个非常薄的绞合字符串通常是棉布或丝绸面料以及用于缝制衣服,这样的。在计算机编程领域中也使用相同的术语“线程”。现在,我们如何将用于缝纫衣服的线程与用于计算机编程的线程联系起来?这两个线程执行的角色在此处相似。在衣服中,线程将衣服合在一起,而在另一端,在计算机程序中,线程将计算机程序保持在一起,并允许程序一次执行顺序动作或一次执行多个动作。

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

线程状态

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

新线程

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

可运行

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

跑步

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

不运行/正在等待

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

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

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

死

螺纹类型

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

用户级线程

这些是用户管理的线程。

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

用户级线程的示例是-

  • Java线程
  • POSIX线程

死

用户级线程的优点

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

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

用户级线程的缺点

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

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

内核级线程

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

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

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

死

内核级线程的优点

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

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

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

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

内核级线程的缺点

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

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

线程控制块-TCB

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

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

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

  • 线程状态-它包含与线程状态(正在运行,可运行,不可运行,已死)相关的信息。

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

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

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

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

印刷电路板

进程与线程之间的关系

在多线程中,进程和线程是两个密切相关的术语,它们的目标相同,即使计算机一次可以执行多项操作。一个进程可以包含一个或多个线程,但相反,线程不能包含一个进程。但是,它们仍然是执行的两个基本单元。执行一系列指令的程序将同时启动进程和线程。

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

Process Thread
Process is heavy weight or resource intensive. Thread is lightweight which takes fewer resources than a process.
Process switching needs interaction with operating system. Thread switching does not need to interact with operating system.
In multiple processing environments, each process executes the same code but has its own memory and file resources. All threads can share same set of open files, child processes.
If one process is blocked, then no other process can execute until the first process is unblocked. While one thread is blocked and waiting, a second thread in the same task can run.
Multiple processes without using threads use more resources. Multiple threaded processes use fewer resources.
In multiple processes, each process operates independently of the others. One thread can read, write or change another thread’s data.
If there would be any change in the parent process then it does not affect the child processes. If there would be any change in the main thread then it may affect the behavior of other threads of that process.
To communicate with sibling processes, processes must use inter-process communication. Threads can directly communicate with other threads of that process.

多线程的概念

如前所述,多线程是CPU通过同时执行多个线程来管理操作系统使用的能力。多线程的主要思想是通过将一个进程划分为多个线程来实现并行性。用更简单的方式,可以说多线程是通过使用线程的概念来实现多任务的方式。

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

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

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

多线程

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

多线程的优点

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

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

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

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

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

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

多线程的缺点

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

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

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

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

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

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