1. 프로세스 주소 공간의 개념

의미
- 프로세스 주소 공간은 프로세스가 고유한 가상 주소 공간을 가지며 이는 프로세스가 실행되는 동안 메모리에 존재하는 영역을 의미
- 주소 공간은 프로세스가 사용하는 코드, 데이터, 힙, 스택 등 다양한 세그먼트로 구성
- 프로세스는 독립적인 주소 공간을 가지므로 다른 프로세스와의 메모리 충돌을 방지하고 안정성을 높임
요소
- 가상 메모리(Virtual Memory)
- 프로세스는 독립적인 가상 메모리 공간
- 32비트 아키텍처에서는 가상 메모리 공간이 최대 4GB로 제한
- 가상 메모리는 두 영역으로 나뉩니다:
- 커널 영역(Kernel Space)
- 유저 영역(User Space)
- 물리 메모리(Physical Memory)
- 실제 하드웨어 메모리(RAM)를 의미
- 여러 프로세스의 가상 메모리가 물리 메모리에 매핑
특징
- 보안
- 커널과 유저 영역을 분리하여 악성 프로그램이 운영 체제에 영향을 미치는 것을 방지
- 효율성
- 가상 메모리를 통해 물리적 메모리를 효율적으로 관리
- 확장성
- 프로세스가 독립적인 주소 공간을 가지므로 다중 작업 환경에서 충돌을 방지

구성요소
Stack(스택)
- 함수 호출 시 지역 변수, 매개변수, 리턴 주소 등을 저장
- 스택은 높은 주소에서 낮은 주소로 확장
- ESP(Stack Pointer)
- EBP(Frame Pointer)
Shared Libraries(공유 라이브러리)
- 동적으로 링크된 라이브러리(
lib*.so
)가 로드되는 공간
- ex)
malloc.o
, printf.o
등의 함수 여기에 위치
Heap(힙)
- 동적 메모리 할당(
malloc
, calloc
)에 사용
- 낮은 주소에서 높은 주소로 확장되며, 힙의 끝은 brk() 포인터로 관리
Data, BSS, Text 섹션

커널의 기능
메모리 영역 설정
- 새 프로세스를 생성할 때 코드, 데이터, 스택, 힙 등의 기본 메모리 영역을 설정
메모리 영역 추가/삭제
- 동적 메모리 할당(
mmap
) 또는 해제(munmap
) 요청 처리
페이지 폴트 처리
- 프로세스가 접근하려는 페이지가 물리 메모리에 없는 경우 처리
페이지 테이블 설정
- 가상 메모리를 물리 메모리에 매핑하기 위해 페이지 테이블을 관리
2. 프로세스 주소 공간 관리
- 프로세스의 주소 공간이 가상 메모리를 통해 관리
- 가상 메모리는 프로세스 간 메모리 격리를 제공하고 효율적인 메모리 사용을 가능
- 프로세스는 자신만의 메모리 공간을 가지며 다른 프로세스의 메모리에 접근할 수 없음
메모리 관리 구조 이해
- 프로세스의 메모리 관리 정보를 설명
- 프로세스의 가상 주소 공간, 페이지 테이블, 메모리 맵, 메모리 할당 상태 등을 관리
mm_struct
는 프로세스가 사용하는 메모리 영역을 추적하고 페이지 폴트 처리와 같은 메모리 관리 작업을 수행하는 데 필수적
- 구성요소
- pgd(Page Global Directory)
- mmap
- 가상 메모리 영역을 관리하는 메모리 매핑 시스템
- mm_rb
- 가상 메모리 영역을 관리하기 위한 레드-블랙 트리
- vmacache
- task_struct
- 구조체는 프로세스의 상태와 관련된 모든 정보를 포함
- 프로세스 ID, 상태, 우선순위, 스케줄링 정보, 그리고
mm_struct
에 대한 포인터를 포함하여 프로세스의 메모리 관리와 관련된 정보를 연결
- vm_area_struct
- 특정 영역의 가상 메모리 영역을 나타내며
mm_struct
가 유지하는 리스트의 일부
- 가상 주소 공간
- struct file
- address_space
- 파일의 전체 데이터 공간을 설명하며
vm_area_struct
와 유사한 역할

