전체 글 101

[크래프톤 정글] 동적 메모리 할당기 총정리

블로그 글: 동적 메모리 할당기 총정리: Implicit/Explicit List부터 단편화까지우리가 C언어에서 malloc과 free를 사용할 때, 그저 필요한 메모리를 요청하고 돌려주는 편리한 함수라고 생각하기 쉽습니다. 하지만 그 이면에서는 프로그램의 성능과 안정성을 좌우하는 복잡하고 정교한 동적 메모리 할당기(Dynamic Memory Allocator)가 쉴 새 없이 움직이고 있습니다.이번 포스트에서는 동적 메모리 할당기의 기본 개념부터 대표적인 구현 방식, 그리고 메모리 관리의 영원한 숙적인 단편화(Fragmentation) 문제와 해결책까지, 그 내부 동작 원리를 총정리해 보겠습니다.1. 동적 메모리 할당기의 기본 원리동적 메모리 할당기는 프로그램 실행 중에(runtime) 사용할 메모리 공..

[크래프톤 정글] 컴퓨터 시스템 hello.c 실행 전체 플로우 정리

우리가 프로그램을 실행하기까지의 전체 과정을 설명하면, 먼저 hello.c 파일을 작성한 후 빌드를 시키면 다음과 같은 과정들이 차례대로 진행된다.1. 전처리 과정헤더 파일 확장: #include로 포함된 헤더 파일들이 실제 코드로 확장된다.매크로 확장: #define으로 정의된 매크로가 코드에 삽입된다.주석 제거: 소스 코드 내 모든 주석이 제거된다.이 과정을 통해 전처리가 완료되며, 그 결과물은 .i 파일로 저장된다.2. 컴파일 과정구문 분석: 소스 코드의 문법을 검사하여 파싱한다.구문 트리 생성: 구문 트리를 생성하여 코드의 구조를 분석한다.중간 표현(IR): 구문 트리를 기반으로 중간 표현(Intermediate Representation)으로 변환된다.어셈블리 코드 생성: 중간 표현을 기반으로 ..

[크래프톤 정글]4주차 회고

회고를 몰아쓰는거 같이 느껴진다면 그건 기분탓이다.Clang4주차 부터 c 언어를 시작하게 되었다.이번 주차 부터 c언어의 기본 문법 부터 c언어를 가지고 앞에 주차 에서 했던 LinkedList,Statck,Queue 등을 직접 구현 해보는 주차였다.펌웨어 를 다루면서 c언어를 다루기는 했지만, 그걸 가지고 알고리즘을 구현 하려고 하니 쉬운 과정은 아니었다.특히 포인터와 구조체 에 대한 개념을 이해 하는데 오랜 시간이 걸렸던거 같다.다만 한가지 느낀건 확실히 하드웨어 에 가까운 언어인 만큼 직접 디버깅 을 해보면서 메모리에 할당되는 과정이나 , 개념으로 만 알고있던 호출 스택이 쌓이는 과정을 직접 확인 해보는 과정은 좀 흥미롭게 느껴졌다.최근에는 진행했던 프로젝트를 다시 보고 있는데 공부할때는 머리에 ..

크래프톤 정글 2024.10.15

[크래프톤 정글] 동적 메모리 할당(CSAP 9.9장)

CSAPP 9.9장은 동적 메모리 할당에 관한 다양한 기법과 문제들을 다루고 있으며, 특히 malloc과 free 같은 C의 기본 메모리 관리 함수와 관련된 동작 원리와 구현 방식을 정리 해보고자 한다. 9.9.1 malloc과 free 함수malloc 함수는 동적으로 메모리를 할당하고, free 함수는 그 메모리를 해제하는 기본적인 함수이다.예시:#include #include int main() { int *arr = (int *)malloc(5 * sizeof(int)); // 5개의 정수 공간 할당 if (arr == NULL) { printf("메모리 할당 실패\n"); return 1; } for (int i = 0; i 이 예시는 malloc을 ..

[크래프톤 정글] c프로그래밍에서의 고통된 메모리 관련 버그(CSAP 9.11장)

다음은 CSAPP 9.11장에서 설명된 메모리 관련 버그들에 대한 설명과 각 상황에 대한 예시를 들어 정리 해보고자 한다.9.11.1 잘못된 포인터 역참조잘못된 포인터를 역참조하면 가상 메모리의 잘못된 위치를 참조하게 되어 프로그램이 비정상 종료된다.예시:int *ptr = NULL;*ptr = 100; // NULL 포인터 역참조, 프로그램이 종료됨위 코드는 NULL 포인터를 역참조하려고 하기 때문에 실행 중에 프로그램이 크래시된다.9.11.2 초기화되지 않은 메모리 읽기초기화되지 않은 메모리를 읽으면 해당 메모리에는 쓰레기 값이 포함될 수 있다.예시:int *arr = (int *)malloc(5 * sizeof(int));printf("%d\n", arr[0]); // 초기화되지 않은 메모리 읽..

[크래프톤 정글]2~3주차 회고

