Python中的并发 - 线程

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

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

线程状态

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

新线程

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

Runnable

当新生的线程启动时,线程变为可运行即等待跑步.在这种状态下,它拥有所有资源,但仍然没有安排任务调度程序运行.

正在运行

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

非运行/等待

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

Dead

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

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

死

线程类型

本节内容,我们将看到不同类型的线程.类型描述如下 :

用户级线程

这些是用户管理的线程.

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

用户级线程的示例是 :

  • Java线程

  • POSIX线程

死

用户级线程的优点

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

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

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

  • 在用户级线程中,调度可以是特定于应用程序的.

  • 用户级线程可以快速创建和管理.

用户级线程的缺点

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

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

  • 多线程应用程序可以没有利用多处理.

内核级线程

操作系统托管线程作用于内核,这是一个操作系统核心.

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

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

Dead

内核级线程的优点

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

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

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

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

内核级线程的缺点

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

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

线程控制块 -  TCB

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

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

  • 线程识别 : 它是分配给每个新线程的唯一线程id(tid).

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

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

  • 注册集 : 它包含分配给它们进行计算的线程寄存器值.

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

  • 指向PCB的指针 : 它包含指向创建该线程的进程的指针.

pcb

流程与流程之间的关系线程

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

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

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

多线程的概念

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

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

示例

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

下图帮助我们了解内存中多个线程的存在与减去;

多线程

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

多线程优势

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

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

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

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

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

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

多线程的缺点

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

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

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

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

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

  • 需要同步 : 需要同步以避免互斥.这会带来更多的内存和CPU利用率.