操作系统中的并发

2025年7月11日 | 阅读 14 分钟

在当今快节奏的数字世界中,用户期望计算机和设备能够无缝地执行多项任务——无论是边听音乐边浏览网页,还是在后台下载文件,或者同时运行多个应用程序。操作系统能够高效处理这些任务的能力,取决于一个称为并发的基本概念。

操作系统中的并发是指同时活跃的多个进程或线程的管理和执行。它使系统能够最大限度地利用可用资源,保持响应性,并确保任务不被不必要地延迟执行。虽然并发为计算系统带来了显著的强大功能和灵活性,但它也引入了同步、死锁和资源争用等复杂性。

在本文中,您将学习操作系统中的并发及其原理、问题、优点和缺点。

什么是并发?

并发是计算机科学和操作系统中的一个基本概念,它指的是系统同时管理和执行多个任务的能力。从实际角度来看,这意味着多个进程或线程在同一时间段内都在进行中,尽管它们在任何给定的时刻可能不是同时执行的。相反,操作系统使用上下文切换和调度等技术,将 CPU 的时间分配给这些任务,从而产生同时执行的错觉。

在并发系统中,任务被分解成更小的工件并进行交错处理,这意味着 CPU 可以快速地在任务之间切换。这种方法可以最大限度地提高效率,并确保没有一个任务会垄断系统的资源,从而保持系统的响应性。例如,当用户同时流式传输音乐、浏览网页和下载文件时,似乎所有这些操作都在同时进行。实际上,操作系统以一种严格控制的方式管理每个任务,允许每个任务在不等待其他任务完成的情况下取得进展。

它指的是同时执行多个指令序列。当多个进程线程并发执行时,它会发生在操作系统中。这些线程可以通过共享内存或消息传递相互交互。并发导致资源共享,从而引发死锁和资源稀缺等问题。它通过进程协调、内存分配和执行计划等技术来帮助最大限度地提高吞吐量。

并发在经常涉及等待的任务(例如等待用户输入或 I/O 操作)的环境中尤其有用。当一个任务正在等待磁盘或网络的响应时,CPU 可以切换到另一个已准备好运行的任务。这使得处理器保持繁忙,并使系统保持响应。

区分并发和并行很重要。并发是指在同一时间段内有多个任务正在进行,而并行则意味着多个任务实际上正在同时执行,通常是在独立的处理器核心上。单核处理器可以通过快速切换任务来实现并发,但真正的并行需要多核或多处理器系统,其中任务可以真正地同时运行。

并发会增加复杂性,特别是当多个任务共享内存、文件或设备等资源时。管理这种共享访问需要仔细的同步,以防止竞态条件、死锁和数据不一致等问题。尽管存在这些挑战,并发仍然是现代操作系统效率和响应能力背后的核心原则,使得多个应用程序和服务能够协同工作。

并发的关键特征

交错执行

并发的定义特征之一是交错执行。在并发系统中,多个任务在重叠的时间间隔内进行。操作系统不会运行一个任务到完成再开始另一个任务,而是快速地在任务之间切换,执行每个任务的一小部分。这种时间共享方法允许 CPU 以对用户来说似乎是同时的方式处理多个操作。交错执行确保所有活动任务随着时间的推移都能取得进展,即使只有一个处理器可用。

共享资源

并发通常涉及访问内存、文件或外围设备等公共资源的任务。由于多个任务可以并发运行,因此系统必须仔细管理对这些共享资源的访问,以避免冲突和不一致。例如,如果两个线程同时尝试写入同一个文件,结果可能会导致数据损坏。为防止此类问题,使用锁、信号量和监视器等机制来控制访问并维护数据完整性。

独立和依赖任务

在并发系统中,某些任务可能独立于其他任务运行,而某些任务可能相互依赖。独立任务不依赖于其他任务的状态或输出,并且可以在没有协调的情况下继续进行。相比之下,依赖任务必须相互同步,通常在继续之前等待满足某些条件或可用数据。这种依赖性带来了额外的复杂性,因为系统必须协调这些任务之间的时间和通信,以确保正确执行。

响应性和效率

