linux – RES!= CODE DATA在顶部命令的输出信息中,为什么?

linux – RES!= CODE DATA在顶部命令的输出信息中,为什么?,第1张

概述什么’人顶“说是:RES =代码数据 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, 什么’人顶“说是:RES =代码数据
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.

当我运行’顶部-p 4258′,我得到以下内容:

PID USER      PR  NI  VIRT  RES  SHR S %cpu %MEM    TIME+  CODE DATA COMMAND258 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 -aLSB 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-noarchdistributor ID: SUSE liNUXDescription:    SUSE linux Enterprise Server 9 (i586)Release:        9Codename:       n/a

内核版本:

linux-iguu:~ # uname -alinux linux-iguu 2.6.16.60-0.21-default #1 Tue May 6 12:41:02 UTC 2008 i686 i686 i386 GNU/linux
解决方法 我将在一个程序分配和使用内存时发生什么的例子来解释这一点.具体来说,这个程序:
#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.outfyi: your ints are 4 bytes largeEnter number of ints to malloc: 1250000Enter 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 VIRTbefore allocation:         124    4  408 3628after 5MB allocation:     5008    4  476 8512after 2MB initialization: 5008    4 2432 8512

在我malloc’d 5MB的数据后,VIRT和DATA都增加了约5MB,但RES没有.在我触摸了我分配的整数的2MB后,RES的确增加了,但DATA和VIRT保持不变.

VIRT是进程使用的虚拟内存的总量,包括共享和what is over-committed.DATA是不共享的虚拟内存量,而不是代码文本.即,它是进程的虚拟堆栈和堆. RES不是虚拟的:它是对该进程在该特定时间实际使用多少内存的测量.

所以在你的情况下,大的不等式CODE DATA< RES可能是进程包含的共享库.在我的例子(和你的)中,SHR代码数据更接近于RES. 希望这可以帮助.
与top和ps有很多的挥手和巫术.在线有很多文章(咆哮?),关于这些不符之处.例如this和this.

总结

以上是内存溢出为你收集整理的linux – RES!= CODE DATA在顶部命令输出信息中,为什么?全部内容,希望文章能够帮你解决linux – RES!= CODE DATA在顶部命令的输出信息中,为什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1045354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存