我正在研究此处定义的 malloc 的实现:
http://www.inf.udec.cl/~leo/Malloc_tutorial.pdf .
作者创建了一个自然对齐 4 字节边界的元数据结构,然后将 x 字节的请求对齐到元数据结构之后的 4 字节边界,该元数据结构有效地充当 block 的 header 。 pdf 指出,由于元数据和请求现在已对齐,因此生成的数据将完全对齐。 如果对 sbrk() 的第一次调用返回与 4 字节边界对齐的堆基地址,则结果有效。 sbrk() 是否总是在初始调用中返回 4 字节(或 64 位系统中的 8 字节)对齐地址?
最佳答案
standard for brk and sbrk明确不指定返回的地址是否以任何方式对齐。在 Mac OS X(可能还有其他 BSD 系统)上,大小/地址是页面对齐的,但在 Linux 上,没有这样的舍入发生,可以很容易地用这个小程序测试:
#include <unistd.h>
#include <stdio.h>
int main() {
void *p;
p = sbrk(0);
printf("Initial brk: %p\n", p);
p = sbrk(1); // Increase the brk (returns OLD brk!)
p = sbrk(0); // Get the new brk
printf("New brk: %p\n", p);
return 0;
}
在我的一个系统上,输出是:
Initial brk: 0x602000
New brk: 0x602001
但是您要求进行初始 通话。 Linux 手册页指出:
brk() and sbrk() change the location of the program break, which defines the end of the process's data segment (i.e., the program break is the first location after the end of the uninitialized data segment). Increasing the program break has the effect of allocating memory to the process; decreasing the break deallocates memory.
单元化数据段也称为 BSS。这里的关键字是 segment,因此很可能初始值始终是页面对齐的。
为了安全起见,可以通过对页面大小(可以通过getpagesize查询)取模来验证初始地址。
更新:所以我很好奇并进一步挖掘。在手册页中,我已经读到 brk 和 sbrk 是在内核的 sys_brk 上实现的。它在内核源代码中的实现可以在 mm/mmap.c 中找到(或 mm/nommu.c 对于没有内存管理单元的系统;我们将忽略这个).在 mm/mmap.c 的 brk 实现中,我们找到这一行:
newbrk = PAGE_ALIGN(brk);
(这里的“brk”是参数,而不是函数。)因此内核确实进行了页面对齐……有点:同时计算是使用页面对齐值和任何必要的内存完成的分配是页面对齐的,brk 的存储值实际上是您传递的指针值:
mm->brk = brk;
因此在用户空间中,即使内核发生了,它看起来也没有发生任何页面对齐。我查看了版本 3.17.5 和 2.4.37,行为是相同的。
关于初始值,在 fs/binfmt_elf.c(实现 ELF 链接)中,我们找到一个函数 set_brk,它设置初始“brk”值(mm->start_brk).该值是显式页面对齐的。处理旧 a.out 格式的 fs/binfmt_aout.c 和处理 HP-UX SOM 格式的 fs/binfmt_som.c 也是如此(从未听说过)前)。还有 fs/binfmt_flat.c 设置初始 brk 值但没有显式对齐;该值在此处隐式对齐。所以看起来初始值总是页面对齐。至少它保证了 ELF 文件的页面对齐,这是我们对“正常”系统关心的。
glibc 简单地包装了 sys_brk 并添加了簿记以正确地实现 sbrk。所以 glibc 的 brk 行为是内核的行为,返回值 sys_brk 存储在内部隐藏变量 __curbrk 中,因此 sbrk 可以正确计算新地址。
关于c - 在 Linux 中对 sbrk(0) 的初始调用是否总是返回一个对齐到 8 字节的值(或 4 在 32 位系统的情况下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27340800/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?