[IPC] Shared Memory - 가장 빠른 프로세스 간 통신
·
Dev/System Programming
들어가며지난 글에서 FIFO (Named Pipe)를 다뤘는데, 실습하면서 한 가지 아쉬운 점이 있었습니다. 바로 속도였죠. 간단한 메시지 주고받기에는 충분했지만, 큰 데이터를 전송하려니 느렸습니다.왜 느릴까요? FIFO는 Kernel을 거쳐서 데이터를 복사하기 때문입니다.FIFO 방식:Writer → [User Space] ↓ (복사!) [Kernel Space] ↓ (또 복사!) [User Space] → Reader→ 2번 복사! 느림!"메모리를 그냥 공유하면 안 되나?" 라는 생각이 들었습니다. 그게 바로 오늘 다룰 Shared Memory (공유 메모리)입니다.Shared Memory란?개념Shared Memory는 여러 프로세스가 같은 메모리 영역을 공유하는..
FIFO (Named Pipe) : 프로세스 간 통신의 기본
·
Dev/System Programming
들어가며프로세스 간 통신(IPC)을 공부하다 보면 가장 먼저 만나는 개념이 Pipe입니다.그런데 Pipe는 부모-자식 프로세스처럼 혈연관계가 있는 프로세스들끼리만 통신할 수 있다는 제약이 있죠. 만약 완전히 독립적인 두 프로그램이 통신하려면 어떻게 해야 할까요?바로 여기서 FIFO(Named Pipe)가 등장합니다. 이 글에서 FIFO의 개념부터 실제 구현까지, 직접 코드를 작성하며 겪은 문제들과 해결 과정을 공유하겠습니다.FIFO란?FIFO = First In First OutFIFO는 "First In First Out"의 약자로, 먼저 들어간 데이터가 먼저 나오는 자료구조입니다.마치 은행 대기줄처럼 선착순으로 처리되죠. 입구 → [A][B][C][D] → 출구 ↑ ..
싱글톤 패턴(singleton pattern) - C++
·
Dev/Design Pattern
1. 개념 이해싱글톤 패턴이란?프로그램 전체에서 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며, 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있다. 따라서 보통 싱글톤 패턴이 적용된 객체가 필요한 경우는 그 객체가 리소스를 많이 차지하는 역할을 하는무거운 클래스일 때 적합하다. 대표적으로 보통 설정(Config) 관리자, 로그(Logger) 시스템, DB 커넥션 풀, 네트워크 소켓 매니저, 데이터 베이스 연결 모듈에 많이 사용된..
Scop 구현기 5편: 행렬과 사용 점
·
Dev/Grapics
이전 글에서는 Model 클래스에서 OBJ 파일을 파싱하고 정점 데이터를 처리하는 흐름을 살펴보았습니다.이번 글에서는 그 정점들이 실제로 화면에 어떻게 그려지는지를 결정짓는 핵심 요소, 바로 "행렬(Matrix)"에 대해 깊이 있게 분석합니다.3D 그래픽스에서 행렬은 단순한 계산 도구가 아니라, '시점', '위치', '존재'를 결정하는 철학적 도구입니다.1. 왜 행렬이 필요한가?3D 그래픽스에서 모델을 불러온다고 해서 곧바로 화면에 보이는 건 아닙니다.그 이유는 모델의 정점(Vertex)들이 여전히 '자기 내부(Local Space)'에 존재하기 때문입니다. 예를 들어, 정점이 (0, 0, 0)이라고 하면, 이는 오브젝트 기준의 원점을 의미하지 화면 기준의 원점은 아닙니다.우리는 화면(스크린)이라는 2차..
Scop 구현기 4편: Model 클래스
·
Dev/Grapics
전 편에서 Shader코드들을 분리해 클래스로 따로 만들었다이제는 기본. obj 파일을 파싱 해서 VAO와 VBO 그리고 정점들에 대한 데이터 들을 클래스 단위로 분리해 보자! Scop에서 가장 중요한 클래스가 아닐까 싶다1. 왜 Model 클래스를 도입했나?삼각형 그리기를 생각해 본다면 VAO, VBO, 위치 데이터, 셰이더 정보 등이 전부 흩어져 있다 이걸 하나로 묶지 않으면각 객체마다 VAO/VBO를 일일이 관리해야 하고draw 호출마다 셰이더 바인딩도 반복하고좌표, 색상, 메시 정보를 통합적으로 다루기 어렵다그래서 이 모든 "하나의 그릴 대상"을 감싸는 클래스를 만들게 된 것이다.2. Model 클래스는 어떤 책임을 가져야 할까?처음에는 단순히 "정점 데이터를 갖는 그릇" 정도로만 생각했다하지만 ..
Scop 구현기 3편: 셰이더 클래스를 만들기로 했다
·
Dev/Grapics
OpenGL 셰이더를 매번 glCreateShader → glCompileShader → glLinkProgram 반복하는 게너무 지저분하고 비효율적이라는 생각이 들었다.심지어 하나만 있을 땐 모르겠는데, 앞으로 이게 10개, 20개 넘어가면… 말 다했지 뭐.그래서 아예 셰이더 클래스를 하나 짜기로 했다.헤더부터 깔끔하게 작성했다.class Shader {public: Shader(const char* vsPath, const char* fsPath); ~Shader(); void Use(); GLuint GetId(); void SetBool(const std::string& name, bool value) const; void SetInt(const std::string& name, int value..
Scop 구현기 2편: VAO와 VBO의 세계
·
Dev/Grapics
윈도우를 띄우는 것까지 했으니 이제 삼각형을 그려보겠습니다. 삼각형 그리기 전체 코드#include #include #include #include const char* vertexShaderSource = R"(#version 330 corelayout (location = 0) in vec3 aPos;void main() { gl_Position = vec4(aPos, 1.0);})";const char* fragmentShaderSource = R"(#version 330 coreout vec4 FragColor;void main() { FragColor = vec4(1.0, 0.5, 0.2, 1.0); // 주황색})";void processInput(GLFWwindow* window){ if (..
Scop 구현기 1편: 윈도우 하나 띄우는 게 뭐라고 (Object Viewer)
·
Dev/Grapics
앞선 지식들을 구현하며 공부하느라 많이 정리를 하지 못했습니다.구현했던 순서대로 작성을 해보겠습니다! 윈도우를 만들기 위한 전체 코드#include #include #include #include int main(void){ if (!glfwInit()) { std::cerr 1. OpenGL 프로젝트의 시작은 항상 창 만들기부터!OpenGL은 "그래픽"만 담당합니다. 운영체제 창은 만들어주지 않죠.그래서 우리는 GLFW 같은 라이브러리를 써야 해요. GLFW는 "운영체제에 독립적인 윈도우 생성 및 입력 처리"를 담당합니다.#include 헤더를 포함한 뒤 glfw 함수를 사용하기 위해 초기화해야 합니다.if (!glfwInit()) { std::cerr  glfwInit() 은 GLFW를 사용하기 위..
Rasterization vs Ray Tracing
·
Dev/Grapics
렌더링 기술의 두 갈래, 무엇이 다르고 왜 중요한가? 게임 그래픽을 담당하는 개발자 A는 GPU 성능을 쥐어짜며 실시간 렌더링을 구현하고 있었습니다.그런데 어느 날, 팀의 아티스트가 무심코 묻습니다."레이 트레이싱 쓰면 더 예쁘지 않아요? 왜 안 써요?" 개발자 A는 한숨을 쉬며 이렇게 답합니다."아름다움은 계산량과 반비례하거든요...." 그래서 오늘의 질문은 이것입니다. 왜 어떤 렌더링은 Rasterization을 쓰고, 어떤 렌더링은 Ray Tracing을 쓸까?둘은 어떻게 다르고, 각각 어떤 장단점이 있을까? 이 글에서는 두 기술의 핵심 원리, 차이점, 그리고 실제 적용 사례까지 알아보겠습니다.1. Rasterization - 화면에 삼각형을 빠르게 찍는 기술Rasterization은 3D 공간의 ..
셰이더는 그낭 함수일까?
·
Dev/Grapics
GPU 프로그래밍의 착각과 진실1. 셰이더는 정말 함수일까?void main(){ gl_Position = ...;} 처음 GLSL 셰이더 코드를 보면 진짜 함수처럼 생겼다.C 언어와 똑같은 void main()에, 변수 선언, 수식, return 없이도 끝나는 심플한 구조까지. 그래서 흔히 이렇게 착각하곤 한다."아하, 셰이더도 함수니까 그냥 내가 부르면 되겠네?" 그런데 막상 실행해 보면 이상하다.main()을 딱 한 번 쓴 것 같은데, 화면 전체에 셰이더가 작동한다.어라? 내가 호출한 적 없는데? 그럼 셰이더는 대체 뭐지?그냥 함수처럼 보이는데.... 진짜 함수는 아닌 걸까?2. 셰이더란 무엇인가?셰이더는 GPU에서 실행되는 작은 프로그램이다.이 프로그램은 정점(Vertex), 픽셀(Fragm..