Linux Proc status: /proc/self/status


Linux 커널에서 실행 중인 프로세스의 상태: /proc/self/status

'/proc/self/status' 파일은 Linux 커널에서 실행 중인 프로세스의 상태에 대한 정보를 제공하는 가상 파일입니다.   '/proc/self/status'는 현재 프로세스에 대한 정보를 보여주며, 다양한 항목들로 구성되어 있습니다.   Red Hat Enterprise Linux 9 (RHEL 9)에서도 마찬가지로 이 파일을 통해 프로세스 상태를 확인할 수 있습니다.

📦 각 항목 설명

  • Name: cat -> 실행 중인 프로세스의 이름입니다.
  • Umask: 0022 -> 파일 생성 시 기본으로 적용되는 파일 모드 생성 마스크(umask) 값입니다. 8진수로 표현됩니다.
  • State: R (running) -> 프로세스의 현재 상태를 나타냅니다.
    • R(running):실행 중
    • D(disk sleep):I/O 작업 대기
    • Z(zombie):좀비 상태
    • T(stopped):중지됨
  • Tgid: 3168 -> Thread Group ID, 프로세스의 그룹 ID로 일반적으로 프로세스 ID(PID)와 동일합니다.
  • Ngid: 0 -> NUMA Group ID로 NUMA(Numa Node) 관련 그룹 ID를 나타냅니다.
  • Pid: 3168 -> 프로세스 ID입니다.
  • PPid: 2616 -> 부모 프로세스의 ID입니다.
  • TracerPid: 0 -> 프로세스가 다른 프로세스에 의해 추적될 때 추적하는 프로세스의 PID를 나타냅니다. 추적하는 프로세스가 없으면 0으로 설정됩니다.
  • Uid: 1000 1000 1000 1000 -> 프로세스의 사용자 ID, 효과적인 사용자 ID, 저장된 사용자 ID, 파일 시스템 사용자 ID를 나타냅니다.
  • Gid: 1000 1000 1000 1000 -> 프로세스의 그룹 ID, 효과적인 그룹 ID, 저장된 그룹 ID, 파일 시스템 그룹 ID를 나타냅니다.
  • FDSize: 256 -> 프로세스가 사용할 수 있는 파일 디스크립터의 최대 수입니다.
  • Groups: 1000 -> 프로세스가 속한 추가 그룹 ID를 나열합니다.
  • NStgid: 3168 -> PID namespace 안의 Thread Group ID, Process ID, Process Group ID, Session ID를 각각 나타냅니다.
  • NSpid: 3168
  • NSpgid: 3168
  • NSsid: 2616
  • VmPeak: 221096 kB -> 프로세스가 실행되는 동안 사용된 최대 가상 메모리 크기입니다.
  • VmSize: 221096 kB -> 현재 프로세스가 사용하는 가상 메모리 크기입니다.
  • VmLck: 0 kB -> 잠긴(lock) 메모리 크기입니다. ✅ 스왑되지 않도록 메모리에 고정된 메모리를 의미합니다.
  • VmPin: 0 kB -> 고정된(pin) 메모리 크기입니다. ✅ 메모리 페이지가 물리적 메모리에서 다른 위치로 이동되거나 스왑 아웃되지 않도록 고정하는 것을 말합니다.
  • VmHWM: 1664 kB -> 프로세스가 실행되는 동안 사용된 최대 물리적 메모리 크기입니다.
  • VmRSS: 1664 kB -> 현재 프로세스가 사용하는 물리적 메모리 크기입니다.
  • RssAnon: 0 kB -> 익명 메모리에 사용된 RSS 크기입니다. ✅ malloc()으로 할당된 메모리, 특정 파일이나 장치와 매핑되지 않으므로 "익명"이라고 불립니다.
  • RssFile: 1664 kB -> 파일 매핑에 사용된 RSS 크기입니다.
  • RssShmem: 0 kB -> 공유 메모리에 사용된 RSS 크기입니다. ✅ 여러 프로세스가 동시에 접근할 수 있는 메모리 영역을 의미(예: IPC, 파일 공유), mmap()을 사용.
  • VmData: 360 kB -> 데이터 세그먼트 크기입니다.
  • VmStk: 132 kB -> 스택 크기입니다.
  • VmExe: 16 kB -> 실행 가능한 텍스트 세그먼트 크기입니다.
  • VmLib: 1656 kB -> 라이브러리(공유된 메모리) 크기입니다.
  • VmPTE: 68 kB -> 페이지 테이블 엔트리 크기입니다.
  • VmSwap: 0 kB -> 스왑 메모리에 사용된 크기입니다.
  • HugetlbPages: 0 kB -> 거대 페이지에 사용된 메모리 크기입니다.
  • CoreDumping: 0
  • THP_enabled: 1
  • untag_mask: 0xffffffffffffffff
  • Threads: 1 -> 프로세스 내에서 현재 실행 중인 스레드의 수입니다.
  • SigQ: 0/30489 -> 현재 사용 중인 시그널 큐와 시그널 큐의 최대 크기입니다.
  • SigPnd: 0000000000000000 -> 프로세스에 대해 보류 중인 시그널 마스크입니다.
  • ShdPnd: 0000000000000000 -> 스레드에 대해 보류 중인 시그널 마스크입니다.
  • SigBlk: 0000000000000000 -> 블록된 시그널 마스크입니다.
  • SigIgn: 0000000000000000 -> 무시된 시그널 마스크입니다.
  • SigCgt: 0000000000000000 -> 캐치된 시그널 마스크입니다.
  • CapInh: 0000000000000000 -> 프로세스에 의해 상속된 유효한 캡 권한 비트마스크입니다.
  • CapPrm: 0000000000000000 -> 프로세스에 의해 유효한 캡 권한 비트마스크입니다.
  • CapEff: 0000000000000000 -> 프로세스에 의해 현재 유효한 캡 권한 비트마스크입니다.
  • CapBnd: 000001ffffffffff
  • CapAmb: 0000000000000000
  • NoNewPrivs: 0
  • Seccomp: 0
  • Seccomp_filters: 0
  • Speculation_Store_Bypass: vulnerable
  • SpeculationIndirectBranch: always enabled
  • Cpus_allowed: 1f
  • Cpus_allowed_list: 0-4
  • Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000, 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000, 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000, 00000000,00000000,00000000,00000001
  • Mems_allowed_list: 0
  • voluntary_ctxt_switches: 0
  • nonvoluntary_ctxt_switches: 0

