iocp
-
알아두면 좋을 개념개발/C·C++ 2022. 1. 3. 21:49
IOCP를 이용한 멀티스레드 네트워크 프로그래밍에서 WSASend가 쉽지 않으며 버퍼 관리도 마찬가지입니다. 환형 버퍼를 사용하는 방법이 있으며 다른 방법은 메모리 풀링을 활용하는 것입니다. 1. 전역 버퍼 매니저를 통해 필요할 때마다 메모리를 할당받고 이 메모리는 쓰임이 다 끝나면(ref_count가 0이 되면) 자동으로 재활용됩니다. make_shared 객체를 만들 때 두 번째 인수로 deleter를 넣을 수 있는데 멤버 함수가 아닌 클래스 스태틱 함수를 넣어주면 됩니다. 반납할 때 매니저 클래스에서 관리하는 벡터 객체에 push_back 해줍니다. 2. 메모리 덩어리는 TLS에서 관리되도록 합니다. 그러면 획득한 메모리에 대해서는 멀티스레드를 신경쓰지 않아도 됩니다. 전역 객체인 버퍼 매니저에서 ..
-
WSASend function개발/C·C++ 2021. 6. 6. 22:38
마이크로소포트의 윈도우 개발자 문서에서 WSASend 함수 설명을 읽다 보면 재미있는 문장 하나를 발견하게 됩니다. 너무 당당해서 그런가 보다 넘어갈 수도 있는데, 이 부분에 대한 처리를 꼭 해줘야 합니다. WSASend 함수를 호출하기 위해 인수를 세팅해줄 때 전송할 데이터의 크기를 따로 저장합니다. 스레드가 완료 큐에서 가져온 메시지를 처리할 때 실제 전송된 바이트의 수와 데이터의 크기를 비교해서, 전송됐어야 할 데이터의 크기보다 전송된 실제 바이트가 작다면 WSASend() 함수를 다시 호출해야 합니다. WSASend 함수를 호출하기 전에 인수를 세팅할 때, WSABUF의 buf를 실제 전송한 사이즈 만큼 포인터를 앞으로 옮겨줘야 하며 WSABUF의 len은 사이즈만큼 빼야 합니다.
-
IOCP(2)개발/C·C++ 2021. 6. 4. 11:20
>> 번역글입니다 >> 의역은 있고 오역이 있을 수 있습니다 >> 출처 https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports >> IOCP(1)에서 이어집니다 스레드는 입출력 완료 포트의 큐에 완료 패킷을 넣기 위해 PostQueuedCompletionStatus 함수를 사용할 수 있습니다. 이렇게 하면, 완료 포트는 입출력 시스템에서 입출력 완료 패킷을 받는 것뿐만 아니라 다른 프로세스 스레드의 연락을 수신하는 것에도 사용될 수 있습니다. PostQueuedCompletionStatus 함수는 하나의 비동기 입출력 작업을 시작하지 않고도, 어플리케이션이 입출력 완료 포트에 자신만의 완료 패킷을 대기하게 할 수 있습니다. 외..
-
[Pointer] 정수형을 문자형으로개발/C·C++ 2021. 5. 28. 22:28
정수형 포인터 변수를 초기화할 때 정수형 변수의 주소값을 넣는 이유는, 메모리에서 데이터를 읽는 간격이 자료형의 크기로 결정되기 때문입니다. int 포인터 변수 p는 ++p 연산을 하면 4바이트를 이동하고, short 포인터 변수 s는 ++s 연산을 하면 2바이트를 이동합니다. 컴파일 단계에서, 메모리 크기 단위를 포인터의 타입으로 파악할 수 있습니다. 때문에 포인터의 타입을 다른 타입으로 변환하다고 해서, 역참조하고 있는 내용이 바뀌는 건 아닙니다. 아래 예제를 봅시다. s1에는 260, s2에는 2를 할당했습니다. 구초제 포인터의 타입 캐스팅을 통해 Family1의 객체인 f1의 주소값을 Family2 포인터 변수에 넣었습니다. f1의 short 변수들은 f2의 char 배열에 할당됩니다. 260인 ..
-
IOCP(1)개발/C·C++ 2021. 5. 25. 20:51
>> 번역글입니다 >> 의역은 있고 오역이 있을 수 있습니다 >> 출처 https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports I/O Completion Ports 입출력 완료 포트는 멀티프로세서 시스템에서 여러가지 비동기 입출력 요청을 처리하는 효율적인 스레딩 모델입니다. 프로세스가 입출력 완료 포트를 만들면 시스템은 요청을 서비스하기 위해 연관된 큐 객체를 생성합니다. 동시적인 비동기 입출력 요청을 처리하는 프로세스는 요청이 있을 때 스레드를 만들지 않고, 미리 할당된 스레드풀과 입출력 완료 포트를 통해 더 빠르고 효율적으로 일할 수 있습니다. How I/O Completion Ports Work CreateCompleti..