CPU时间片是进程还是线程的可调度单元?

尹锡哦

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

根据维基百科中的“短期调度”,进程用于指代可调度单元。

“这个调度程序可以是抢占式的,这意味着当它决定将 CPU 分配给另一个进程时,它能够强制从 CPU中删除进程

另外,根据维基百科中的“时间片”,

“调度程序在每个时间片运行一次,以选择下一个要运行的进程。”

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

进程是资源的单位,线程调度和执行的单位”

根据微软文档中的“进程和线程”,

线程是操作系统分配处理器时间的基本单位。”

根据“线程调度是由 CPU、内核还是两者都完成? ”在 quora 中,

“CPU(硬件)只是执行指令。CPU 本身没有线程或调度的概念,尽管 CPU 中可能有支持它们的功能。

“操作系统内核(一组指令,又名软件)在 CPU(硬件)上执行。操作系统内核中的调度算法选择下一个要执行的线程,并指示 CPU 开始执行下一条指令选择的线程“。

杰罗姆·理查德

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

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


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

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

线程是进程中可以调度执行的实体

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章