📦 VmLck: 잠긴 메모리 설명

VmLck: 잠긴 메모리 크기입니다.
여기서 "잠긴"에 대해서 자세히 설명해주세요. 누가, 왜 잠그는 거죠? 어떻게 잠그나요?

"잠긴 메모리"란 특정 프로세스가 운영 체제에 의해 스왑되지 않도록 메모리에 고정된 메모리를 의미합니다.   이는 메모리 페이지를 메모리에서 스왑 공간으로 옮기지 못하도록 잠그는 것을 의미합니다.   이 잠금은 특정 작업이 반드시 메모리에 있어야 하고, 스왑될 경우 성능 저하나 다른 문제가 발생할 수 있는 상황에서 사용됩니다.

  • 1. 누가 메모리를 잠그나요?
    - 메모리 잠금은 일반적으로 응용 프로그램(프로세스) 또는 시스템 관리자가 수행합니다. 응용 프로그램은 자신의 메모리를 잠글 수 있으며, 시스템 관리자는 특정 작업에 대해 메모리를 잠글 수 있습니다.
  • 2. 왜 메모리를 잠그나요?
    - 실시간 성능 요구: 실시간 시스템이나 데이터베이스 서버와 같은 응용 프로그램은 일정 시간 내에 작업을 처리해야 하며, 메모리 페이지가 스왑되어 디스크로 이동되면 성능이 크게 저하될 수 있습니다. 이런 경우 메모리를 잠가서 스왑되지 않도록 해야 합니다.
    - 보안: 보안이 중요한 경우, 암호화 키나 민감한 데이터를 포함한 메모리 페이지가 스왑되면, 이러한 데이터가 스왑 공간에 저장될 수 있습니다. 메모리를 잠그면 이러한 위험을 방지할 수 있습니다.
  • 3. 어떻게 메모리를 잠그나요?
    • mlock(2) 및 mlockall(2): 리눅스에서는 'mlock'과 'mlockall'이라는 시스템 호출을 사용하여 메모리를 잠글 수 있습니다.
      - 'mlock(void *addr, size_t len)': 이 시스템 호출은 'addr'에서 시작하여 'len' 바이트 크기의 메모리를 잠급니다.
      - 'mlockall(int flags)': 이 시스템 호출은 호출된 프로세스의 모든 메모리를 잠급니다. 'flags' 인수로 'MCL_CURRENT' (현재 매핑된 메모리만 잠금) 또는 'MCL_FUTURE' (미래에 매핑될 메모리도 잠금)를 전달할 수 있습니다.
    • 권한: 메모리를 잠그는 데는 권한이 필요합니다. 일반 사용자는 잠글 수 있는 메모리의 양이 제한될 수 있으며, 이는 '/etc/security/limits.conf' 파일에서 'memlock' 한도를 설정하여 제어할 수 있습니다. 시스템 관리자(root)는 이러한 제한을 초과할 수 있습니다.
  • 4. 사용 예 - 예를 들어, 실시간 처리 요구가 있는 응용 프로그램은 자신의 중요 메모리 영역이 스왑되지 않도록 메모리를 잠그는 경우가 많습니다. 이는 응답 시간을 보장하고 중요한 데이터가 디스크로 스왑되어 보안 위험에 노출되는 것을 방지합니다.
  • 5. 제한사항 및 고려사항 - 메모리를 너무 많이 잠그면 시스템의 가용 메모리가 줄어들어 다른 프로세스의 성능에 악영향을 줄 수 있습니다. 따라서 메모리 잠금은 신중하게 사용되어야 합니다.
  • 요약하자면, 메모리 잠금은 특정 메모리 페이지가 물리적 메모리에 상주하도록 보장하기 위해 사용되며, 이는 실시간 성능 요구 사항이나 보안상의 이유로 사용됩니다. 이 기능은 특정 권한을 가진 프로세스나 시스템 관리자가 설정할 수 있습니다.

