개요 본 문서는 실행 코드의 메모리 요청에 대한 프로세스 주소 공간 소비와 매핑을 이해하는 데 관심이 있는 개발자들을 위해 작성됐습니다. 또한 위에서 언급한 메모리 요청과 관련해 물리적 메모리와 swap 소모에 대해서도 설명하고 있습니다. 메인 페이지에서 제공되는 정보를 보충 설명하기 위해 이들 기능을 입증하고 내부 작동을 설명할 수 있는 코드 예제와 쉘 명령이 포함되어 있습니다.

들어가는 글 본 문서의 sample code 는 논의되는 개념들에 대한 설명을 돕기 위한 것으로 다른 메모리 요청이 실행될 때 프로세스가 주소 공간을 차지하는 방식을 보여줍니다. 이 샘플 코드에서, global array, local array, malloc, mmap(MAP_PRIVATE), mmap(MAP_PRIVATE|MAP_NORESERVE)의 사용에 대해 설명합니다. pmap -x를 툴로 사용하여 실행 프로세스의 주소 공간 소모와 매핑을 단계별로 나타내고 swap -s를 툴로 사용하여 swap 공간 소모를 표시합니다.

이론상의 개념 단계 1:

이 코드에서는 다음과 같은 6가지 메모리 요청 사례를 고려해 보겠습니다:

단계 1. 2MB의 global array 단계 2. main() 에 정의된 1MB local array 단계 3. main() 을 제외한 부분에 정의된 1MB local array 단계 4. 1MB의 malloc 단계 5. 1MB의 mmap(MAP_PRIVATE) 단계 6. 1MB의 mmap(MAP_PRIVATE|MAP_NORESERVE)

이 코드의 실행 결과는 프로세스의 가상 주소 공간 매핑, 시스템 메모리, swap 소모 측면에서다음과 같이 나타납니다:

위의 모든 메모리 요청은 요청된 크기에 따라 프로세스의 가상 주소(VA) 공간을 소모합니다. 프로세스의 가상 주소 공간은 32비트 운영 환경에서 4GB로 제한됩니다. 커널 매핑과 같이 프로세스에서 기본적으로 수행되는 다른 가상 주소 매핑이 존재하기 때문에 실제로 실행 코드에 사용 가능한 공간은 더욱 적습니다.

사례 6을 제외한 위의 모든 메모리 요청은 swap 공간을 예약합니다. 스택에 할당되거나 malloc을 통해 할당되는 모든 데이터(어레이 등)는 해당 프로세스에 대한 swap 예약을 야기합니다. 이러한 소모는 swap 예약뿐이며 아직 실제 swap 할당은 이루어지지 않았습니다.

Solaris OE(Operating Environment)는 성공적으로 반환된 모든 메모리 요청들을 통해 메모리가 사용되어야 할 때 사용할 수 있도록 보장합니다. 이는 요청이 이루어질 때 swap 공간을 먼저 예약하는 방식으로 수행됩니다. 코드가 많은 양의 메모리를 요청하는 경우, 나중에 사용되지 않더라도 Solaris OE는 swap에서 동일한 양을 줄이게 됩니다. 따라서, 시스템에서 사용 가능한 전체 메모리 양(시스템 메모리 + swap)이 감소하게 되며 의도한 바는 아니지만 다른 프로세스가 필요한 메모리를 확보하지 못하게 될 수도 있습니다.

사례 6의 mmap(MAP_PRIVATE)의 경우, MAP_NORESERVE를 포함한 메모리 요청을 사용하여 swap 예약을 피할 수 있습니다. 그러나 이 경우, Solaris OE는 요청한 메모리를 사용해야 할 때 실제로 이 메모리를 사용할 수 있도록 보장하지는 않습니다.

mmap() 플래그 옵션에 대해:

MAP_SHARED swap을 예약하지 않음. MAP_PRIVATE(writable) swap을 예약함. MAP_PRIVATE | MAP_NORESERVE swap을 예약하지 않음. 메모리가 부족한 경우 SIGBUS 또는 SIGSEGV가 발생되며 코드는 이러한 오류를 처리해야 합니다.

