Você pode forçar todo o espaço de endereço de um processo a ser paginado com truques como mlockall()
, mas isso não ajudará a economizar memória porque não importa o que o kernel mantenha o arquivo de apoio aberto por quanto tempo for mapeado na memória (mesmo que você o exclua).
O que você está procurando é chamado de eXecute In Place (XIP) e é um recurso que permite executar arquivos diretamente a partir do armazenamento mapeado em memória, em vez de copiar para RAM (separada) primeiro.
O XIP é muito difícil de suportar porque coloca requisitos severos em como o arquivo executável deve ser colocado no armazenamento (no sistema de arquivos, se aplicável). Por exemplo, as seções do arquivo que serão mapeadas na memória devem estar alinhadas na página no armazenamento e não misturadas com os metadados do sistema de arquivos. Além disso, o binário será idealmente compilado como código independente de posição para que o link de tempo de execução não tem que modificar qualquer parte depois de ser mapeado. Quase nenhum sistema de arquivos suporta XIP.
Por sorte, meu entendimento é que tmpfs faz suporte a XIP . Se isso estiver correto, sua solução é simplesmente montar um sistema de arquivos tmpfs e mover o arquivo executável para lá antes de executá-lo.
Atualizar após xiaokaoy comentou :
If I just move the executable file into tmpfs, will it automatically be able to execute in place? Why? What makes the file page-aligned in RAM? Will the loader check whether the executable file meets the required conditions to run in the XIP way every time it starts to load an executable file?
O tmpfs pode suportar o XiP devido à maneira como ele armazena arquivos na RAM. Os arquivos em tmpfs são armazenados em páginas de memória com cada arquivo sendo alocado em um número inteiro de páginas de memória não compartilhadas com outros arquivos no tmpfs. (É por isso que os arquivos em tmpfs sempre ocupam um múltiplo de 4 KiB - o tamanho da página.) Os dados são armazenados com o primeiro byte do arquivo no primeiro byte de sua página de memória e assim por diante. Então, quando mmap()
(ou o carregador ELF do kernel) é chamado para mapear páginas do arquivo, ele não precisa copiar os dados para novas páginas, ele pode apenas compartilhar as páginas que já pertencem ao tmpfs - contanto que o mapeamento está alinhado (o que deve ser com ELF).