2009-03-06 3 views

답변

1

FlushViewOfFile

체크 아웃 사용에 FlushViewOfFile의 예와 msync에 대한 파이썬 2.6 mmapmodule.c에서 찾을 수 있습니다

/* 
/Author: Sam Rushing <[email protected]> 
/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 [email protected] 
/
/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 
} 

업데이트 : 난 몰라 win32 맵핑 파일 API에서 완전한 패리티를 찾으려고한다고 생각합니다. FlushViewOfFile API에는 (캐시 관리자의 영향으로 인해) 동기 취향이 없습니다. 데이터가 디스크에 기록되는시기를 정확하게 제어해야한다면 매핑 된 파일에 대한 핸들을 만들 때 FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH 플래그를 CreateFile API와 함께 사용할 수 있습니다.

0

빠른 답장을 보내 주셔서 감사합니다. mysql 및 FlushViewOfFile 사용에 대해 알고 있습니다. 붙여 넣은 코드에서 OS에 따라 볼 수 있습니다. msync [in unix]와 flushviewofFile [windows]를 해당 sys 호출이라고합니다.

"플러싱 매핑 된 뷰의 범위가 더러운 쓰기를 시작합니다 : FlushViewofFile의 MSDN의 문서에서

: 내가 무엇을 찾고 우리가 FlushViewofFile를 호출하면 반환하기 전에 하드 디스크에 변경 사항을 커밋하도록 할 수 있습니다 것을 특징으로하는 메커니즘입니다 해당 범위 내의 페이지를 디스크에 추가합니다 .Dirty 페이지는 파일보기가 매핑 된 이후 내용이 변경된 페이지입니다 .FromViewOfFile 함수는 파일 메타 데이터를 플러시하지 않으며 기본 하드웨어 디스크에서 변경 사항이 플러시 될 때까지 기다리지 않습니다. 캐시에 저장하고 물리적으로 디스크에 씁니다. 모든 더티 페이지와 파일의 메타 데이터를 플러시하고 실제로 파일에 디스크에 기록되도록하려면 FlushViewOfFile을 호출 한 다음 FlushFileBuffers 함수를 호출하십시오. "

FlushFileBuffers()는이 용도로 사용할 수 있지만 파일 핸들에서만 유효합니다. 내가 가지고있는 디스크에 커밋해야 할 메모리 매핑 된 영역입니다.이 처음에는 플러시하려면 기본 주소 및 바이트 수를 전달하는 FlushViewoffile cal.

msync는 데이터 파일 내용/바이트 버퍼를 플러시하고 하드 디스크에 커밋하는 단일 호출에서이 작업을 수행합니다. 나는 Windows에서 동등한 기능을 원했다.

+0

안녕하세요 Maximus_1986, 약간의 업데이트를 작성했지만 도움이 될 것 같지 않습니다. 죄송합니다. – yothenberg

0

FlushViewOfFile이 실제로 맞는 것 같습니다. man page for msync을 읽을 때 실제로 디스크 캐시 (디스크 장치의 캐시, 메인 메모리의 시스템 캐시가 아닌)를 플러시한다고 가정하지 않습니다.

디스크 스택이 쓰기를 완료 할 때까지 FlushViewOfFile이 반환되지 않습니다. msync 문서처럼 디스크 캐시에서 어떤 일이 발생하는지에 대해서는 아무 것도 말하지 않습니다. 문서에서 더 명확하게 살펴보아야합니다.