프로세스 주소공간 관리

sungho·2024년 12월 5일
0

가상 메모리

목록 보기
8/11

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.oprintf.o 등의 함수 여기에 위치

Heap(힙)

  • 동적 메모리 할당(malloccalloc)에 사용
  • 낮은 주소에서 높은 주소로 확장되며, 힙의 끝은 brk() 포인터로 관리

Data, BSS, Text 섹션

  • Text
    • 실행 가능한 컴파일된 코드가 저장
  • Data
    • 초기화된 전역 및 정적 변수 저장
  • BSS
    • 초기화되지 않은 전역 및 정적 변수 저장

커널의 기능

메모리 영역 설정

  • 새 프로세스를 생성할 때 코드, 데이터, 스택, 힙 등의 기본 메모리 영역을 설정

메모리 영역 추가/삭제

  • 동적 메모리 할당(mmap) 또는 해제(munmap) 요청 처리

페이지 폴트 처리

  • 프로세스가 접근하려는 페이지가 물리 메모리에 없는 경우 처리

페이지 테이블 설정

  • 가상 메모리를 물리 메모리에 매핑하기 위해 페이지 테이블을 관리

2. 프로세스 주소 공간 관리

  • 프로세스의 주소 공간이 가상 메모리를 통해 관리
  • 가상 메모리는 프로세스 간 메모리 격리를 제공하고 효율적인 메모리 사용을 가능
  • 프로세스는 자신만의 메모리 공간을 가지며 다른 프로세스의 메모리에 접근할 수 없음

메모리 관리 구조 이해

  • 프로세스의 메모리 관리 정보를 설명
  • 프로세스의 가상 주소 공간, 페이지 테이블, 메모리 맵, 메모리 할당 상태 등을 관리
  • mm_struct는 프로세스가 사용하는 메모리 영역을 추적하고 페이지 폴트 처리와 같은 메모리 관리 작업을 수행하는 데 필수적
  • 구성요소
    • pgd(Page Global Directory)
      • 페이지 테이블 매핑에 사용
    • mmap
      • 가상 메모리 영역을 관리하는 메모리 매핑 시스템
    • mm_rb
      • 가상 메모리 영역을 관리하기 위한 레드-블랙 트리
    • vmacache
      • 스레드별 가상 메모리 캐시
  • task_struct
    • 구조체는 프로세스의 상태와 관련된 모든 정보를 포함
    • 프로세스 ID, 상태, 우선순위, 스케줄링 정보, 그리고 mm_struct에 대한 포인터를 포함하여 프로세스의 메모리 관리와 관련된 정보를 연결
  • vm_area_struct
    • 특정 영역의 가상 메모리 영역을 나타내며 mm_struct가 유지하는 리스트의 일부
  • 가상 주소 공간
    • 프로세스의 다양한 메모리 영역을 포함
      • code
        • 실행 가능한 코드 섹션
      • heap
        • 동적 메모리 할당 영역
      • mmapped
        • 메모리 맵 파일 영역
      • stack
        • 함수 호출과 지역 변수를 위한 메모리 영역
  • 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
        • address_space를 가리킴
  • 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_structtask_struct와 같은 자료구조를 통해 메모리 접근을 제어합니다. 페이지 테이블 구조와 TLB 관리는 메모리 관리의 효율성을 높이며 /proc/[pid]/maps 파일과 mmap 시스템 호출은 실용적인 도구로서 프로세스의 메모리 관리를 지원합니다.

0개의 댓글