Como obter informações sobre a memória de processo de um programa em C?

1

Eu tenho que obter as informações de uso de memória de um processo. Eu sei que está disponível em /proc/${pid}/statm , mas existe uma função do sistema para obtê-lo. Analisar um arquivo parece ineficiente.

    
por Bionix1441 21.09.2015 / 09:35

2 respostas

5

Você está enganado porque analisar um arquivo parece ineficiente, porque você o desconsidera. Você provavelmente já sabe que as informações em /proc são "criadas" somente quando você as solicita e não atualizadas sempre que houver uma alteração. Portanto, você não apenas precisa analisá-lo, mas o kernel precisa gerá-lo como texto.

Ler alguns bytes diretamente em um longo é, obviamente, mais eficiente do que chamar atoi() em uma string. Mas você tem que ver isso como parte do contexto onde você precisa fazer uma chamada de sistema. Todo o código extra executado para ler algum conteúdo de arquivo (ou chamar alguma API binária que o kernel possa fornecer) supera o tempo que leva para fazer a conversão de string.

Processos de kernel, que precisam desse tipo de dados com muito mais frequência do que o programa médio, não têm a sobrecarga de fazer chamadas de sistema para acessar esses dados e podem acessar esse tipo de dados diretamente.

    
por 22.09.2015 / 08:31
3

Você não mencionou que tipo de informação gostaria de obter, mas o Linux reimplementou o comando pmap <pid> do Solaris. Não imprime exatamente a mesma informação, mas a saída é comparável. Você pode querer verificar se o Linux reimplementou mais dos vários comandos p * do Solaris. O interessante psig não é suportado no Linux.

Por razões de segurança, informações específicas sobre o UNIX só estão disponíveis para o processo em si e o que está além disso é limitado e normalmente apenas para ps e programas similares.

Note que a filosofia geral do UNIX era dar informações especiais através da função ioctl() , é assim que /proc funcionou em sua primeira implementação no final dos anos 80. Cada processo era um arquivo em / proc e apenas ioctls funcionava nesse arquivo. Note que antes do / proc ser introduzido, os usuários do UNIX eram forçados a ler livremente a memória do kernel para obter informações especiais e, como não havia bloqueios, isso poderia resultar em lixo quando, por exemplo, o processo relacionado morreu ou foi trocado.

Em 1980, o UNOS - o primeiro clone do UNIX implementou uma sycall getpsinfo () para o comando ps. /proc pode ser visto como uma implementação melhor de uma visão abstrata.

Por volta de meados dos anos 90, o procfs-2 definiu um processo para se tornar um diretório e os arquivos dentro permitem ler dados binários complexos (por exemplo, para /proc/<pid>/as do arquivo do espaço de endereço). Outros arquivos dentro desse diretório têm dados binários estruturados (estruturas definidas) que podem ser read() (por exemplo, /proc/<pid>/usage para o uso de recursos).

O Linux não é compatível com os papéis procfs e procfs2, os nomes dos caminhos diferem e o conteúdo do arquivo é diferente. /proc/<pid>/fd/ no Linux está em claro conflito com o documento AT & T procfs2.

    
por 21.09.2015 / 12:43

Tags