Контекст: я использую файл с отображением памяти в своем коде, созданном с помощью ACE_Mem_Map. Замечено, что файл отображения памяти занимает больше места на диске, чем ожидалось.
Сценарий. У меня есть структура, содержащая массив символов размером 15 КБ. Я создал файл карты памяти для массива этой структуры с размером файла ~ 2 ГБ.
- Если я попытаюсь получить доступ к нескольким байтам массива символов (скажем, 256), то потребляемый размер файла отображается как 521 МБ, но фактическое использование диска, показанное файловой системой (с использованием df -h), превышает 3 ГБ.
- Если я получаю доступ ко всем байтам памяти, то размер файла и использование диска отображаются как 2 ГБ.
Окружающая среда: ОС: Oracle Linux 7.3 Версия ядра: 3.10.0/4.1.12
Код:
#include<ace/Mem_Map.h>
#include <stdio.h>
#define TEST_BUFF_SIZE 15*1024
typedef struct _test_struct_ {
char test[TEST_BUFF_SIZE];
_test_struct_() {
reset();
}
void reset() {
/* Issue replicating */
memset(test, '\0', 256);
/* Issue not replicating */
memset(test, '\0', TEST_BUFF_SIZE);
}
}TestStruct_t;
int main(int argc, char *argv[]) {
if(3 != argc) {
printf("Usage: %s <num of blocks> <filename>\n",
argv[0]);
return -1;
}
ACE_Mem_Map map_buf_;
size_t num_of_blocks = strtoull(argv[1], NULL, 10);
size_t MAX_SIZE = num_of_blocks*sizeof(TestStruct_t);
char* mmap_file_name = argv[2];
printf("num_of_blocks[%llu], sizeof(TestStruct_t)[%llu], MAX_SIZE[%llu], mmap_file_name[%s]\n",
num_of_blocks,
sizeof(TestStruct_t),
MAX_SIZE,
mmap_file_name);
TestStruct_t *base_addr_;
ACE_HANDLE fp_ = ACE_OS::open(mmap_file_name,O_RDWR|O_CREAT,
ACE_DEFAULT_OPEN_PERMS,0);
if (fp_ == ACE_INVALID_HANDLE)
{
printf("Error opening file\n");
return -1;
}
map_buf_.map(fp_,MAX_SIZE,PROT_WRITE,MAP_SHARED);
base_addr_ = (TestStruct_t*)map_buf_.addr();
if (base_addr_ == MAP_FAILED)
{
printf("Map init failure\n");
ACE_OS::close(fp_);
return -1;
}
printf("map_buf_ size[%llu]\n",
map_buf_.size());
for(size_t i = 0; i < num_of_blocks; i++) {
base_addr_[i].reset();
}
return 0;
}
Кто-нибудь может объяснить, почему происходит сценарий 1??
Примечание. В сценарии 1, если я сделаю копию сгенерированного файла mmap, а затем удалю эту копию, то дополнительные 2,5 ГБ дискового пространства будут освобождены. Не знаю причину
mmap
, вопрос в его нынешнем виде специфичен для ACE. - person John Bollinger   schedule 25.11.2020ls
? - person John Bollinger   schedule 25.11.2020