下面先来看看这三个术语的说明:
- 多道程序 —— 一台计算机同时运行多个程序(例如同时运行 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 就会分配给它。
这样,系统就不会浪费 CPU 时间等待 I/O 任务完成。
因此,多重编程的最终目标是只要有准备好执行的进程,就让 CPU 保持忙碌。这样,可以在单个处理器上执行多个程序,一次执行一个程序的一部分,然后执行另一个程序的一部分,然后执行另一个程序的一部分,以此类推,从而执行多个程序。因此,CPU 永远不会保持空闲状态。
在下图中,程序 A 运行了一段时间,然后进入等待状态。 与此同时,程序 B 开始执行。 所以CPU不会浪费自己的资源,给了程序B一个运行的机会。
2、多处理
在单处理器系统中,一次只执行一个进程。多处理是在单个计算机系统中使用两个或多个 CPU(处理器)。该术语还指系统在单个计算机系统中支持多个处理器的能力。现在由于有多个处理器可用,因此可以一次执行多个进程。这些多处理器共享计算机总线,有时还共享时钟、内存和外围设备。
多处理系统的工作
- 在多处理的帮助下,可以同时执行多个进程。假设进程 P1、P2、P3 和 P4 正在等待执行。现在在单处理器系统中,首先执行一个进程,然后执行另一个,然后再执行另一个,以此类推。
- 但是对于多处理,每个进程都可以分配给不同的处理器来执行。如果它是双核处理器(2 个处理器),则可以同时执行两个进程,因此速度会快两倍,类似地,四核处理器的速度将是单处理器的四倍。
为什么要使用多处理?
多处理器系统的主要优点是在更短的时间内完成更多的工作。 当需要非常高的速度来处理大量数据时,使用这些类型的系统。 与单处理器系统相比,多处理系统可以节省资金,因为处理器可以共享外围设备和电源。
它还提供了更高的可靠性,即如果一个处理器发生故障,工作不会停止,只会减慢速度。 例如 如果我们有 10 个处理器并且 1 个发生故障,那么工作不会停止,而是剩余的 9 个处理器可以共享第 10 个处理器的工作。 因此,整个系统的运行速度只慢了 10%,而不是完全失败。
多处理是指硬件(即 CPU 单元)而不是软件(即正在运行的进程)。 如果底层硬件提供多个处理器,那么这就是多处理。 这是系统利用多个处理器的计算能力的能力。
多编程和多处理之间的区别
- 一个系统既可以通过同时运行多个程序来进行多重编程,也可以通过拥有多个物理处理器来进行多重处理。 多处理和多编程之间的区别在于,多处理基本上是在多个处理器上同时执行多个进程,而多编程是将多个程序保留在主存储器中,并仅使用单个 CPU 并发执行它们。
- 多处理通过并行处理发生,而多编程通过从一个进程切换到另一个进程发生(称为上下文切换的现象)。
3、多任务处理
顾名思义,多任务是指一次执行多个任务(例如进程、程序、线程等)。 在现代操作系统中,可以同时播放 MP3 音乐、在 Microsoft Word 中编辑文档、浏览 Google Chrome,这都是通过多任务来完成的。多任务处理是多编程的逻辑扩展。 多任务与多编程的主要区别在于,多编程仅基于上下文切换的概念,而多任务基于时间共享以及上下文切换的概念。
多任务系统的工作
- 在分时系统中,每个进程都被分配了一些特定的时间段,一个进程要在这段时间内执行。假设有 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 播放器示例:
多线程的优点
- 多线程的好处包括提高响应能力。 由于程序中有多个线程,因此如果一个线程执行时间过长或被阻塞,其余线程继续执行没有任何问题。 因此,整个程序通过剩余线程保持对用户的响应。
- 多线程的另一个优点是成本较低。 创建全新的进程并分配资源是一项耗时的任务,但由于线程共享父进程的资源,因此创建线程并在它们之间切换相对容易。 因此,多线程是现代操作系统的需要。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/264190.html