이 글을 쓰는 시점은 이제막 3주차가 끝난 시점이다.사실 2,3 주차 는 1주차 와 똑같은 생활의 연속이었기에 2,3 주차 회고 를 같이 쓰려한다.알고리즘2~3 주차 통틀어 bfs, dfs, dp , 그리디 알고리즘 등을 다루며 알고리즘에서 가장 기초가 되고 중요한 개념들을 익혔던 2주 였는데 그만큼 그 어떤 것 하나도 쉽게 가는 법이 없었다. dfs , bfs는 좀만 익숙 해질만 하면 응용 문제들이 나왔고 , dp 에서는 분명 점화식 을 찾는 감만 잡으면 될거 같았는데 문제만 보면 머리가 하애지는 하루들의 연속 이었다.한가지 얻은게 있다면 확실히 풀면 풀수록 스스로 알고리즘에 대해 익숙해지고 있다는 것을 느끼게 되었고, 많이 풀어보며 많은 문제 익숙 해지는것이 유일한 방법이라는 것을 알게 되었다. 그래..

크래프톤 정글 2024.10.14

[크래프톤 정글] 시그널(CSAP 8.5장)

8.5 시그널(Signals) - 상세 설명시그널은 소프트웨어 기반의 예외적 제어 흐름의 한 형태로, 프로세스에 특정 이벤트가 발생했음을 알리는 간단한 메시지이다. 시그널은 운영체제가 외부 이벤트나 오류를 프로세스에 통지하는 방법으로 사용되며, 프로세스는 시그널을 받으면 이에 대한 적절한 처리를 수행할 수 있다. 시그널의 기본 개념시그널 전송: 시그널은 커널이나 다른 프로세스에 의해 생성되어, 대상 프로세스에 전송된다.시그널 대기 및 처리: 시그널이 프로세스에 도착하면, 커널은 해당 프로세스에 시그널을 전달하고, 해당 시그널이 처리되기를 기다린다.시그널 처리기: 시그널을 처리하기 위해, 프로세스는 시그널을 무시하거나, 기본 동작(프로세스 종료 등)을 수행하거나, 또는 시그널 핸들러를 통해 시그널을 처리할..

[크래프톤 정글] 예외상황(CSAP 8.1장)

8.1 예외(Exception) - 상세 설명예외는 프로그램의 실행 중에 정상적인 제어 흐름을 방해하는 예기치 않은 사건이 발생할 때 나타나는 현상이다. 이러한 예외는 하드웨어나 소프트웨어 모두에 의해 발생할 수 있으며, 시스템은 이를 처리하기 위해 제어 흐름을 변경하여 예외 처리 코드를 실행한다. 이 과정은 컴퓨터 시스템에서 중요한 개념인 예외적인 제어 흐름(ECF: Exceptional Control Flow)를 이해하는 데 핵심적인 역할을 한다.예외 처리의 개념프로세서는 예외가 발생하면 즉시 현재 실행 중인 명령어의 실행을 중단하고, 특정 예외 처리 루틴을 호출한다. 이 루틴은 발생한 예외를 처리한 뒤, 필요에 따라 원래 프로그램으로 돌아가거나, 프로그램을 종료할 수 있다. 예외 처리는 시스템의 핵..

[크래프톤 정글] 재배치 가능 목적 파일(CSAP 7.4장)

7.4 재배치 가능 오브젝트 파일 (Relocatable Object Files)재배치 가능 오브젝트 파일은 컴파일된 프로그램의 기본 단위로, 여러 소스 파일에서 생성된 오브젝트 파일들을 링크하여 하나의 실행 파일을 만들기 위해 사용된다. 각 오브젝트 파일은 기계어 코드와 데이터, 메타데이터(심볼 테이블)를 포함하고 있으며, 이 파일들은 링킹 과정에서 결합되어 최종 실행 파일을 생성한다. 이 재배치 가능 오브젝트 파일의 주요 기능은 프로그램을 재배치할 수 있도록 설계되어 있다는 것이다.재배치 가능 오브젝트 파일의 각 섹션은 실행 시점에 특정 메모리 주소에 고정되지 않으며, 링커에 의해 실제 실행 시 필요한 주소로 "재배치"될 수 있다. 이를 통해 여러 모듈(소스 파일)을 독립적으로 컴파일하고, 링커가 나..

[크래프톤 정글] 컴파일러 와 링커(CSAP 7.1장)*

컴파일러 드라이버는 여러 단계를 통해 소스 코드를 실행 파일로 변환하는데,각 단계는 서로 밀접하게 연결되어 있으며, 이 과정에서 각각의 파일이 중간 산출물로 생성된다.1. 전처리 단계 (Preprocessing)전처리 단계에서는 전처리기(cpp)가 동작하여 소스 파일의 전처리 지시문을 처리한다. 이는 컴파일 프로세스의 첫 단계로, #include, #define, #if, #ifdef와 같은 전처리 지시문을 해결한다.주요 작업:헤더 파일 확장: #include 지시문에 의해 포함된 헤더 파일들은 소스 파일에 삽입된다. 예를 들어, #include 는 해당 헤더 파일의 전체 내용을 소스 코드에 삽입하는 과정이다.매크로 확장: #define으로 정의된 매크로들은 실제 코드에서 사용될 때 해당 값으로 대체된다..