단계 2:

위의 메모리 요청에서 처음 20페이지와 마지막 페이지에 대한 작업을 수행하면서 요청된 메모리를 사용한다고 생각해 봅시다.

결과는 다음과 같습니다:

프로세스 가상 주소 공간은 이미 초기의 메모리 요청에서 소모되었기 때문에 이 작업을 통해 증가하지 않습니다.

메모리 작업(프로세스의 가상 메모리 위치로 읽기 또는 쓰기)의 결과로 사용된 양과 메모리로 가져온 물리적 페이지 수는 pmap -x 명령의 RSS(Resident Set Size) 섹션 아래에 표시됩니다.

또한, RSS에 대해 동일한 양의 swap 할당이 발생합니다.

이 swap 할당은 사례 6을 제외한 초기의 메모리 요청(단계 1) 동안 예약된 swap 예약의 메모리 양에서 소모됩니다. 사례 6 메모리 요청은 swap 공간을 먼저 예약하지 않았기 때문에 페이지에 대한 작업을 수행하고 가져올 때 swap 공간을 사용(할당)하기 시작합니다.

실제 swap이 발생하면 swap 할당량은 RSS 페이지를 스왑아웃(swap out )하는 데 사용됩니다. Solaris OE는 anon Solaris OE 커널 구조의 스왑아웃 양을 추적합니다. swap 공간에 대한 non-NULL 포인터가 있는 anon 페이지가 실제 "스왑아웃된" 페이지입니다.

샘플 코드 본 문서에 포함된 샘플 코드, test.cpp 와 이 코드를 실행하여 생성된 출력을 통해 지금부터 논의되는 개념을 보충 설명하겠습니다. 이 코드는 요청된 파일을 생성하게 됩니다 샘플 코드와 출력을 비교해보고 설명을 단계별로 읽어보십시오.

컴파일: CC -o test test.cpp 실행: ./test 결과 보기: screen output + out file

테스트 % ./test

이 테스트를 실행하면 다음과 같은 가상 주소 공간 매핑이 발생합니다:

/usr/bin/pmap -x 27228

27228: ./test Address Kbytes RSS Anon Locked Mode Mapped File 00010000 8 8 - - r-x-- test 00020000 8 8 8 - rwx-- test 00022000 2040 152 152 - rwx-- test 00220000 1048 184 184 - rwx-- [ heap ] FEF00000 1024 160 160 - rw--R dev:32,56 ino:390102 FF080000 1024 160 160 - rw--- dev:32,56 ino:390102 FF200000 680 648 - - r-x-- libc.so.1 FF2BA000 24 24 24 - rwx-- libc.so.1 FF2C0000 8 8 8 - rwx-- libc.so.1 FF310000 16 16 - - r-x-- libc_psr.so.1 FF330000 8 8 - - r-x-- libdl.so .1 FF340000 96 72 - - r-x-- libm.so.1 FF366000 8 8 8 - rwx-- libm.so.1 FF370000 40 40 - - r-x-- libCrun.so.1 FF388000 16 16 16 - rwx-- libCrun.so.1 FF38C000 16 - - - rwx-- libCrun.so.1 FF3A0000 8 8 - - r-x-- libw.so.1 FF3B0000 8 8 8 - rwx-- [ anon ] FF3C0000 152 152 - - r-x-- ld.so.1 FF3F6000 8 8 8 - rwx-- ld.so.1 FF9FE000 2056 2056 2056 - rwx-- [ stack ]


total Kb 8296 3744 2792 - Address 열 아래에 표시된 각 매핑은 각 매핑의 첫 번째 페이지의 가상 주소를 나타냅니다.

Kbytes 열은 매핑의 크기를 나타냅니다.

RSS 열은 가상 매핑 중에서 현재 메모리에 상주하는 페이지 수를 나타냅니다. 이는 가상 주소 공간에 대한 작업(쓰기)을 수행한 결과로서 나타납니다. 따라서, 가상 페이지와 물리적 페이지 간에 실질적인 매핑이 이루어집니다.