并发提高了系统的响应性和效率。通过允许多个任务在重叠的时间段内进行,系统可以更快地响应用户输入和外部事件。这在图形用户界面等交互式系统中尤其重要,因为滞后或无响应会严重影响用户体验。此外,通过利用本应花在等待慢速操作(如磁盘或网络 I/O)上的 CPU 时间,并发确保了系统资源的整体利用率更高。

实现并发的机制

进程创建和管理

在操作系统中实现并发的基本机制之一是进程创建。每个进程代表一个独立的执行上下文,拥有自己的内存空间、程序计数器和系统资源。操作系统使用系统调用(如 fork() 或 exec()(在基于 Unix 的系统中))来创建和管理这些进程。通过在单 CPU 上进行时间共享或在多 CPU 上进行并行处理来运行多个进程,从而实现并发。

线程和多线程

线程比进程轻量,并且在一个进程内共享相同的内存空间。操作系统支持多线程以允许单个应用程序中的并发执行。这比使用多个进程效率更高,因为线程在上下文切换和内存管理方面的开销更少。线程可以独立运行,但它们在访问共享资源时通常需要同步。

上下文切换

上下文切换是一项关键技术,它允许 CPU 从一个进程或线程切换到另一个进程或线程。在上下文切换期间,操作系统会保存当前运行任务的状态,并加载下一个要运行任务的状态。这种切换速度快且频繁,使得多个任务都能取得进展,并给人以同时执行的印象,即使在单核处理器上。

调度算法

调度算法决定进程和线程的执行顺序。这些算法对于确保 CPU 的公平高效使用至关重要。例如,先进先出(FCFS)、轮转法、优先级调度和多级队列调度。这些算法在管理并发方面起着重要作用,因为它们决定了任务如何随时间交错。

同步工具

为了协调对共享资源的访问,操作系统提供了同步工具,如互斥锁(mutual exclusions)、信号量、监视器和条件变量。这些工具可防止竞态条件等问题,其中两个或多个进程尝试同时修改相同的数据。同步可确保一次只有一个进程或线程可以访问代码的关键部分。

进程间通信 (IPC)

进程通常需要相互通信和共享数据。进程间通信机制,如消息队列、管道、共享内存和套接字,用于支持并发进程之间安全高效的数据交换。IPC 机制在需要并发的客户端-服务器体系结构和分布式系统中尤为重要。

信号和中断

信号和中断允许操作系统响应异步事件。中断可能由硬件生成(如键盘输入或网络数据包到达),而信号通常由软件发送以通知进程一个事件(如终止请求)。操作系统会并发处理这些事件和正在进行的 I/O 操作,从而保持系统响应性和控制能力。

并发在操作系统中的重要性

高效的资源利用

并发允许操作系统更有效地利用系统资源。当一个任务正在等待时(例如等待用户输入或磁盘读取),CPU 可以切换到另一个已准备好执行的任务。这减少了空闲时间,并确保 CPU、内存和 I/O 设备等硬件组件始终处于忙碌状态并进行有益的工作。

提高响应能力

在具有用户界面的系统中,响应性至关重要。并发可确保后台长时间运行的任务(如下载或更新)不会阻止诸如单击按钮或键入之类的交互式任务。通过并发管理多个任务,操作系统保持系统响应和用户友好。

更好的可扩展性

随着多核处理器的兴起,并发对于可扩展性能至关重要。支持并发执行的操作系统可以将任务分配给多个核心,从而实现真正的并行运行。这对于同时处理大量用户或进程的服务器和应用程序尤为重要。

实时能力

某些应用程序要求操作在严格的时间约束内发生——例如在嵌入式系统、机器人或多媒体中。并发使操作系统能够高效地调度和优先处理时间敏感的任务,确保及时执行并保持系统可靠性。

支持多任务处理

现代用户期望一次运行许多应用程序——编辑文档、听音乐、接收电子邮件。并发正是允许操作系统流畅地管理这些同时进行的任务,以至于它们感觉像是同时运行的。

并发的原理

当今的技术,如多核处理器和并行处理,允许同时执行多个进程和线程。多个进程和线程可以访问相同的内存空间、代码中声明的相同变量,甚至可以读取或写入同一个文件。

进程的执行时间无法简单估算,也无法预测哪个进程会先完成,这使得您能够构建技术来处理并发带来的问题。

交错进程和重叠进程是具有相同问题的两种并发进程。无法预测相对执行速度,以下因素决定了它

  1. 操作系统处理中断的方式
  2. 其他进程的活动
  3. 操作系统的调度策略

