如何从一个进程切换到另一个进程:关于上下文切换

最后更新: 27的胡里奥·德2023
情境变化、过程

正如我已经解释过的 关于更改主题的文章,回到这个话题也很重要 上下文变化 但这次应用到进程上。这样,你就能获得缺失的信息,了解运行多任务软件时 CPU 和操作系统如何协同工作。

什么是流程?

任务管理器

在计算中 一个过程 进程是程序或软件的运行实例。它可以被视为一个活动实体,执行一系列顺序指令、访问系统资源并与其他进程通信。进程拥有自己分配的内存空间,其中包括程序代码、数据、执行堆栈和变量。

每个过程 它由操作系统创建和管理,它分配内存、CPU 时间、打开的文件和输入/输出设备等资源。操作系统还负责调度和协调进程的执行,确保有效利用可用资源。

每个进程都有自己的状态,可以是活动(正在运行)、等待(被事件阻塞)、暂停(暂时停止)或终止(已终止)。进程可以通过进程间通信 (IPC) 等机制相互通信,从而实现进程间数据交换和同步。

什么是消费物价指数?

IPC(进程间通信) 它是操作系统中进程之间用来相互通信和共享信息的一组机制和技术。进程间通信 (IPC) 允许进程进行通信和协作,无论是在同一台计算机上,还是通过网络连接的不同计算机之间。

CPI 对于 并发编程 以及创建需要多个进程之间交互和同步的应用程序。它提供了进程间数据交换、活动同步和任务协调的手段。

有不同的 CPI 机制可用,包括:

  • 消息队列:允许使用共享队列在进程之间发送和接收消息。
  • 回忆录: 它允许多个进程访问公共内存区域,从而使它们能够快速高效地交换数据。
  • 插座: 它们通过 TCP/IP 或其他网络协议为不同机器上的进程之间的通信提供网络接口。
  • 管道: 它们允许进程之间进行单向通信,其中一个进程的输出被重定向为另一个进程的输入。
  • 同步: 同步机制(例如信号量、互斥量和条件变量)用于协调对共享资源的访问并避免进程之间的竞争条件。

IPC 机制的选择取决于应用程序的具体要求以及进程运行的环境。每种机制在性能、复杂性和安全性方面都有其自身的优点和局限性。

IPC 在并发编程和分布式系统构建中起着基础性的作用,因为它实现了进程之间的通信和协作,促进了复杂应用程序的开发和系统资源的有效利用。

什么是PCB?

在流程方面, PCB(过程控制块) 指操作系统用来维护正在运行的进程重要信息的数据结构。它也被称为进程控制块。

PCB 是由 OS 当新进程被创建并存储在主内存中时。它包含有关进程状态和管理的基本信息,使操作系统能够正确地控制和管理其执行。

PCB 上存储的一些数据可能包括:

  • 工艺识别: 进程的唯一标识符,例如进程编号或名称。
  • 程序国家:表示进程正在运行、等待、准备运行、暂停还是终止。
  • 内存管理信息:分配给进程的内存大小、基地址、内存限制、页表等。
  • 资源管理信息:进程打开的文件列表,访问权限,文件描述符等。
  • 规划师信息:进程优先级、CPU 使用时间、调度和资源分配等。
  • 控制信息:进程上下文数据,例如CPU寄存器、堆栈指针、程序计数器、状态寄存器等。
  如何使用 NAS 进行 WordPress 本地备份

当进程状态改变或发生上下文切换时,操作系统会持续更新 PCB。当一个进程被挂起或切换到另一个进程时,操作系统会将该进程的当前状态保存到其 PCB 中,并加载下一个要执行的进程的状态。

PCB 对于操作系统高效管理进程至关重要,它能够有效地控制、协调 CPU 资源和调度。每次执行上下文切换操作时,操作系统都会查询相应的 PCB,以获取有关正在运行的进程的必要信息。

进程和线程之间的区别