Anon 열은 물리적 페이지가 스왑아웃되어야 하는 경우 백업 스토리지를 보여줍니다. Anon은 이러한 물리적 페이지에 대한 실제 swap 할당입니다.

Locked 열은 물리적 메모리 잠금을 나타냅니다. 이들 잠긴 페이지에 대해서는 스왑아웃이 발생하지 않으며 물리적 메모리에 남아 있도록 보장됩니다.

'Mode' 열은 매핑의 승인 및 플래그를 나타냅니다. 즉, MAP_NORESERVE 플래그를 포함한 mmap()를 실행하면 Mode 열 아래에서 R 플래그가 확인됩니다.

Mapped File 열은 별도의 세그먼트와 프로세스 가상 주소로 나누어집니다.

결과 단계 1. 2MB의 global array

이것은 실행 가능한 데이터 섹션으로 매핑됩니다. 2MB global array는 2MB의 프로세스 가상 주소 매핑을 소모합니다. 이 예제에서 매핑은 00022000에서 시작됩니다. 페이지에 대한 작업이 실제로 수행될 때까지, 물리적 메모리 페이지는 사용되지 않고 swap은 예약된 상태로 남아 있습니다(할당되지 않음). 일단 페이지에 대한 작업이 수행되면 RSS 및 Anon의 증가를 확인할 수 있습니다.

단계 2. main() 에 정의된 1MB local array

이는 스택 섹션에 매핑됩니다(FFAFE000). 스택 주소 공간 매핑은 시스템에 구성된 최대 스택 크기까지 확장할 수 있습니다(기본적으로 프로세스당 8MB. 시스템에서 limit 명령을 실행하여 제한 설정 확인).

단계 3. main() 을 제외한 부분에 정의된 1MB local array

단지 함수의 입력/종료(enter/exit) 이전과 이후의 매핑을 보여주기 위해 main() 함수를 제외한 함수에 또 다른 local array를 생성했습니다. 이것은 스택 섹션에 매핑됩니다(FF9FE000). 나중에 메모리 부족이 발생하지 않는 한 스택의 매핑은 그대로 매핑되어 있을 것입니다.

단계 4. 1MB의 malloc

1M malloc는 1MB의 프로세스 VA 공간 소모를 나타내며 heap 섹션 00220000으로 매핑됩니다. 가상 주소가 사용될 때 물리적 페이지를 가져오게 되고 RSS 및 Anon 증가로 나타납니다.

단계 5. 1MB의 mmap(MAP_PRIVATE)

mmap는 1MB의 프로세스 VA 공간 소모를 나타내며 열린 inode 파일 아래 매핑됩니다(FF080000). 가상 주소가 사용되면 물리적 페이지를 가져오게 되며 이를 RSS 및 Anon 증가로 확인할 수 있습니다.

단계 6. 1MB의 mmap(MAP_PRIVATE|MAP_NORESERVE)

MAP_NORESERVE 플래그가 표시된 mmap()는 열린 inode 파일로의 매핑을 나타내며(FEF00000) Mode 아래의 R 플래그는 MAP_NORESERVE 플래그를 나타냅니다. 가상 주소가 사용되면 물리적 페이지를 가져오게 되며 이를 RSS 및 Anon 증가로 확인할 수 있습니다.

mmap(MAP_PRIVATE)와 mmap(MAP_PRIVATE | MAP_NORESERVE)의 상세 비교

swap 예약에 대한 요점을 보충 설명하기 위해 mmap 플래그 MAP_NORESERVE에 대해 상세하게 설명하도록 하겠습니다.

앞에서 설명한 정보를 보충하기 위해 어떤 결과가 도출되는 지를 설명하는 추가 테스트를 실행했습니다. 이 테스트를 실행할 때 동일한 매핑 크기에 대해 mmap(MAP_PRIVATE)는 오류를 일으키지만 mmap(MAP_PRIVATE | MAP_NORESERVE)는 그렇지 않습니다. 샘플 코드에서 이를 확인하지 못할 경우 코드의 TOOBIG_SIZE를 현재 swap 가용성보다 큰 값으로 변경해야 합니다.

개념: mmap(MAP_PRIVATE) 대 mmap(MAP_PRIVATE | MAP_NORESERVE)

