[Linux 주요 개념] 2. 시스템 호출과 메모리 관리

steve·2024년 10월 9일

Linux

목록 보기
2/4

개요

  • 운영체제는 하드웨어와 소프트웨어 사이의 중재 역할을 하며, 시스템 호출(System Call)을 통해 애플리케이션이 커널 기능을 사용하고 자원에 접근할 수 있도록 지원함
  • 시스템 호출은 사용자 애플리케이션이 커널에 요청하는 방식으로, 파일 읽기, 쓰기, 메모리 할당 등 하드웨어 자원에 접근하거나 관리하는 필수적인 메커니즘임. 또한, 메모리 관리는 운영체제가 효율적으로 시스템 메모리를 할당하고, 가상 메모리 공간을 통해 메모리 자원의 사용을 최적화하는 중요한 기법
  • 이번 글에서는 시스템 호출과 메모리 관리 기법에 대해 상세히 설명

1. 시스템 호출 (System Calls)

  • 시스템 호출은 사용자 모드에서 실행되는 애플리케이션이 커널 모드에서만 처리할 수 있는 작업을 요청할 때 사용됨. 예를 들어, 파일을 열거나 데이터를 읽고 쓰는 작업은 커널 모드에서만 처리되므로, 애플리케이션은 시스템 호출을 통해 이러한 작업을 요청함
  • 주요 System calls에 대한 예시 및 설명은 다음과 같음

1) read()write():

  • read(): 파일이나 네트워크 소켓에서 데이터를 읽어옴.
  • write(): 파일이나 네트워크로 데이터를 씀.
  • 이 두 시스템 호출은 파일 입출력의 기본이며, 모든 파일 시스템 상호작용의 근간이 됨. 사용자 공간에서 요청이 들어오면 커널이 파일 시스템 또는 네트워크 소켓과 통신하여 데이터 전송을 수행함.
    int fd = open("file.txt", O_RDONLY);
    char buffer[1024];
    read(fd, buffer, 1024);  // 파일에서 데이터를 읽어옴
    write(1, buffer, 1024);  // 표준 출력으로 데이터를 출력
    close(fd);

2) open()close():

  • open(): 파일을 열고, 파일 디스크립터를 반환함. 이 파일 디스크립터를 통해 파일을 읽거나 쓸 수 있음.
  • close(): 파일 디스크립터를 닫고, 해당 자원을 해제함.
  • 파일 시스템의 모든 자원은 파일 디스크립터를 통해 제어되며, 애플리케이션은 이 시스템 호출을 사용해 파일에 접근함.

3) fork()exec():

  • fork(): 현재 프로세스를 복제하여 새로운 자식 프로세스를 생성함. 자식 프로세스는 부모 프로세스의 모든 메모리, 파일 디스크립터 등을 복사하여 독립적으로 실행됨.
  • exec(): 현재 프로세스를 종료하고, 새로운 프로그램을 실행함. exec() 시스템 호출은 새로운 프로그램을 실행하는 데 사용되며, 자식 프로세스에서 주로 사용됨.
    pid_t pid = fork();
    if (pid == 0) {
        execl("/bin/ls", "ls", NULL);  // 자식 프로세스에서 새로운 프로그램 실행
    }
  • 커널과의 상호 작용
    • 시스템 호출은 커널 모드 전환을 통해 이루어짐. 사용자 모드에서 시스템 호출이 발생하면, 소프트웨어 인터럽트가 발생해 CPU가 커널 모드로 전환됨. 이때, 커널은 해당 요청을 처리하고, 다시 사용자 모드로 돌아옴. 이를 통해 사용자 애플리케이션이 하드웨어에 직접 접근하는 것을 방지하고, 보안안정성을 유지함

2. 메모리 관리 (Memory Management)

  • 운영체제는 메모리 자원을 효율적으로 관리하여 여러 프로세스가 안정적으로 실행될 수 있도록 함. Linux와 같은 현대적인 운영체제는 가상 메모리를 통해 물리적 메모리를 추상화하여 프로세스가 더 많은 메모리를 사용할 수 있도록 하고, 페이지 교체스왑 공간을 사용해 메모리 자원의 부족 문제를 해결함