同步进行

并发的核心原则之一是,多个任务或进程可以在同一时间段内取得进展。虽然在单核处理器上这可能不意味着实际的并行执行,但操作系统会进行时间共享,以便所有任务在短时间间隔内获得 CPU 注意。这会产生任务同时运行的错觉,并确保没有任何一个任务会因为 CPU 时间而饿死。

独立和协作执行

并发进程可以独立执行或协作执行。独立任务不共享资源或不依赖于彼此的输出,因此可以在无需协调的情况下执行。相比之下,协作或依赖进程需要共享数据或同步它们的行为。操作系统必须仔细协调这些进程,以确保一致性并防止竞态条件等错误。

结构化同步

为确保并发任务之间的安全交互,结构化同步至关重要。这包括使用信号量、互斥锁和监视器等机制。这些工具有助于管理对共享资源的访问,确保一次只有一个任务可以修改资源。没有同步,进程可能会相互干扰,导致不可预测和不正确的行为。

进程之间的通信

并发通常需要进程或线程相互通信。这可以通过共享内存或消息传递来实现。在共享内存系统中,多个线程访问公共变量,这需要严格控制谁何时写入。在消息传递系统中,数据通过明确定义的通道进行交换,这降低了冲突的风险,但需要清晰的通信协议。

非确定性

并发执行的一个关键方面是,任务的确切执行顺序在程序每次运行时都可能不同。并发的这种非确定性使得预测系统行为更加困难,尤其是在出现 bug 时。开发人员和操作系统必须考虑到这种可变性,并确保系统无论事件发生的顺序如何都能正确运行。

操作系统组件中的并发

进程和线程

并发最直接地体现在操作系统管理进程和线程的方式中。进程是执行中的独立程序,拥有自己的内存空间。线程是进程的较小单元,共享相同的内存但可以独立运行。操作系统允许多个线程或进程并发执行,无论是通过单 CPU 的时间切片还是通过将它们分发到多个核心。这使得多任务处理和高效的 CPU 利用成为可能。

CPU 调度

CPU 调度程序通过决定当前哪个进程或线程应该运行,在实现并发方面发挥着核心作用。使用轮转法、多级队列或最短作业优先等算法,调度程序可以快速地在任务之间切换。这种快速切换确保所有活动进程都获得公平的 CPU 时间份额,从而产生它们同时运行的错觉。

输入/输出 (I/O) 管理

I/O 操作比 CPU 任务慢得多。为防止 CPU 在等待 I/O 完成时处于空闲状态,操作系统使用并发来使 I/O 与计算重叠。例如,当一个进程正在从磁盘读取时,另一个进程可以执行指令。这提高了系统吞吐量,并使 CPU 即使在存在 I/O 密集型任务时也能保持忙碌。

中断处理

中断是来自硬件或软件的信号,它会暂时中断当前的 CPU 活动,以便处理更高优先级的事件。操作系统会并发处理这些中断以及正在进行的进程。这使系统能够快速响应时间敏感的事件(如用户输入或设备故障),而不会显着干扰其他正在运行的任务。

内存管理

并发也在内存管理中发挥作用,其中多个进程需要访问系统的 RAM。操作系统必须确保每个进程拥有自己的受保护的内存空间,同时在需要时启用共享内存。必须仔细管理对内存区域的并发访问,以防止数据损坏或泄露,尤其是在多线程环境中。

文件系统和资源访问

多个进程可能同时请求访问文件、数据库或设备。文件系统中的并发可确保此类操作得到安全高效地处理。锁定机制、访问权限和缓冲区缓存可帮助操作系统协调并发文件访问,而不会引起冲突或数据不一致。

并发中的问题

并发中存在各种问题。其中一些如下

1. 定位编程错误

很难发现编程错误,因为由于每次代码执行时共享组件的状态不同,报告通常是可重复的。

2. 共享全局资源

共享全局资源很困难。如果两个进程使用全局变量并且都修改了变量的值,那么许多更改的执行顺序至关重要。

3. 锁定通道

操作系统锁定资源并阻止其他进程使用它可能会效率低下。

4. 最佳资源分配

操作系统很难正确处理资源分配。

并发问题

各种并发问题如下

