All'inizio va bene, riesco a mantenere il ritmo, ma ogni tanto, casualmente, qualche lettura impiega 100, 300, anche 1000 ms.
L'unico modo che sono riuscito a trovare per far funzionare la lettura è "indurre" il caching del file da parte di linux.
In pratica "preleggo" tutto il file prima di iniziare la lettura vera e propria.
Non serve nemmeno che allochi lo spazio di tutto il file, basta che leggo qualcosa e lo memorizzo in un buffer, poi posso anche non utilizzarlo.
Praticamente questo:
Code: Select all
void preload(char filename)
{
int file;
char buffer[1000];
file = open(filename, O_RDONLY);
while(!eof(file))
{
read(file, buffer, 1000);
}
close(file);
}
int main()
{
int filed;
char buffer[11832];
preload("blablabla");
filed = open("blablabla", O_RDONLY);
while(!eof(filed))
{
read(filed, buffer, 11832);
delay_ms(50);
}
return 0;
}
Ora, questa cosa va bene per file piccoli, ma se ho un file grosso, oltre al tempo perso per il preload, potrebbe non esserci abbastanza RAM e linux non avrebbe tutto il file in cache, quindi rischierei di avere ancora quei ritardi.
Perché read() ha questi delay?
Leggo solo 12000 byte ogni 50 ms, fanno 240000 B/s, è un flusso ridicolo.
Anche bufferizzando io stesso il file, cioè caricando qualche MB in un buffer e prendere i 12000 B da lì, non risolve il problema: ogni tanto la funzione read() si addormenta.
Come la risolvo?