Linux에서 pmap 명령을 사용하는 방법

게시 됨: 2022-06-25
bash 프롬프트를 표시하는 Linux 노트북
Fatmawati achmad zaenuri/Shutterstock.com

Linux 프로세스가 사용하는 RAM의 양을 알아내는 것은 간단한 문제가 아닙니다. 특히 공유 메모리를 고려해야 할 때 그렇습니다. 고맙게도 pmap 명령은 모든 것을 이해하는 데 도움이 됩니다.

메모리 매핑

최신 운영 체제에서 각 프로세스는 메모리 또는 할당 공간 의 할당된 고유 영역에 있습니다. 할당된 영역의 경계는 물리적 하드웨어 주소에 직접 매핑되지 않습니다. 운영 체제는 각 프로세스에 대한 가상 메모리 공간을 생성하고 가상 메모리를 물리적 메모리에 매핑하는 추상화 계층 역할을 합니다.

커널은 각 프로세스에 대한 변환 테이블을 유지 관리하며 이것은 CPU에서 액세스합니다. 커널이 특정 CPU 코어에서 실행 중인 프로세스를 변경하면 프로세스와 CPU 코어를 함께 묶는 변환 테이블을 업데이트합니다.

추상화의 이점

이 계획에는 이점이 있습니다. 메모리 사용은 사용자 영역의 각 프로세스에 대해 다소 캡슐화되고 샌드박스 처리됩니다. 프로세스는 가상 메모리 주소의 관점에서 메모리만 "본다". 이것은 운영 체제에서 제공한 메모리로만 작동할 수 있음을 의미합니다. 일부 공유 메모리에 대한 액세스 권한이 없는 한 다른 프로세스에 할당된 메모리에 대해 알지 못하거나 액세스할 수 없습니다.

Linux에서 Swappiness란 무엇입니까? (및 변경 방법)
관련 Linux에서 Swappiness란 무엇입니까? (및 변경 방법)

하드웨어 기반 물리적 메모리를 가상 메모리 주소로 추상화하면 커널이 일부 가상 메모리가 매핑되는 물리적 주소를 변경할 수 있습니다. 가상 메모리 영역이 가리키는 실제 주소를 변경하여 메모리를 디스크로 스왑할 수 있습니다. 실제로 필요할 때까지 물리적 메모리 제공을 연기할 수도 있습니다.

메모리 읽기 또는 쓰기 요청이 요청된 대로 처리되는 한 커널은 적절하다고 판단되는 매핑 테이블을 자유롭게 저글링할 수 있습니다.

주문형 RAM

매핑 테이블과 "주문형 RAM"의 개념은 공유 메모리 의 가능성을 열어줍니다. 커널은 같은 것을 메모리에 두 번 이상 로드하지 않으려고 합니다. 예를 들어 공유 라이브러리를 메모리에 한 번 로드하고 이를 사용해야 하는 다른 프로세스에 매핑합니다. 각 프로세스에는 공유 라이브러리에 대한 고유한 주소가 있지만 모두 동일한 실제 위치를 가리킵니다.

메모리의 공유 영역이 쓰기 가능하면 커널은 copy-on-write라는 체계를 사용합니다. 한 프로세스가 공유 메모리에 쓰고 해당 메모리를 공유하는 다른 프로세스가 변경 사항을 볼 수 없는 경우 쓰기 요청 시점에 공유 메모리의 복사본이 생성됩니다.

초심자 괴짜: 가상 머신을 만들고 사용하는 방법
관련 초보자 괴짜: 가상 머신을 만들고 사용하는 방법

2009년 12월에 릴리스된 Linux 커널 2.6.32는 Linux에 "Kernel SamePage Merging"이라는 기능을 제공했습니다. 이것은 Linux가 다른 주소 공간에서 동일한 데이터 영역을 감지할 수 있음을 의미합니다. 단일 컴퓨터에서 실행되는 일련의 가상 머신을 상상해 보십시오. 가상 머신은 모두 동일한 운영 체제를 실행하고 있습니다. 공유 메모리 모델과 copy-on-write를 사용하면 호스트 컴퓨터의 오버헤드를 크게 줄일 수 있습니다.

