분류 전체보기(39)
-
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 -
C# Garbage Collection
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.메모리 관리 문제는 항상 주의를 살펴도, 코드의 규모가 커질수록 비일비재했습니다. 자원을 해제하지 못해 발생하는 메모리 누수는 프로그램의 안정성에 치명적이었습니다. 메모리를 해제하는 순서도 중요했습니다. 잘못 해제하면 dangling pointer로 인한 예측되지 않는 동작이 발생하거나, segment fault가 발생하며 프로세스가 비정상적으로 종료됐습니다. 그렇기에 C++에서는 RAII 객체를 사용하여 메모리를 관리하였습니다. 그런데 GC, Garbage Collection 있다는 것을 알게 되었습니다. 자원관리를 알아서 자동으로 해준다니, 위 문제에서 자유로워지고 온전히 코드의 설계에 대해서만 생각할 수 있게 될 것이라 ..
2025.04.01 -
C# 네트워크 프로그래밍
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.서버는 정확히 무엇일까요. 시스템 엔지니어로 일할 때 서버들을 유지보수하며 생각했었습니다. apache, mariadb와 같은 서버 프로그램을 구동하고 있는 워크스테이션을 서버로 부를 수 있는 것인가. 그러면 Dell R750과 같은 서버 하드웨어에 단순하게 ssh를 통해 접속해 OpenFOAM과 같은 전산유체역학 소프트웨어를 실행하여 개인 컴퓨터로 사용한다면 이 것은 서버일까. 같은 생각을 말이죠. TcpListener / TcpClientSystem.Net.Sockets 네임스페이스에 정의되어 있는 클래스로 소켓기반의 서버와 클라이언트 역할을 합니다. Server.csusing System;using System.Net;us..
2025.03.28 -
IPC
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다. 프로세스는 개별적으로 독립적인 메모리 공간을 할당받아 실행됩니다. 그래서 다른 프로세스와 데이터를 주고받기 위해서는 IPC를 사용해야 합니다. IPC란 Inter-Process Communication의 약자로 프로세스 간 통신기술을 뜻합니다. 그래서 기존에 다루었던 소켓과 파이프, Signal 등의 방법들이 모두 IPC에 해당합니다. 이번에는 Windows를 기준으로 커널 오브젝트와 핸들을 통해 IPC를 알아보겠습니다. Kernel Object State...WaitForSingleObject(pi.hProcess, INFINITE);GetExitCodeProcess(pi.hProcess, &state);...
2025.03.26