이 두 가지 개념은 프로세스 가상 주소 매핑에서는 전혀 차이가 없습니다(Mode 아래의 R notication을 제외한 pmap -x에서 확인). 그러나 swap -s의 경우 두 매핑 간에 차이가 나타납니다. 즉, mmap(MAP_PRIVATE)는 swap 가용성을 감소시키지만, MAP_NORESERVE 플래그를 사용하면 swap 가용성이 감소되지 않습니다. 코드에 정의된 TOOBIG_SIZE가 이를 입증합니다. 이는 시스템의 swap 구성에 따라 변경되어야 합니다. 예를 들어, 562MB의 swap 가용성이 지원되는 시스템에서 MAP_NORESERVE 플래그 없이 1GB의 쓰기 가능한 전용 매핑(private mapping)을 요청하면 오류가 반환됩니다.

% ./a.out

명령: /usr/bin/pmap -x 2693 >> out

결과는 out 파일을 확인합니다.

MMAP MAP_RESERVE 플래그

시스템이 예약할 수 있는 이상의 매핑을 요청하려고 시도한 다음, MAP_NORESERVE가 지정되지 않은 경우 mmap(MAP_PRIVATE) 오류를 관찰하십시오.

현재 mmap 크기: 1048576000 '/usr/sbin/swap'으로 표시되는 swap 가용성:

total: 40352k bytes allocated + 9544k reserved = 49896k used, 562952k available

mmap()을 시도 Mmap failed as expected. errno: Resource temporarily unavailable

mmap(MAP_NORESERVE)을 시도 오류가 발생되지 않았습니다. 이것은 MAP_NORESERVE의 예상 결과입니다l.

test.cpp //To compile: CC test.cpp

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <errno.h>

#define ONE_M (1024 * 1024) #define TOOBIG_SIZE (ONE_M * 1000) #define GLOBAL_SIZE (ONE_M * 2) #define LOCAL_SIZE ONE_M #define MALLOC_SIZE ONE_M #define MMAP_SIZE ONE_M #define mapfile "/usr/tmp/mem.mem"

//CASE #1 char global_array[GLOBAL_SIZE];

size_t page_size = getpagesize();

void use_local_array(char *local_array) {

local_array[0] = local_array[LOCAL_SIZE -1] = 'E'; }

void create_local_array(char *command) {

char local_array[LOCAL_SIZE]; use_local_array(local_array); system(command); }

void touch_pages(char *array, int size) {

array[size - 1] = 'A'; for( int indx = 20; indx--; ) { array[indx * page_size + 1] = 'D'; } }

int open_file_to_size() {

int fd; remove(mapfile); if (-1 == (fd = open(mapfile, (O_RDWR | O_CREAT), (S_IRUSR | S_IWUSR)))) { printf( "ERROR: open failed..." ); exit(EXIT_FAILURE); }

if( -1 == ftruncate(fd, ONE_M * 500)) { printf("ERROR: ftruncate failed..."); exit(EXIT_FAILURE); } return(fd); }

void put_heading(FILE *fname, const char *heading) {

fprintf(fname, heading); fflush(fname); }

