multithreading - CPU时间片的可调度单位是进程还是线程?

标签 multithreading process operating-system cpu-architecture scheduling

我想澄清一下“CPU时间片的可调度单位”是“进程”还是“线程”(内核管理的线程)。我所说的“CPU时间片的可调度单位”是指操作系统的CPU调度器分配CPU时间片的单位。

根据维基百科中的“Short-term scheduling”,process用于指代可调度单元。

"This scheduler can be preemptive, implying that it is capable of forcibly removing processes from a CPU when it decides to allocate that CPU to another process"

此外,根据维基百科中的“Time slice”,

"The scheduler is run once every time slice to choose the next process to run."

此外,根据维基百科中的“Thread”,

"a process is a unit of resources, while a thread is a unit of scheduling and execution"

根据微软文档中的“Processes and Threads”,

"A thread is the basic unit to which the operating system allocates processor time."

根据quora中的“Is thread scheduling done by the CPU, kernel, or both?”,

"The CPU (hardware) just carries out instructions. The CPU itself has no concept of threads or scheduling, although there may be features in the CPU that support them.

"The operating system kernel (a set of instructions, aka software) executes on the CPU (hardware). A scheduling algorithm in the kernel of the operating system chooses which thread to execute next, and directs the CPU to begin executing the next instruction in that chosen thread".

最佳答案

澄清:我对“CPU时间片的可调度单元”的理解是“在给定的CPU时间片内可以调度的单元”(因为如果“可调度单元”是一个时间那么这个问题对我来说没有多大意义)。

基于此,简单地说,给定逻辑核心的“CPU时间片的可调度单位”可以被视为一个软件线程(更具体地说,它的执行上下文由寄存器和进程组成)信息)。


操作系统调度程序对任务进行操作。任务可以是线程、进程或其他不寻常的结构(例如数据流)。

现代主流操作系统主要在处理单元上调度线程(通常是硬件线程也称为逻辑核心)。您可以在 Microsoft documentation 中获取有关 Windows 调度程序如何工作的更多信息。 。文档明确指出:

A thread is the entity within a process that can be scheduled for execution

在 Linux 上,默认调度程序 CFS ,运行于 task (即task_struct数据结构)。任务可以是一个线程、一组线程或一个进程。这样做是为了使调度程序更加通用,也因为这个调度程序是很久以前设计的,当时处理器只有 1 个核心,人们关注的是进程而不是线程。此后的多核时代导致应用程序使用大量线程,以便使用可用的核心。因此,现在,据我所知,实际调度的通常是线程。著名研究论文The Linux Scheduler: a Decade of Wasted Cores对此进行了解释。 (这也解释了 CFS 如何针对目标处理器进行操作)。

请注意,术语“进程”有时可以指线程,因为线程有时称为“轻量级进程”,而基本进程有时称为“重型进程”。进程甚至可以是重型和轻量级进程(即线程和实际进程)的通用术语。这是一个非常令人困惑的术语和语言的误用(就像有时用于核心的术语“处理器”)。实际上,这在特定上下文中通常不是问题,因为线程和进程可以互换使用(在这种情况下,人们应该使用“任务”等通用术语)。

至于“CPU时间片的可调度单位”,这就有点复杂了。一个简单而幼稚的答案是:一个线程(它绝对不是单独的进程)。话虽这么说,线程是一个软件定义的概念(就像进程一样)。它基本上是一个堆栈、几个寄存器和一个父进程(可能带有一些元信息和 TLS 空间)。 CPU 不直接对此类数据结构进行操作。例如,CPU 没有线程堆栈的概念(它只是虚拟进程内存的一部分)。他们只需要一个由寄存器和进程配置组成的执行上下文(在 protected mode 中)。为了简单起见,我们可以说它们执行线程。现代主流 x86 处理器非常复杂,每个核心通常能够同时运行多个线程。这称为simultaneous multithreading (又名:英特尔处理器的超线程)。 x86 物理核心通常由两个逻辑线程(即硬件线程)组成,每个逻辑线程可以执行一个软件线程。

关于multithreading - CPU时间片的可调度单位是进程还是线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72423227/

相关文章:

java - 如何释放信号量并让任何线程继续运行?

java - 在单独的 Android 线程上调用时,emit 不起作用

c++ - dumping Core 时 Heap snapshot 的时间

Delphi - 如何通过知道进程的路径来终止进程?

Java、子进程和未读输出流 : When does it deadlock?

c - 使用 read() 将文件内容写入屏幕和 C 中的其他文件的问题

c# - 如何创建一个立即启动的线程(即使有很多线程就绪)?

Java 进程在 GC 之前停止

operating-system - 存储和检索进程控制 block

operating-system - 当页面错误发生时,操作系统从哪里获得所需的磁盘地址?