Skip to content

IOThreadPool Class

CleftObsidian edited this page Jan 22, 2024 · 1 revision

File I/O를 수행하기 위한 스레드풀 클래스

Constructor

  • _completionPort Overlapped I/O를 위한 IOCP 초기화
  • _threadMaxSize 스레드풀에서 사용할 스레드의 수
  • _workerThreads 스레드들의 handle을 보관할 std::vector
  • _createQueue 파일 열기를 따로 수행하는 ThreadMode에서만 사용하는 queue
  • _readQueue 파일 읽기를 위한 queue
  • _fileInfoHashMap 파일 정보를 보관하고 key로 탐색하기 위한 std::unordered_map
  • _csCreateRead, _csProcess 공유 데이터 접근을 위한 CRITICAL_SECTION들
  • _numCreatedFiles, _numReadFiles, _numProcessedFiles 스레드들이 _targetNumFiles로 완료를 확인하기 위한 counter들
  • _targetNumFiles 처리할 총 파일 수
  • _maxReadProcCount ThreadMode::READ_N_AND_PROCESS_N에서 한번에 연속적으로 읽거나 처리할 파일 수
  • _startIOtime, _endIOtime QueryPerformanceCounter로 File I/O에 소요된 시간을 측정하기 위한 변수들

CRITICAL_SECTION을 초기화하고, ThreadMode에 따라서 _threadMaxSize개의 스레드를 만든다.

AddFileToHashMap

파일 경로를 받아 _fileInfoHashMap에 파일 정보를 추가한다.
파일 열기 및 읽기를 위해 _readQueue에 key를 추가한다.

AddFileToHashMapForHandle

파일 경로를 받아 _fileInfoHashMap에 파일 정보를 추가한다.
파일 열기를 위해 _createQueue에 key를 추가한다.

Release / Destructor

작업이 끝난 스레드들과 CRITICAL_SECTION, IOCP를 삭제하고 할당한 메모리를 해제한다.
File I/O에 소요된 시간을 콘솔로 출력한다.

Worker Functions

workerReadAllProcess

비동기인 threadCreateReadFile 함수로 파일 열기 및 읽기 요청을 모두 수행한 후에
읽기가 완료된 파일들에 대한 processing을 수행한다.

workerAlwaysCheck

비동기인 threadCreateReadFile 함수로 파일 열기 및 읽기 요청읽기가 완료된 파일들에 대한 processing
각각 확인하며 반복한다.

workerCounting

각 스레드가 _maxReadProcCount로 정한 횟수에 따라서
비동기인 threadCreateReadFile 함수로 파일 열기 및 읽기 요청을 일정 횟수 반복하고
읽기가 완료된 파일들에 대한 processing을 수행하는 것을 일정 횟수 반복한다.

workerCreateAllReadAllProcess

threadOnlyCreateFile 함수로 파일 열기를 모두 수행한 후에
비동기인 threadOnlyReadFile 함수로 열린 파일들에 대한 읽기 요청을 모두 수행한다.
이후 읽기가 완료된 파일들에 대한 processing을 수행한다.

workerCreateAllAlwaysCheck

threadOnlyCreateFile 함수로 파일 열기를 모두 수행한 후에
비동기인 threadCreateReadFile 함수로 파일 열기 및 읽기 요청읽기가 완료된 파일들에 대한 processing
각각 확인하며 반복한다.

workerOnlyRead

비동기인 threadCreateReadFile 함수로 파일 열기 및 읽기 요청만을 모두 수행한 후에 스레드를 종료한다.

workerOnlyProcess

읽기가 완료된 파일들에 대한 processing만을 수행한다.

workerSyncIO

동기로 파일 열기 및 읽기 요청, 읽기가 완료된 파일들에 대한 processing을 수행한다.

Tasks

threadCreateReadFile

비동기로 파일 캐싱 없이 파일을 열고 IOCP에 등록한다. 파일 크기에 따라 버퍼를 할당하고 읽기를 요청한다.

threadOnlyCreateFile

비동기로 파일 캐싱 없이 파일을 열고 IOCP에 등록하는 작업만을 수행한다.

threadOnlyReadFile

열린 파일의 크기에 따라 버퍼를 할당하고 읽기를 요청하는 작업만을 수행한다.

threadProcessFile

DummyFileGenerator에서 파일을 생성하면서 설정한 processing time에 따라서
메모리 할당이나 system call(_findfirst)을 반복한다.

threadSyncIO

동기로 파일을 열고 읽기를 요청한 후 대기한다.
해당 파일에 대한 읽기가 완료되면 파일을 생성하면서 설정한 processing time에 따라서 메모리 할당이나 system call(_findfirst)을 반복한다.