- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
考虑一个使用大量页面大小的内存区域(比如 64 kB 左右)的程序,每个内存区域的生命周期都相当短。 (在我的特定情况下,这些是绿色线程的备用堆栈。)
如何最好地分配这些区域,以便在该区域不再使用时可以将它们的页面返回给内核?天真的解决方案显然是简单地 mmap
每个区域,并在完成后立即再次 munmap
它们。不过,我觉得这是个坏主意,因为它们太多了。我怀疑 VMM 可能会在一段时间后开始严重扩展;但即使不是,我仍然对理论案例感兴趣。
如果我只是 mmap
我自己一个巨大的匿名映射,我从中按需分配区域,有没有办法通过该映射为我完成的区域“打洞” ?有点像 madvise(MADV_DONTNEED)
,但不同之处在于页面应该被视为已删除,因此内核实际上不需要将它们的内容保留在任何地方,而是可以在它们被删除时重用归零页面再次出错。
我正在使用 Linux,在这种情况下,我不会为使用特定于 Linux 的调用而烦恼。
最佳答案
我在某个时候对这个主题做了很多研究(用于不同的用途)。在我的例子中,我需要一个人口稀少的大型散列图 + 不时将其归零的能力。
mmap
解决方案:
最简单的解决方案(可移植,madvise(MADV_DONTNEED)
是特定于 Linux 的)将这样的映射置零是到 mmap
它上面的一个新映射。
void * mapping = mmap(MAP_ANONYMOUS);
// use the mapping
// zero certain pages
mmap(mapping + page_aligned_offset, length, MAP_FIXED | MAP_ANONYMOUS);
最后一次调用在性能方面等同于后续的 munmap/mmap/MAP_FIXED
, 但它是线程安全的。
在性能方面,此解决方案的问题在于页面必须在后续写访问时再次出现故障,这会发出中断和上下文更改。这只有在一开始就出现故障的页面很少的情况下才有效率。
memset
解决方案:
如果必须取消映射大部分映射,在获得如此糟糕的性能后,我决定使用 memset
手动将内存归零。 .如果大约超过 70% 的页面已经出现故障(如果不是,它们发生在第一轮 memset
之后),那么这比重新映射这些页面要快。
mincore
解决方案:
我的下一个想法是实际上只有 memset
在之前出现故障的那些页面上。此解决方案不是线程安全的。打电话mincore
确定页面是否出现故障,然后有选择地 memset
它们为零是一个显着的性能改进,直到超过 50% 的映射出现故障,此时 memset
整个映射变得更简单(mincore
是一个系统调用,需要一个上下文更改)。
incore 表解决方案:
然后我采用的最后一种方法是拥有自己的核心表(每页一位),说明自上次删除后是否使用过它。这是迄今为止最有效的方法,因为您实际上只会将实际使用的每一轮中的页面归零。它显然也不是线程安全的,需要您跟踪哪些页面已写入用户空间,但如果您需要这种性能,那么这是迄今为止最有效的方法。
关于c - 是否可以通过 mmap 匿名内存访问 "punch holes"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21722545/
我有一些如果查询。它必须有点像媒体查询。在某种程度上,它起作用了,但是Grunt打印出了一个错误,称为: Unexpected token: punc ({). 这是我的jQuery代码段: $(do
我有一个使用 TCP 连接进行通信的服务器-客户端程序。多个客户端可以同时连接到服务器。我想在这个系统上实现tcp hole punching。 在客户端,它调用公共(public)服务器来查找我的服
为了获得某种可靠的行为,我已经有几天没玩过打洞了,但我现在陷入了死胡同。 UDP 打洞效果很好:只需先向远程发送一个数据包,然后让远程发送一个数据包,因为它将通过源 NAT 到达。根据我的尝试,它相当
我想实现一个 autoprefixer Punch 的预处理器静态站点生成器。 但是,按照 Punch 的说法,我不确定这是否符合编译器、压缩器等条件。我已经尝试了上述所有方法,但都无济于事。 这是我
我正在使用 JQuery UI Touch Punch,就像我在 this JSFiddle 中使用它一样.我搜索了很多地方以弄清楚 event 和 ui 包含什么,但我找不到相关信息。 是否缺少某种
我正在使用 JQuery Draggable 函数和 Touch Punch 来生成可以通过单击和拖动来滚动的水平 slider 列表。它适用于触摸和点击设备。我面临的问题是,如果我尝试在触摸设备中向
我正在尝试在 Graphics2D 渲染器上创建 Punch Out 效果。 我有一个黑色的矩形。文本颜色为红色。我希望能够将颜色设置为 0x00FF0000 并让它从背景中“冲出”。 Gra
这个问题在这里已经有了答案: Create a transparent hole inside a window's background - WPF (2 个答案) 关闭 4 年前。 我现在开始使
我对我在 Paul Irish 的博客上第一次遇到的“打鸭子”模式有疑问。我得到了一般前提...将引用保存到现有函数,然后用条件分支替换现有函数,如果满足条件,则调用新函数,否则调用旧版本。我的问题是
考虑一个使用大量页面大小的内存区域(比如 64 kB 左右)的程序,每个内存区域的生命周期都相当短。 (在我的特定情况下,这些是绿色线程的备用堆栈。) 如何最好地分配这些区域,以便在该区域不再使用时可
我正在尝试使用 jquery-ui sortable(),该函数必须适用于移动设备和台式计算机。 当我在笔记本电脑上使用鼠标按钮或触摸屏时,sortable() 可以正常工作,但在移动设备上则不行。
我有一个文本框,其中输入了逗号分隔/分隔的值,我必须确保其中的条目是唯一的。解决了使用 Paul Irish's Duck Punching example #2并将其绑定(bind)到该文本框的 o
我对 jQuery UI Touch Punch 有疑问。我可以很好地拖动所有内容,但是当我使用 css3 的“translsateY”时,它可以在计算机上运行,但不能在 iPad 上运行。该元素
我有一个彩色背景和一个位于该背景之上的元素。通过使用 CSS 定位完成。 我的想法是让被 lorem ipsum-text 覆盖的区域基本上“消失”。这样背景橙色和 Jade 米丝就会出现。 有人会说
我不确定为什么每次通过 jQuery UI 调用 setData 和 getData 时都是未定义的。 我在做 $(`#selector`).draggable({ start
我想在 C# 中进行 TCP 打洞(NAT 遍历)。如果需要,可以使用会合服务器来完成。我找到了 http://sharpstunt.codeplex.com/但无法让它发挥作用。理想情况下,我需要一
在 DelayedJob 中,我们可以在控制台上使用 Delayed::Job.all 来列出队列中的所有作业。有没有办法使用 SuckerPunch gem 做同样的事情? 最佳答案 要获取有关队列
我花了一点时间,但我发现我无法点击我的输入,因为我使用 touch.punch 脚本在触摸设备上启用 jquery UI 拖动功能。熟悉此脚本的任何人都知道为什么会这样吗?表单实际上位于父对象的树的下
我遇到了无法追踪的问题。我正在使用Revolution Slider我不断收到 jQuery 错误: ▼ Uncaught TypeError: Cannot read property 'leng
我尝试解释我的问题和行为。 在您的智能手机上输入 touchpunch vertical slider demo-page ( http://touchpunch.furf.com/content.p
我是一名优秀的程序员,十分优秀!