검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 시스템
참조 원문 : Linux Memory Management – Virtual Memory and Demand Paging

가상 메모리(Virtual Memory)
  가상 메모리는 시스템이 실제보다 더 많은 메모리를 가지고 있는 것처럼 만들어줍니다.
  • 가상 메모리는 실제 물리 주소와 연결된 별도의 메모리 주소 계층이다.
  • 가상 메모리 모델에서는 프로세서가 프로그램 명령어를 실행할 때 가상 메모리로부터 명령어를 읽어 실행한다.
  • 하지만 명령어를 실행하기 전에 가상 메모리는 먼저가상 메모리 주소를 실제 물리 주소로 변환시킨다.
  • 이 변환은 페이지 테이블(OS가 관리함)에 있는 맵핑 정보를 기반으로 이뤄진다.
  가상 메모리와 물리 메모리는 페이지(page)라고 부르는 고정된 크기의 쪼가리로 나뉩니다. 이런 페이지 모델에서는 가상 주소를 두 부분으로 나눌 수 있습니다.
  • 오프셋(처음 12비트)
  • 가상 페이지 프레임 번호(나머지 비트 전부)
  프로세서가 가상 주소를 처리할 상황이 올 때마다 그것에서 가상 페이지 프레임 번호를 추출하여 물리 페이지 프레임 번호로 변환하며 그 후 오프셋으로 물리 페이지의 정확한 주소를 찾습니다. 이 주소 변환은 페이지 테이블을 통해 이뤄집니다.

  이론적으로 페이지 테이블에는 아래의 정보가 있다고 볼 수 있습니다.
  • 해당 엔트리가 사용 중인지에 대한 플래그
  • 이 엔트리의 물리 페이지 프레임 번호
  • 페이지에 대한 접근 정보(읽기 전용, 읽기/쓰기 등)
  가상 메모리의 가상 페이지 프레임 번호를 읽으면 그것을 오프셋으로 사용하여 그것이 가리키는 페이지 엔트리에 접근합니다. 예를 들어 가상 페이지 프레임 번호가 2라면 페이지 테이블의 1번 엔트리로 가게 됩니다.(엔트리 번호는 0부터 시작)

  아래 그림에서 VPFN은 가상 페이지 프레임 번호의 약자이며, PFN은 물리 페이지 프레임 번호를 약자입니다.

출처 : 참조 원문 페이지

  프로세서가 가상 페이지 프레임 번호로 페이지 테이블 엔트리를 처리하다가 잘못된 엔트리를 발견하는 일이 생길 수도 있는데 이런 경우 프로세서는 제어권을 커널에 넘긴 후 문제를 해결하도록 요청할 책임이 있습니다. 프로세서마다 제어권을 넘기는 방식은 다르지만 일반적으로 이런 현상을 '페이지 폴트(page fault)'라고 부릅니다. 엔트리가 정상이라면 프로세서는 물리 페이지 프레임 넘버와 페이지의 크기를 곱하여 물리 페이지의 기준(base) 주소를 구한 후 오프셋 값을 더하여 정확한 물리 주소를 계산합니다.

  각각의 프로세스는 전체 범위의 가상 주소를 자체적으로 소유하며 이런 개념 때문에 시스템이 실제보다 더 많은 물리 메모리를 가진 것처럼 보이는 것입니다.


페이징 요청(Demand Paging)
  프로세서가 가상 페이지 프레임 번호로 페이지 테이블을 처리하다가 아무것도 없는 엔트리를 건들이게 되는 원인은 2가지가 있습니다.
  1. 프로세스가 잘못된 메모리 주소로 접근하려고 했다.
  2. 가상 주소와 연결된 물리 페이지가 물리 메모리에 아직 올라가지 않았다.
  1번의 경우 프로세스가 허용되지 않는 메모리 주소로 접근을 시도하는 경우로 이때는 페이지 폴트가 발생하며 커널이 해당 프로세스를 종료시킵니다.

  2번의 경우에도 페이지 폴트가 발생하며 그 후 커널이 필요한 메모리 페이지를 하드 디스크에서 물리 메모리로 올리는 시도를 합니다.

  페이지를 하드 디스크에서 물리 메모리로 옮기는 일은 시간이 많이 걸리기 때문에 그 틈에 프로세스 간의 컨텍스트 스위치를 처리하거나 다른 프로세스를 실행합니다. 그러던 중 프로세스의 페이지가 물리 메모리로 옮겨지고 페이지 테이블이 업데이트되면 프로세스가 '페이지 폴트'를 일으켰던 명령어를 다시 실행합니다.

  이것을 페이징 요청(Demand Paging)이라고 부르며 이런 일이 발생한다는 것은 한 프로세스에 속한 모든 메모리 페이지가 동시에 전부 물리 메모리에 존재하지 않을 수도 있다는 것을 의미합니다. 이렇게 필요하지 않은 메모리 페이지를 올리지 않았다가 필요할 때 페이지 폴트를 통해 물리 메모리로 옮김으로서 물리 메모리를 아낄 수 있습니다.

2013/07/01 16:51 2013/07/01 16:51
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : How to find which process is eating RAM in Linux

  매우 간단하고 짧은 팁으로써 램 사용량을 기준으로 프로세스 목록을 내림차순으로 정렬하여 보는 방법입니다. 'top' 명령어를 실행합니다. 'M(대문자)'을 누릅니다. 끝.

  커맨드 라인으로 몇 가지 명령어를 조합하여 확인하는 방법도 소개합니다. 당장 실시간 확인 용도라면 사실 위의 방법이 더 좋고 아래 방법은 보고서 생성 같은 용도의 쉘 스크립트에 활용하기 좋을 듯 싶습니다. 다만 그런 용도라면 모니터링 툴로 생성된 그래프 그림이 더 좋을 것 같네요.
$ ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 21
PID %MEM COMMAND
5669 1.2 /usr/sbin/mysqld
2226 0.7 /usr/sbin/named
19677 0.5 /usr/sbin/apache2
20024 0.5 /usr/sbin/apache2
20083 0.5 /usr/sbin/apache2
20085 0.5 /usr/sbin/apache2
20099 0.5 /usr/sbin/apache2
20204 0.5 /usr/sbin/apache2
20205 0.5 /usr/sbin/apache2
20206 0.5 /usr/sbin/apache2
20207 0.5 /usr/sbin/apache2
20208 0.5 /usr/sbin/apache2
14498 0.3 /usr/sbin/apache2
32651 0.2 /usr/sbin/smbd
4413 0.1 /usr/sbin/winbindd
5100 0.1 /usr/sbin/smbd
6283 0.1 /usr/sbin/openvpn
19873 0.1 sshd:
1659 0.1 dovecot-auth
19723 0.1 /bin/bash
2010/12/15 20:55 2010/12/15 20:55