【问题标题】:Would Linux kernel send signal to the process when the process need to do swapping当进程需要交换时,Linux内核会向进程发送信号吗
【发布时间】:2021-06-22 10:00:51
【问题描述】:

最近在学习操作系统。我有一些关于交换过程的问题。

由于有限的物理内存限制,我知道当我们想将一个新程序加载到物理内存时,内核不会将整个程序加载到物理内存中。

这是我的问题:

  1. 当一个进程遇到页面错误,并且该进程需要进行交换时。内核会传递一个信号来通知该进程吗?如果是,进程会收到什么信号?

  2. 与第一个问题类似,有时我们想将新程序加载到物理内存中。但是,由于物理内存的限制,我们需要从物理内存中换出一些进程。内核会向那些将要被换出的进程发送信号吗?如果是,那些被处理的会收到什么信号?

任何详细的解释将不胜感激。 如果有任何有用的链接,我也将不胜感激。

感谢大家提前回复。 :))

【问题讨论】:

  • 1. 不; 2. 不会。但是如果内核内存不足(包括交换空间),它可能会杀死一些进程。
  • @lan Abbott,你知道内核为什么不向进程传递任何信号吗?是因为性能吗?
  • 因为不需要这样的信号。该进程存在于虚拟内存的世界中。

标签: linux linux-kernel


【解决方案1】:

由于您正在学习这些概念,我认为您应该得到更详细的答案。今天的操作系统将“虚拟内存”(VM)的抽象呈现给用户空间应用程序。本质上,它是一个 n 位虚拟地址空间,其中每个页面都可以取消映射,或者使用 rwx 权限进行映射。在内部,操作系统可以更改实际页面权限(请参阅写时复制/去重页面),甚至不映射它们(按需分页)。条件是用户空间看不到这些,并且每当它访问具有正确权限的映射页面时,它(最终)会看到正确的数据。

交换是弥合抽象(47 位虚拟内存)和现实(小得多的 DRAM)之间差距的操作系统操作之一。正如您正确指出的那样,当 DRAM 不足时,操作系统可以暂时将一些页面移动到磁盘,并在需要时将它们移回。请注意,VM 抽象忽略了这一点,并且任何操作系统交换操作​​都应该对用户空间不可见。因此,操作系统在不通过信号告知用户空间的情况下换出页面(将它们移动到磁盘)和换入页面(磁盘到内存)。

直接回答您的问题:

  1. 没有。换出的页面仍然期望被用户空间合法地映射。操作系统将隐藏页面错误,换入页面并恢复用户空间进程。

  2. 操作系统将静默换出页面以回收内存,除非内存短缺严重到需要终止进程。顺便说一句,在换出用户内存之前,内核将尝试其他方法来回收内存,例如减小内核缓冲区的大小。在没有进程被杀死的公共页面中,不会发出任何信号。

抽象的原因如下:(i) 它简化了应用程序开发,(ii) 应用程序在不同的硬件平台上运行相同,(iii) 操作系统添加的新功能不会制作应用程序过时了。

以上是一个简化:内核确实为程序提供了一个 API 来管理自己的内存 (see this)。由于特定于应用程序的访问模式和性能要求,此 API 对于希望实施自己的交换策略的数据库和浏览器等程序非常有用。

【讨论】:

  • 嗨@TSG,非常感谢您的详细解释!根据您的解释,我可以假设操作系统不会发送任何信号(在进行换入/换出时)来处理的原因是因为我们希望该进程仍然具有它仍然具有那些的“错觉”内存中的页面,对吧?
  • 另外,是不是为了性能,我们希望这些操作对用户空间不可见?
  • 如果我们修改了操作系统,并在执行这些操作时强制发送信号进行处理。操作系统的性能会被严重削减吗?
  • 计算机系统通常建立在抽象的原则之上,在隐藏实现细节的同时呈现一致的视图。操作系统对用户空间隐藏这些操作的主要原因是为了抽象。在绝大多数情况下,这显着简化了应用程序开发人员的工作。
  • 在编写“hello world”程序时,或者在编写pdf阅读器(例如)时,应用程序开发人员可以假设一个简单的、无限的虚拟地址空间,而不必考虑各种影响实际页面分配的操作系统机制:分页/交换、请求分页、透明大页面、COW 页面、文件支持页面等。此外,如果操作系统实现了新的优化,用户不必改变他们的程序来处理新的信号,它都是透明地处理的。
猜你喜欢
  • 2019-04-11
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2017-01-20
相关资源
最近更新 更多