我想使用mmap在Linux下运行的C程序中实现程序状态的某些部分的持久性,方法是使用设置了MAP_SHARED标志的mmap()将固定大小的结构与众所周知的文件名相关联.出于性能原因,我宁愿根本不调用msync(),也不会有其他程序访问此文件.当我的程序终止并重新启动时,它将再次映射同一个文件并对其进行一些处理以恢复它在终止之前所处的状态.我的问题是:如果我从不在文件描述符上调用msync(),内核是否会保证对内存的所有更新都会写入磁盘并随后可以恢复,即使我的进程是以SIGKILL终止的?此外,即使我的程序从不调用msync(),内核是否会定期将页面写入磁盘?
编辑:我已经解决了数据是否写入的问题,但我仍然不确定这是否会导致一些意外的系统加载,而不是试图用open()/ write()/ fsync()来处理这个问题承担KILL/SEGV/ABRT /等过程中某些数据可能丢失的风险.添加了一个'linux-kernel'标签,希望有些知识渊博的人可以加入.
在我的应用程序中,我想为每个用户登录将用户设置保存在 plist 文件中,我编写了一个名为的类,该类CCUserSettings具有几乎相同的界面NSUserDefaults,它读取和写入与当前用户 ID 相关的 plist 文件。它有效,但性能不佳。每次用户来电[[CCUserSettings sharedUserSettings] synchronize],我写了NSMutableDictionary(这使用户设置)的plist文件,下面的代码显示synchronize中CCUserSettings忽略了一些琐碎的细节。
- (BOOL)synchronize {
BOOL r = [_settings writeToFile:_filePath atomically:YES];
return r;
}
Run Code Online (Sandbox Code Playgroud)
我想,NSUserDefaults当我们调用应该写入文件[[NSUserDefaults standardUserDefaults] synchronize],但它运行非常快,我写了一个演示测试,关键部分是下面,运行1000次[[NSUserDefaults standardUserDefaults] synchronize],并[[CCUserSettings sharedUserSettings] synchronize]在我的iPhone6,结果是0.45秒VS9.16秒。
NSDate *begin = [NSDate date];
for (NSInteger i = 0; i < 1000; ++i) {
[[NSUserDefaults standardUserDefaults] setBool:(i%2==1) forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
NSDate *end = [NSDate date];
NSLog(@"synchronize …Run Code Online (Sandbox Code Playgroud)