3. 가상 메모리 영역(VMA) 및 주소 공간 구조
프로세스 주소 공간 자료구조
- 프로세스의 주소 공간을 설명하는 자료구조는 프로세스 주소 공간 디스크립터
- 구조체는 주소 공간의 크기, 위치, 접근 권한 등에 대한 정보를 포함
- 운영 체제는 프로세스의 메모리 사용을 효율적으로 관리하고 필요한 경우 메모리 할당 및 해제를 수행
Virtual Memory Area(VMA)
- 프로세스의 가상 주소 공간 내에서 연속적인 영역
- 특정한 속성과 권한을 가지며 프로세스가 메모리에 접근할 때 이 정보를 기반으로 접근을 제어
- 메모리 관리의 중요한 구성 요소로 프로세스의 메모리 사용을 최적화하고 페이지 폴트 처리와 같은 메모리 관리 작업을 지원
VMA Descriptor
- VMA의 속성을 설명하는 자료구조
- 구조체는 VMA의 시작 주소, 끝 주소, 접근 권한, 오프셋, 장치 정보 등을 포함하여 운영 체제가 메모리 접근을 관리하는 데 필요한 정보를 제공
- VMA Descriptor는 프로세스의 메모리 관리와 관련된 다양한 작업을 수행하는 데 필수적

프로세스
- task_struct
- 열린 파일과 메모리 관리 정보
- 필드
files
- 열린 파일을 관리하는
files_struct
를 가리킴
mm
및 active_mm
- 메모리 관리를 위한
mm_struct
를 가리킴
메모리 관리 구조
- mm_struct
- 프로세스의 메모리를 관리
vm_area_struct
목록을 포함하며 이는 가상 메모리 영역(VMA)을 나타냄
- vm_area_struct
- 연속된 가상 메모리 영역
- 파일 매핑이나 익명 메모리에 사용
시스템 전역구조
- file
- 시스템 전역 파일 정보
- 필드
inode info
lock info
pos info
ref count
f_mapping
- inode cache
- 디스크에 저장된 파일의 메타데이터 구조인 인노드를 메모리를 나타냄
- address_space
- 파일을 메모리에 매핑하는 정보를 관리
- 페이지 테이블 항목(pte)의 트리와 페이지 읽기/쓰기 함수(
a_ops
)를 포함
구조 간 관계
task_struct
는 배열(fd_array[i]
)을 통해 열린 파일과 연결
- VMA가 파일 기반일 경우
file
구조와 관련된 address_space
와 연결
inode cache
는 디스크와 상호작용하여 메모리에 인노드를 관리
4. 페이지 테이블 구조와 TLB 관리
- 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환
- 가상 주소 공간의 페이지에 대한 물리적 주소를 매핑하는 자료구조
- 다단계 페이지 테이블 구조를 사용하여 메모리 관리의 효율성을 높임
- 메모리 사용을 최적화하고 단편화를 줄이는 데 기여
TLB(Translation Lookaside Buffer)
- 가상 주소를 물리 주소로 변환하는 과정에서 발생하는 성능 저하를 줄이기 위해 사용되는 캐시 메모리
- 최근에 사용된 주소 변환 정보를 저장하여 주소 변환 시 빠른 접근을 가능
- 메모리 접근 속도를 향상시키고 시스템 성능을 최적화
5. 활용 방법
- 프로세스 주소 공간을 관리하는 방법에 대한 구체적인 예시로는
/proc/[pid]/maps
파일을 통해 프로세스의 메모리 맵을 확인하는 방법
- 특정 프로세스의 가상 주소 공간에 대한 정보를 제공하며 메모리 영역의 시작 주소, 끝 주소, 접근 권한, 그리고 해당 영역의 파일 매핑 정보를 포함
메모리 매핑(mmap)
mmap
시스템 호출은 파일이나 장치를 메모리에 매핑하여 프로세스가 해당 메모리 영역에 직접 접근
- 호출은 파일 I/O를 효율적으로 처리할 수 있게 해주며 메모리 공유와 같은 다양한 기능을 지원
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_RDONLY);
size_t length = 4096;
char *map = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
if (map == MAP_FAILED) {
perror("mmap");
return 1;
}
write(STDOUT_FILENO, map, length);
munmap(map, length);
close(fd);
return 0;
}
6. 결론
프로세스 주소공간 관리는 운영 체제의 핵심 기능 중 하나로 프로세스가 독립적인 메모리 공간을 가지도록 하여 안정성과 보안을 강화합니다. 가상 메모리를 통해 프로세스 주소 공간을 관리하며 mm_struct
, task_struct
와 같은 자료구조를 통해 메모리 접근을 제어합니다. 페이지 테이블 구조와 TLB 관리는 메모리 관리의 효율성을 높이며 /proc/[pid]/maps
파일과 mmap
시스템 호출은 실용적인 도구로서 프로세스의 메모리 관리를 지원합니다.