Crea sito

Gli interrupts e le ioports

11 / 100

Le Ioports

Diamo un’occhiata al file /proc/ioports/.

Al suo interno vediamo ogni dispositivo e il suo corrispondente e univoco spazio in memoria. Una cosa sono gli interrupts, ma una volta che il dispositivo ha inviato l’interrupt alla CPU questa deve mediare il trasferimento di dati tra la periferica e la memoria. e questo e’ lo scopo delle IOPORTS.

Fornire ad un Device un range di memoria in cui possa essere assegnato e poi la CPU trasferisce e mette in atto una mediazione in termini di trasferimento di dati dal device alla memoria.

Ognuno di questi indirizzi posti in memoria non e’ e non e’ possibile poterlo condividere con altri dispositivi per funzionare correttamente.

Se cosi non fosse ci sarebbe un malfunzionamento dell’intero sistema

In alcuni sistemi piu’ recenti,invece di usare le ioports viene usato DMA ( cat /proc/dma dove possono esserci piu’ dispositivi e il vantaggio con questo sistema e’ che non si affatica la cpu.

Infatti con DMA possiamo assegnare la memoria direttamente ai dispositivi e bypassare la mediazione della CPU. Quindi sara’ il dispositivo che scrive e legge direttamente dalla memoria che gli e’ stata assegnata.

Gli Interrupts

Tutti i programmi scritti con i tradizionali linguaggi imperativi, dal Pascal al C++, per accedere all’I/O (ad esempio la tastiera e la stampante) utilizzano funzioni tipo readln(), scanf(), cin() ed altre che svolgono il loro compito con un’inefficenza incredibile. Nell’esempio descritto nell’animazione si sprecano 499.999 istruzioni per ogni effettiva istruzione di lettura di I/O, con un’efficenza di 1/500.000 !!! La causa di tutto ciò è la tecnica adottata per acquisire i dati, normalmente detta polling, in cui per effettuare la lettura di un dato si acquisisce continuamente lo stato della periferica in attesa che il dato risulti disponibile: nel caso di periferiche lente (stampante) o pilotate direttamente dall’uomo (tastiera/mouse) l’attesa del dato determina inevitabilmente una grave inefficenza.

Richiama l’animazione
Richiama la metafora
Richiama la verifica in C

L’alternativa è ricorrere a linguaggi orientati ad eventi, o più semplicemente utilizzare gli interrupt. Quando si deve acquisire un dato, si puó proseguire con un altro programma e lasciare che sia la periferica ad avvisarci quando il dato è disponibile. In quel momento si accantonerá momentaneamente il programma in corso e si leggerá il dato. In tal modo l’efficenza ritorna a livelli accettabili.

Ovviamente la modesta perdita di tempo introdotta per accantonare momentaneamente il programma e poi riprenderlo (scambio di contesto) determina il limite dell’utilizzo degli interrupt: se Richiama la metaforala frequenza dei dati di I/O gestiti è elevata, i tempi di scambio del contesto non sono piú trascurabili rispetto alla gestione del dato, e quindi anche la tecnica dell’interrupt diventa inefficente. In tal caso si potrebbe ricorrere alla tecnica del DMA (Direct Memory Access) [presumibilmente affrontata in Elettronica ].

Per quanto abbiamo detto fino ad ora, il concetto di interrupt è strettamente collegato a quello di gestione di un dato, ma vi è anche un’altra possibilità. Gli interrupt infatti si possono genericamente dividere in due categorie:

interrupt hardware
sono quegli interrupt generati da dispositivi esterni alla CPU, che hanno il compito di comunicare il verificarsi di eventi esterni (tipo quelli di cui abbiamo parlato fino ad ora)


interrupt software
sono delle istruzioni (INT xx) che possono essere assimilate alle chiamate di sottoprogrammi (CALL xx) ma che sfruttano il meccanismo delle interruzioni per passare il controllo dal programma chiamante a quello chiamato, e viceversa; vengono utilizzati per accedere direttamente alle risorse del Sistema Operativo
Concludiamo questa prima parte con la definizione formale di interrupt, tratta da un tradizionale testo scolastico:
un interrupt è un segnale o un messaggio, generalmente di natura asincrona, che arriva alla CPU per avvisarla del verificarsi di un certo evento

Translate »