MGI 线程和进程 线程是编程领域和操作系统程序执行中的两个重要概念。以下是线程和进程之间的一些主要区别:

  • 执行上下文进程拥有自己独立的执行上下文,包括其自身的内存空间、CPU 寄存器、进程 ID、打开的文件和其他资源。而线程则在进程内共享相同的执行上下文,与父进程共享相同的内存空间、打开的文件和其他资源。
  • 创造与毁灭进程由操作系统调用创建,并拥有独立的生命周期。它们可以独立创建和销毁,这意味着终止一个进程不会影响其他正在运行的进程。而线程则是在现有进程中创建的。一个进程可以拥有多个线程,线程的创建和销毁都在其父进程的上下文中完成。
  • 通信和同步进程通常使用进程间通信 (IPC) 机制(例如管道、消息队列或共享内存)进行通信和同步。共享同一内存空间的线程可以使用共享变量或互斥锁直接进行通信和同步。
  • 性能和效率: 由于线程共享资源,并且创建和销毁的成本比进程更低,因此在进程内切换线程通常比在进程之间切换更快、更高效。这使得线程非常适合并发和并行任务,这些任务可以从同时处理和资源共享中受益。
  • 资源保护线程在进程内共享相同的内存空间和资源,这意味着它们在访问和修改相同的共享资源时必须谨慎。需要适当的同步来避免竞争条件并确保共享数据的一致性。相比之下,进程拥有自己的内存空间和资源,这使得它们更加独立,并且更不容易发生资源冲突。

进程上下文切换和线程上下文切换的区别

线程上下文切换流程上下文变更
当 CPU 保存线程的当前状态并切换到同一进程中的另一个线程时,就会发生 TCS。PCS发生在操作系统调度程序保存正在运行的程序的当前状态(包括PCB状态)并切换到另一个程序时。
TCS 帮助 CPU 同时处理多个线程。PCS 涉及加载新的程序状态以供执行。
TCS 不涉及更改内存地址空间。处理器寻址的所有内存地址均保持保存。PCS 涉及交换内存地址空间。处理器计数的所有内存地址均被清空。
处理器缓存和转换查找缓冲区保留其状态。处理器缓存和 TLB 被刷新。
虽然 TCS 涉及更改寄存器和堆栈指针,但它不涉及更改地址空间的开销。因此,它更高效。PCS 涉及更改地址空间的高昂成本。因此,效率较低。
TCS 更快一些,而且更便宜。PCS相对较慢且更昂贵。

在单线程进程中,线程本身代表整个进程。然而,在多线程进程中,程序执行时需要在不同的线程之间切换:

  • 线程更改线程切换是指在同一进程内从一个线程切换到另一个线程。这种上下文切换非常高效且经济,因为它只涉及更改特定的标识和资源,例如程序计数器、寄存器和堆栈指针。从一个线程切换到另一个线程的成本几乎与进入和退出内核的成本相当。
  • 流程变更进程切换涉及从一个进程切换到另一个进程。在这种情况下,必须将当前进程关联的所有资源交换为新进程所需的资源。这涉及更改内存地址空间,包括内存地址、页表和内核资源以及处理器缓存。
  如何充分利用 iPad:技巧和主要功能

如何执行上下文切换

我们来看看 如何改变语境 在计算机系统中,为此,我们首先需要了解一些概念:

在旧处理器上,上下文切换需要数百纳秒,而在新处理器上则只需几纳秒。上下文切换的影响取决于处理器,可以用时钟周期来衡量,在某些情况下需要数百个时钟周期,有时甚至超过一千个时钟周期。请记住,上下文切换会产生额外的开销,例如 TLB(转换后备缓冲区)刷新、多个任务之间的缓存共享以及任务调度程序的执行等。由于线程共享相同的虚拟内存映射,同一进程中两个线程之间的上下文切换比两个不同进程之间的上下文切换更快。因此,无需刷新 TLB……

什么是上下文切换?