int main( int argc, char *argv[] ) {

//CASE #2 char local_array_main[LOCAL_SIZE];

remove("out"); FILE *fname = fopen("out", "a");

int pid = getpid(); char command[50]; sprintf(command,"/usr/bin/pmap -x %d >> out", pid); printf("COMMAND: %s\n", command);

//MAPPING OF GLOBAL ARRAY AND LOCAL ARRAY IN MAIN() const char *case_12 = "MAPPINGS Per /USR/BIN/PMAP -X <PID>\n\n" \ "2M Global Array in the Executable-data (test)\n" \ "1M Local Array from main() in the Stack.\n"; put_heading(fname, case_12); system (command);

//CASE #3 - MAPPING OF LOCAL ARRAY IN FUNCTION const char *case_3= "\n1M Local Array in function mapped in the Stack\n"; put_heading(fname, case_3); create_local_array(command); const char *case_3_after= "\n1M Local Array remains mapped in the Stack" \ " after return.\n"; put_heading(fname, case_3_after); system(command);

//CASE #4 - MAPPING OF MALLOC const char *case_4 = "\n1M Malloc Request in Heap.\n"; put_heading(fname, case_4); char *malloc_memory; if (0 == (malloc_memory = (char *) malloc(MALLOC_SIZE))) { printf( "ERROR: malloc failed..." ); exit(EXIT_FAILURE); } system (command);

//CASE #5 - MAPPING OF MMAP() const char *case_5_open = "\n1M File Open - no change in mapping.\n"; put_heading(fname, case_5_open); int fd; fd=open_file_to_size(); system (command);

const char *case_5 = "\n1M Mmap(MAP_PRIVATE) Request on File.\n"; put_heading(fname, case_5); char *mem_mmap; if (MAP_FAILED == (mem_mmap = (char *) mmap( 0, (MMAP_SIZE), (PROT_WRITE | PROT_READ), MAP_PRIVATE, fd, 0 ))) { printf( "ERROR: mmap of 1 MB failed..." ); exit(EXIT_FAILURE); } system (command);

//CASE #6 - MAPPING OF MMAP(MAP_NORESERVE) char *mem_mmap_NR; if (MAP_FAILED == (mem_mmap_NR = mmap( 0, (MMAP_SIZE), (PROT_WRITE | PROT_READ), (MAP_PRIVATE | MAP_NORESERVE), fd, 0 ))) { printf("ERROR: mmap of 1 MB with MAP_NORESERVE failed..."); exit(EXIT_FAILURE); } const char *case_6 = "\n1MB Mmap with MAP_NORESERVE Request on File.\n"; put_heading(fname, case_6); system (command);

// ALL MEMORY DEFINED, NOW PERFORM TOUCH OPERATIONS...

fflush( NULL );

const char *touch_1 = "\nTouch first 20 & last pages of global_array.\n"; put_heading(fname, touch_1); touch_pages(global_array, GLOBAL_SIZE); system (command);

const char *touch_2 = "\nTouch first 20 & last pages of local_array in main.\n"; put_heading(fname, touch_2); touch_pages(local_array_main, LOCAL_SIZE); system (command);

const char *touch_3 = "\nTouch first 20 & last pages of malloc memory.\n"; put_heading(fname, touch_3); touch_pages(malloc_memory, MALLOC_SIZE); system (command);

const char *touch_4 = "\nTouch first 10 pages of mmaped(MAP_PRIVATE) memory.\n"; put_heading(fname, touch_4); touch_pages(mem_mmap, 1); system (command);

const char *touch_5 = "\nTouch first 10 pages of mmaped(MAP_NORESERVE) memory.\n"; put_heading(fname, touch_5); touch_pages(mem_mmap_NR, 1); system (command);

// ALL DONE, NOW ABOUT SWAP RESERVATION...

printf("\n See the out file for results\n\n"); printf("MMAP MAP_RESERVE FLAG \n\n"); printf(" Ask for mapping beyond your system can reserve and\n"); printf(" observe mmap(MAP_PRIVATE) failure unless MAP_NORESERVE" \ " flag is specified.\n\n");

printf(" Your mmap size (see TOOBIG_SIZE in the code) is: %d\n",TOOBIG_SIZE); printf(" your swap availability shown by '/usr/sbin/swap -s' is:\n\n"); system("/usr/sbin/swap -s");

printf("\n\n Trying mmap()...\n");

if (MAP_FAILED == (mem_mmap = (char *) mmap( 0, (TOOBIG_SIZE), (PROT_WRITE| PROT_READ), MAP_PRIVATE, fd, 0 ))) { printf(" Mmap failed as expected.\n"); char *myerr = strerror(errno); printf(" errno: %s\n", myerr); } else { printf(" It did not fail. Check your swap availability.\n" \ " Maybe it needs a bigger size mapping to fail.\n"); printf(" Change TOOBIG_SIZE in the test code bigger than the " \ "available\n swap shown the above.\n\n");

 system("/usr/sbin/swap -s");
 }

printf("\n\n Trying with MAP_NORESERVE flag...\n"); if (MAP_FAILED == (mem_mmap_NR = mmap( 0, (MMAP_SIZE), (PROT_WRITE | PROT_READ), (MAP_PRIVATE | MAP_NORESERVE), fd, 0 ))) { printf(" Mmap should have worked. Maybe other problem. " \ "Check the errno.\n"); char *myerr = strerror(errno); printf(" errno: %s\n", myerr); } else { printf(" It did not fail. This is expected for MAP_NORESERVE.\n"); }

return (EXIT_SUCCESS); }

