在多处理器系统上使用多个线程进行处理。他们是如何工作的?

时间:2014-05-07 17:45:15

标签: multithreading process operating-system

所以我正在阅读有关进程和线程的内容,我有一个问题。以下是该方案。

单处理器环境

据我所知,操作系统会在处理器上旋转特定时间段的进程。(量子)。现在我在进程是单线程时得到它,即只有一条执行路径。在这种情况下,无论何时为其分配处理器,它都会继续执行。让我们说进程分叉和/或只是创建一个新线程。现在整个过程如何运作?操作系统会说处理P“继续执行,继续执行”并且内部的进程将在轮换时选择新线程或父线程?因此,如果有两个以上的线程,则每个线程的轮换似乎都是公平的。或者OS实际上是否与线程交互? (在这种情况下,我不确定会发生什么)。

多处理器环境

现在说我有一个多处理器环境。现在在这种情况下,如果只有单线程进程,那么操作系统将为其分配任一个处理器,并在其上执行它。现在说,流程中有多个线程。现在,如果我将一个处理器分配给进程,并要求它继续执行,并且进程必须选择其中一个线程执行,那么在该特定进程中永远不会进行并行处理。由于该过程必须将其中任何一个线程放在处理器上。

那么两种情况都会如何发生?

干杯。

3 个答案:

答案 0 :(得分:1)

进程预定

操作系统最终控制这些类型的线程调度。

Windows系统是基于优先级的,因此允许进程消耗更多其他资源。这就是为什么如果某个流程已升级到高优先级,您的计算机可以“挂起”的原因。据我所知,优先级介于1-31之间。

Mac OS / Linux / Unix是基于时间的,允许所有进程拥有相同的CPU时间。因此,加载更多进程会降低系统速度,因为它们共享较小的执行时间。

单处理器环境

操作系统最终负责此事,但转换过程涉及(我不能保证这里的准确性,但它只是一个指示):

  • 停止进程/线程
  • 存储当前堆栈(代码位置)
  • 存储CPU的当前寄存器
  • 要求内核运行下一个进程/线程
  • 内核指示必须运行哪一个
  • 操作系统从缓存重新加载寄存器
  • 操作系统为下一个应用程序重新加载当前堆栈。
  • 恢复过程

显然,运行的线程和进程越多,它就越慢。问题是切换进程所花费的时间实际上比执行进程所允许的时间要长。

线程只是单个进程的子进程。对于单个处理器,它看起来就像是额外的工作。

多处理器环境

多处理器环境的工作方式不同,因为缓存在处理器之间共享。我相信这些被称为L1(级别)和L2缓存。所以区别在于处理器A可以重新加载处理器B存储的状态而不会发生冲突。 '超线程'也有相同的方法,虽然这是特定于处理器的。这里的不同之处在于处理器可以单独控制特定的进程 - 这被称为“CPU亲和力”。它并不鼓励每个进程,但它确实允许应用程序有一个专用的处理器来解决。

答案 1 :(得分:0)

这当然是特定于操作系统的,但大多数操作系统都是在线程级别安排的。进程只是一组线程。例如,在Linux上,线程被称为"任务"每个都是独立安排的。它们是使用clone调用创建的。通常称为线程的任务是与创建任务共享其地址空间(以及其他资源,如文件描述符,挂载点等)。请注意,如果未传递启用共享的标志,clone调用也可以创建通常称为进程的内容。

考虑到上述情况,任何线程都可以随时在任何处理器上进行调度,无论有多少处理器可用。也就是说,大多数操作系统也试图保持一定程度的处理器亲和性,以避免过多的缓存未命中,但通常如果一个线程可以运行并且有不同的CPU可用,它将改变CPU。通常还有一种方法可以指定特定线程可以在哪些CPU上执行。

答案 2 :(得分:0)

是否有1或128个处理器无关紧要。操作系统管理对资源的访问,以尝试有效地匹配具有可用性的请求,并且包括CPU执行。如果一个线程正在运行,它已经设法获得了一些CPU,但是,如果它请求一个不能立即可用的资源,它将不再需要任何CPU,直到其他资源变为空闲,因此操作系统将从中删除CPU执行它,如果还有另一个等待CPU的线程,它将把它交给它。当请求的资源可用时,该线程将再次准备就绪。如果有一个核心空闲,它将被“立即”运行,如果没有,CPU调度算法决定是否停止当前正在运行的线程以释放核心或让新准备好的thrad等待。

最好尝试忽略诸如“时间片,量子,优先级”之类的东西 - 它会引起很多混乱和FUD。如果一个正在运行的线程想要它还没有它的东西,它就不再需要CPU周期了,操作系统会将它们带走,如果另一个线程需要它,则将它们应用于那里。这就是为什么存在抢先式多任务的原因 - 将线程与资源相匹配以试图最大化前进。