개발/Windows(14)
-
Windows 구조적 예외 처리
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.예외 처리는 예상하지 못한 문제가 발생하여 프로세스가 비정상적으로 종료되는 문제를 방지해 줍니다. 잘못된 메모리 접근 혹은 0으로 나누기와 같은 문제를 안전하게 처리할 수 있게 해 줍니다. 그런데 앞서 말한 문제들은 개발자가 런타임에 발생할 예외들을 사전에 방지하여 설계하기 때문에 try-catch와 같은 예외처리를 잘 사용하지 않는 것 같습니다. 오히려 예외처리를 사용하게 되면 스택 언와인딩이 발생할 수 있기 때문에 성능이 상대적으로 낮아집니다. 그렇다면 예외 처리를 언제 사용해야 할까요. 저는 HTTP서버를 설계하며 HTTP Request를 읽어 HTTP Response를 작성할 때 사용하였습니다. Requ..
2025.05.28 -
Windows 캐시와 가상 메모리
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.캐시는 프랑스어에서 유래했다고 합니다. 프랑스어로 숨겨진 장소를 뜻하는 Cachette가 영어에서도 사용되며 Cache로 변했다고 하는데요. 그런데 왜 임시 데이터 저장소 용도로 사용되는 메모리를 왜 캐시라고 불렀는지는 잘 모르겠습니다. 문화의 차이일까요?Cache캐시 메모리는 CPU가 발전함에 따라 처리 속도가 높아져 주기억장치의 속도 차이로 발생하는 성능 저하를 완화하기 위해 만들어졌습니다. 캐시 메모리는 버스 대역폭 크기, 물리적 거리, SRAM 등의 이유로 주기억장치 보다 속도가 월등하게 빠릅니다. 그래서 CPU와 주기억장치 사이에서 임시 데이터를 저장하여 성능을 완화하는 것입니다. 하지만 위 내용만 보..
2025.05.22 -
Windows 스레드 풀
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.스레드를 사용한다면 자연스럽게 스레드 풀에 대해 알게 됩니다. 왜냐하면 스레드를 생성/해제할 때마다 서버가 지연되고 계속해서 한도 없이 새로운 스레드로 생성하여 요청을 처리하면 누적되는 부하에 서버가 중단되는 상황이 많이 발생하기 때문입니다. 서버가 꼭 멀티 스레드를 사용하는 것은 아니지만 I/O burst가 많다면 멀티 스레드를 사용하는 것이 유리합니다. 물론 입출력 다중화를 사용하는 방법도 유효합니다. Thread Pool스레드 풀은 위에서 말한 문제점을 해결하면서 여러 작업을 효율적으로 처리하기 위해 스레드를 집합으로 관리하는 것을 말합니다. 스레드 풀에 생성된 스레드들은 계속해서 생성 및 해제되지 않고 ..
2025.05.19 -
Windows 스레드 동기화
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.저는 일반적으로 동기화라면 어떤 행동을 동시에 진행하거나 다른 두 개 이상의 매체의 상태을 동일하게 유지하는 것으로 알고 있었습니다. 그런데 공부를 해보니 스레드에서 동기화는 다른 의미를 지니고 있었습니다. 오히려 반대의 개념에 더 가까운 것 같습니다. 스레드에서 동기화는 스레드들이 동시에 접근할 수 있는 공유 자원을 순차적으로 접근할 수 있게 해주는 객체입니다. 결국 스레드를 사용하는 목적이 어떻든 동기화의 본질은 순서인 것 같습니다. Synchronization in user mode유저 모드 동기화는 말 그래로 유저 모드에서 동기화가 이뤄지며 커널 모드에 진입하지 않기 때문에 성능에 큰 이점이 있습니다. ..
2025.05.13 -
Windows 스레드 생성과 소멸
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.Windows 시스템 프로그래밍을 공부하며 생각한 적이 있습니다. Windows의 많은 매크로, 비트 플래그, typedef, C 스타일 등으로 작성된 코드를 보며 "그냥 ISO C++ 표준을 사용해서 개발하면 되는 것 아닐까?"라는 생각을 말이죠. 하지만 핸들과 커널 오브젝트 개념을 알게 되면서 Windows의 기능을 모두 사용하려면 알아둬야 하는 내용이구나 다시 깨달았죠. 맞습니다. 열심히 해야죠. CreateThread, _beginthreadex Windows에서 스레드를 생성하기 위해서는 위 함수들을 사용해야 합니다. 우선 CreateThread부터 알아보겠습니다.HANDLE CreateThread( ..
2025.04.29 -
Windows 스레드
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.이번에 WinAPI를 사용하여 미니게임 프로젝트를 2주간 진행하였습니다. 그런데 이 프로젝트를 진행하며 오랜만에 창작하는 재미를 느꼈습니다. 무언가를 협업해 가며 만들어간다는 기쁨, 동료의 열정에 감화되는 기분을 말이죠. 어쨌든 이 프로젝트에서 저는 스레드를 사용하였습니다. 사용된 부분은 레이 캐스팅의 거리 탐색과 렌더링 부분이었습니다. 렌더링 부분은 그래픽 라이브러리를 사용하면 되지만 WinAPI를 사용하여 만드는 것이 목적이었기 때문에 사용하지 않았습니다. 그래서 시작하기 앞서 제가 사용한 방법을 간략히 적고 가겠습니다. 게임은 어두운 공간에서 괴물을 피해 앞에 보이는 영혼을 모두 획득하여 탈출하는 게임입..
2025.04.28 -
Windows 스택 프레임과 레지스터
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.최근 유튜브의 알고리즘에 의해 C/C++의 메모리 영역에 대한 영상을 봤습니다. 5분 안에 빠르고 간단하게 메모리 영역에 대해 설명해 주는데 굉장히 효율적인 영상이라 생각했습니다. 특히 이분법적으로 메모리 영역을 코드와 데이터로 나눈 것이 인상 깊었습니다. 코드는 프로세스가 실행될 흐름이고 나머지 데이터, 힙, 스택은 단순히 코드가 실행되며 사용될 데이터로 분류한 것이 참신했습니다. 지난 '레지스터와 명령어구조' 포스트에서 실행된 프로세스의 명령어를 IR에서 Decode 하여 실제 CPU가 실행하는 명령어의 구조를 살펴봤습니다. 이번 포스트에서는 프로세스가 실행되며 사용하는 메모리와 레지스터의 구조와 순서에 대..
2025.04.09 -
IPC
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다. 프로세스는 개별적으로 독립적인 메모리 공간을 할당받아 실행됩니다. 그래서 다른 프로세스와 데이터를 주고받기 위해서는 IPC를 사용해야 합니다. IPC란 Inter-Process Communication의 약자로 프로세스 간 통신기술을 뜻합니다. 그래서 기존에 다루었던 소켓과 파이프, Signal 등의 방법들이 모두 IPC에 해당합니다. 이번에는 Windows를 기준으로 커널 오브젝트와 핸들을 통해 IPC를 알아보겠습니다. Kernel Object State...WaitForSingleObject(pi.hProcess, INFINITE);GetExitCodeProcess(pi.hProcess, &state);...
2025.03.26 -
커널 오브젝트와 오브젝트 핸들
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.CreateProcess 함수를 실행하면 인자로 전달한 PROCESS_INFORMATION 구조체에 생성한 프로세스에 대한 커널 오브젝트의 핸들이 반환됩니다. 이때 커널 오브젝트는 무엇일까요? Kernel ObjectWindows 운영체제에서 관리하는 프로세스, 스레드, 파일 등과 같은 자원들을 데이터 블록으로 저장한 것을 커널 오브젝트라 부릅니다. 이 커널 오브젝트를 통해 프로세스와 스레드는 해당 자원에 접근할 수 있습니다. 그리고 프로세스와 스레드가 커널 오브젝트에 접근할 수 있게 해주는 것이 핸들(Handle)입니다. Handletypedef void *HANDLE; 핸들은 커널 오브젝트에 접근하기 위한 ..
2025.03.17 -
Windows 프로세스 생성과 소멸
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.프로세스의 구성요소는 무엇일까요. 프로그램이 메모리에 할당되니, 메모리는 구성요소에 포함될 것입니다. 그리고 책에서는 레지스터도 프로그램의 구성요소로 취급합니다. 왜냐하면 프로세스를 실행하기 위해서는 레지스터의 값을 저장하고 불러와야 할 수 있기 때문입니다. 우선 프로세스의 메모리 구조를 확인해 보겠습니다. Process memory structureLow Address...CODEDATABSSHEAPUnused MemorySTACK...High Address CODE: 실행된 프로그램의 코드가 저장되는 공간, 함수와 메서드가 여기에 존재하며, 읽기 전용으로 컴파일 타임에 영역의 크기가 정해집니다.DATA: ..
2025.03.15