1. 非原子操作

非原子但可被多个进程中断的操作可能会出现问题。非原子操作依赖于其他进程,而原子操作独立于其他进程运行。

2. 死锁

在并发计算中,当一个组成员等待另一个成员(包括它自己)发送消息并释放锁时,就会发生这种情况。软件和硬件锁通常用于仲裁共享资源并在并行计算、分布式系统和多处理中实现进程同步。

3. 阻塞

被阻塞的进程正在等待某个事件,例如资源可用性或 I/O 操作完成。进程可能会因等待资源而阻塞,并且一个进程可能会因等待终端输入而长时间阻塞。如果需要定期更新某些数据,这将非常不利。

4. 竞态条件

当应用程序的输出取决于其他不可控事件的 timing 或顺序时,就会发生竞态问题。在多线程软件、分布式环境运行或依赖于共享资源的程序中也可能发生竞态情况。

5. 饥饿

并发计算中的一个问题是,一个进程被持续拒绝完成其工作所需的资源。这可能是由于调度错误或互斥算法错误引起的,但也可能由资源泄漏引起。

并发系统设计通常需要开发可靠的策略来协调它们的执行、数据交换、内存分配和执行计划,以减少响应时间并最大化吞吐量。

操作系统中并发的优缺点

操作系统中并发的各种优点和缺点如下

优点

1. 更好的性能

它提高了操作系统的性能。当一个应用程序仅使用处理器,而另一个应用程序仅使用磁盘驱动器时,同时运行这两个应用程序所需的时间少于顺序运行它们所需的时间。

2. 更好的资源利用

它使一个应用程序未使用的资源可以被另一个应用程序使用。

3. 运行多个应用程序

它允许您同时运行多个应用程序。

缺点

  1. 有必要保护多个应用程序免受彼此的侵害。
  2. 有必要使用额外的技术来协调多个应用程序。
  3. 在操作系统中需要额外的性能开销和复杂性来在应用程序之间进行切换。

常见问题解答 (FAQs)

1. 并发与并行有什么区别?

并发是指在同一时间段内有多个任务正在进行,通常在单个处理器上交错执行。而并行是指任务在多个处理器或核心上同时执行。并发涉及结构和协调,而并行涉及实际的同时执行。

2. 为什么并发在操作系统中很重要?

并发提高了资源利用率、系统响应性和可扩展性。它允许操作系统有效地管理多个任务,即使在单处理器上,并确保用户界面保持响应,同时后台进程也在运行。

3. 单核处理器上可以发生并发吗?

是的,可以通过时间共享在单核处理器上发生并发。操作系统会在任务之间快速切换,给人以它们同时运行的错觉,尽管一次只有一个任务在使用 CPU。

4. 并发系统中的常见问题有哪些?

并发系统可能会遇到竞态条件、死锁、饥饿和数据不一致等问题。当多个进程或线程在没有适当同步的情况下访问共享资源时,就会出现这些问题。

5. 操作系统如何处理并发?

操作系统使用进程和线程管理、上下文切换、 CPU 调度、同步工具(如互斥锁和信号量)以及进程间通信等机制来有效实现和控制并发。

6. 并发中的竞态条件是什么?

当程序的输出取决于并发线程或进程的 timing 或执行顺序时,就会发生竞态条件。如果两个线程在没有适当同步的情况下同时访问和修改共享数据,可能会导致不可预测的行为。

7. 同步在并发中起什么作用?

同步确保多个进程或线程以可控且可预测的方式访问共享资源。它通过强制执行互斥等规则来防止冲突和错误,从而维护数据一致性。

8. 什么是上下文切换?为什么它很重要?

上下文切换是操作系统保存当前正在运行的任务状态并加载另一任务状态的过程。它允许 CPU 在任务之间切换,从而即使在单核系统上也能实现并发。

9. 线程比进程在并发执行中更有效率吗?

是的,线程通常更有效率,因为它们共享相同的内存空间,并且创建和上下文切换的开销更少。但是,它们也需要仔细同步以避免冲突。

10. 并发如何影响系统性能?

并发通过允许多个任务同时或在重叠的时间范围内进行,提高了整体系统性能。它使系统资源保持活跃,并确保更好的吞吐量,尤其是在多用户和实时环境中。


下一个主题Z-operating-system