一般来说,线是一种非常细的丝线,通常是棉或丝绸织物,用于缝制衣服等。 同样的术语线程也被用于计算机编程领域。 现在,我们如何将用于缝制衣服的线与用于计算机编程的线相关联? 这两个线程执行的角色类似。 在衣服中,线程将布料放在一起,在另一侧,在计算机编程中,线程持有计算机程序,并允许程序一次执行顺序操作或许多操作。
线程是操作系统中最小的执行单元。 它本身不是一个程序,而是在程序中运行。 换句话说,线程并不相互独立,并与其他线程共享代码段,数据段等。 这些线程也被称为轻量级进程。
线程状态
为了深入理解线程的功能,我们需要了解线程的生命周期或不同的线程状态。 通常,线程可以以五种不同的状态存在。 下面显示了不同的状态 -
新线程
新线程在新状态下开始其生命周期。 但是,在这个阶段,它尚未开始,也没有分配任何资源。 我们可以说它只是一个对象的实例。
可运行
当新出生的线程启动时,线程变为可运行的,即等待运行。 在这种状态下,它拥有所有资源,但仍然有任务调度程序没有安排它运行。
运行
在此状态下,线程进行并执行已由任务计划程序选择运行的任务。 现在,线程可以进入死态或不可运行/等待状态。
非运行/待机
在这种状态下,线程暂停,因为它要么等待某个I/O请求的响应,要么等待其他线程执行完成。
死锁
可运行线程在完成其任务或以其他方式终止时进入终止状态。
下图显示了线程的完整生命周期 -
线程类型
在本节中,我们将看到不同类型的线程。 类型如下所述 -
用户级线程
这些是用户管理的线程。
在这种情况下,线程管理内核不知道线程的存在。 线程库包含用于创建和销毁线程的代码,用于在线程之间传递消息和数据,用于调度线程执行以及用于保存和恢复线程上下文。 应用程序以单个线程开始。
用户级线程的例子是 -
- Java线程
- POSIX线程
用户级线程的优点
以下是用户级别线程的不同优势 -
- 线程切换不需要内核模式特权。
- 用户级线程可以在任何操作系统上运行。
- 调度可以是用户级别线程中特定于应用程序的。
- 用户级线程可以快速创建和管理。
用户级别线程的缺点
以下是用户级别线程的不同缺点 -
- 在典型的操作系统中,大多数系统调用都是阻塞的。
- 多线程应用程序无法利用多处理。
内核级线程
操作系统管理的线程在内核上运行,内核是操作系统的核心。
在这种情况下,内核执行线程管理。 应用程序区域中没有线程管理代码。 内核线程直接由操作系统支持。 任何应用程序都可以编程为多线程。 应用程序中的所有线程都在单个进程中受支持。
内核维护整个流程和流程内的各个线程的上下文信息。 内核调度是基于线程完成的。 内核在内核空间中执行线程创建,调度和管理。 内核线程创建和管理通常比用户线程要慢。 内核级线程的例子是Windows,Solaris。
内核级线程的优点
以下是内核级线程的不同优点 -
- 内核可以同时在多个进程上安排来自同一进程的多个线程。
- 如果进程中的一个线程被阻塞,则内核可以调度同一进程的另一个线程。
- 内核例程本身可以是多线程的。
内核级线程的缺点
- 内核线程创建和管理通常比用户线程要慢。
- 在同一进程内将控制从一个线程转移到另一个线程需要将模式切换到内核。
线程控制块 - TCB
线程控制块(TCB)可以定义为操作系统内核中的数据结构,主要包含有关线程的信息。 存储在TCB中的线程特定信息将突出显示有关每个进程的一些重要信息。
考虑与TCB中包含的线程相关的以下几点 -
- 线程标识 - 它是分配给每个新线程的唯一线程标识(tid)。
- 线程状态 - 它包含与线程状态(运行,可运行,不运行,死机)有关的信息。
- 程序计数器(PC) - 它指向线程的当前程序指令。
- 寄存器组 - 它包含分配给它们的线程的寄存器值用于计算。
- 堆栈指针 - 它指向进程中线程的堆栈。 它包含线程范围内的局部变量。
- 指向PCB的指针 - 它包含指向创建该线程的进程的指针。
进程和线程之间的关系
在多线程中,进程和线程是两个非常紧密相关的术语,具有相同的目标,使计算机能够一次完成多个任务。 一个进程可以包含一个或多个线程,但相反,线程不能包含进程。 但是,它们仍然是执行的两个基本单位。 一个执行一系列指令的程序启动进程,并启动两者。
下表显示了进程和线程之间的比较 -
编号 | 进程 | 线程 |
---|---|---|
1 | 进程是重量或资源密集型的。 | 线程是轻量级的,比进程占用更少的资源。 |
2 | 进程切换需要与操作系统进行交互。 | 线程切换不需要与操作系统交互。 |
3 | 在多个处理环境中,每个进程执行相同的代码,但拥有自己的内存和文件资源。 | 所有线程都可以共享相同的一组打开文件,子进程。 |
4 | 如果一个进程被阻塞,那么在第一个进程解除阻塞之前,不能执行其他进程。 | 当一个线程被阻塞并等待时,同一个任务中的第二个线程可以运行。 |
5 | 不使用线程的多进程使用更多的资源。 | 多线程进程使用更少的资源。 |
6 | 在多个进程中,每个进程独立于其他流程运作。 | 一个线程可以读取,写入或更改另一个线程的数据。 |
7 | 如果父进程中有任何更改,则不会影响子进程。 | 如果主线程中有任何更改,则可能会影响该进程的其他线程的行为。 |
8 | 要与兄弟进程进行通信,进程必须使用进程间通信。 | 线程可以直接与该进程的其他线程通信。 |
多线程的概念
正如我们前面讨论过的,多线程是CPU通过并发执行多个线程来管理操作系统使用的能力。 多线程的主要思想是通过将进程分成多个线程来实现并行性。 以更简单的方式,多线程是通过使用线程的概念来实现多任务的方式。
以下示例的帮助可以理解多线程的概念。
示例
假设我们正在运行一个进程。 这个过程可能是为了写一些东西而打开MS词。 在这样的过程中,一个线程将被分配以打开MS字,另一个线程将被要求写入。 现在,假设想要编辑某些东西,那么将需要另一个线程来执行编辑任务等等。
下图解释内存中是否存在多个线程 -
我们可以在上面的图中看到,一个进程中可以存在多个线程,其中每个线程都包含自己的寄存器集和局部变量。 除此之外,进程中的所有线程共享全局变量。
多线程的优点
现在让我们看看多线程的一些优点。 优点如下 -
- 通信速度 - 多线程技术提高了计算速度,因为每个核心或处理器可以同时处理单独的线程。
- 程序保持响应 - 它允许程序保持响应,因为一个线程等待输入,另一个线程同时运行GUI。
- 访问全局变量 - 在多线程中,特定进程的所有线程都可以访问全局变量,如果全局变量有任何变化,那么其他线程也可以看到它。
- 资源的利用 - 在每个程序中运行多个线程可以更好地使用CPU,并且CPU的空闲时间会变少。
- 共享数据 - 每个线程不需要额外的空间,因为程序中的线程可以共享相同的数据。
多线程的缺点
现在让我们看看多线程的一些缺点。 缺点如下 -
- 不适用于单处理器系统 - 与多处理器系统的性能相比,多线程技术难以实现单处理器系统的计算速度。
- 安全性问题 - 由于程序中的所有线程共享相同的数据,因此总是存在安全问题,因为任何未知线程都可以更改数据。
- 复杂性增加 - 多线程会增加程序的复杂性,调试变得困难。
- 导致死锁状态 - 多线程会导致程序潜在的达到死锁状态的风险。
- 需要同步 - 需要同步以避免互斥。这导致更多的内存和CPU利用率。