【问题标题】:OS Process Scheduling - What effect does a kernel system call have on a process scheduler?操作系统进程调度 - 内核系统调用对进程调度器有什么影响?
【发布时间】:2022-01-24 17:54:07
【问题描述】:

这个问题与正在运行的进程执行系统调用有关,以及调度程序如何受到影响。

  1. 假设我有一个进程当前处于运行状态。
  2. 它决定需要对内核 API 进行系统调用(例如,访问磁盘)。
  3. 进程进入阻塞状态。调度程序选择一个挂起的进程并让它运行。

我的问题是 - 如果其他进程现在正在 CPU 上运行,系统调用何时/在哪里执行?还是调度器会等到系统调用完成后再选择运行挂起的进程?

还有一个额外的问题 - 无论你给出什么答案,通用操作系统和 RTOS 都是这种情况,还是后者不同(因为任何 RTOS 调度程序对时间更敏感并实现确定性性能)。

【问题讨论】:

  • '系统调用何时/何地被执行?'好吧,事实并非如此。它不会完成它的执行并返回,直到它准备好/在磁盘硬件的 I/O 完成中断后再次运行。

标签: process operating-system scheduler freertos rtos


【解决方案1】:

在现代 x86-64 上,如果用户模式进程发出系统调用请求磁盘上的数据,操作系统会将磁盘操作置于 AHCI 或 NVME PCI 主机控制器的操作队列中。这两个都是 DMA 的 PCI-Express 设备。操作系统本身也持有各种数据结构,以确定哪个操作属于哪个进程等。

操作系统通过内存映射 IO 请求 PCI 设备执行操作,然后将进程放入阻塞队列并等待 MSI/MSI-X 中断,其作用类似于处理器间中断,因为它绕过 IOAPIC 直接触发在特定 CPU 内核的 IDT 中找到的处理程序,可以通过使用 PCI 设备 (AHCI/NVME) 的 PCI 寄存器中的 MMIO 更改某些设置来指定该处理程序。

有关更多信息,请在此处查看我的回答:https://cs.stackexchange.com/questions/142525/data-transfer-between-cpu-ram-and-secondary-storage/142553#142553

【讨论】:

  • 不错的细节:)
  • 很好的答案,谢谢。后续问题:这与 RTOS 上的流程相同吗?系统调用是否能够通知正在运行的进程操作队列的长度,这样,如果队列很长并且预计会发生 RTOS 超时,为了确定性性能,进行系统调用的进程可以选择,不进行系统调用并做一些替代?
  • 编辑:当然可以选择在进行实际系统调用之前检查队列的长度,但我看到的问题是,如果有上下文切换在长度检查系统调用之后,一旦进程再次运行并准备执行实际的磁盘 I/O 系统调用,将导致有关队列长度的信息过时。在一般操作系统中,这可能不是问题,但我特别考虑的是 RTOS 和确定性性能。
  • 我不确定 RTOS。我主要回答了您问题的第一部分,也许有人可以添加有关 RTOS 等的内容。
猜你喜欢
  • 2014-02-18
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2010-10-16
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多