MSync эквивалент в Windows - PullRequest
1 голос
/ 06 марта 2009

что эквивалентно msync [unix sys call] в windows? Я ищу MSDN API в C, C ++ пространстве. Больше информации о msync можно найти по адресу http://opengroup.org/onlinepubs/007908799/xsh/msync.html

Ответы [ 3 ]

1 голос
/ 06 марта 2009

FlushViewOfFile

Проверьте Python 2.6 mmapmodule.c для примера использования FlushViewOfFile и msync:

/*
 /  Author: Sam Rushing <rushing@nightmare.com>
 /  Hacked for Unix by AMK
 /  $Id: mmapmodule.c 65859 2008-08-19 17:47:13Z thomas.heller $

 / Modified to support mmap with offset - to map a 'window' of a file
 /   Author:  Yotam Medini  yotamm@mellanox.co.il
 /
 / mmapmodule.cpp -- map a view of a file into memory
 /
 / todo: need permission flags, perhaps a 'chsize' analog
 /   not all functions check range yet!!!
 /
 /
 / This version of mmapmodule.c has been changed significantly
 / from the original mmapfile.c on which it was based.
 / The original version of mmapfile is maintained by Sam at
 / ftp://squirl.nightmare.com/pub/python/python-ext.
*/

static PyObject *
mmap_flush_method(mmap_object *self, PyObject *args)
{
    Py_ssize_t offset = 0;
    Py_ssize_t size = self->size;
    CHECK_VALID(NULL);
    if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size))
        return NULL;
    if ((size_t)(offset + size) > self->size) {
        PyErr_SetString(PyExc_ValueError, "flush values out of range");
        return NULL;
    }
#ifdef MS_WINDOWS
    return PyInt_FromLong((long) FlushViewOfFile(self->data+offset, size));
#elif defined(UNIX)
    /* XXX semantics of return value? */
    /* XXX flags for msync? */
    if (-1 == msync(self->data + offset, size, MS_SYNC)) {
        PyErr_SetFromErrno(mmap_module_error);
        return NULL;
    }
    return PyInt_FromLong(0);
#else
    PyErr_SetString(PyExc_ValueError, "flush not supported on this system");
    return NULL;
#endif
}

UPDATE: Я не думаю, что вы найдете полный паритет в API-интерфейсах сопоставленных файлов win32. API FlushViewOfFile не имеет синхронного вида (вероятно, из-за возможного влияния диспетчера кэша). Если требуется точный контроль над записью данных на диск, возможно, вы можете использовать флаги FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH с API CreateFile при создании дескриптора для вашего сопоставленного файла?

0 голосов
/ 17 ноября 2018

Эквивалент Windows для сброса всех файловых карт

void FlushToHardDrive(LPVOID fileMapAddress,HANDLE hFile)
{
    FlushViewOfFile(fileMappAddress,0); //Async flush of dirty pages
    FlushFileBuffers(hFiles); // flush metadata and wait 
}

и для очистки части картографии

void FlushToHardDrive(LPVOID address,DWORD size, HANDLE hFile)
{
    FlushViewOfFile(address,size); //Async flush of region
    FlushFileBuffers(hFiles); // flush metadata and wait 
}

Это описано в MSDN здесь

Флаг FILE_FLAG_NO_BUFFERING фактически ничего не делает для файлов с отображенной памятью (описано здесь ), также даже дескриптор файла создается с этими флагами, метаданные файла могут кэшироваться и не сбрасываться , поэтому FlushFileBuffers всегда требуется для ввода-вывода и MM, если вы хотите быть полностью уверены, что все данные (включая время доступа к файлу) сохранены. Это поведение описано здесь

P.S. Пример из реальной жизни: SQLite использует MM-файлы почти только для чтения , поэтому, когда вы используете MM-файлы для записи / обновления, вам необходимо понимать все побочные эффекты для этого сценария

0 голосов
/ 28 августа 2010

Я подозреваю, что FlushViewOfFile на самом деле является правильным. Когда я читаю справочную страницу для msync , я не предполагаю, что она фактически очищает дисковый кеш (кеш в дисковом блоке, а не системный кеш в основной памяти).

FlushViewOfFile не вернется, пока стек диска не завершит запись; как и в документации по msync, в ней ничего не говорится о том, что происходит в кеше диска. Вероятно, нам следует взглянуть на это более четко в документации.

...