Fwrite VS mmap ( " " ). , , . fwrite mmap. mmap ; , fwrite, .
remapSize - , .
fileSize , mappedSpace mmap ( ), alreadyWrittenBytes - , .
:
void init() {
fileDescriptor = open(outputPath, O_RDWR | O_CREAT | O_TRUNC, (mode_t) 0600);
result = ftruncate(fileDescriptor, remapSize);
fsync(fileDescriptor);
memoryMappedFile = (char*) mmap64(0, remapSize, PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
fileSize = remapSize;
mappedSpace = remapSize;
}
Q1:
"Unmap-Remap" -.
:
void unmap() {
msync(memoryMappedFile, mappedSpace, MS_SYNC);
munmap(memoryMappedFile, mappedSpace)
}
Remap , .
Remap
:
void fullRemap() {
ftruncate(fileDescriptor, mappedSpace + remapSize);
fsync(fileDescriptor);
memoryMappedFile = (char*) mmap64(0, mappedSpace + remapSize, PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
fileSize += reampSize;
mappedSpace += remapSize;
}
:
void smallRemap() {
ftruncate(fileDescriptor, fileSize + remapSize);
fsync(fileDescriptor);
remapAt = alreadyWrittenBytes % pageSize == 0
? alreadyWrittenBytes
: alreadyWrittenBytes - (alreadyWrittenBytes % pageSize);
memoryMappedFile = (char*) mmap64(0, fileSize + remapSize - remapAt, PROT_WRITE, MAP_SHARED, fileDescriptor, remapAt);
fileSize += remapSize;
mappedSpace = fileSize - remapAt;
}
mremap function,
Linux .
Q2:
, . " ", , ( , ). . Q3 , .
Q3:
madvise MADV_SEQUENTIAL, , , .
Excerp man:
:
mmap . "" , , fwrite.
mmap .
, . , mmap , .