Stavo guardando questo talk sull'implementazione di IO asincrono in Rust e Carl menziona due potenziali modelli. Disponibilità e completamento.
Modello di prontezza:
- dici al kernel che vuoi leggere da un socket
- fai altre cose per un po '...
- il kernel ti dice quando il socket è pronto
- leggi (inserisci un buffer)
- fai tutto il necessario
- libera il buffer (avviene automaticamente con Rust)
Modello di completamento:
- allocate un buffer per il kernel da riempire
- fai altre cose per un po '...
- il kernel ti dice quando il buffer è stato riempito
- fai tutto il necessario con i dati
- libera il buffer
Nell'esempio di Carl di usare il modello di prontezza si può scorrere le prese pronte per riempire e liberare un buffer globale che fa sembrare che utilizzerebbe molto meno memoria.
Ora le mie ipotesi:
Sotto il cofano (nello spazio del kernel) quando un socket è detto "pronto", i dati esistono già. È entrato nel socket sulla rete (o da qualsiasi luogo) e il sistema operativo si sta trattenendo sui dati.
Non è che l'allocazione di memoria magicamente non avvenga nel modello di prontezza. È solo che il sistema operativo lo sta estrapolando da te. Nel modello di completamento, il sistema operativo ti chiede di allocare la memoria prima che i dati entrino effettivamente ed è ovvio che cosa sta succedendo.
Ecco la mia versione modificata del Modello di competenza:
- dici al kernel che vuoi leggere da un socket
- fai altre cose per un po '...
- EMENDAMENTO: i dati arrivano al sistema operativo (un po 'di spazio nella memoria del kernel)
- il kernel dice che il socket è pronto
- leggi (riempi un altro buffer separato dal buffer del kernel di abover (o ottieni un puntatore ad esso?))
- fai tutto il necessario
- libera il buffer (avviene automaticamente con Rust)
/ Le mie ipotesi
Mi è sempre piaciuto mantenere il programma dello spazio utente di piccole dimensioni, ma volevo solo qualche chiarimento su ciò che, in realtà, sta accadendo qui. Non vedo che un modello usi intrinsecamente meno memoria o supporti un livello più alto di IO simultaneo. Mi piacerebbe sentire pensieri e una spiegazione più approfondita di questo.