LKMPG: Pianificare compiti: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
Riga 3: | Riga 3: | ||
== Pianificare i compiti == | == Pianificare i compiti == | ||
Versione delle 14:35, 24 apr 2010
Pianificare i compiti
Molto spesso, abbiamo dei compiti proprietari che devo essere eseguiti in tempi precisi, o molto spesso. se il compito è eseguito da un processo, possiamo metterlo nel file crontab. Se il processo è eseguito da un modulo del kernel, abbiamo due possibilità. La prima è di mettere un processo nel file crontab, che attiverà il modulo tramite una system call quando necessario, per esempio aprendo un file. In ogni caso questo metodo è molto inefficente -- si esegue un nuovo precesso di crontab, si legge un nuovo eseguibile nella memoria, e tutto solo per attivare il modulo del kernel che è comunque caricato nella memoria.
Invece di fare così, si può creare una funzione che sarà chiamato una volta per ogni interrupt. La strada da seguire è creare un compito, tenuto in una struttura workqueue_struct, che terrà un puntatore sulla funzione. Successivamente, si userà queue_delayed_work per mettere il compito in una lista di compiti chiamata my_workqueue, che è la lita dei compiti che saranno eseguiti nel prossimo interrupt. Siccome vogliamo che la funzione sia portata in esecuzione**, abbiamo bisogno di metterela ancora nella lista my_workqueue ogni volta che è chiamata, per il prossimo interrupt.
C'è ancora un putnto che dobbiamo ricordare. Quando un modulo è rimosso tramite rmmod, prima di tutto è controllato il conteggio delle sue referenze Se è zero, è eseguito module_cleanup.Poi, il modulo è rimosso dalla memoria con tutte le sue funzioni. E' importante avere tutte cose di cui si ha bisogno per essere arrestato correttamente,o potrebbero accadere imprevisti spiacevoli. Si guardi il codice sotto dove si nota come può essere fatto in un modo sicuro.