Friday, April 18, 2008

Memory, Paging and etc.

알다시피 Linux의 메모리는 페이지로 나누어져 있다(대략 4kb인데 64비트에서는 8kb이다). 실제 물리적 메모리나 하드디스크에 mapping 되어 있는 경우가 valid page이고 그외에는 fault를 일으키는 invalid page이다. 상주되지 않은 디스크를 읽으려 하는 경우 page fault가 발생하고 커널에서 해당 페이지를 하드에서 읽어 메모리로 올리는 paging in을 해준다. 반대로 메모리가 없으면 앞으로 가장 덜 사용될 것 같은 메모리의 부분을 디스크로 옮겨는 paging out을 한다.

때때로 한 물리적인 공간을 여러 (virtual memory address)메모리 주소가 가지고 있는 경우가 있는데, 이때 두가지로 동작이 가능하다. 하나는 share - 말그대로 공유하게 되어 한 프로세스가 write한 내용이 다른 프로세스에 의해 보이는 경우이고, 다른 경우는 그렇게 write 동작이 일어날 때 해당 프로세스에게 독자적인 영역을 할당해주는 COW(Copy-on-write) 동작을 하는 경우이다.

메모리는 여러 블럭을 묶어 memory region, segment, mapping 라고 부를 수 있는데, 각각은 아래와 같이 구분된다.

  • text segment 는 프로그램 영역이고,

  • stack

  • data segment(heap) : 동적 메모리 영역

  • bss segment : 초기화 안된 전역 변수공간 (이 변수들에 대해 object file에서 초기값이 없으므로 값을 저장하지 않는다. 그래서 바이너리 사이즈를 줄일 수 있다. 또 실행시에 메모리에 올라갈 때에도 copy-on-write로 동작하여 0으로 초기화 하는 작업을 효율적으로 진행한다)


이러한 영역들은 /proc/self/maps나 pmap을 통해 프로세스별로 어떻게 메모리가 할당되어 있는지 확인할 수 있다.

No comments:

Post a Comment