Prefiro ver um bom resumo nesta página do que um link que pode desaparecer para que essa página possa ser usada como referência.
21711 Jim Hunziker
Respostas:
34
Em resumo:
Tamanho virtual: é a quantidade de espaço de endereço que um processo está gerenciando. O espaço de endereço virtual contém tudo o que o processo pode acessar por meio de ponteiros (referências de endereço de memória). Por exemplo, se o seu programa obtiver acesso ao buffer de quadros da sua placa de vídeo, essa memória será mapeada para o espaço virtual do processo e receberá um endereço armazenado em um ponteiro. Arquivos mapeados na memória e mapeamentos anônimos também são contabilizados no tamanho do espaço de endereço virtual. Praticamente tudo está no tamanho virtual. Se você resumir o tamanho de todos os intervalos de endereços listados /proc/<pid>/maps, ele deverá retornar aproximadamente o mesmo valor do tamanho virtual.
Tamanho do residente: é a quantidade de memória que pertence especificamente ao processo que atualmente reside na memória. Isso significa a quantidade de memória que não está em troca. Observe que partes do processo podem estar na memória de troca mesmo quando o processo está em execução. O sistema operacional extrairá essas regiões da troca quando o processo tentar acessá-lo. Isso deve incluir a pilha, as pilhas de todos os threads e outros mapeamentos particulares. Se você olhar em /proc/<pid>/maps, as [stack], [heap]e outros mapeamentos anônimos (aqueles sem caminhos de arquivos) ou são trocados ou contabilizada no tamanho residente.
Tamanho compartilhado: é a quantidade de memória que pode pertencer a vários processos. Por exemplo, se você tiver quatro instâncias do mesmo aplicativo carregadas na memória, terá quatro instâncias do heap e pelo menos quatro pilhas, uma para cada processo (essa é a memória residente), mas terá apenas uma instância de o código binário do programa e suas bibliotecas. Este é o espaço compartilhado. Não só ele inclui o código do programa binário e suas bibliotecas, mas também arquivos de localização, somente leitura de dados do programa, SysV e POSIX compartilhado segmentos de memória, semáforos, etc ... Se você olhar no /proc/<pid>/maps, a maioria dos mapeamentos vinculados a arquivos de biblioteca e do programa são compartilhado.
Observe que o VIRT contém a união de RSS e SHR e sempre será maior que qualquer um deles. Pode haver regiões contabilizadas como RSS e SHR.
Aliás, em versões recentes do linux você pode ver um colapso muito detalhado do uso da memória em / proc / <pid> / smaps
bdonlan
1
Tamanho compartilhado é a memória que pode ser compartilhada. Se um aplicativo for o único usuário da biblioteca, a biblioteca será mantida na memória por um único processo. Dessa forma, mesmo a memória compartilhada pode ser "propriedade do processo".
quer
6
Na resposta de Juliano:
Observe que RSS + SHR <= VIRT, sempre.
Isso é apenas falso. O SHR contém toda a memória virtual que pode ser compartilhada com outros processos, e o RSS contém toda a memória fisicamente na RAM usada pelo processo.
Portanto, toda a memória compartilhada atualmente na RAM é contada no SHR e no RSS, portanto, o SHR + RSS não tem significado, pois pode conter contagens duplicadas.
Para construir um processo com RSS + SHR> VIRT, apenas mapeie um arquivo grande (1 GB) e leia-o completamente: o arquivo mmaped será carregado na RAM, e VIRT, SHR e RSS serão levemente maiores que 1 GB, portanto, SHR + RSS> VIRT.
Sim, foi mais uma declaração sobre o VIRT do que os outros dois. O que eu tinha em mente era mais sobre a união de RSS e SHR do que a soma deles, ou seja, o VIRT contém RSS e SHR. Má representação matemática.
Respostas:
Em resumo:
Tamanho virtual: é a quantidade de espaço de endereço que um processo está gerenciando. O espaço de endereço virtual contém tudo o que o processo pode acessar por meio de ponteiros (referências de endereço de memória). Por exemplo, se o seu programa obtiver acesso ao buffer de quadros da sua placa de vídeo, essa memória será mapeada para o espaço virtual do processo e receberá um endereço armazenado em um ponteiro. Arquivos mapeados na memória e mapeamentos anônimos também são contabilizados no tamanho do espaço de endereço virtual. Praticamente tudo está no tamanho virtual. Se você resumir o tamanho de todos os intervalos de endereços listados
/proc/<pid>/maps
, ele deverá retornar aproximadamente o mesmo valor do tamanho virtual.Tamanho do residente: é a quantidade de memória que pertence especificamente ao processo que atualmente reside na memória. Isso significa a quantidade de memória que não está em troca. Observe que partes do processo podem estar na memória de troca mesmo quando o processo está em execução. O sistema operacional extrairá essas regiões da troca quando o processo tentar acessá-lo. Isso deve incluir a pilha, as pilhas de todos os threads e outros mapeamentos particulares. Se você olhar em
/proc/<pid>/maps
, as[stack]
,[heap]
e outros mapeamentos anônimos (aqueles sem caminhos de arquivos) ou são trocados ou contabilizada no tamanho residente.Tamanho compartilhado: é a quantidade de memória que pode pertencer a vários processos. Por exemplo, se você tiver quatro instâncias do mesmo aplicativo carregadas na memória, terá quatro instâncias do heap e pelo menos quatro pilhas, uma para cada processo (essa é a memória residente), mas terá apenas uma instância de o código binário do programa e suas bibliotecas. Este é o espaço compartilhado. Não só ele inclui o código do programa binário e suas bibliotecas, mas também arquivos de localização, somente leitura de dados do programa, SysV e POSIX compartilhado segmentos de memória, semáforos, etc ... Se você olhar no
/proc/<pid>/maps
, a maioria dos mapeamentos vinculados a arquivos de biblioteca e do programa são compartilhado.Observe que o VIRT contém a união de RSS e SHR e sempre será maior que qualquer um deles. Pode haver regiões contabilizadas como RSS e SHR.
fonte
Na resposta de Juliano:
Isso é apenas falso. O SHR contém toda a memória virtual que pode ser compartilhada com outros processos, e o RSS contém toda a memória fisicamente na RAM usada pelo processo.
Portanto, toda a memória compartilhada atualmente na RAM é contada no SHR e no RSS, portanto, o SHR + RSS não tem significado, pois pode conter contagens duplicadas.
Para construir um processo com RSS + SHR> VIRT, apenas mapeie um arquivo grande (1 GB) e leia-o completamente: o arquivo mmaped será carregado na RAM, e VIRT, SHR e RSS serão levemente maiores que 1 GB, portanto, SHR + RSS> VIRT.
fonte