欢迎任何建议/讨论!
这个问题实际上作为标题很简短,但我会解释为什么我需要实际地址。
背景:
这些天我对缓存和多核架构着迷,现在我很好奇在并行环境下缓存如何影响我们的程序。
在某些 CPU 型号(例如,我的 Intel Core Duo T5800)中,L2 缓存在内核之间共享。因此,如果程序 A 正在访问物理地址处的内存,如
0x00000000, 0x20000000, 0x40000000...
程序B访问数据在
0x10000000, 0x30000000, 0x50000000...
由于这些地址共享相同的后缀,因此二级缓存中的相关集合将被频繁刷新。我们预计会看到两个程序互相争斗,缓慢地从内存而不是缓存中读取数据,尽管它们在不同的内核中是分开的。
然后我想在实践中验证结果。在这个实验中,我必须知道物理地址而不是虚拟地址。但是我该如何应对呢?
第一次尝试:
从堆中吃一大块空间,掩码,得到某个地址。
我的 CPU 有一个二级缓存,大小为 2048KB,关联性为 8,所以像 0x12340000, 0x12380000, 0x123c0000 这样的物理地址将与二级缓存中的第一组相关。
int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {
v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
v[1] = (int*) ((unsigned)(v[0]) + 0x40000);
// one program pollute v[0], another polluting v[1]
}
遗憾的是,在虚拟内存的“帮助”下,变量 HEAP 在物理内存中并不总是连续的。 v[0] 和 v[1] 可能与不同的缓存集有关。
第二次尝试
访问/proc/self/mem,尝试获取内存信息。
嗯……看来结果还是关于虚拟内存的。
最佳答案
您对内存和这些地址的理解不完整/不正确。本质上,您尝试测试的内容是徒劳的。
在用户模式进程的上下文中,您看到的几乎每个地址都是 virtual address .也就是说,只有在该进程的上下文中才有意义的地址。操作系统管理此虚拟内存空间(对进程唯一)映射到内存页面的位置的映射。这些内存页面在任何给定时间可能映射到页面调入页面(即驻留在物理 RAM 中)- 或者它们可能被页面调出,并且仅存在于磁盘上的交换文件中。
因此,要解决背景 示例,这些地址来自两个不同的进程 - 尝试比较它们绝对没有任何意义。他们的代码是否存在于任何缓存中取决于许多因素,包括 cache-replacement strategy处理器的数量、操作系统启用的缓存策略、其他进程(包括内核模式线程)的数量等。
在您的第一次尝试中,您仍然无法直接实际测试 CPU 缓存。首先,你的大缓冲区不会在堆上。它将成为可执行文件的数据部分(特别是 .bss)的一部分。堆用于内存分配的 malloc() 系列。其次,如果你分配一些巨大的 1GB 区域并不重要,因为尽管它在你的进程的虚拟地址空间中是连续的,但操作系统会在它认为合适的地方分配虚拟内存页面 - 这可能 < em="">不实际上是连续的。同样,您几乎无法控制用户空间的内存分配。 “Is there a way to allocate contiguous physical memory from userspace in linux?”简短的回答是否定的。
/proc/$pid/maps 也不会让您到达任何地方。是的,那里列出了很多地址,但同样,它们都在进程 $pid 的虚拟地址空间中。有关这些的更多信息:How do I read from /proc/$pid/mem under Linux?
关于c - 我们如何为变量指定物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946728/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。