📦 VmPin: 고정된 메모리 설명

VmPin: 고정된 메모리 크기입니다.
여기서 "고정된"에 대해서 자세히 설명해주세요.
그리고 Pin은 "핀으로 고정하다"란 뜻인가요?

"VmPin" 항목에서 "페이지된 메모리"와 "Pin"이라는 용어는 일반적인 메모리 관리와는 약간 다르게 해석될 필요가 있습니다. 이 항목은 메모리가 특정 방식으로 관리되고 고정된 메모리 크기를 나타내는데 사용됩니다.

  • 1. 페이지된 메모리란?
    - 페이지(Page)는 메모리 관리의 기본 단위입니다. 운영 체제는 프로그램의 메모리를 작은 단위(일반적으로 4KB)로 나누어 관리하며, 이 단위를 페이지라고 합니다.
    - 페이지된 메모리는 일반적으로 메모리의 페이지들이 스왑 공간으로 이동하거나 다시 로드될 수 있다는 것을 의미하지만, 'VmPin'의 경우 이러한 의미보다는 메모리 페이지들이 특정한 이유로 물리적 메모리에 고정되어 있는지를 나타냅니다.
  • 2. Pin의 의미
    - 여기서 "Pin"은 "핀으로 고정하다"는 의미에서 유래한 것으로, 메모리를 물리적 메모리에 "고정"하는 것을 의미합니다. 즉, 메모리 페이지가 물리적 메모리에서 다른 위치로 이동되거나 스왑 아웃되지 않도록 고정하는 것을 말합니다.
    - 이 고정은 일반적으로 특정 응용 프로그램이 페이지가 메모리에 상주해야 함을 요구할 때 사용됩니다. 예를 들어, 하드웨어 장치와 직접 상호작용하는 프로그램에서 메모리 페이지를 핀으로 고정하면, 해당 메모리가 물리적으로 일관되게 유지되어야 할 때 매우 유용합니다.
  • 3. VmPin의 실제 의미
    - VmPin은 특정 응용 프로그램이 물리적 메모리에 고정(Pinned)된 메모리 크기를 나타냅니다.
    - 이 메모리는 일반적인 스왑 관리의 대상이 되지 않으며, 물리적 메모리에서 다른 위치로 옮겨지지 않습니다. 이 메모리 고정은 주로 실시간 응용 프로그램, 하드웨어 장치와의 직접 메모리 맵핑, 그리고 고성능 요구 사항이 있는 프로세스에서 사용됩니다.
    - 'mlock' 시스템 호출이 이러한 고정을 수행하는 일반적인 방법 중 하나입니다.
  • 4. 사용 예
    - 예를 들어, 고성능 네트워킹이나 데이터베이스 서버에서 자주 사용됩니다. 이러한 시스템은 매우 빠른 응답 시간을 필요로 하므로, 메모리가 디스크 스왑으로 인해 느려지지 않도록 핀 고정하는 것입니다.
  • 5. 고정된 메모리의 관리
    - 고정된 메모리는 스왑될 수 없기 때문에, 시스템의 가용 물리적 메모리를 감소시킵니다. 따라서 'VmPin' 값이 너무 크면 시스템의 다른 프로세스들이 사용할 수 있는 메모리가 부족해져 성능 저하가 발생할 수 있습니다. 이 때문에 메모리 고정은 제한된 상황에서 신중하게 사용되어야 합니다.
  • 요약하면, 'VmPin'은 운영 체제가 특정 메모리 페이지들을 물리적 메모리에 고정시킨 크기를 나타내며, 이는 주로 실시간 처리 요구나 특정 하드웨어와의 상호작용이 필요한 경우에 사용됩니다. "Pin"은 "고정하다"라는 의미로, 메모리를 스왑되지 않도록 물리적 메모리에 고정하는 것을 의미합니다.

