标签: fallocate

如何实现或模拟MADV_ZERO?

我希望能够在不调用任何io的情况下将一系列文件内存映射归零(为了有效地顺序覆盖大文件而不会产生任何磁盘读取io).

这样做std::memset(ptr, 0, length)会导致页面从磁盘,如果他们已经不在,即使整个页面被覆盖从而完全捣毁磁盘性能存储器中读取.

我希望能够做一些类似于madvise(ptr, length, MADV_ZERO)将范围归零(类似于FALLOC_FL_ZERO_RANGE)的事情,以便在访问指定范围时导致零填充页面错误而不是常规的io页面错误.

遗憾的MADV_ZERO是不存在.即使相应的标志FALLOC_FL_ZERO_RANGE确实存在fallocate并且可以与其一起使用fwrite以实现类似的效果,尽管没有即时的交叉过程一致性.

我猜的一个可能的替代方案是使用MADV_REMOVE.但是,根据我的理解,这可能导致文件碎片并在完成时阻止其他操作,这使我不确定其长期性能影响.我对Windows的经验是,类似的FSCTL_SET_ZERO_DATA命令在调用时会引起显着的性能峰值.

我的问题是如何实现或模拟MADV_ZERO共享映射,最好是在用户模式下?

1. /dev/zero/

我已阅读它被提出简单地读取/dev/zero到所选择的范围.虽然我不太确定"阅读范围"意味着什么,以及如何做到这一点.难道喜欢一个fread/dev/zero入内存范围?不确定如何避免访问时出现常规页面错误?

对于Linux,只需读/dev/zero入所选范围即可.内核已经针对匿名映射优化了这种情况.

如果一般来说这样做太难实现,我
建议MADV_ZERO应该有这样的效果:就像读取
/dev/zero到范围内一样,但总是有效的.

编辑:进一步跟踪线程,事实证明它实际上不起作用.

在处理共享映射时,它不会做任何技巧.

2. MADV_REMOVE

在Linux中实现它的一个猜测(即不在我喜欢的用户应用程序中)可以通过简单的复制和修改MADV_REMOVE,即代替madvise_remove使用.虽然我在猜测这一点时有点头脑,特别是因为我不太清楚它周围的代码是做什么的:FALLOC_FL_ZERO_RANGEFALLOC_FL_PUNCH_HOLEvfs_allocate

// madvice.c
static long madvise_remove(...)
  ...
  /*
   * Filesystem's fallocate may need to take i_mutex.  We need …
Run Code Online (Sandbox Code Playgroud)

c linux mmap shared-memory fallocate

8
推荐指数
1
解决办法
172
查看次数

为什么linux上的fallocate()在没有足够空间时会创建一个非空文件?

考虑我有以下代码:

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(int argc, char** argv) {

    if (argc > 2) {
        int fd = open(argv[1], O_CREAT|O_WRONLY, 0777);
        size_t size = atoi(argv[2]);

        if (fd > 0) {

            //int result = fallocate(fd, 0, 0, size);
            //printf("itak: %d, errno: %d (%s)\n", result, errno, strerror(errno));
            int result = posix_fallocate(fd, 0, size);
            printf("itak: %d, errno: %d (%s)\n", result, result, strerror(result));

        } else {
            printf("failed …
Run Code Online (Sandbox Code Playgroud)

c linux fallocate

5
推荐指数
1
解决办法
718
查看次数

在磁盘上分配文件而不进行归零

我需要分配大文件而不归零它的内容.我正在fopen => ftruncate => fclose => mmap => (...work...) => munmap以巨大的文件大小(数百千兆字节)制作这些步骤.应用程序挂起终止几分钟,而系统正在尝试将文件字节归零 - 恕我直言,因为ftruncate使用.

ftruncate(ofd, 0);

#ifdef HAVE_FALLOCATE

    int ret = fallocate(ofd, 0, 0, cache_size);
    if (ret == -1) {
        printf("Failed to expand file to size %llu (errno %d - %s).\n", cache_size, errno, strerror(errno));
        exit(-1);
    }

#elif defined(HAVE_POSIX_FALLOCATE)

    int ret = posix_fallocate(ofd, 0, cache_size);
    if (ret == -1) {
        printf("Failed to expand file to size %llu (errno %d - %s).\n", cache_size, errno, strerror(errno));
        exit(-1);
    }

#elif defined(__APPLE__) …
Run Code Online (Sandbox Code Playgroud)

c macos posix fcntl fallocate

5
推荐指数
1
解决办法
299
查看次数

fallocate和ftruncate有什么区别

他们都可以根据我的测试更改文件大小。他们为什么都可以将文件更改为更大和更短?fallocate和ftruncate有什么区别?

c linux glibc fallocate

2
推荐指数
1
解决办法
1159
查看次数

标签 统计

c ×4

fallocate ×4

linux ×3

fcntl ×1

glibc ×1

macos ×1

mmap ×1

posix ×1

shared-memory ×1