Pergunta

Quero usar uma biblioteca que use descritores de arquivos como meios básicos para acessar seus dados. Por razões de desempenho, não quero ter que comprometer arquivos com o disco antes de usar as funções desta biblioteca.

Quero criar (grandes) blobs de dados em tempo real e ligar para a biblioteca para enviá -los para um servidor. Como está, tenho que escrever o arquivo no disco, abrir, passar o FD para a biblioteca, aguarde o término e exclua o arquivo no disco. Como eu posso recriar os blobs sob demanda (e não são tão grandes que causam uma paginação excessiva de memória virtual), salvando-os para não me compra não compra nada e incorre em uma grande penalidade de desempenho.

É possível atribuir um FD a um bloco de dados que reside apenas como uma entidade mapeada de memória?

Foi útil?

Solução

Você poderia montar um sistema de arquivos apoiado pela memória: http://lists.apple.com/archives/darwin-kernel/2004/sep/msg00004.html

O uso desse mecanismo aumentará a pressão da memória no sistema e provavelmente será pagado se a pressão da memória for grande o suficiente. Pode valer a pena torná-lo uma opção de configuração, caso o usuário preferir algum outro aplicativo ter a primeira escolha da memória.

Outra opção é usar Segmentos de memória compartilhada POSIX: http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html (Eu não usei os segmentos de memória compartilhados POSIX; se eu os entender corretamente, eles foram projetados para resolver exatamente esse problema.)

o shm_open() A função cria um objeto de memória e retorna um descritor de arquivo. Você poderia então mmap(2) Esse descritor de arquivo, faça seu trabalho e passe o descritor de arquivo para a biblioteca.

Não se esqueça de shm_unlink o objeto quando terminar; Segmentos de memória compartilhados POSIX, filas de mensagens e matrizes de semáforo não desaparecem automaticamente quando o último processo sair.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top