- 多道程序 –一次运行多个程序的计算机(如同时运行 Excel 和 Firefox)。
- 多处理 –一次使用多个 CPU 的计算机。
- 多任务 –共享公共资源(如 1 个 CPU)的任务。
- 多线程是多任务的扩展。
1. 多编程——
在现代计算系统中,通常有多个并发的应用进程需要执行。现在,操作系统的责任是有效和高效地管理所有流程。
操作系统最重要的方面之一是多程序。
在计算机系统中,有多个进程等待执行,即它们在等待分配给它们的 CPU 并开始执行。这些过程也称为作业。现在主内存太小,无法容纳所有这些进程或作业。因此,这些进程最初保存在称为作业池的区域中。该作业池由所有等待分配主内存和 CPU 的进程组成。
CPU 从所有这些等待的作业中选择一个作业,将它从作业池带到主内存并开始执行它。处理器执行一项作业,直到它被某些外部因素中断或执行 I/O 任务。
非多程序系统的工作 –
- 在非多程序系统中,一旦一项作业离开 CPU 并执行其他任务(例如 I/O),CPU 就会空闲。 CPU 一直在等待,直到此作业(之前执行的)返回并继续与 CPU 一起执行。所以 CPU 在这期间一直是免费的。
- 现在它有一个缺点,就是 CPU 会在很长一段时间内保持空闲状态。此外,等待执行的其他作业可能没有机会执行,因为 CPU 仍分配给较早的作业。
这带来了一个非常严重的问题,即使其他作业已准备好执行,CPU 也不会分配给它们,因为 CPU 分配给了一个甚至不使用它的作业(因为它忙于 I/O 任务)。 - 不可能发生一个作业使用 CPU 1 小时而其他作业已在队列中等待 5 小时的情况。为了避免这种情况并提出 CPU 的有效利用,多编程的概念出现了。
多道编程的主要思想是最大化CPU时间。
多程序系统的工作 –
- 在多程序系统中,一旦一个作业执行 I/O 任务,操作系统就会中断该作业,从作业池(等待队列)中选择另一个作业,将 CPU 分配给这个新作业并开始执行。前一个作业继续执行其 I/O 操作,而这个新作业执行 CPU 密集型任务。现在假设第二个作业也用于 I/O 任务,CPU 选择第三个作业并开始执行它。一旦作业完成其 I/O 操作并返回 CPU 任务,CPU 就会分配给它。
- 这样,系统等待 I/O 任务完成就不会浪费 CPU 时间。
因此,多路编程的最终目标是只要有进程准备执行就让 CPU 保持忙碌。这样,多个程序可以在单个处理器上执行,通过一次执行程序的一部分,然后执行另一个程序的一部分,然后执行另一个程序的一部分等等,从而执行多个程序。因此,CPU 永远不会保持空闲。
在下图中,程序 A 运行了一段时间,然后进入等待状态。与此同时,程序 B 开始执行。这样CPU就不会浪费资源,给程序B一个运行的机会。
2. 多处理 –
在单处理器系统中,一次只执行一个进程。
多处理是在单个计算机系统中使用两个或多个 CPU(处理器)。该术语还指系统在单个计算机系统中支持多个处理器的能力。现在,由于有多个处理器可用,因此可以一次执行多个进程。这些多处理器共享计算机总线,有时还共享时钟、内存和外围设备。
多处理系统的工作 –
- 在多处理的帮助下,可以同时执行多个进程。假设进程 P1、P2、P3 和 P4 正在等待执行。现在在单处理器系统中,首先执行一个进程,然后是另一个进程,然后是另一个进程,依此类推。
- 但是对于多处理,每个进程都可以分配给不同的处理器来执行。如果它是双核处理器(2 个处理器),则可以同时执行两个进程,因此速度会快两倍,同样,四核处理器的速度是单处理器的四倍。
为什么使用多处理 –
- 多处理器系统的主要优点是在更短的时间内完成更多的工作。当需要非常高的速度来处理大量数据时,就会使用这些类型的系统。与单处理器系统相比,多处理系统可以节省资金,因为处理器可以共享外围设备和电源。
- 它还提供了更高的可靠性,如果一个处理器出现故障,工作不会停止,只会减慢速度。例如,如果我们有 10 个处理器并且 1 个失败,那么工作不会停止,而是剩余的 9 个处理器可以共享第 10 个处理器的工作。因此,整个系统的运行速度只会慢 10%,而不是完全失败。
多处理指的是硬件(即 CPU 单元)而不是软件(即正在运行的进程)。如果底层硬件提供不止一个处理器,那就是多处理。它是系统利用多个处理器的计算能力的能力。
多编程和多处理之间的区别 –
- 一个系统既可以通过同时运行多个程序进行多编程,也可以通过具有多个物理处理器进行多处理。多进程和多进程编程的区别在于多进程基本上是在多个处理器上同时执行多个进程,而多进程是将多个程序保存在主内存中并仅使用单个 CPU 并发执行它们。
- 多处理通过并行处理发生,而多编程通过从一个进程切换到另一个进程(称为上下文切换的现象)发生。
3. 多任务处理——
顾名思义,多任务是指一次执行多个任务(例如进程、程序、线程等)。在现代操作系统中,我们可以同时播放 MP3 音乐、在 Microsoft Word 中编辑文档、浏览谷歌浏览器,这是通过多任务完成的。
多任务是多编程的逻辑扩展。多任务与多编程的主要区别在于,多编程仅基于上下文切换的概念,而多任务基于时间共享以及上下文切换的概念。
多任务系统的工作 –
- 在分时系统中,每个进程都被分配了一个进程要执行的特定时间量。假设有 4 个进程 P1、P2、P3、P4 准备执行。因此,它们中的每一个都被分配了一些时间量,它们将为其执行例如 5 纳秒 (5 ns) 的时间量。当一个进程开始执行时(比如 P2),它会在这段时间(5 ns)内执行。在 5 ns 之后,CPU 开始在指定的时间内执行另一个进程(比如 P3)。
- 因此,CPU 使进程在它们之间共享时间片并相应地执行。一旦一个进程的时间量到期,另一个进程就开始执行。
- 这里也基本上发生了上下文切换,但它发生得如此之快,以至于用户能够在每个程序运行时分别与它进行交互。这样,用户就会产生多个进程/任务同时执行的错觉。但实际上在特定时刻只有一个进程/任务正在执行。在多任务处理中,时间共享是最好的体现,因为每个正在运行的进程只占用相当一部分 CPU 时间。
在更一般的意义上,多任务是指同时运行多个程序、进程、任务、线程。当多个任务共享一个公共处理资源(例如,CPU 和内存)时,该术语用于现代操作系统。
- 如上图所示,在任何时候 CPU 只执行一项任务,而其他任务正在等待轮到它们。当 CPU 重新分配给另一个任务时,就会产生并行的错觉。即,由于时间共享,所有三个任务 A、B 和 C 似乎同时发生。
- 因此,要进行多任务处理,首先应该是多道程序设计,即存在多个准备执行的程序。其次是分时的概念。
4. 多线程——
线程是 CPU 利用率的基本单位。多线程是一种执行模型,它允许单个进程在该进程的“上下文”中同时运行多个代码段(即线程)。
例如 VLC 媒体播放器,其中一个线程用于打开 VLC 媒体播放器,一个线程用于播放特定歌曲,另一个线程用于将新歌曲添加到播放列表。
多线程是一个进程能够一次管理多个用户的使用并管理同一用户的多个请求而不必拥有程序的多个副本的能力。
多线程系统的工作——
示例 1 –
- 假设有一个处理客户端请求的 Web 服务器。现在,如果它作为单线程进程执行,那么它将无法一次处理多个请求。首先,一个客户端将发出请求并完成其执行,只有这样,服务器才能处理另一个客户端请求。这确实是一项昂贵、耗时且累人的任务。为了避免这种情况,可以使用多线程。
- 现在,每当有新的客户端请求进来时,Web 服务器只需创建一个新线程来处理此请求并继续执行以听取更多客户端请求。因此,Web 服务器的任务是侦听新的客户端请求并为每个单独的请求创建线程。每个新创建的线程处理一个客户端请求,从而减轻 Web 服务器的负担。
示例 2 –
- 我们可以将线程视为共享父进程资源但独立执行的子进程。现在以 GUI 为例。假设我们正在 GUI 上执行计算(这需要很长时间才能完成)。现在,在此命令完成执行之前,我们无法与 GUI 的其余部分进行交互。为了能够与 GUI 的其余部分交互,这个计算命令应该分配给一个单独的线程。所以此时,将有 2 个线程执行,即一个用于计算,另一个用于 GUI 的其余部分。因此,在单个进程中,我们使用多个线程来实现多种功能。
下图完整描述了 VLC 播放器示例:
多线程的优点——
- 多线程的好处包括提高响应能力。由于程序中有多个线程,因此如果一个线程执行时间过长或被阻塞,其余线程将继续执行而不会出现任何问题。因此,整个程序通过剩余线程保持对用户的响应。
- 多线程的另一个优点是成本更低。创建全新的进程和分配资源是一项耗时的任务,但由于线程共享父进程的资源,因此创建线程和在它们之间切换相对容易。因此多线程是现代操作系统的需要。