15

「マントップ」が言ったことは次のとおりです: RES = 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.

「top -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
4

2 に答える 2

30

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

#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 );
}

これは、割り当てる整数の数を尋ね、割り当て、初期化する整数の数を尋ねてから初期化する単純なプログラムです。1250000 個の整数を割り当て、そのうちの 500000 個を初期化する実行の場合:

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

Top は次の情報を報告します。

  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

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

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

5MB のデータを malloc した後、VIRT と DATA の両方が最大 5MB 増加しましたが、RES は増加しませんでした。割り当てた整数の 2MB に触れた後、RES は増加しましたが、DATA と VIRT は同じままでした。

VIRT は、共有されているものとオーバーコミットされているものを含む、プロセスによって使用される仮想メモリの合計量です。DATA は、共有されておらず、コードテキストではない、使用されている仮想メモリの量です。つまり、プロセスの仮想スタックとヒープです。RES は仮想ではありません。特定の時間にプロセスが実際に使用しているメモリの量を測定したものです。

したがって、あなたの場合、CODE + DATA < RES という大きな不等式は、プロセスに含まれる共有ライブラリである可能性があります。私の例 (およびあなたの例) では、SHR+CODE+DATA が RES に近い近似値です。

お役に立てれば。top と ps に関連する手を振ったり、ブードゥー教の言葉がたくさん使われています。不一致に関する多くの記事 (暴言?) がオンラインにあります。たとえば、これこれ

于 2011-12-07T19:32:10.247 に答える
0

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

  1. 最新の OS プロセスの概念は、仮想メモリに基づいています。仮想メモリ システムには RAM+SWAP が含まれます。したがって、いくつかの補足事項があることを除いて、プロセスに関連するメモリの概念のほとんどは仮想メモリを参照していると思います。

  2. プロセスに割り当てられた仮想アドレス (ページ) は、以下の状態にあります。

    a)割り当てられていますが、物理メモリへのマッピングはありません(COWのようなもの)

    b) 割り当てられ、物理メモリに既にマップされている

    c) 割り当てられ、スワップされたメモリに既にマップされている。

  3. top コマンドのフィールド出力:

    a) VIRT -- プロセスがアクセスする権利を持つすべての仮想メモリを参照します。これは、物理メモリまたはスワップ メモリに既にマップされているか、マッピングがない場合でも同様です。

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

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

    d) SHR -- プロセス (VM?) で利用可能な共有メモリを指します。

    e) CODE + DATA -- CODE は 2.b/2.c の状態になり、DATA は 2.a/2.b/3.c および 3.b/3 のいずれかの状態になります。 c には、「USED」というフィールド名もあります。

4) したがって、計算は次のようになります。

a) VIRT(VM) = RES(メモリ内の VM) + SWAP(スワップ内の VM) + マップされていない VM (DATA、SHR?)。

b) 使用済み = RES + スワップ

c) SWAP = CODE(メモリ内の vm) + DATA(メモリ内の vm) + SHR(メモリ内の vm?)

d) RES = CODE(メモリ内の vm) + DATA(メモリ内の vm) + SHR(メモリ内の vm?)

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

よろしく、

于 2016-11-14T11:22:21.273 に答える