C언어 malloc, struct, 메모리 관련 핵심 정리

낚시하는 곰·2025년 4월 8일

krafton jungle

목록 보기
48/52

1. Hyper-V란?

hyper-v라는 내용을 동기 형에게 설명을 듣는 데 리눅스와 윈도우를 hyper-v가 동시에 실행시켜 준다는 이야기를 들었다. 동시에 실행시켜준다? 그러면 병렬 작업이라는 소리인데 '한 쪽은 윈도우를 한 쪽은 리눅스를 어떻게 동작시키지?' 라는 생각이 들었음.

  • Hyper-V는 Microsoft의 가상화 플랫폼으로, 하나의 물리 컴퓨터에서 여러 개의 가상 머신을 실행할 수 있게 해주는 하이퍼바이저(Hypervisor)입니다.
  • 각 VM은 독립된 OS를 설치하고 실행할 수 있으며, CPU, 메모리, 디스크, 네트워크 등 리소스를 분할해서 사용합니다.

✅ 하나의 시스템에 Hyper-V는 1개만 설치되며, 그 안에서 여러 VM을 생성할 수 있음

Hyper-V는 가상 CPU 단위로 스케줄링을 통해서 윈도우와 리눅스를 번갈아 실행시켜줌. 따라서 같은 물리 코어를 윈도우와 VM이 시간 단위로 번갈아 쓰는 구조이다.


2. DOS에서는 메모리에 1 << 31을 덮어쓰면 어떻게 될까?

DOS라는 현대와는 다른 메모리 보호가 없는 운영체제가 있다고 한다. 이 이야기를 왜 하냐면 C언어에 scanf와 printf라고 입력과 출력을 담당하는 기능이 있는데 a라는 10개의 int형 배열을 만들었을 때 이 배열에 1 << 31의 값을 할당하게 되면 메모리에 2^31만큼의 값들이 저장되고, printf를 출력하면 0~9까지만 출력이 된다고 한다. 즉 우리 눈에는 배열이 10개만 만들어진 것처럼 보이지만 실제는 2^31개나 만들어진 것이다(왜 2^31개이냐면 1 << 31은 비트 연산자로 1을 31만큼 왼쪽으로 밀고 남은 자리를 0으로 채우기 때문이다). 이 값을 메모리에 저장하게 되면 기존에 메모리에 저장되어 있던 값들은 어떻게 될까? 그리고 메모리 영역을 넘어서서 최상위에 있는 커널 영역까지 영향을 준다고 하는 데 왜 이런 일이 벌어질까?

  • DOS는 메모리 보호가 없는 운영체제입니다. CPU의 특권 레벨, 가상 메모리, 사용자/커널 모드 등의 개념이 존재하지 않았습니다.
  • 따라서 C에서 int* ptr = (int*)0x12345678; *ptr = 1234;처럼 임의 주소를 접근해도 시스템이 막지 않습니다.
  • 1 << 31 같은 큰 연산으로 메모리를 덮어써도 OS가 예외를 발생시키지 않고, 실수로 커널이나 BIOS 영역을 망가뜨릴 수도 있습니다.

✅ 현대 운영체제는 이런 위험한 접근을 방지하기 위해 메모리 보호를 적용합니다.


3. 프로세스란?

프로세스에 p1, p2, p3라는 영역이 있다고 한다

  • 운영체제에서 실행 중인 프로그램을 **프로세스(Process)**라고 합니다.
  • p1, p2, p3은 각각 실행 중인 독립된 프로세스를 의미하며, 각자 고유한 주소 공간, PID, 레지스터 상태 등을 가집니다.

✅ OS는 여러 프로세스를 동시에 스케줄링하며 CPU 시간을 나눠줌


4. malloc()이 할당한 메모리는 어디에 저장되는가?

  • malloc()힙(Heap) 영역에 메모리를 할당합니다.
  • 힙은 RAM(RAM)에 존재하는 메모리 공간이며, 레지스터가 아니라 운영체제의 가상 메모리 시스템으로 관리됩니다.

✅ 힙은 수백 MB ~ 수십 GB까지 할당 가능하며, 할당 해제는 free()로 수동으로 해야 함


5. 컴퓨터를 껐다 켜면 malloc 메모리는 어떻게 될까?

  • RAM은 휘발성 메모리이므로 전원이 꺼지면 모든 데이터가 사라집니다.
  • 따라서 malloc()으로 확보한 메모리도 컴퓨터를 껐다 켜면 초기화됩니다.

✅ 데이터를 영구 저장하려면 파일 I/O, 데이터베이스, EEPROM 등을 사용해야 함


6. malloc과 struct는 왜 함께 쓰는가?

✅ 유연한 메모리 관리

  • 구조체를 동적으로 생성하고 수명과 개수를 제어하기 위해 힙에 할당하는 것이 효율적입니다.
typedef struct {
    int id;
    char name[100];
} Student;

Student* s = malloc(sizeof(Student));

✅ 포인터로 데이터 전달

  • 함수 간 구조체를 복사하지 않고 포인터로 효율적으로 넘기기 위해 malloc과 함께 사용합니다.

✅ 연결 리스트, 트리, 큐 등 구현

  • 이러한 자료구조는 실행 중 노드 수가 바뀌기 때문에 malloc()으로 유동적으로 메모리를 관리해야 합니다.

❗ 꼭 같이 써야 하는 건 아니지만, 동적 자료구조나 복잡한 데이터 흐름이 있을 때는 필수에 가깝습니다.


7. struct만 사용할 수도 있나?

  • 가능합니다. 스택에 생성되며 자동 해제됩니다.
  • 다만 수명, 유연성, 개수 조절 등이 제한됩니다.
Student s;
s.id = 1;

결론 정리

  • malloc()은 RAM의 Heap 영역에서 동적으로 메모리를 할당해줍니다.
  • struct는 복잡한 데이터를 표현할 수 있는 구조이며, 둘을 조합하면 강력한 메모리 제어가 가능합니다.
  • 이 둘의 조합은 C 언어에서 실전적으로 유연한 코드 작성을 위해 자주 사용됩니다.

malloc + struct는 C의 진짜 무기다. 강력하지만 위험하니 구조화된 메모리 관리 습관이 필수!

profile
취업 준비생 낚곰입니다!! 반갑습니다!!

0개의 댓글