이 모든 것이 Linux의 메모리 처리를 최대한 정교하고 최적으로 만듭니다. 그러나 그 정교함 때문에 프로세스를 살펴보고 메모리 사용량이 실제로 무엇인지 알기가 어렵습니다.

pmap 유틸리티

커널은 "/proc" 시스템 정보 의사 파일 시스템에 있는 두 개의 의사 파일을 통해 RAM으로 수행하는 작업의 많은 부분을 노출합니다. 각 프로세스의 프로세스 ID 또는 PID 에 대해 "/proc/maps" 및 "/proc//smaps"라는 이름의 프로세스당 두 개의 파일이 있습니다.

pmap 도구는 이러한 파일에서 정보를 읽고 터미널 창에 결과를 표시합니다. pmap 을 사용할 때마다 관심 있는 프로세스의 PID를 제공해야 하는 것은 분명합니다.

프로세스 ID 찾기

프로세스의 PID를 찾는 방법에는 여러 가지가 있습니다. 다음은 예제에서 사용할 간단한 프로그램의 소스 코드입니다. C로 작성되었습니다. 터미널 창에 메시지를 인쇄하고 사용자가 "Enter" 키를 누르기를 기다리는 것뿐입니다.

 #include <stdio.h>

int main(int argc, char *argv[])
{
  printf("Geek 테스트 프로그램 방법.");
  getc(표준 입력);
} // 메인 끝

프로그램은 gcc 컴파일러를 사용하여 pm 이라는 실행 파일로 컴파일되었습니다.

 gcc -오 오후 pm.c 

예제 프로그램 컴파일

프로그램은 사용자가 "Enter" 키를 누르기를 기다리기 때문에 원하는 만큼 계속 실행됩니다.

 ./오후 

예제 프로그램 실행

프로그램이 시작되고 메시지를 인쇄하고 키 입력을 기다립니다. 이제 PID를 검색할 수 있습니다. ps 명령은 실행 중인 프로세스를 나열합니다. -e (모든 프로세스 표시) 옵션은 ps 가 모든 프로세스를 나열하도록 합니다. grep 을 통해 출력을 파이프하고 이름에 "pm"이 포함된 항목을 필터링합니다.

 추신 - 전자 | 그렙 오후 

grep으로 프로세스 ID 찾기

이것은 이름에 "pm"이 있는 모든 항목을 나열합니다.

pidof 명령을 사용하여 보다 구체적으로 할 수 있습니다. 명령줄에서 관심 있는 프로세스의 이름을 pidof 에 지정하고 일치 항목을 찾으려고 합니다. 일치하는 항목이 발견되면 pidof 는 일치하는 프로세스의 PID를 인쇄합니다.

 피도프 오후 

pidof를 사용하여 프로세스 ID 찾기

pidof 방법은 프로세스 이름을 알면 더 깔끔하지만 ps 방법은 프로세스 이름의 일부만 알고 있어도 작동합니다.

pmap 사용

테스트 프로그램을 실행하고 PID를 식별하면 다음과 같이 pmap을 사용할 수 있습니다.

 피맵 40919 

예제 프로그램에서 pmap 실행

프로세스에 대한 메모리 매핑이 나열됩니다.

표준 pmap 출력

다음은 명령의 전체 출력입니다.

 40919: ./오후
