분류 전체보기
파편화 (Fragmentation)
파편화(Fragmentation)란?파편화는 메모리를 할당하고 해제하는 과정에서 사용하지 못하는 공간이 군데군데 생겨나는 현상이다.전체 메모리의 총합은 충분해 보이지만, 연속된 큰 공간이 없거나 공간이 낭비되어 새로운 메모리 할당이 실패하게 된다.운영체제의 메모리 관리 효율성을 저해하는 주요 원인 중 하나로, 외부 파편화와 내부 파편화로 나뉜다.파편화의 종류1. 외부 파편화 (External Fragmentation)여러 프로세스의 할당과 해제가 반복되면서, 빈 공간이 조각조각 흩어진 상태메모리 총량은 충분하지만, 요구된 크기만큼 연속된 공간이 없어 할당에 실패한다.주로 가변 크기 메모리 할당 방식에서 발생한다.2. 내부 파편화 (Internal Fragmentation)프로세스에 할당된 메모리 블록이 ..
동기화 객체란?
동기화 객체란?멀티스레드 환경에서 여러 실행 흐름이 공유 자원에 동시에 접근하면 충돌이나 비정상적인 동작이 발생할 수 있다. 이를 방지하기 위해 사용되는 도구가 동기화 객체(Synchronization Primitives)이다.대표적인 동기화 객체로는 뮤텍스(Mutex), 세마포어(Semaphore), 스핀락(Spin Lock)이 있으며,각각의 특징과 사용 목적은 다르다.뮤텍스 (Mutex)뮤텍스는 Mutual Exclusion의 줄임말로, 단일 자원에 대해 하나의 스레드만 접근할 수 있도록 제한한다.lock()과 unlock()으로 자원 접근을 제어한다.락을 획득한 스레드만 해제할 수 있는 소유 개념이 존재한다.다른 스레드가 락을 요청하면 커널이 해당 스레드를 대기 상태로 전환시킨다.일반적으로 임계영역..
데드락(Deadlock)이란?
데드락(Deadlock)이란?멀티프로세스나 멀티스레드 환경에서 여러 실행 흐름이 자원을 점유한 채 서로가 가진 자원을 기다리며 영원히 진행되지 못하는 상태를 데드락(Deadlock)이라고 한다.예를 들어, 스레드 A가 자원 X를 점유한 상태에서 자원 Y를 기다리고, 스레드 B가 자원 Y를 점유한 상태에서 자원 X를 기다리는 상황이면 두 스레드는 서로를 기다리며 영원히 멈춰버리게 된다.데드락 예시 코드#include #include #include pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;void* task1(void*) { pthread_mutex_lock(&lo..
임계영역(Critical Section) 이란?
임계영역(Critical Section)이란?멀티스레드 혹은 멀티프로세스 환경에서는 여러 실행 흐름이 동시에 동일한 자원에 접근할 수 있다. 이때, 공유 자원을 동시에 수정하거나 읽으면 예기치 못한 결과나 충돌이 발생할 수 있다. 이러한 문제를 방지하기 위해 등장한 개념이 임계영역(Critical Section)이다.임계영역이란, 공유 자원에 접근하는 코드 영역 중 동시에 하나의 실행 흐름만 진입할 수 있도록 보호되어야 하는 부분을 말한다.예시다음은 두 개의 스레드가 동시에 하나의 전역 변수 counter를 증가시키는 코드이다.#include #include int counter = 0;void* increment(void* arg) { for (int i = 0; i 위 코드는 두 개의 스레드가..
프로그램의 빌드 과정
프로그램의 빌드 과정C/C++과 같은 언어로 작성된 소스 코드는 컴퓨터가 실행 가능한 바이너리 파일로 변환되어야 한다. 이 과정은 여러 단계를 거치며, 각각의 단계에서 소스 코드는 점차 저수준 형태로 바뀌게 된다. 이러한 일련의 과정을 빌드(build)라고 한다. 일반적으로 다음과 같은 네 단계를 거친다.1. 전처리 (Preprocessing)첫 번째 단계는 전처리기(preprocessor)가 수행한다. 이 단계에서는 소스 코드에 포함된 전처리 지시문들을 처리한다.#include로 포함된 헤더 파일의 내용이 소스 코드에 삽입된다.#define으로 정의된 매크로가 치환된다.조건부 컴파일 지시문(#ifdef, #ifndef 등)이 해석된다.전처리 결과는 확장자가 .i인 파일로 저장되며, 아직 컴파일이 되지 ..
함수 호출의 리턴 주소는 어떻게 스택에 저장될까?
리턴 주소는 어떻게 스택에 저장될까?C/C++을 포함한 대부분의 언어에서 함수 호출은 단순히 점프(jump)하는 것이 아니라, 나중에 돌아올 위치를 기억해야 하기 때문에 "리턴 주소(return address)"라는 개념이 사용됩니다. 이 리턴 주소는 스택(stack)에 저장되며, 함수가 끝나면 이 주소로 제어가 돌아옵니다.이번 글에서는 리턴 주소가 스택에 어떻게 저장되고 다시 복원되는지, 그 과정을 함수 호출 단계별로 자세히 정리해보겠습니다.1. 함수 호출 시: call 명령어의 역할C++ 함수가 호출되면, 컴파일된 어셈블리 코드에서는 보통 다음과 같은 명령어가 사용됩니다:call 함수_주소이 call 명령은 다음 두 가지 일을 동시에 합니다:리턴 주소를 스택에 push 한다→ 즉, 현재 명령어의 다음..
변수들이 메모리에 저장되는 영역
변수들이 메모리에 저장되는 영역에 대해서프로그램이 실행될 때 변수와 코드들은 운영체제로부터 할당받은 메모리 공간에 저장되며, 이 메모리는 용도에 따라 여러 영역으로 나뉩니다. 대표적으로 다음과 같은 영역들이 있습니다:1. Text (Code) 영역컴파일된 기계어 명령어가 저장되는 영역입니다.함수의 실제 동작 코드들이 이곳에 위치하며, 일반적으로 읽기 전용입니다.프로그램이 실행되는 동안 항상 메모리에 상주합니다.2. rodata (Read-Only Data) 영역읽기 전용 상수 데이터가 저장되는 구역입니다.예를 들어 문자열 리터럴("Hello")이나 const로 선언된 전역 상수 등이 여기에 저장됩니다.수정이 불가능하며, 수정 시 런타임 오류(segmentation fault)가 발생할 수 있습니다.3. ..
Effective C++ 공부 (항목 1 ~ 5)
Effective C++ 정리: 항목 1~5항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수C++는 단일 언어가 아니라 다중 패러다임의 결합입니다. 이를 이해하고 적절한 관점으로 접근해야 합니다.C++의 4가지 주요 관점C 스타일: 절차적 프로그래밍, 포인터, 메모리 직접 관리 등.객체지향 스타일: 클래스, 상속, 다형성 등.템플릿 스타일: 컴파일타임 제네릭, 타입 추론 등.STL 스타일: 컨테이너, 반복자, 알고리즘, 람다.➡️ 어떤 기능을 구현할 때 이 중 어떤 스타일이 적절한가를 고민하면서 코딩해야 함.항목 2: #define을 쓰거든 const, enum, inline을 떠올리자❌ #define의 문제점#define A 123단순 텍스트 치환 → 타입 정보 없음에러 시 디버깅 어려움 (에..