2011-09-29 8 views
14

です:RES = CODE + DATARES!=トップコマンドの出力情報のCODE + DATA、なぜですか? '男のトップは' 言っ

q: RES -- Resident size (kb) 
The non-swapped physical memory a task has used. 
RES = CODE + DATA. 

r: CODE -- Code size (kb) 
The amount of physical memory devoted to executable code, also known as the 'text  resident set' size or TRS. 

s: DATA -- Data+Stack size (kb) 
The amount of physical memory devoted to other than executable code, also known as the 'data >resident set' size or DRS. 

i 'は、トップ-p 4258' を実行したときに、私は以下の何を得る:!

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ CODE DATA COMMAND 
258 root  16 0 3160 1796 1328 S 0.0 0.3 0:00.10 476 416 bash 

1796 = 476+ 416

なぜですか?

PS: Linuxディストリビューション:

linux-iguu:~ # lsb_release -a 
LSB Version: core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32:desktop-3.1-ia32:desktop-3.1-noarch:graphics-2.0-ia32:graphics-2.0-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: SUSE LINUX 
Description: SUSE Linux Enterprise Server 9 (i586) 
Release:  9 
Codename:  n/a 

カーネルバージョン:

linux-iguu:~ # uname -a 
Linux linux-iguu 2.6.16.60-0.21-default #1 Tue May 6 12:41:02 UTC 2008 i686 i686 i386 GNU/Linux 

答えて

23

私はプログラムを割り当て、メモリを使用するときに何が起こるかの例の助けを借りてこれを説明します。具体的には、このプログラムは:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

int main(){ 

     int *data, size, count, i; 

     printf("fyi: your ints are %d bytes large\n", sizeof(int)); 

     printf("Enter number of ints to malloc: "); 
     scanf("%d", &size); 
     data = malloc(sizeof(int) * size); 
     if(!data){ 
       perror("failed to malloc"); 
       exit(EXIT_FAILURE); 
     } 

     printf("Enter number of ints to initialize: "); 
     scanf("%d", &count); 
     for(i = 0; i < count; i++){ 
       data[i] = 1337; 
     } 

     printf("I'm going to hang out here until you hit <enter>"); 
     while(getchar() != '\n'); 
     while(getchar() != '\n'); 

     exit(EXIT_SUCCESS); 
} 

これは、多くの整数を割り当てる方法をお願いしますそれらを割り当て、初期化するために、これらの整数の何を要求し、それらを初期化する簡単なプログラムです。私のmalloc」の後

      DATA CODE RES VIRT 
before allocation:   124 4 408 3628 
after 5MB allocation:  5008 4 476 8512 
after 2MB initialization: 5008 4 2432 8512 

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP CODE DATA COMMAND 
<program start> 
11129 xxxxxxx 16 0 3628 408 336 S 0 0.0 0:00.00 3220 4 124 a.out 
<allocate 1250000 ints> 
11129 xxxxxxx 16 0 8512 476 392 S 0 0.0 0:00.00 8036 4 5008 a.out 
<initialize 500000 ints> 
11129 xxxxxxx 15 0 8512 2432 396 S 0 0.0 0:00.00 6080 4 5008 a.out 

関連情報は次のとおりです。

$ ./a.out 
fyi: your ints are 4 bytes large 
Enter number of ints to malloc: 1250000 
Enter number of ints to initialize: 500000 

トップには、以下の情報を報告します。私は1250000個の整数を割り当て、それらの500000を初期化し、実行するためにd 5MBのデータ、VIRTとDATAの両方が〜5MB増加しましたが、RESは増加しませんでした。私が割り当てた2MBの整数に触れた後、RESは増加しましたが、DATAとVIRTは同じままです。

VIRTは、共有されているものを含めて、プロセスによって使用される仮想メモリの合計量で、what is over-committedです。 DATAは共有されていない仮想メモリの量であり、コードテキストではありません。つまり、プロセスの仮想スタックとヒープです。 RESは仮想ではありません。プロセスがその特定の時間に実際に使用しているメモリ量の測定値です。

あなたのケースでは、大きな不等号CODE + DATA < RESは、プロセスに含まれる共有ライブラリの可能性が高いです。私の例では、SHR + CODE + DATAはRESに近似しています。

これが役に立ちます。 トップとpsには手を振ったり、ブードーがたくさんあります。不平等については、オンラインで多くの記事(暴言?)があります。例えば、thisおよびthis

+0

あなたの説明に感謝! psのユーザーマニュアルが不正確だとの結論に至りました。しかし、ここでは他の質問があります。あなたはDATAが仮想であり、RESはそうではないと分かりました。私の質問は、SHRが仮想であるかどうかです。なぜあなたのプログラムでSHRが増加したのですか? SHRがバーチャルでない場合、なぜSHR + CODEがRESよりも大きいリターですか? – redhatlinux10

+0

SHRは仮想でVIRTに含まれています。 RESは、スワップアウトされたものを除いて、メモリ内のプロセスが実際に使用している仮想アロケーションの数だけです。 –

+0

あなたの説明は私の疑問を明確にし、感謝します。 – redhatlinux10

0

この説明は私のいくつかの質問を解決するのに素晴らしいです。ありがとう! そして、何かを追加しようとすると、Linuxのメモリ管理知識を理解しています。何か誤解があれば、私を修正してください!

  1. 現代のOSプロセスの概念は、仮想メモリに基づいています。仮想メモリシステムにはRAM + SWAPが含まれています。 私は、プロセスに関連するメモリの概念のほとんどは、補足事項があることを除いて、仮想メモリを参照していると思います。プロセスに割り当てられ

  2. 任意の仮想アドレス(ページ)での状態を下回る:

    a)に割り当てられ、任意の物理メモリ(COWのようなもの)

    B)へのマッピングは既にマッピングされ、割り当てられていません物理メモリへ

    c)スワップされたメモリに既に割り当てられています。 topコマンドの出力に含ま

  3. フィールド:

    A)VIRT - それはプロセスがアクセス権 、それはすでに物理メモリまたはスワップ メモリにマッピングされているに関係なく持っているすべての仮想メモリを参照、またはマッピングもありません。

    b)RES:既に物理アドレスにマップされている仮想アドレスを指し、RAMに残っています。

    c)SWAP - 物理アドレスに既にマップされている仮想アドレスを指し、SWAP空間にスワップされます。

    D)SHR - ?それはプロセス(VM)

    E)CODE + DATAに利用可能な共有メモリを指す - CODEは2.B/2.Cの状態であることができ、そしてDATAは3状態2.a/2.b/3.cのいずれかにあり、3.b/3.cは "USED"というフィールド名も持っています。

4)だから、計算は、おそらく次のようになります?

A)VIRT(VM)=のRES(VMメモリで)+ SWAPスワップ中(VM)+ VMマッピングされていない(DATA、SHR)を。

B)を使用= RES + SWAP

C)SWAP = CODEメモリ(VM)+ DATA(メモリ内VM)+ SHR(メモリ内のVM?)

D)RES = CODE(

少なくともDATAセグメントには "DATA(VM unmapped)"が残っていますが、これはmallocの例の上から見ることができます。これは、「DATA:実行可能コード以外の物理メモリの量(データ常駐セットのサイズまたはDRSとも呼ばれます)」というトップコマンドのマンページとは少し異なります。再度、感謝します。 少なくともDATA(VMマッピングされていない)が実際に "DATA"で計算されたので、(CODE + DATA + SHR)は通常RESより大きいので、マンページの主張とは異なります。

よろしく、