Linux内核中的进程管理

问题描述 投票:0回答:1

我一直在研究Linux内核的子系统。那里写着Linux内核负责上下文切换(让另一个进程使用CPU)。以下是内核执行上下文切换的步骤:

  1. CPU(实际硬件)基于在内部计时器上,切换到内核模式,并进行手动控制回到内核。
  2. 内核记录CPU和内存的当前状态,其中对于恢复刚刚中断的过程至关重要。
  3. 内核执行在前一个时间片(例如,从输入和输出中收集数据,或I / O,操作)。
  4. 现在内核准备好让另一个进程运行。内核分析准备运行的进程列表,然后选择一个。
  5. 内核为这个新进程准备了内存,然后准备了CPU。
  6. 内核告诉CPU新进程需要多长时间会持续。
  7. 内核将CPU切换到用户模式,并手动控制CPU到进程。

我的问题是我听不懂上面的第三步。有人可以说明一下这句话吗?谢谢!

linux linux-kernel operating-system multitasking
1个回答
0
投票
  1. CPU(实际硬件)基于内部计时器中断当前进程,切换到内核模式,并将控制权移交给内核。

大多数任务切换是由任务阻塞引起的(因为它们必须等待互斥量,磁盘IO,用户IO,最终用户操作等)。>>

最好(更准确地说,“某事”(IRQ,系统调用)会导致在内核决定要执行任务切换之前切换到内核的代码,并且该“某事”不属于内核的一部分)。任务切换本身。

  1. 内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要。

排序。因为“某物”(IRQ,系统调用)会导致在内核决定执行任务切换之前切换到内核代码。所有任务仅在内核代码(针对一个任务)和内核代码(针对另一任务)之间切换。因为任务切换只能从内核代码切换到内核代码;任务开关本身不需要关心用户空间内存(这对于内核代码而言并不重要)或内核内存(由所有CPU和所有虚拟地址空间共享/共享)。更多;因为有些寄存器是“被调用者保留的”(通过C调用约定),而有些寄存器是“就内核而言是恒定的”(例如,段寄存器),所以任务切换代码也不需要关心CPU状态的各个部分。

  1. 内核执行上一个时间段内可能发生的任何任务(例如,从输入和输出或I / O操作中收集数据)。

也不是任务切换的一部分(更多“内核决定执行任务切换之前或之后发生的事情”)。

  1. 现在内核准备好让另一个进程运行。内核分析准备运行的进程列表,然后选择一个。

排序;但是它并不像列表那样简单,有时(例如,高优先级的实时线程取消阻止并抢占了次要的任务),内核无需执行任何其他操作即可知道需要切换到哪个任务。

  1. 内核为这个新进程准备了内存,然后准备了CPU。

用于记忆;内核通常只会加载新的“对新任务的虚拟地址空间的引用”(例如80x86上的单个mov cr3, ...指令)。对于CPU状态,这与上面的“ 2. The kernel records the current state of the CPU ...”相反(正在加载以前保存的内容,其中某些CPU状态未加载且未保存)。

  1. 内核告诉CPU新进程的时间片将持续多长时间。

  1. 内核将CPU切换到用户模式,并将CPU的控制权交给进程。

不是。最好(更准确地说)是在内核完成任务切换之后,新任务的内核代码会执行所需的任何操作(并最终可能返回用户空间)。并且“任务切换完成后发生的事情”不属于任务切换的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.