The Sample out File MAPPINGS Per /USR/BIN/PMAP -X 2M Global Array in the Executable-data (test)1M Local Array from main() in the Stack.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 24 24 24 - rwx-- [ heap ]FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FFAFE000 1032 1032 1032 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 4200 2088 1136 -1M Local Array in function mapped in the Stack5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 24 24 24 - rwx-- [ heap ]FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 5224 3112 2160 - 1M Local Array remains mapped in the Stack after return.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 24 24 24 - rwx-- [ heap ]FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 5224 3112 2160 - 1M Malloc Request in Heap.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 6248 3128 2176 - 1M File Open - no change in mapping.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 6248 3128 2176 - 1M Mmap(MAP_PRIVATE) Request on File.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FF080000 1024 - - - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 7272 3128 2176 - 1MB Mmap with MAP_NORESERVE Request on File.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 - - - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FEF00000 1024 - - - rw--R dev:32,56 ino:390102FF080000 1024 - - - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3128 2176 - Touch first 20 & last pages of global_array.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 152 152 - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FEF00000 1024 - - - rw--R dev:32,56 ino:390102FF080000 1024 - - - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3280 2328 - Touch first 20 & last pages of local_array in main.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 152 152 - rwx-- test00220000 1048 40 40 - rwx-- [ heap ]FEF00000 1024 - - - rw--R dev:32,56 ino:390102FF080000 1024 - - - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3280 2328 - Touch first 20 & last pages of malloc memory.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 152 152 - rwx-- test00220000 1048 184 184 - rwx-- [ heap ]FEF00000 1024 - - - rw--R dev:32,56 ino:390102FF080000 1024 - - - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3424 2472 -Touch first 10 pages of mmaped(MAP_PRIVATE) memory.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 152 152 - rwx-- test00220000 1048 184 184 - rwx-- [ heap ]FEF00000 1024 160 - - rw--R dev:32,56 ino:390102FF080000 1024 160 160 - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3744 2632 - Touch first 10 pages of mmaped(MAP_NORESERVE) memory.5472: ./testAddress Kbytes RSS Anon Locked Mode Mapped File00010000 8 8 - - r-x-- test00020000 8 8 8 - rwx-- test00022000 2040 152 152 - rwx-- test00220000 1048 184 184 - rwx-- [ heap ]FEF00000 1024 160 160 - rw--R dev:32,56 ino:390102FF080000 1024 160 160 - rw--- dev:32,56 ino:390102FF200000 680 648 - - r-x-- libc.so.1FF2BA000 24 24 24 - rwx-- libc.so.1FF2C0000 8 8 8 - rwx-- libc.so.1FF310000 16 16 - - r-x-- libc_psr.so.1FF330000 8 8 - - r-x-- libdl.so.1FF340000 96 72 - - r-x-- libm.so.1FF366000 8 8 8 - rwx-- libm.so.1FF370000 40 40 - - r-x-- libCrun.so.1FF388000 16 16 16 - rwx-- libCrun.so.1FF38C000 16 - - - rwx-- libCrun.so.1FF3A0000 8 8 - - r-x-- libw.so.1FF3B0000 8 8 8 - rwx-- [ anon ]FF3C0000 152 152 - - r-x-- ld.so.1FF3F6000 8 8 8 - rwx-- ld.so.1FF9FE000 2056 2056 2056 - rwx-- [ stack ]-------- ------- ------- ------- -------total Kb 8296 3744 2792 -

저자 소개 Hae Hirdler는 10년 간 썬 마이크로시스템즈에서 근무하며 주로 Solaris OE 플랫폼 코드 개발자들을 지원하고 있습니다.