Può un programmatore disinteressarsi dell’hardware di una CPU?
Questa è una domanda che spesso, in passato, ci ponevamo.
Chi si occupa di firmware o di software sicuramente conosce già la risposta.
Personalmente, occupandomi di firmware/software e di hardware ormai da quasi tre decenni, non posso che rispondere positivamente.
L’AMD, recentemente, ha rilasciato un’interessante proposta da estendere all’AMD64; si tratta, infatti, di una nuova modalità di programmazione che consente di gestire, in maniera più efficiente, la concorrenzialità dei programmi.
Grazie a questa, chiamata Advanced Synchronization Facility o ASF, nuova prerogativa saranno in molti a ricavare indubbi benefici: da programmi applicativi a sistema operativi, senza trascurare le librerie.
Questo articolo vuole essere un’introduzione a questo tema, seguiranno, poi, altri maggiormente esplicativi.
Il meccanismo Advanced Synchronization Facility permette di aggiornare locazioni multiple di memoria in maniera atomica senza per questo stabilire dei locks per instaurare una sessione di mutua esclusione. Per garantire un meccanismo di questo tipo, AMD ha implementato nuove istruzioni.
L’esempio che segue mostra le nuove istruzioni previste in colore rosso:
Per prima cosa, si esamini Rflags immediatamente, dopo SPECULATE, attraverso una JNZ (JNZ accedi).
In questo contesto non si salta ad un ipotetico gestore di abort della richiesta, ma si richiede l’uso della regione (salta a ‘accedi’).
In una applicazione reale, però, è bene utilizzare un gestore che si occupi di controllare un risultato del genere.
Come vediamo la coppia Speculate/Commit ha lo scopo di delimitare l’area di lavoro.
Con Speculate si marca l’inizia della regione, mentre, al contrario, con COMMIT si indica la fine. Una volta marcata l’area è necessario accedere all’area, in lettura e/o scrittura, con l’istruzione ‘LOCK MOV’, in questo modo l’area rimane interdetta alle altre CPU, o core, fino a quando la stessa non è eseguita COMMIT.
L’esempio è abbastanza banale. L’istruzione, messa all’inizio,’LOCK MOV’ identifica l’area di memoria che deve essere monitorata (per intenderci, la locazione buffer1 e buffer2).
Una regione marcata può anche contenerne un’altra dello stesso tipo o la richiesta potrebbe anche non essere accettata.
L’ultima ipotesi risulta vera se la regione contiene una istruzione che tenti di accedere ad una regione a sua volta protetta o quando un evento asincrono (interrupt) occorre.
Come diretta conseguenza, la regione è immediatamente rilasciata considerando nulle gli eventuali aggiornamenti. Il program counter conterrà, poi, l’indirizzo dell’istruzione precedente alla richiesta di Speculate, così come lo stack pointer. Il software, ad ogni modo, può verificare le ragioni leggendo lo stato dei registri CPU rAX e rFLAGS.