Windows 응용 프로그램에서 파일 이름과 버퍼를 래핑하는 클래스가 있습니다. 파일 이름을 사용하여 생성하고 객체를 쿼리하여 버퍼가 아직 채워져 있는지 확인하고, 그렇지 않으면 nullptr을 반환하고, 그렇지 않으면 버퍼 addres를 반환 할 수 있습니다.겹친 IO 또는 파일 매핑?
class file_buffer
{
public:
file_buffer(const std::string& file_name);
~file_buffer();
void* buffer();
private:
...
}
내가 비동기 메모리에 데이터를 넣어 원하고, 지금까지의 내가 그것을보고 나는 두 가지 선택이 있습니다 : 개체가 범위를 벗어날 경우, 버퍼는 해제 중 버퍼를 생성하고 사용 IO를 중복 ReadFileEx를 사용하거나 MapViewOfFile을 사용하고 다른 스레드의 주소를 터치하십시오.
현재 약 16MB보다 큰 요청이 실패하기 때문에 몇 가지 문제가있는 ReadFileEx를 사용하고 있습니다. 요청을 분할하려고 시도 할 수는 있지만 동기화 문제가 발생하고 개체가 범위를 벗어나는 경우 IO가 완료되기 전에 버퍼 정리 문제가 있습니다. 또한 클래스의 여러 인스턴스가 빠르게 연속해서 생성되는 경우 상황이 매우 까다 롭습니다.
다른 스레드의 데이터를 매핑하고 만지는 것은 상 한계 문제가 없으므로 상당히 쉬워 보입니다. 클라이언트가 절대적으로 데이터를 가져야 만하는 경우에는 주소를 간접 참조 할 수 있습니다. OS는 페이지 폴트에 대해 걱정하고 블로킹 히트를 취한다.
이 응용 프로그램은 단일 코어 컴퓨터를 지원해야하므로 제 질문은 다른 소프트웨어 스레드의 페이지 오류가 현재 스레드의 IO가 겹친 것보다 더 비쌉니까? 그들은 그 과정을 멈출 것인가? 중첩 된 입출력은 같은 방식으로 프로세스를 정지 시키거나 이해가 안되는 OS 매직이 있습니까? 페이지 중복은 중복 된 입출력을 사용하여 수행됩니까? http://msdn.microsoft.com/en-us/library/aa365199(v=vs.85).aspx (파일 관리 IO 개념) http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx (파일 매핑) 을하지만 성능 트레이드 오프를 만드는 방법을 추론 할 수없는 것 :
나는이 주제의 좋은 읽기 했어.
우우! 나는 텀블 위드 배지를 가지고있다. 어쩌면 내가 C++ 태그를 추가해야합니다 ... – hatcat