El 上下文切换是保存进程状态以供日后恢复和继续执行,然后加载先前保存的不同状态的过程。这允许多个进程共享单个中央处理器 (CPU),并且是多道程序设计或多任务操作系统的基本特性。在传统的 CPU 系统中,每个正在运行的进程使用 CPU 寄存器来存储数据并维护其当前状态。然而,在多任务系统中,操作系统在进程或线程之间切换,以允许多个进程同时执行。在每次切换时,操作系统必须保存当前正在运行的进程的状态,然后加载下一个要在 CPU 上执行的进程的状态。这种涉及保存和加载进程状态的操作序列称为上下文切换。

  如果扬声器听不到你的声音,该如何修复

上下文切换成本:对性能的影响

上下文经常切换 需要大量资源 硬件,操作系统设计的大部分重点在于优化它们的使用。从一个进程切换到另一个进程涉及执行各种管理任务,例如保存和加载寄存器和内存映射、更新表和列表等等。上下文切换的具体性质取决于系统架构、操作系统和共享资源的数量。属于同一进程的线程共享许多资源,这与彼此不协作的无关进程不同。

例如,在 Linux内核上下文切换涉及将存储在 PCB 表中的相应进程控制块 (PCB) 加载到内核堆栈,以获取有关新进程状态的信息。CPU 状态数据(例如寄存器、堆栈指针和程序计数器)以及内存管理信息(例如段表和页表)都会被加载(除非旧进程与新进程共享内存)。为了防止在旧进程和当前进程使用不同内存空间时出现地址转换错误,必须刷新转换后备缓冲区 (TLB)。这会对性能产生负面影响,因为在大多数上下文切换之后,TLB 中所有内存引用都会丢失,因为它会变为空。

此外,类似的上下文切换发生在 用户线程尤其是在绿色线程中,它通常非常轻量,仅保存和恢复少量上下文。在极端情况下,例如在 Go 中在协程之间切换,上下文切换的性能与协程相当,并且仅比子程序调用略高。

流程摘要

MGI 涉及的步骤 上下文变化如下:

  1. 保存当前在 CPU 上运行的进程的上下文。更新进程控制块和其他重要字段。
  2. 将前一个进程的控制块移动到相应的队列中,比如就绪队列、I/O队列等。
  3. 选择要运行的新流程。
  4. 更新选定进程的控制块。这包括将进程状态更新为“正在运行”。
  5. 根据需要更新内存管理数据结构。
  6. 当先前执行的进程被加载回处理器时,恢复其上下文。这是通过从进程控制块和寄存器加载先前的值来完成的。

例如,在 linux的情况 具体来说,这是我最了解的系统,它是:

  1. CPU 上运行的当前进程到达必须中断的点,或者发生需要上下文切换的事件,例如系统调用或硬件中断。
  2. 操作系统内核将当前进程状态(包括 CPU 寄存器、堆栈指针和程序计数器)保存在其进程控制块 (PCB) 中。这样做是为了保留进程状态,以便稍后恢复进程。
  3. 内核从就绪队列或根据调度算法选择下一个要运行的进程。新选中的进程的 PCB 会被更新,并将其状态设置为运行中。
  4. 执行必要的任务来设置新进程的环境,例如使用存储在其 PCB 上的值加载 CPU 寄存器和堆栈指针。
  5. 内核为新进程更新内存结构,例如段表和页表。
  6. 最后,新进程的上下文被恢复,并被分配 CPU 执行。该进程将从上次中断的地方继续执行。

值得注意的是,此示例是对 Linux 上下文切换中实际发生过程的简化。实际上,涉及更多任务和考虑,例如管理 I/O 设备和其他系统资源。此外,Linux 内核实现了各种调度策略,这些策略决定如何选择要执行的进程以及如何在它们之间分配 CPU 时间。

我希望这篇文章以及主题转换文章对您有所帮助……如果您对这些教程感兴趣, 您可以在这里查看更多.