SERVER/Windows2024. 3. 6. 02:04요청한 I/O작업 취소하기 - CancelIo, CancelIoEx

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와 연계되어 있는 경우 사용하기 힘들다. ..

SERVER/Multi-Thread2024. 3. 4. 21:47SRWLock전용 LockGuard 제작하기

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..

Windows I/O의 이해 - 드라이버와 디바이스
CS/OS2024. 3. 3. 00:31Windows I/O의 이해 - 드라이버와 디바이스

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..

SERVER/Multi-Thread2024. 2. 12. 16:41스레드의 생성과 종료(_beginthreadex, _endthreadex 소스코드 분석)

쓰레드 생성 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 플레티넘 달성 후 느낀점 (+ 공부법)
PS2023. 7. 22. 21:30Solved.ac 플레티넘 달성 후 느낀점 (+ 공부법)

포스팅을 하지 않은지 너무 많은 시간이 지났다. 이 글을 계기로 다시한번 주기적인 포스팅의 의지를 다져야겠다. 사실 Solved.ac 플레티넘 티어를 달성한지는 꽤 오래되었다. (2023년 1월 달성) 물론 이 티어라는게 실력을 입증하는 자료도 아니고, 높은사람이 무조건 알고리즘문제를 잘푼다는 것도 아니다. 또 플레티넘이 대단한 티어인가 하면 그건 더더욱 아니다. 하지만 티어라는게 목표를 잡고, 꾸준히 알고리즘 문제를 풀 수 있게해주는 원동력이 되는 것은 확실한 것 같다. 이번 글에서는 내가 플레티넘을 달성하는 동안 어떤식으로 공부를 하였고, 어떻게 생각하는지 글을 써내려가 보겠다. 플레티넘을 달성한지는 반년이 넘었고, 그 뒤로는 알고리즘 푸는 것에 좀 소홀해지기도하고, 점수가 올라가려면 고난도의 문제를..

[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해버리자
C++/Effective C++2022. 11. 10. 19:38[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해버리자

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item6. 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해버리자 어떤 클래스에서 특정한 종류의 기능을 지원하지 않았으면 하는 의도를 반영하는 방법은 그런 기능을 제공하는 함수를 선언하지 않는 것이다. 하지만, 복사 생성자나 복사 대입 연산자에 대해서는 해당되지 않는 방법이다. 선언하지 않아도 컴파일러가 자동으로 생성하기 때문이다. 따라서 이에 대한 해결책으로 복사 생성자와 복사 대입연산자를 private 멤버로 선언함으로써 외부의 사용을 막을 수 있다. 하지만 이 방법의 문제점은 그 클레스의 멤버 함수나 frie..

[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자
C++/Effective C++2022. 11. 10. 18:13[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자. 🔻생성자, 소멸자, 대입 연산자 모든 c++ 클래스에 한 개 이상 꼭 들어 있는 것이 생성자, 소멸자, 대입 연산자이다. ◽ 생성자 : 새로운 객체를 메모리에 만드는 데 필요한 과정을 제어하고 초기화를 맡는 함수. ◽ 소멸자 : 객체를 없앰과 동시에 그 객체가 메모리에서 적절히 사라질 수 있도록 하는 과정을 제어하는 함수. ◽ 대입 연산자 : 기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수. 이들을 어떻게 하면 멋지게 모아둘 수 있을까? 🔻컴파일러가..

[Effective C++] 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자
C++/Effective C++2022. 11. 9. 23:49[Effective C++] 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자. 초기화되지 않은 값을 읽도록 내버려 두면 해당 객체에 쓰레기 값이 들어가 있게되어 프로그램이 내가 의도한대로 흘러가지 않을 가능성이 매우 크다. 따라서 초기화가 중요하다. int x; class Point { int x, y; }; Point p; 이런식으로 객체의 값을 명시적으로 초기화 해주지 않았다면, 어떤 상황에서는 초기화가 보장되지만, 또 어떤 경우에서는 안된다. 이것만 보면 C++의 객체 초기화가 중구난방인 것처럼 보이겠지만, 그런 것은 절대 아니다. 언제 ..

[Effective C++] 3. 낌새만 보이면 const를 들이대 보자!
C++/Effective C++2022. 11. 9. 01:22[Effective C++] 3. 낌새만 보이면 const를 들이대 보자!

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item3. 낌새만 보이면 const를 들이대 보자! 🔻const const에 대해 생각해 볼 때 가장 멋지다고 말할 수 있는 부분이 있다면, '의미적인 제약'을 소스 코드 수준에서 붙인다는 점과 컴파일러가 이 제약을 단단히 지켜준다는 점이다. 어떤 값이 불변이어야 한다는 제작자의 의도를 컴파일러와 다른 프로그래머와 나눌 수 있는 아름다운 수단이다. const는 팔방미인! const의 사용처 전역 혹은 네임스페이스 유효범위의 상수를 선언(정의)하는데 사용(항목 2) 파일, 함수, 블록 유효범위에서 static으로 선언한 객체에도 ..

[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자.
C++/Effective C++2022. 11. 8. 20:34[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자.

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item2. #define을 쓰려거든 const, enum, inline을 떠올리자. 🔻#define보다는 const, enum item이름을 다른 말로 해보면 "가급적 전처리기보다는 컴파일러를 더 가까이 하자"라고 할 수 있다. #define ASPECT_RATIO 1.653 위와 같은 코드를 썻을 때, 우리는 ASPECT_RATIO가 Symbolic name으로 보이지만, 소스코드가 컴파일러에게 넘어가기 이전에 전처리기가 해당 글자를 숫자 상수로 바꾸어버리기 때문에 컴파일러의 입장에서는 전혀 보이지 않는다. 그렇기때문에 해당 ..

image