000056059f06c000 4K r---- 오후
000056059f06d000 4K 수신-- 오후
000056059f06e000 4K r---- 오후
000056059f06f000 4K r---- 오후
000056059f070000 4K rw--- 오후
000056059fc39000 132K rw --- [ anon ]
00007f97a3edb000 8K rw --- [ anon ]
00007f97a3edd000 160K r---- libc.so.6
00007f97a3f05000 1616K rx-- libc.so.6
00007f97a4099000 352K r---- libc.so.6
00007f97a40f1000 4K ------ libc.so.6
00007f97a40f2000 16K r---- libc.so.6
00007f97a40f6000 8K rw--- libc.so.6
00007f97a40f8000 60K rw --- [ anon ]
00007f97a4116000 4K r---- ld-linux-x86-64.so.2
00007f97a4117000 160K rx-- ld-linux-x86-64.so.2
00007f97a413f000 40K r---- ld-linux-x86-64.so.2
00007f97a4149000 8K r---- ld-linux-x86-64.so.2
00007f97a414b000 8K rw--- ld-linux-x86-64.so.2
00007ffca0e7e000 132K rw--- [ 스택 ]
00007ffca0fe1000 16K r---- [아논]
00007ffca0fe5000 8K rx-- [ anon ]
ffffffffff600000 4K --x-- [ anon ]
총 2756K

첫 번째 줄은 프로세스 이름과 PID입니다. 다른 각 줄은 매핑된 메모리 주소와 해당 주소의 메모리 양을 킬로바이트 단위로 표시합니다. 각 줄의 다음 5개 문자를 가상 메모리 권한 이라고 합니다. 유효한 권한은 다음과 같습니다.

  • r : 매핑된 메모리를 프로세스에서 읽을 수 있습니다.
  • w : 매핑된 메모리는 프로세스에서 쓸 수 있습니다.
  • x : 프로세스는 매핑된 메모리에 포함된 모든 명령을 실행할 수 있습니다.
  • s : 매핑된 메모리가 공유되고 공유 메모리에 대한 변경 사항은 메모리를 공유하는 모든 프로세스에서 볼 수 있습니다.
  • R : 이 매핑된 메모리에 대한 스왑 공간에 대한 예약이 없습니다.

각 줄의 최종 정보는 매핑 소스의 이름입니다. 이것은 프로세스 이름, 라이브러리 이름 또는 스택이나 힙과 같은 시스템 이름일 수 있습니다.

확장 디스플레이

-x (확장) 옵션은 두 개의 추가 열을 제공합니다.

 pmap -x 40919 

pmap과 함께 -X 확장 옵션 사용

열에는 제목이 지정됩니다. 우리는 이미 "Address", "Kbytes", "Mode" 및 "Mapping" 열을 보았습니다. 새 열은 "RSS" 및 "Dirty"라고 합니다.

pmap 확장 출력

다음은 전체 출력입니다.

 40919: ./오후
주소 Kbytes RSS 더티 모드 매핑
000056059f06c000 4 4 0 r---- 오후
000056059f06d000 4 4 0 수신-- 오후
000056059f06e000 4 4 0 r---- 오후
000056059f06f000 4 4 4 r---- 오후
000056059f070000 4 4 4 rw--- 오후
000056059fc39000 132 4 4 rw --- [ anon ]
00007f97a3edb000 8 4 4 rw --- [ anon ]
00007f97a3edd000 160 160 0 r---- libc.so.6
00007f97a3f05000 1616 788 0 rx-- libc.so.6
00007f97a4099000 352 64 0 r---- libc.so.6
00007f97a40f1000 4 0 0 ----- libc.so.6
00007f97a40f2000 16 16 16 r---- libc.so.6
00007f97a40f6000 8 8 8 rw--- libc.so.6
00007f97a40f8000 60 28 28 rw --- [ anon ]
00007f97a4116000 4 4 0 r---- ld-linux-x86-64.so.2
00007f97a4117000 160 160 0 rx-- ld-linux-x86-64.so.2
00007f97a413f000 40 40 0 ​​r---- ld-linux-x86-64.so.2
00007f97a4149000 8 8 8 r---- ld-linux-x86-64.so.2
00007f97a414b000 8 8 8 rw--- ld-linux-x86-64.so.2
00007ffca0e7e000 132 12 12 rw--- [ 스택 ]
00007ffca0fe1000 16 0 0 r---- [아논]
00007ffca0fe5000 8 4 0 rx-- [ anon ]
ffffffffff600000 4 0 0 --x-- [아노]
----------- ------- ------- 
총 kB 2756 1328 96
  • RSS : 상주 세트 크기 입니다. 즉, 현재 RAM에 있고 교체되지 않은 메모리 양입니다.
  • Dirty : 프로세스와 매핑이 시작된 이후로 "Dirty" 메모리가 변경되었습니다.

