In che modo i modelli di I / O di basso livello sono mappati nell'astrazione di I / O del flusso?

0

I linguaggi di alto livello spesso espongono l'astrazione I / O basata sul flusso al programmatore, dove i flussi bloccanti o non bloccanti offrono select / read / write operazioni. (AFAIK, l'I / O basato sul messaggio sembra di solito un'astrazione di livello ancora superiore costruita sopra i flussi.)

Ma a livello basso, la comunicazione tra CPU e dispositivi hardware utilizza interrupt, I / O programmati (polled) o DMA.

Come possono tutti mappare bene nella stessa astrazione di I / O del flusso che (per quanto posso dire) nasconde completamente la differenza tra questi modelli di basso livello molto diversi? Esistono casi in cui uno sviluppatore di alto livello che utilizza l'astrazione di I / O del flusso dovrebbe effettivamente preoccuparsi della differenza tra I / O gestito da interrupt e programmato?

    
posta max 10.01.2017 - 19:14
fonte

1 risposta

1

L'I / O basato sugli interrupt non si connette bene agli stream.

Un particolare esempio potrebbe essere una chiamata di sistema select . Fornisce un modo per attendere l'input sul conteggio arbitrario dei descrittori di file, ma questa API quasi mai si manifesta nell'API stream delle librerie di alto livello

Anche l'IO asincrono non si associa ai flussi usuali. Questo è il motivo per cui il ruolo dei flussi diminuisce nelle librerie moderne e lascia il posto a più API generiche basate sugli eventi, ad esempio C ++ boost :: asio, Java NIO. Sono più efficaci per le applicazioni asincrone e parallele e sono una reazione alla crescente domanda di parallelizzazione.

Si noti tuttavia che internamente, la maggior parte di queste API sta ancora utilizzando le stesse interfacce di sistema ancora basate su interrupt e vecchi buffer buoni. È possibile, perché le librerie nascondono ancora i dettagli dietro strati di astrazioni.

BTW, tutte queste astrazioni (flussi, eventi, IO bufferizzati) sono intercambiabili a scapito di alcune prestazioni. Ad esempio, gli stream possono essere creati utilizzando eventi con alcune code di blocco, la conversione all'indietro può essere fornita da thread dedicato.

    
risposta data 10.01.2017 - 19:46
fonte

Leggi altre domande sui tag