用于进程创建的 UNIX 系统调用 fork() 通过复制父进程来创建子进程。我的理解是,这之后几乎总是调用 exec() 来替换子进程的内存空间(包括文本段)。在 fork() 中复制父级的内存空间对我来说总是很浪费(尽管我意识到可以通过使内存段在写时复制从而只复制指针来最小化浪费)。无论如何,有谁知道为什么流程创建需要这种复制方法?
我在很多地方读到 Linux 为 Java VM 中的每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:
我说的是后一种。)
内核线程是否与内核进程相同,因为 Linux 进程支持父子进程之间的共享内存空间,还是真的是一个不同的实体?
我正在尝试了解完全公平调度程序 (CFS)。根据Linux 内核开发中的Robert Love ,第 3 版(斜体他的,粗体我的):
CFS 不是为每个进程分配一个时间片,而是根据可运行进程总数计算进程应该运行多长时间。CFS 不使用 nice 值来计算时间片,而是使用 nice 值来加权进程将接收的处理器比例:较高值(较低优先级)的进程相对于默认 nice 值接收分数权重,而较低值(更高的优先级)进程获得更大的权重。
然后每个进程运行一个“时间片”,该时间片与其权重除以所有可运行线程的总权重成正比。为了计算实际时间片,CFS 为其在完美多任务处理中“无限小”调度持续时间的近似值设定了目标。这个目标称为目标延迟......让我们假设目标延迟是 20 毫秒,并且我们有两个具有相同优先级的可运行任务。无论这些任务的优先级如何,每个任务都会运行 10 毫秒,然后抢占另一个。如果我们有四个相同优先级的任务,每个任务将运行 5 毫秒。如果有 20 个任务,每个任务将运行 1 毫秒....
现在,让我们再次考虑两个可运行进程的情况,除了有不同的 nice 值——比如说,一个使用默认的 nice 值(零),另一个的 nice 值为 5。这些 nice 值具有不同的权重,因此我们的两个进程接收处理器时间的不同比例。在这种情况下,权重对 nice-5 过程产生大约 1/3 的惩罚。如果我们的目标延迟再次是 20 毫秒,我们的两个进程将分别收到 15 毫秒和 5 毫秒的处理器时间。
第一个粗体句子表示无论优先级如何,任务都具有相同的时间片,而第二个表示时间片取决于 nice 值。哪个是正确的,或者我错过了什么?
Unix 进程调度程序本身是一个进程,还是像系统调用一样(在用户进程中运行内核代码并设置内核位)那样搭载在其他进程上?
我知道,出于调度目的,Linux 进程具有“nice”值和实时优先级值,并且可以使用nice和chrt命令显式更改这些值。如果用户没有明确设置一个进程的实时优先级,它是如何设置的?
linux ×3
process ×3
scheduling ×3
priority ×2
fork ×1
kernel ×1
linux-kernel ×1
nice ×1
thread ×1