gerenciamento de buffer múltiplo em C
-
27-10-2019 - |
Pergunta
O que você recomendaria que eu fizesse para armazenar vários streams (cada stream exigiria seu próprio buffer) em C?
Eu meio que montei uma solução na minha cabeça:
Este é um "pseudocódigo" teórico
[ptr, ptr, ptr, ptr ... ]
Cada ptr
é um ponteiro para uma estrutura:
{
stream_id
buff_ptr
}
stream_id
é o ID do fluxo (eu tenho essa informação) e buff_ptr
é um ponteiro para alguns dados malloc
ed. Além disso, os buffers provavelmente teriam que ser flexíveis e chamar muito malloc
e free
para torná-lo flexível (pelo menos acho que seria?
Basicamente, eu encontraria o buffer de que preciso iterando pela matriz de ptr
s.
Então, essa "arquitetura" é boa ou existe uma melhor?
Se alguém está se perguntando "Por que diabos ela precisa disso ?!" Fiz um servidor em Ruby / EventMachine, o protocolo está realmente podre (para dizer o mínimo) e não sei mais como lidar com isso ... A menos que haja uma maneira de forçar EventMachine a armazená-lo em buffer para mim, seria a melhor solução, suponho.
Obrigado.
P.S: Desculpe pela rave! ~
Solução
Bem, parece a única opção, mas você pode mudar algumas coisas:
- Não
malloc
efree
.Em vez disso, userealloc
-
Iterar pela lista pode funcionar, mas se houver muitos buffers
- Você pode fazer o chamador passar um ponteiro para o buffer?
- Você pode usar um hash em vez de uma lista e pesquisar por
stream_id
?Por exemplo,glib2
fornece tal hash
Muitas APIs (por exemplo, epoll) permitem que você associe um ponteiro a um id (um descritor no caso de epoll).Quando algo interessante acontece a esse id, a API passa seu ponteiro -> pesquisa zero à custa de 4 a 8 bytes de memória.
Outras dicas
Use libev para fazer um loop de evento simples e deixá-lo lidar com descritores de arquivo de pesquisa.Existem muitos exemplos por aí e sua página de manual (man 3 libev
) é uma das melhores que já li.
Basta definir alguns retornos de chamada e criar alguns buffers para seus pools de leitura e gravação.O tamanho desses pools pode permanecer estático, desde que você bloqueie ou ignore suas leituras e gravações quando o buffer se enche ou se esgota, respectivamente.