我有一个通过mmap
使用获得的内存段MAP_ANONYMOUS
.
如何分配引用第一个相同大小的第二个内存段并在Linux中进行复制写入(目前正在使用Linux 2.6.36)?
我想要与完全相同的效果fork
,只是没有创建一个新的过程.我希望新映射保持在同一个进程中.
整个过程必须在原始页面和复制页面上都是可重复的(就像父母和孩子一样会继续fork
).
我不想分配整个段的直接副本的原因是因为它们是几千兆字节大而且我不想使用可以写入时复制的内存.
我尝试过的:
mmap
该段分享,匿名.复制mprotect
它为只读并创建第二个映射remap_file_pages
也是只读的.
然后使用libsigsegv
拦截写入尝试,手动制作页面的副本然后mprotect
两者进行读写.
诀窍,但非常脏.我本质上是实现自己的VM.
令人遗憾的是,当前的Linux不支持mmap
ing /proc/self/mem
,否则MAP_PRIVATE
就可以实现映射.
写时复制机制是Linux VM的一部分,必须有一种方法可以在不创建新进程的情况下使用它们.
作为一个注释: 我已经在Mach VM中找到了合适的机制.
以下代码在我的OS X 10.7.5上编译并具有预期的行为:
Darwin 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64 i386
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#ifdef __MACH__
#include …
Run Code Online (Sandbox Code Playgroud) 当我尝试输入密钥时,我正在使用jQuerye.keyCode
if (e.keyCode === 13) {
// my code
}
Run Code Online (Sandbox Code Playgroud)
然后它适用于ie7和所有主流浏览器,但不适用于ie10.
但是当我使用e.which
它时,它运行在所有主流浏览器中.
e.keyCode
和之间有什么区别e.which
?
我有以下问题:
我通过分配一大块的存储器(多个GIB)mmap
用MAP_ANONYMOUS
.该块包含一个大的哈希映射,需要时不时地归零.并非整个映射可以在每一轮中使用(并非每个页面都有错误),因此memset
不是一个好主意 - 需要太长时间.
快速做到这一点的最佳策略是什么?
将
madvise(ptr, length, MADV_DONTNEED);
Run Code Online (Sandbox Code Playgroud)
保证我任何后续访问都提供新的空页面?
从Linux man madvise
页面:
此调用不会影响应用程序的语义(MADV_DONTNEED除外),但可能会影响其性能.内核可以自由地忽略这些建议.
...
MADV_DONTNEED
对此范围内页面的后续访问将成功,但将导致从底层映射文件(请参阅mmap(2))或零填充按需页面重新加载内存内容,以便在没有基础文件的情况下进行映射.
...
当前的Linux实现(2.4.0)将此系统调用视为命令而不是建议...
或者我是否必须munmap
重新重新映射该区域?
它必须在Linux上工作,理想情况下在OS X上具有相同的行为.
我决定将我的pthreaded代码转换为OpenMP.
之前我使用Intel/GCC原子内置(__sync_fetch_and_add
系列)进行了大量的同步.
正如预期的那样,它们lock xadd
在x64上与GCC和ICC一起编译.
但是当-fopenmp
我在GCC上编译时,我开始在这些位置接听电话.callq ___sync_fetch_and_add_8
和家人.ICC仍然生成适当优化的代码.
编辑:链接器拒绝链接该GCC代码:
$ gcc -O3 -Wall *.o -lpthread -ldl -lgomp
Undefined symbols for architecture x86_64:
"___sync_fetch_and_add_8"
Run Code Online (Sandbox Code Playgroud)
编辑2:这似乎是Apple的GCC特有的.我没有在Red Hat gcc 4.4.6上得到这种现象
如何让GCC生成相同的优化内联,而不是没有-fopenmp
?
$ gcc -v
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个使用STL容器作为模板参数的类.并非所有容器都提供相同的方法,所以我试图找出如何基于所使用的容器专门化特定方法.
例:
template<typename container>
class A
{
private:
container m_container;
public:
void foo(); // does something container specific
// more generic methods that work with any container
};
Run Code Online (Sandbox Code Playgroud)
下面的代码不会编译说"无法匹配方法专门化",但这大概是我想要实现的:
template<typename T>
template<>
void A<std::vector<T> >::foo()
{
// vector specific implementation
}
template<typename T>
template<>
void A<std::map<T> >::foo()
{
// map specific implementation
}
Run Code Online (Sandbox Code Playgroud)
我必须支持许多编译器,包括MSVC2010,gcc C++ 99,一个旧的Solaris编译器......
我发现这种惨败的唯一方法是实现外部方法,这些方法可以做任何foo
应该做的事情,并为不同的容器类型重载它们.但我不想在全球范围内公开这些功能,有没有办法通过专业化来实现?
不可能外包它们的特殊情况是构造函数专门化......
我正在尝试为高度优化的x86-64位操作代码编写一个小型库,并且正在摆弄内联asm.
在测试这个特殊情况时引起了我的注意:
unsigned long test = 0;
unsigned long bsr;
// bit test and set 39th bit
__asm__ ("btsq\t%1, %0 " : "+rm" (test) : "rJ" (39) );
// bit scan reverse (get most significant bit id)
__asm__ ("bsrq\t%1, %0" : "=r" (bsr) : "rm" (test) );
printf("test = %lu, bsr = %d\n", test, bsr);
Run Code Online (Sandbox Code Playgroud)
在gcc和icc中编译并运行良好,但是当我检查程序集时,我会得到差异
gcc -S -fverbose-asm -std=gnu99 -O3
movq $0, -8(%rbp)
## InlineAsm Start
btsq $39, -8(%rbp)
## InlineAsm End
movq -8(%rbp), %rax
movq %rax, -16(%rbp)
## …
Run Code Online (Sandbox Code Playgroud) 我试图在GCC样式扩展asm(x86-64目标)中编写我的一小段代码,并且在编码结构偏移时遇到问题.
我有一个struct s
成员size_t a[]
,一个指向这样的结构和索引的指针,这两个结构都是在asm块中生成的.
现在我需要在asm中解决这个问题
asm (
"mov %[displ](%[s], %[index], 8), %%rbx"
: [s] "+r" (s)
, [index] "+r" (i)
: "memory", "cc", "rax", "rbx"
);
Run Code Online (Sandbox Code Playgroud)
如何编码displ
到asm块?offsetof(struct s, a)
作为立即前缀传递$
并生成无效的程序集.
asm (
"mov %[displ](%[s], %[index], 8), %%rbx"
: [s] "+r" (s)
, [index] "+r" (i)
: [displ] "i" (offsetof(struct s, a))
: "memory", "cc", "rax", "rbx"
);
Run Code Online (Sandbox Code Playgroud) 我正在努力最大化我的程序速度(以便实时获得结果)并避免从硬盘驱动器中不必要地加载数据.
程序应该处理大量的图像,我想尽可能多地处理RAM中的处理数据.但我发现,malloc
即使我有8GB的RAM(Windows 7 64位),也不会分配超过2GB的内存.
如何让我的程序尽可能多地使用RAM?
我正在尝试在C中构建一个程序,它具有许多依赖于各种共享库的可选功能.
在我们的异构计算集群中,并非所有这些库都可在所有系统上使用(或更新).
实例是从较新的glibc(符号sched_getcpu@@GLIBC_2.6
,__sched_cpucount@@GLIBC_2.6
)或整个共享库其可以是或可以不是可用的(libnuma
,libR
,libpbs
).
我知道,我可以使用libdl
与加载符号dlopen
和dlsym
,但这样做的(目前约为30)数量不断增长的符号是乏味的最好的.
据我所知,Linux中的共享库默认是延迟加载的,因此在实际使用之前不应该使用符号.
但是如果我尝试提前检查它,那么它在执行开始时失败:
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
#include <sched.h>
int main() {
void *lib_handle;
int (*fn)(void);
int x;
char *error;
lib_handle = dlopen("libc.so.6", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "sched_getcpu");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
printf("%d\n", sched_getcpu());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在包含所有库的编译系统上:
$ …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个包含大量项目的大型C ++解决方案。
其中一些是构建瓶颈,其中dll依赖于另一个需要永久构建的文件。
我有很多CPU可以构建,但是我无法让MSBuild并行编译(不链接)所有内容,而只能在链接时使用依赖项。
我本质上想在每个项目上都有:
# build objects
msbuild /t:BuildCompile project.vcxproj
# only now build/wait for dependencies
msbuild /t:ResolveReferences;BuildLink project.vcxproj
Run Code Online (Sandbox Code Playgroud)
我希望以上内容可以作为单个构建的一部分(级联到相关项目)。
我一直在尝试弄乱MSBuild目标构建顺序:
<PropertyGroup>
<BuildSteps>
SetBuildDefaultEnvironmentVariables;
SetUserMacroEnvironmentVariables;
PrepareForBuild;
InitializeBuildStatus;
BuildGenerateSources;
BuildCompile;
ResolveReferences;
BuildLink;
</BuildSteps>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
不起作用,此设置中的“解决依赖关系”不会生成依赖项目。
有任何想法吗?实际上,只有链接器依赖于引用的项目,而objs不依赖。