- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我问是因为我记得所有属于内核的物理页面都固定在内存中,因此不可交换,就像这里所说的:http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt
但是,我正在阅读一篇研究论文,并感到困惑,因为它说,“(物理)页面经常在内核数据段和用户空间之间移动。”
它还提到,相比之下,物理页面不会在内核代码段和用户空间之间移动。
我想如果一个物理页有时属于内核数据段有时属于用户空间,那一定意味着属于内核数据段的物理页是可交换的,这与我目前的理解不符。
那么,属于内核数据段的物理页是可交换的吗?不可交换?
附言该研究论文可在此处获取: https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf
请搜索“move between”,您会找到它。
附言再次,[3G + 896M]到4G的虚拟内存区域属于内核,用于映射ZONE_HIGHMEM(x86 32位Linux,3G + 1G设置)中的物理页面。在这种情况下,内核可能首先将该区域中的一些虚拟页面映射到托管当前进程页表的物理页面,修改一些页表条目,并取消映射虚拟页面。这样,物理页面可能有时属于内核,有时属于用户空间,因为它们在取消映射后不属于内核,因此变得可交换。是这个原因吗?
最佳答案
tl;dr - 内存池和交换是不同的概念。你不能从一个中扣除另一个。
kmalloc()
和其他内核数据分配来自 slab/slub 等。内核为用户空间获取数据的相同位置。因此 页面经常在内核数据段和用户空间之间移动。这是对的。它没有说任何关于交换的事情。那是一个单独的问题,您无法推断出任何东西。
内核代码通常在启动时填充并标记为只读,之后永远不会更改。因此,物理页面不会在内核代码段和用户空间之间移动。
为什么你认为因为某些东西来自同一个池子,所以它是一样的?网络套接字也来自同一个内存池。这是一个关注点分离。 linux-mm(内存管理系统)处理交换。可以固定页面(不可交换)。检查静态内核内存(这可能包括 .bss 和 .data)是一个简单的范围检查。内存通常在 linux-mm 层固定并标记为不可交换。 linux-mm 可以将用户数据(其分配来自同一个池)标记为可交换。例如,即使没有交换,用户空间文本仍然是可交换的,因为它由 inode 支持。对于只读数据,缓存要简单得多。如果数据被交换,它在 MMU 表中被标记为这样,并且故障处理程序必须区分交换和 SIGBUS;这是 linux-mm 的一部分。
还有 no-mm(或没有 MMU)的 Linux 版本,这些版本永远不会交换任何东西。理论上,有人可能能够交换内核数据;但为什么它在内核中? Linux 方式是使用模块 并且只在需要时加载它们。当然,linux-mm 数据是内核数据,希望您能看到交换它的问题。
像这样的概念题的问题,
可以肯定的是,linux-mm 代码是不可交换的,也不是任何中断处理程序。在某个时间点,内核代码和/或数据可能会被交换。我认为这不是模块加载/卸载之外的当前情况(关于您是否称其为 swapping 是相当迂腐/深奥的)。
关于linux - 在Linux中,属于内核数据段的物理内存页是否可交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738696/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!