[JUNGLE] TIL_4. 코어타임동안 궁금했던 점들

모깅·2025년 9월 8일

JUNGLE

목록 보기
5/56
post-thumbnail

정답보고 풀었던 문제들을 다시 한 번 풀어보고 정렬(삽입, 선택, 버블, 셸)을 다시 구현해보았다.

팀원들과 코어타임을 가지며 다음과 같은 궁금증이 생겼다.

1. 가상 메모리가 존재하는데 게임 최소 용량이 필요한 이유

최소 설치 용량 (저장 공간)
게임의 최소 설치 용량은 게임을 구성하는 모든 파일을 하드 드라이브(HDD)나 SSD 같은 영구 저장 장치에 보관하는 데 필요한 공간입니다. 여기에는 다음과 같은 파일이 포함됩니다.

그래픽 데이터: 텍스처, 3D 모델, 맵

사운드 파일: 배경 음악, 효과음, 캐릭터 음성

게임 엔진 및 코드: 게임을 구동하는 핵심 프로그램

기타 데이터: 동영상, 폰트, 설정 파일

이 파일들은 게임이 꺼져 있어도 컴퓨터에 계속 남아있어야 하며, 게임을 실행할 때마다 이 저장 장치에서 필요한 데이터를 불러옵니다.

2. IPC의 종류 -> shared memory가 가상메모리 어디에 있는지

IPC의 주요 종류
IPC는 크게 두 가지 모델로 나눌 수 있으며, 다양한 종류가 있습니다.

1. 데이터 공유 (Data Sharing)

공유 메모리 (Shared Memory): 여러 프로세스가 메모리의 특정 공간을 공유하는 방식입니다. 커널의 개입 없이 직접 메모리에 접근하므로 속도가 가장 빠릅니다. 다만, 여러 프로세스가 동시에 접근할 때 데이터 충돌이 발생할 수 있어 별도의 동기화(예: 세마포어, 뮤텍스)가 필수적입니다.

2. 메시지 전달 (Message Passing)

파이프 (Pipes): 단방향 통신 채널로, 주로 부모-자식 프로세스 간 통신에 사용됩니다. (익명 파이프)

메시지 큐 (Message Queues): 식별자를 통해 여러 프로세스가 메시지를 주고받는 컨테이너입니다. 보낸 순서대로 쌓이며, 비동기적으로 처리하기 좋습니다.

소켓 (Sockets): 네트워크 통신을 위해 만들어졌지만, 같은 기기 내의 프로세스 간 통신에도 사용됩니다. 원격 통신이 가능하다는 큰 장점이 있습니다.

파일 (Files): 한 프로세스가 파일에 데이터를 쓰면, 다른 프로세스가 그 파일을 읽어 통신하는 가장 간단한 방법입니다. 속도는 느리지만 영구적인 데이터 보관이 가능합니다.

3. 커널 코드 실제 물리 메모리에 항상 상주하는지

커널 코드는 대부분 물리 메모리(RAM)에 항상 상주(resident)합니다.

운영체제는 부팅 과정에서 자신의 핵심 코드를 디스크에서 RAM의 특정 보호된 영역으로 불러온 뒤, 이 공간이 다른 일반 프로그램에 의해 덮어쓰이거나 디스크로 스와핑(swapping)되지 않도록 잠가버립니다.

4. 가상 메모리가 어디에 존재하는지

가상 메모리는 물리적으로 RAM이 아닌, 하드 드라이브(HDD)나 SSD 같은 보조 저장 장치에 저장됩니다.

CPU는 가상 메모리를 가리키고 있는 것으로 알고 있고 시작 위치를 알아야 프로그램을 실행 할 것 같은데 그럼 보조 기억 장치의 주소를 가리키고 있는건가? 이런 궁금증이 생겼습니다.
그 답은 아래와 같습니다.

'가상 주소 공간(Virtual Address Space) 정보'는 당연히 어딘가에 저장되어야 하고, CPU가 실행을 시작하려면 누군가 그 시작점을 가리켜줘야 합니다.
그 역할을 하는 것은 바로 실행 파일(Executable File)운영체제(OS)입니다.

1단계: 실행 파일 (.exe, a.out 등)
컴파일과 링크가 끝나면 만들어지는 game.exe 같은 실행 파일이 바로 그 '가상 주소 설계도'가 저장된 실체입니다.
이 파일 안에는 기계어 명령어뿐만 아니라, 다음과 같은 '메타데이터(metadata)' 정보가 헤더(header) 부분에 기록되어 있습니다.
"이 프로그램의 코드 영역은 가상 주소 0x1000부터 시작한다."
"이 프로그램의 데이터 영역은 가상 주소 0x8000부터 시작한다."
"프로그램이 처음 시작될 때, CPU가 가장 먼저 실행해야 할 명령어는 가상 주소 0x2050에 있다." (이것을 '엔트리 포인트(Entry Point)'라고 합니다.)

2단계: 운영체제(OS) 로더
사용자가 game.exe 파일을 더블클릭해서 실행하는 순간, 운영체제(OS)의 '로더(Loader)'라는 프로그램이 이 모든 것을 준비합니다.
프로세스 생성: OS는 game.exe를 위한 새로운 프로세스를 만듭니다.
설계도 확인: OS 로더는 game.exe 파일의 헤더를 읽어서 가상 주소 설계도를 파악합니다.
준비 작업: 이 프로그램을 위한 페이지 테이블을 생성합니다. 처음에는 비어있지만, 앞으로 가상 주소와 물리 주소(RAM)의 연결 정보가 여기에 기록될 것입니다.
시작점 지정 (가장 중요한 단계): 로더는 파일 헤더에 기록된 '엔트리 포인트' 가상 주소(예: 0x2050)를 읽어서 CPU의 프로그램 카운터(PC) 레지스터에 딱 한 번, 직접 써줍니다.

정리하면 실행 파일을 만들면서 엔트리 포인트의 주소를 메타데이터에 저장하게 되고 운영체제가 프로세스를 실행하며 엔트리 포인트를 PC 레지스터에 직접 써주는 방식으로 작동합니다.

profile
멈추지 않기

0개의 댓글