📦 RssAnon: 익명 메모리 설명

RssAnon: 익명 메모리에 사용된 RSS 크기입니다.
여기서 "익명"에 대해서 자세히 설명해주세요.

"RssAnon"에서 "익명 메모리"는 일반적으로 특정 파일이나 장치와 직접적으로 연관되지 않은 메모리를 의미합니다.   익명 메모리는 디스크에 존재하는 파일을 기반으로 하지 않고, 프로세스가 동적으로 할당하는 메모리 공간을 말합니다.   익명 메모리는 보통 `malloc`, `brk`, `mmap` 등과 같은 시스템 호출을 통해 할당됩니다.

  • 익명 메모리의 특징
    • 1. 파일과의 연관 없음: 익명 메모리는 특정 파일이나 장치와 매핑되지 않으므로 "익명"이라고 불립니다. 이는 이 메모리가 메모리 맵핑된 파일이 아닌, 프로세스의 동적 데이터나 스택, 힙 등의 용도로 사용되는 메모리라는 것을 의미합니다.
    • 2. 스왑 공간: 익명 메모리는 디스크의 스왑 공간에 저장될 수 있습니다. 만약 메모리가 부족하면, 운영 체제는 익명 메모리를 스왑 공간으로 옮겨 물리적 메모리를 확보할 수 있습니다.
    • 3. RssAnon의 의미:
      - Rss는 Resident Set Size의 약자로, 프로세스가 실제로 물리적 메모리(RAM)에 상주하는 메모리 양을 나타냅니다.
      - RssAnon은 그 중에서 익명 메모리로 할당된 부분이 물리적 메모리에 상주하는 크기를 나타냅니다. 즉, 파일이나 장치와 매핑되지 않은, 프로세스가 사용 중인 실제 물리적 메모리 크기입니다.
  • 익명 메모리의 예
    • 힙(Heap): 동적 메모리 할당('malloc', 'calloc', 'realloc' 등)으로 얻어지는 메모리. 이 메모리는 특정 파일이나 장치와 연관되지 않으며, 프로세스가 종료되거나 명시적으로 해제('free')될 때까지 메모리에 남아 있습니다.
    • 스택(Stack): 함수 호출 시 지역 변수나 함수 호출 스택 프레임 등이 저장되는 메모리 공간. 이 또한 특정 파일이나 장치와 연관되지 않으며, 함수 호출이 끝나면 자동으로 해제됩니다.
    • 익명 메모리 맵핑: 'mmap' 시스템 호출에서 파일이 아닌, 'MAP_ANONYMOUS' 플래그를 사용해 할당된 메모리. 이 경우 해당 메모리는 파일과 연관되지 않고 프로세스가 사용하기 위한 일반적인 메모리로 할당됩니다.
  • 요약 "익명 메모리"는 파일이나 장치와 직접적으로 연결되지 않은, 프로세스가 동적으로 할당하는 메모리 공간을 의미합니다. 'RssAnon'은 이 익명 메모리 중 실제 물리적 메모리에 상주하는 메모리의 크기를 나타냅니다. 익명 메모리는 주로 힙, 스택, 그리고 익명 메모리 맵핑을 통해 할당된 메모리로 구성됩니다.

📦 RssShmem: 공유 메모리 설명

RssShmem: 공유 메모리에 사용된 RSS 크기입니다.
여기서 "공유"에 대해서 자세히 설명해주세요.

