I/O 요청을 등록하고, 디바이스 드라이버가 I/O 요청을 처리하기 이전에 앞서 요청했던 I/O 작업을 취소하고 싶을 수있다. 윈도우에서는 이를 위해 CancleIo와 CancleIoEx 함수를 제공한다. CancleIo BOOL WINAPI CancelIo( _In_ HANDLE hFile ); 지정된 핸들에 대해 진행 중인 I/O작업이 있고, 해당 함수를 호출 하는 스레드에서 실행된 경우 CancleIo 함수는 이를 취소한다. I/O작업은 Overlapped I/O로 실행될때만 유효하다. 취소된 모든 I/O작업은 ERROR_OPERATION_ABORTED를 포함하여 완료되며, I/O 작업에 대한 모든 완료통지는 정상적으로 발생한다. 해당 함수는 핸들이 IOCP와 연계되어 있는 경우 사용하기 힘들다. ..
lock_guard std::lock_guard - cppreference.com template class lock_guard; (since C++11) The class lock_guard is a mutex wrapper that provides a convenient RAII-style mechanism for owning a mutex for the duration of a scoped block. When a lock_guard object is created, it attempts to take en.cppreference.com lock_guard란 c++11 부터 제공되는 클래스이다. C++의 RAII(Resource Aquisition Is Initailiza..
I/O Manager I/O 시스템은 IRP (I/O Request Packet)이라 불리는 패킷에 기반하여 동작한다 예외로, IRP생성을 생락하고 I/O를 수행하는 Fast I/O라는 기법이 있다. I/O Manager는 I/O작업을 표현하기 위해 메모리에 IRP를 생성하고, IRP에 대한 포인터를 드라이버에 전달한 후 I/O작업이 완료되면 패킷을 폐기한다. 드라이버는 요청된 I/O 작업이 완료되었거나, 추가 처리를 위해 다른 드라이버로 전달해야하기 때문에, IRP를 수신하고, IRP가 지정한 작업을 수행한 후, IRP를 I/O Manager에게 다시 전달한다. I/O Manager는 여러 드라이버가 공통으로 쓸 수 있는 I/O처리 수행코드를 제공하고, 드라이버가 제공하는 모듈식 인터페이스 덕에 I/O..
쓰레드 생성 CreateThread HANDLE CreateThread( [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] SIZE_T dwStackSize, [in] LPTHREAD_START_ROUTINE lpStartAddress, [in, optional] __drv_aliasesMem LPVOID lpParameter, [in] DWORD dwCreationFlags, [out, optional] LPDWORD lpThreadId ) dwStatckSize 스레드 스택의 크기 프로세스가 시작되면 내부적으로 CreateThread 함수를 호출하여 프로세스의 주 스레드를 초기화한다. 이때, CreateProcess는 실행 파일 내부에 저장..
포스팅을 하지 않은지 너무 많은 시간이 지났다. 이 글을 계기로 다시한번 주기적인 포스팅의 의지를 다져야겠다. 사실 Solved.ac 플레티넘 티어를 달성한지는 꽤 오래되었다. (2023년 1월 달성) 물론 이 티어라는게 실력을 입증하는 자료도 아니고, 높은사람이 무조건 알고리즘문제를 잘푼다는 것도 아니다. 또 플레티넘이 대단한 티어인가 하면 그건 더더욱 아니다. 하지만 티어라는게 목표를 잡고, 꾸준히 알고리즘 문제를 풀 수 있게해주는 원동력이 되는 것은 확실한 것 같다. 이번 글에서는 내가 플레티넘을 달성하는 동안 어떤식으로 공부를 하였고, 어떻게 생각하는지 글을 써내려가 보겠다. 플레티넘을 달성한지는 반년이 넘었고, 그 뒤로는 알고리즘 푸는 것에 좀 소홀해지기도하고, 점수가 올라가려면 고난도의 문제를..
Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item6. 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해버리자 어떤 클래스에서 특정한 종류의 기능을 지원하지 않았으면 하는 의도를 반영하는 방법은 그런 기능을 제공하는 함수를 선언하지 않는 것이다. 하지만, 복사 생성자나 복사 대입 연산자에 대해서는 해당되지 않는 방법이다. 선언하지 않아도 컴파일러가 자동으로 생성하기 때문이다. 따라서 이에 대한 해결책으로 복사 생성자와 복사 대입연산자를 private 멤버로 선언함으로써 외부의 사용을 막을 수 있다. 하지만 이 방법의 문제점은 그 클레스의 멤버 함수나 frie..