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

Multithreading 在多处理器系统上使用多线程进行处理。它们是如何工作的?,multithreading,process,operating-system,Multithreading,Process,Operating System,所以我在读关于进程和线程的书,我有一个问题。以下是场景 单处理器环境 我知道操作系统会在特定的时间段内在处理器上旋转进程。现在,当进程是单线程的(即只有一条执行路径)时,我得到了它。在这种情况下,无论何时分配处理器,它都会继续执行。假设进程分叉,或者只是创建了一个新线程。那么整个过程是如何运作的呢?是操作系统会对进程P说“继续,继续执行”,而进程本身会轮流选择新线程还是父线程?因此,如果有两个以上的线程,那么旋转对每个线程都是公平的。或者操作系统实际上是与线程交互的?(在这种情况下,我不确定会发

所以我在读关于进程和线程的书,我有一个问题。以下是场景

单处理器环境

我知道操作系统会在特定的时间段内在处理器上旋转进程。现在,当进程是单线程的(即只有一条执行路径)时,我得到了它。在这种情况下,无论何时分配处理器,它都会继续执行。假设进程分叉,或者只是创建了一个新线程。那么整个过程是如何运作的呢?是操作系统会对进程P说“继续,继续执行”,而进程本身会轮流选择新线程还是父线程?因此,如果有两个以上的线程,那么旋转对每个线程都是公平的。或者操作系统实际上是与线程交互的?(在这种情况下,我不确定会发生什么)

多处理器环境

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

那么,这两种情况是如何发生的呢


干杯。

这当然是特定于操作系统的,但大多数操作系统都是在线程级别进行调度的。进程只是一组线程。例如,在Linux上,线程称为“任务”,每个线程都是独立调度的。它们是通过
clone
调用创建的。通常称为线程的任务是与创建任务共享其地址空间(以及其他资源,如文件描述符、装入点等)的任务。请注意,
clone
调用还可以创建一个进程,如果没有传递启用共享的标志,则通常称之为进程

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

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

Windows系统是基于优先级的,因此允许进程消耗比其他进程更多的资源。这就是为什么当进程升级到高优先级时,您的机器会“挂起”。据我所知,优先级在1-31之间

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

单处理器环境 操作系统对此负有最终责任,但切换过程涉及(我不能保证准确性,但这只是一个指示):

  • 停止进程/线程
  • 存储当前堆栈(代码位置)
  • 存储CPU的当前寄存器
  • 请求内核运行下一个进程/线程
  • 内核指示必须运行哪一个
  • 操作系统从缓存中重新加载寄存器
  • OS为下一个应用程序重新加载当前堆栈
  • 恢复该过程
显然,您运行的线程和进程越多,它就会变得越慢。问题是切换进程所花费的时间实际上可能比允许执行进程的时间更长

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

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

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


最好试着忽略诸如“时间片、数量、优先级”之类的事情——这会导致很多混乱和FUD。如果一个正在运行的线程想要一些它还不能拥有的东西,它就不需要更多的CPU周期,操作系统会把它们拿走,如果另一个线程需要,就在那里应用它们。这就是为什么存在先发制人的多任务处理器——将线程与资源相匹配,以最大限度地向前推进。

Linux也是基于优先级的:“所有调度都是先发制人的:如果