1) 가상 메모리와 페이지 테이블

  • 가상 메모리는 각 프로세스가 독립적인 메모리 공간을 가진 것처럼 보이게 만드는 기법임. 운영체제는 물리적 메모리와 가상 메모리를 매핑하여 프로세스가 물리 메모리의 제약 없이 메모리를 사용할 수 있게 함. 가상 메모리는 페이지 테이블을 통해 관리되며, TLB(Translation Lookaside Buffer)와 같은 하드웨어 캐시를 사용해 주소 변환을 가속화함
  • 페이지 테이블: 가상 메모리 주소를 실제 물리 메모리 주소로 매핑하는 구조. 각 프로세스는 고유의 페이지 테이블을 가지며, 이를 통해 가상 메모리 공간을 사용할 수 있음
  • TLB: 페이지 테이블의 일부를 캐싱하여 주소 변환 속도를 높임. 페이지 테이블 접근은 시간이 걸리기 때문에, TLB는 자주 사용되는 페이지 테이블 항목을 저장해 효율적으로 주소 변환을 처리함

2) 페이지 교체와 스왑 공간

  • 물리 메모리가 부족할 때, 운영체제는 페이지 교체 기법을 사용해 자주 사용하지 않는 페이지를 스왑 공간으로 내보내고, 물리 메모리에서 더 이상 필요하지 않은 페이지를 해제함
  • 스왑 공간: 물리 메모리가 부족할 때, 사용하지 않는 페이지를 디스크로 내보내는 영역. 운영체제는 메모리가 꽉 찼을 때 LRU(Least Recently Used)와 같은 알고리즘을 사용해 가장 적게 사용된 페이지를 스왑 공간으로 내보냄
  • 페이지 폴트: 프로그램이 사용하려는 페이지가 메모리에 존재하지 않을 때 발생하는 현상. 이때 커널은 해당 페이지를 스왑 공간에서 불러오고, 메모리에 다시 할당함. 페이지 폴트가 자주 발생하면 성능 저하가 발생할 수 있음

3) 메모리 맵핑 방식과 메모리 누수 방지

  • 메모리 맵핑은 파일을 메모리에 매핑하여 파일 데이터를 직접 메모리에서 다룰 수 있도록 하는 기법임. 예를 들어, 데이터베이스는 큰 데이터를 메모리에 매핑해 빠르게 접근할 수 있으며, 파일 입출력 성능을 극대화할 수 있음. 이는 mmap() 시스템 호출을 통해 이루어짐
  • 메모리 누수 방지: 프로세스가 할당한 메모리를 반환하지 않는 경우 메모리 누수가 발생할 수 있음. 운영체제는 프로세스가 종료될 때 모든 메모리 자원을 해제하지만, 장기 실행 프로세스에서는 메모리 누수를 주의해야 함. 개발자는 메모리 할당 후 이를 적절히 해제하는 관리를 철저히 해야 함

3. 시스템 호출과 메모리 관리 실무 사례

  • 서버 환경에서 시스템 호출과 메모리 관리는 성능 최적화의 중요한 요소임. 예를 들어, 대규모 파일 시스템 접근이나 대량의 네트워크 트래픽 처리 중에는 효율적인 파일 입출력과 메모리 관리가 필수적
  • 데이터베이스 서버웹 서버의 경우, 메모리 맵핑을 통해 파일을 빠르게 읽어올 수 있으며, 시스템 호출을 통해 여러 클라이언트 요청을 처리함. 또한, 메모리 누수는 서버 안정성에 중요한 영향을 미치므로, 자원의 적절한 할당과 해제는 실무에서 매우 중요

정리

  • 시스템 호출메모리 관리는 운영체제의 필수 기능으로, 애플리케이션이 커널을 통해 자원을 안전하게 접근하고 관리할 수 있도록 함. 시스템 호출은 파일 입출력, 프로세스 생성, 실행 등의 작업을 커널에 요청하며, 메모리 관리는 가상 메모리, 페이지 교체, 스왑 공간을 통해 물리 메모리를 최적화하여 효율적으로 사용함

0개의 댓글