분류 전체보기(33)
-
스택 프레임과 레지스터
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.최근 유튜브의 알고리즘에 의해 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 -
C# 스레드와 태스크
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.스레드는 컴퓨터의 실행 단위로 사용되기도 하지만 어원은 아마로 만든 실에서 나왔다고 합니다. 그래서 연결된 무언가를 뜻하기도 한다고 합니다. 저는 컴퓨터 관련 용어를 공부할 때 어원을 궁금해서 찾아보곤 합니다. 그 어원을 알게 되면 그 개념의 본질에 대해 더 이해되는 것 같습니다. 예를 들어 바이트 오더를 뜻하는 엔디안의 경우 걸리버의 여행기에서 소인국 편에서 나오는 사람들을 뜻합니다. 여기 사람들은 계란을 깨는 것을 가지고 편을 갈라 격론을 펼칩니다. 계란을 깰 때 가장 두꺼운 끝 부분을 깨야한다는 사람들과 가장 얇은 끝 부분을 깨야하다는 사람들로 말이죠. 그래서 계란의 어느 끝 부분을 깨는 사람을 End에 접미사 an을 붙여..
2025.03.19 -
커널 오브젝트와 오브젝트 핸들
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.CreateProcess 함수를 실행하면 인자로 전달한 PROCESS_INFORMATION 구조체에 생성한 프로세스에 대한 커널 오브젝트의 핸들이 반환됩니다. 이때 커널 오브젝트는 무엇일까요? Kernel ObjectWindows 운영체제에서 관리하는 프로세스, 스레드, 파일 등과 같은 자원들을 데이터 블록으로 저장한 것을 커널 오브젝트라 부릅니다. 이 커널 오브젝트를 통해 프로세스와 스레드는 해당 자원에 접근할 수 있습니다. 그리고 프로세스와 스레드가 커널 오브젝트에 접근할 수 있게 해주는 것이 핸들(Handle)입니다. Handletypedef void *HANDLE; 핸들은 커널 오브젝트에 접근하기 위한 ..
2025.03.17 -
Lenovo X1 Carbon 4th 리튬전지 및 배터리 교체
얼마 전 여자친구가 남동생이 온라인으로 강의를 들어야 해서 남는 노트북이 있는지 물어봤습니다. 그때 전 2년 전에 지인에게 받은 Lenovo 노트북이 생각났습니다. 리눅스 컴파일 용도로 사용하던 노트북이었는데 강의만 듣는 것이라면 충분할 것이라 생각하고 그 남동생에게 선물해 주기로 마음먹었습니다. 그런데 집에 와서 확인해 보니 이 노트북 평범한 상태가 아니었습니다. 제가 이 노트북을 잊은 사이 총 2가지의 큰 문제가 생겼었습니다. 첫 번째 문제. 리튬전지 방전 처음 전원을 연결하고 부팅하니 비프음과 함께 위 에러가 발생했습니다. 말 그래로 BIOS의 날짜/시간 설정을 다시 하라는 뜻인데, 이 설정이 초기화 됐다는 뜻은 노트북 안에 있는 리튬전지가 방전되었다고 예상해 볼 수 있습니다. 이런 식으로 시간 ..
2025.03.17 -
Windows 프로세스 생성과 소멸
이 글은 윤성우 님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다.프로세스의 구성요소는 무엇일까요. 프로그램이 메모리에 할당되니, 메모리는 구성요소에 포함될 것입니다. 그리고 책에서는 레지스터도 프로그램의 구성요소로 취급합니다. 왜냐하면 프로세스를 실행하기 위해서는 레지스터의 값을 저장하고 불러와야 할 수 있기 때문입니다. 우선 프로세스의 메모리 구조를 확인해 보겠습니다. Process memory structureLow Address...CODEDATABSSHEAPUnused MemorySTACK...High Address CODE: 실행된 프로그램의 코드가 저장되는 공간, 함수와 메서드가 여기에 존재하며, 읽기 전용으로 컴파일 타임에 영역의 크기가 정해집니다.DATA: ..
2025.03.15 -
레지스터와 명령어 구조
이 글은 윤성우님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍'을 참고하여 공부한 내용입니다. 지난번 컴퓨터의 구조를 공부하며 CPU가 명령어를 실행하는 Fetch, Decode, Excute 단계들을 배웠습니다. 그리고 32/64비트 시스템 컴퓨터에서 비트는 데이터 한번에 처리할 수 있는 최대양 이란 것을 알게되었습니다. 이번에는 더 나아가 32/64비트 시스템에서 CPU가 레지스터를 통해 어떻게 명령어를 실행하는지 알아보겠습니다. 명령어 구조초기 개인 컴퓨터는 16비트 시스템을 사용하였습니다. 그래서 16비트 시스템에서는 데이터를 한번에 처리하기 위해 명령어의 구조를 16비트로 구성하였습니다. 그래서 16비트 명령어를 WORD(unsigned short)라고 부르게 되었고, 32비트 시스템에서는 Do..
2025.03.14 -
C# 입출력 작업
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. System.IO는. NET에서 제공하는 파일 및 데이터 스트림 등을 지원하는 네임스페이스입니다. 저희는 여기에 선언된 객체들을 통해 C# 코드에서 파일 및 디렉터리 작업을 수행할 수 있습니다. File, FileInfo, Directory, DirectoryInfoC#에서 파일과 디렉터리를 다룰 때 사용하는 주요 클래스들입니다. 이름에서 알 수 있듯이 File과 FileInfo는 파일을 다룰 수 있는 클래스이며, Directory와 DirectoryInfo는 디렉터리를 다루는 클래스입니다. 그리고 File과 Directory는 정적 메서드를 통해 파일과 디렉터리 작업을 지원하여 간단하게 사용할 수 있습니다. 반대로 FileI..
2025.03.09