"RssShmem"에서 "공유 메모리"는 여러 프로세스가 동시에 접근할 수 있는 메모리 영역을 의미합니다.   이 메모리 영역은 특정 파일, 장치, 또는 메모리 맵핑을 통해 여러 프로세스 간에 공유되며, 이는 협력적인 작업이나 데이터를 효율적으로 교환할 수 있도록 합니다.

  • 공유 메모리의 특징
    • 1. 프로세스 간 데이터 공유: 공유 메모리는 여러 프로세스가 동일한 메모리 공간에 접근할 수 있게 하여, 데이터를 복사할 필요 없이 효율적으로 데이터를 교환할 수 있습니다. 예를 들어, 두 개의 프로세스가 동시에 특정 데이터를 읽고 쓰는 작업을 수행할 수 있습니다.
    • 2. IPC (Inter-Process Communication): 공유 메모리는 주로 프로세스 간 통신(IPC)에서 사용됩니다. 이는 파이프, 소켓, 메시지 큐 등과 함께 프로세스 간에 데이터를 주고받는 수단 중 하나입니다. 특히 대용량 데이터를 처리할 때, 메모리를 공유함으로써 데이터 복사에 드는 시간과 자원을 절약할 수 있습니다.
    • 3. 공유 메모리 맵핑:
      - 공유 메모리는 일반적으로 'mmap' 시스템 호출을 통해 파일이나 장치를 여러 프로세스에서 공유하도록 매핑할 때 사용됩니다.
      - 또 다른 방식은 'shmget', 'shmat', 'shmdt'와 같은 System V 공유 메모리 인터페이스를 사용하는 것입니다. 이 방식에서는 프로세스가 공유 메모리 세그먼트를 생성하고, 다른 프로세스들이 이 세그먼트를 사용할 수 있도록 합니다.
    • 4. RssShmem의 의미:
      - RssShmem은 Resident Set Size의 일부로, 물리적 메모리에 상주하는 공유 메모리의 크기를 나타냅니다.
      - 이는 프로세스가 다른 프로세스와 공유하고 있는 메모리 중 실제로 물리적 메모리에 로드된 부분을 의미합니다.
  • 공유 메모리의 예
    • 메모리 맵핑된 파일: 두 개 이상의 프로세스가 동일한 파일을 'mmap' 시스템 호출을 통해 메모리에 매핑하면, 이 파일은 공유 메모리 영역으로 사용됩니다. 이로 인해 여러 프로세스가 동일한 파일 데이터를 공유할 수 있습니다.
    • System V 공유 메모리: 'shmget'으로 생성된 공유 메모리 세그먼트를 여러 프로세스가 'shmat'를 통해 연결해 사용합니다. 예를 들어, 프로세스 A가 데이터를 공유 메모리 세그먼트에 쓰면, 프로세스 B는 동일한 세그먼트를 읽어 데이터를 바로 사용할 수 있습니다.
    • POSIX 공유 메모리: 'shm_open'과 같은 POSIX 인터페이스를 사용하여 공유 메모리 객체를 생성하고, 이를 여러 프로세스가 접근할 수 있습니다.
  • 요약
    "공유 메모리"는 여러 프로세스가 동시에 접근할 수 있는 메모리 영역을 의미하며, 주로 프로세스 간 통신(IPC)이나 데이터 공유에 사용됩니다. 'RssShmem'은 이러한 공유 메모리 중 실제 물리적 메모리에 상주하는 크기를 나타냅니다. 공유 메모리는 메모리 맵핑된 파일, System V 공유 메모리, POSIX 공유 메모리 등을 통해 구현될 수 있으며, 효율적인 데이터 교환을 위해 자주 사용됩니다.

📦 RssAnon,RssFile,RssShmem 3개 항목을 더하면 VmRSS가 나오나요?

네, 'RssAnon', 'RssFile', 'RssShmem' 이 세 가지 항목을 더하면 'VmRSS' 값이 나옵니다.
이를 공식으로 나타내면 다음과 같습니다:
VmRSS = RssAnon + RssFile + RssShmem
각 항목의 의미는 다음과 같습니다:
- RssAnon: 익명 메모리에 사용된 Resident Set Size (RSS).
- RssFile: 파일 매핑에 사용된 RSS.
- RssShmem: 공유 메모리에 사용된 RSS.
'VmRSS'는 프로세스가 물리적으로 사용하는 총 메모리 크기를 의미하며, 이는 이 세 가지 항목의 합으로 계산됩니다.   이 합은 프로세스가 사용하는 실제 메모리의 양을 나타냅니다.

⚛ 설명 (chatgpt)


Email 답글이 올라오면 이메일로 알려드리겠습니다.