모든 것을 보여줘

-X (확장된 것 이상)는 출력에 추가 열을 추가합니다. 대문자 "X"에 유의하십시오. -XX ( -X 이상)라는 또 다른 옵션은 pmap 이 커널에서 얻을 수 있는 모든 것을 보여줍니다. -X-XX 의 하위 집합이므로 -XX 의 출력을 설명합니다.

 pmap -XX 40919 

pmap과 함께 -XX show me everything 옵션 사용

출력은 터미널 창에서 끔찍하게 둘러싸이고 실제로 해독할 수 없습니다. 전체 출력은 다음과 같습니다.

 40919: ./오후
         주소 Perm 오프셋 장치 아이노드 크기 KernelPageSize MMUPageSize Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty 참조 익명 LazyFree AnonHugePages ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb 스왑 SwapPsible M 잠금 VmFlags
    56059f06c000 r--p 00000000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me pm dw sd
    56059f06d000 r-xp 00001000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me pm dws
    56059f06e000 r--p 00002000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me pm dw sd
    56059f06f000 r--p 00002000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd mr mw d pm dw ac
    56059f070000 rw-p 00003000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw
    56059fc39000 rw-p 00000000 00:00 0 132 4 4 4 4 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me] ac sd [힙
    7f97a3edb000 rw-p 00000000 00:00 0 8 4 4 4 4 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 
    7f97a3edd000 r--p 00000000 08:03 264328 160 4 4 160 4 160 0 0 160 0 0 0 0 0 0 0 0 0 0 0 rd me.sd6 libc
    7f97a3f05000 r-xp 00028000 08:03 264328 1616 4 4 788 32 788 0 0 0 788 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 rd ex.
    7f97a4099000 r--p 001bc000 08:03 264328 352 4 4 64 1 64 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me.so
    7f97a40f1000 ---p 00214000 08:03 264328 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 mr mw me sd libc.so.6
    7f97a40f2000 r--p 00214000 08:03 264328 16 4 4 16 16 0 0 0 16 16 16 0 0 0 0 0 0 0 0 ac 0 0 rd mr.sd6 me
    7f97a40f6000 rw-p 00218000 08:03 264328 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 0 rd wr mr.mw lib me ac.s
    7f97a40f8000 rw-p 00000000 00:00 0 60 4 4 28 28 0 0 0 28 28 28 0 0 0 0 0 0 0 0 0 0 rd wr mr sdw meac 
    7f97a4116000 r--p 00000000 08:03 264305 4 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me ld-6linux4-.xd
    7f97a4117000 r-xp 00001000 08:03 264305 160 4 4 160 11 160 0 0 0 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 linux 0 0 0 rd ex m
    7f97a413f000 r--p 00029000 08:03 264305 40 4 4 40 1 40 0 ​​0 40 0 ​​0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 rd mr sxd8 6ld-mr sw me6
    7f97a4149000 r--p 00032000 08:03 264305 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 rd mr mw me 8 dw-64
    7f97a414b000 rw-p 00034000 08:03 264305 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 0 rdac-6ld mr mw me dw
    7ffca0e7e000 rw-p 00000000 00:00 0 132 4 4 12 12 0 0 0 12 12 12 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me gdac
    7ffca0fe1000 r--p 00000000 00:00 0 16 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 rd mr pf io de dd sd [vvar]
    7ffca0fe5000 r-xp 00000000 00:00 0 8 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me de sd [vdso]
ffffffffff600000 --xp 00000000 00:00 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ex [vsyscall]
                                             ==== ============================================== ==================================================== ===== ============================================== === =============================================== =========== 
                                             2756 92 92 1328 157 1220 0 12 96 1328 96 0 0 0 0 0 0 0 0 0 0 KB 

여기에 많은 정보가 있습니다. 열이 보유하는 내용은 다음과 같습니다.

  • 주소 : 이 매핑의 시작 주소입니다. 이것은 가상 메모리 주소 지정을 사용합니다.
  • Perm : 메모리의 권한입니다.
  • 오프셋 : 메모리가 파일 기반인 경우 파일 내 이 매핑의 오프셋입니다.
  • 장치 : 주 및 부 번호로 제공되는 Linux 장치 번호입니다. lsblk 명령을 실행하여 컴퓨터의 장치 번호를 볼 수 있습니다.
  • Inode : 매핑이 연결된 파일의 inode입니다. 예를 들어, 이 예에서 이것은 pm 프로그램에 대한 정보를 보유하는 inode일 수 있습니다.
  • Size : 메모리 매핑된 영역의 크기입니다.
  • KernelPageSize : 커널에서 사용하는 페이지 크기입니다.
  • MMUPageSize : 메모리 관리 장치에서 사용하는 페이지 크기입니다.
  • Rss : 상주 세트 크기 입니다. 즉, 현재 RAM에 있고 교체되지 않은 메모리 양입니다.
  • Pss : 이것은 비례 공유 크기 입니다. (공유 크기를 공유 수로 나눈 값)에 추가된 개인 공유 크기입니다.
  • Shared_Clean : 매핑이 생성된 이후 변경 되지 않은 다른 프로세스와 공유된 메모리의 양입니다. 메모리가 공유 가능하더라도 실제로 공유되지 않은 경우 여전히 개인 메모리로 간주됩니다.
  • Shared_Dirty : 매핑이 생성된 이후 변경된 다른 프로세스와 공유된 메모리의 양입니다.
  • Private_Clean : 매핑이 생성된 이후 변경 되지 않은 개인 메모리(다른 프로세스와 공유되지 않음)의 양입니다.
  • Private_Dirty : 매핑이 생성된 이후 변경된 개인 메모리의 양입니다.
  • Referenced : 현재 참조되거나 액세스된 것으로 표시된 메모리의 양입니다.
  • Anonymous : 교체할 장치가 없는 메모리입니다. 즉, 파일 기반이 아닙니다.
  • LazyFree : MADV_FREE 로 플래그가 지정된 페이지입니다. 이러한 페이지는 기록되지 않은 변경 사항이 있을 수 있지만 해제 및 회수가 가능한 것으로 표시되었습니다. 그러나 메모리 매핑에 MADV_FREE 가 설정된 후에 후속 변경이 발생하면 MADV_FREE 플래그가 제거되고 변경 사항이 기록될 때까지 페이지가 회수되지 않습니다.
  • AnonHugePages : 파일로 백업되지 않은 "거대한" 메모리 페이지(4KB 이상)입니다.
  • ShmemPmdMapped : 거대한 페이지와 관련된 공유 메모리. 메모리에 완전히 상주하는 파일 시스템에서도 사용할 수 있습니다.
  • FilePmdMapped : Page Middle Directory는 커널에서 사용할 수 있는 페이징 체계 중 하나입니다. 이것은 PMD 항목이 가리키는 파일 지원 페이지 수입니다.
  • Shared_Hugetlb : TLB(Translation Lookaside Tables)는 사용자 공간 메모리 위치에 액세스하는 데 걸리는 시간을 최적화하는 데 사용되는 메모리 캐시입니다. 이 수치는 공유 대용량 메모리 페이지와 연결된 TLB에서 사용되는 RAM의 양입니다.
  • Private_Hugetlb : 이 수치는 private 거대한 메모리 페이지와 관련된 TLB에서 사용되는 RAM의 양입니다.
  • 스왑 : 사용 중인 스왑의 양입니다.
  • SwapPss : 스왑 비례 공유 크기 입니다. (공유 크기를 공유 수로 나눈 값)에 추가된 스왑된 개인 메모리 페이지로 구성된 스왑의 양입니다.
  • 잠김 : 운영 체제가 힙 또는 오프 힙 메모리를 페이징아웃하지 못하도록 메모리 매핑을 잠글 수 있습니다.
  • THPeligible : 매핑이 투명한 거대한 페이지 를 할당할 수 있는지 여부를 나타내는 플래그입니다. 1은 참, 0은 거짓을 의미합니다. 투명 거대 페이지는 RAM이 많은 컴퓨터에서 TLB 페이지 조회의 오버헤드를 줄이는 메모리 관리 시스템입니다.
  • VmFlags : 아래 플래그 목록을 참조하십시오.
  • 매핑 : 매핑 소스의 이름입니다. 이것은 프로세스 이름, 라이브러리 이름 또는 스택이나 힙과 같은 시스템 이름일 수 있습니다.

VmFlags(가상 메모리 플래그)는 다음 목록의 하위 집합입니다.

  • rd : 읽을 수 있습니다.
  • wr : 쓰기 가능.
  • : 실행 가능.
  • sh : 공유합니다.
  • mr : 읽을 수 있습니다.
  • mw : 쓸 수 있습니다.
  • : 실행할 수 있습니다.
  • ms : 공유할 수 있습니다.
  • gd : 스택 세그먼트가 작아집니다.
  • pf : 순수 페이지 프레임 번호 범위. 페이지 프레임 번호는 물리적 메모리 페이지의 목록입니다.
  • dw : 매핑된 파일에 쓰기를 비활성화합니다.
  • lo : 페이지가 메모리에 잠겨 있습니다.
  • io : 메모리 매핑된 I/O 영역.
  • sr : 제공되는 순차 읽기 어드바이스( madvise() 함수에 의해)
  • rr : 무작위 읽기 조언이 제공됩니다.
  • dc : 프로세스가 분기된 경우 이 메모리 영역을 복사하지 않습니다.
  • de : 다시 매핑할 때 이 메모리 영역을 확장하지 않습니다.
  • ac : 지역이 책임집니다.
  • nr : 스왑 공간이 해당 영역에 예약되어 있지 않습니다.
  • ht : 영역이 거대한 TLB 페이지를 사용합니다.
  • sf : 동기 페이지 오류.
  • ar : 아키텍처별 플래그입니다.
  • wf : 프로세스가 분기되면 이 메모리 영역을 지웁니다.
  • dd : 코어 덤프에 이 메모리 영역을 포함하지 마십시오.
  • sd : 부드러운 더티 플래그.
  • mm : 혼합 맵 영역.
  • hg : 거대한 페이지 조언 플래그.
  • nh : 거대한 페이지 조언 플래그가 없습니다.
  • mg : 병합 가능한 조언 플래그입니다.
  • bt : ARM64 바이어스 온도 불안정 보호 페이지.
  • mt : ARM64 메모리 태깅 확장 태그가 활성화됩니다.
  • um : Userfaultfd 추적이 누락되었습니다.
  • uw : Userfaultfd wr-protect 추적.

메모리 관리가 복잡함

그리고 실제로 무슨 일이 일어나고 있는지 이해하기 위해 데이터 테이블에서 거꾸로 작업합니다. 그러나 최소한 pmap 은 전체 그림을 제공하므로 알아야 할 사항을 가장 잘 파악할 수 있습니다.

우리의 예제 프로그램이 16KB 바이너리 실행 파일로 컴파일되었지만 거의 전적으로 런타임 라이브러리로 인해 약 2756KB의 메모리를 사용(또는 공유)하고 있다는 점에 주목하는 것이 흥미로웠습니다.

마지막으로 깔끔한 트릭은 pmappidof 명령을 함께 사용하여 프로세스의 PID를 찾아 pmap 에 전달하는 작업을 하나의 명령으로 결합할 수 있다는 것입니다.

 pmap $(pidof 오후)