01.17

신승빈·2023년 1월 17일
0

KGCA 수업

목록 보기
95/128

memcpy, memmove

둘다 특정 메모리를 다른 메모리로 복사할 때 사용
memcpy는 바로 해당 메모리에 복사하는 방식으로 구현되어 있는데 만약 동일한 메모리에서 memcpy를 호출하게 될 경우 제대로 작동하지 않는 경우가 발생
memmove는 임시로 memory를 복사한 다음 원하는 메모리로 복사를 수행하기 때문에 문제가 발생할 여지가 없음

Reference : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sharonichoya&logNo=220510332768

Overlapped IO

WSASocket(AF_INET, 0, NULL, NULL, WSA_FLAG_OVERLAPPED);	// WSA_FLAG_OVERLAPPED 필수
// Overlapped를 통해 IO 상태 확인
// WSABUF와 WSAOVERLAPPED객체는 비동기 작업이 완료될 때 까지 살아있어야 함
WSABUF buffer;
WSAOVERLAPPED overlapped;

// IO작업이 완료되면 CompletionRoutine으로 지정된 함수 호출
WSASend(socket, buffer, bufferCount, transferCount, flag, &overlapped, CompletionRoutine);
WSARecv(socket, buffer, bufferCount, transferCount, flag, &overlapped, CompletionRoutine);
WSAGetOverlappedResult(socket, &overlapped, &transferCount, wait, flag);

WSASend, WSARecv, WSAGetOverlappedResult에서 모두 Overlapped structure를 요구하는 것을 볼 수 있는데, 해당 함수의 정의를 살펴보면

WSASend, WSARecv의 경우 _inout_opt_ 설정이 되어있고,

WSAGetOverlappedResult는 _In_만 되어있는 것을 볼 수 있음
이를 통해 send, recv함수는 반환값으로서 사용되지만 get함수는 해당 값이 in 매개변수로 사용되는것을 알 수 있음

void CALLBACK * funcName(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags);

Completion Routine은 해당 Thread가 alterable wait 상태이어야만 수행 가능

Reference : https://emongfactory.tistory.com/110

Alterable wait

WaitForSingleObjectEx()
WaitForMultipleObjectsEx();
WSAWaitForMultipleEvents();
SleepEx();

꼭 ex계열 함수만 사용해야 함

Reference : https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject

APC(Asynchronous Procedure Call)

모든 Thread는 각자 자신만의 APC를 갖는데, Thread가 APC의 함수를 호출하기 위해서는 Alterable Wait상태에 있어야 함
꼭 Completion Routine이 아니더라도 APC에 추가하는 방법은 있음

Reference : http://egloos.zum.com/himskim/v/1053865

Overlapped IO의 경우 각 Thread의 APC에 Completion Routine을 저장한 후, 작업이 종료되면 Completion Routine을 수행하는 방식
즉, 만약 여러 Thread들이 대기중이고 1개의 Thread에 작업이 몰려있다고 해도, 작업이 몰려있는 Thread의 APC에 저장된 함수들은 다른 Thread에서 작업될 수 없음

IOCP

Overlapped IO를 통해 입출력을 처리하지만 Completion Routine이 아닌 다수의 Thread에서 미리 수립된 작업을 수행하는 것

IOCP 커널 객체 생성

// 마지막 매개변수는 최대 사용할 Thread의 개수
// 0일시 Core의 개수로 자동 설정
CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);

IOCP 객체와 Socket 연결

CreateIoCompletionPort(socket, iocpHandle, key, 0);

IOCP 커널 객체 생성과 동일한 함수지만 매개변수가 다름

IOCP 완료 검사

GetQueuedCompletionStatus(iocpHandle, &transferCount, &key, &Overlapped, milliSecond);

IOCP 이벤트 추가

PostQueuedCompletionPort(iocpHandle, transferCount, key, &Overlapped);

등록된 장치에서의 작업이 아닌 사용자가 직접 IO Completion 통지

Reference : https://popcorntree.tistory.com/80
Reference : https://jungwoong.tistory.com/43
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글