|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6076
|
[C] Thread e I/O
Ciao a tutti,
vorrei fare una domanda teorica sui thread, quindi diciamo che non devo postare codice. Ho scritto C nel titolo solo perché sto usando i POSIX thread. Dunque, ho un programma multithread che si occupa di leggere e scrivere su disco. In particolare, ho un server che si mette in attesa, ogni volta che arriva una richiesta attiva un thread che si occupa di scrivere o leggere a seconda della richiesta che perviene. Premesso che in un sistema multitasking, ogni thread viene eseguito un "pò per volta" in base alle priorità e allo scheduler del sistema operativo, nel caso che un thread faccia I/O su disco come si comporta lo scheduler? Interrompe comunque il thread e passa ad un altro dopo un tot di tempo oppure considera l'operazione di lettura/scrittura atomica? Se vale il primo caso, non è allora molto dispendioso questo meccanismo? in quanto il disco farebbe continui salti avanti e indietro per recuperare/scrivere dati in dovendo servire richieste random ed in più interrompibili? Qualcuno mi sa dare spiegazioni in merito? Grazie in anticipo! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6076
|
Uppo questa mia vecchia richiesta nella speranza che qualcuno mi sappia rispondere.
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quando un thread chiama una funzione di I/O che non è in grado di servire subito la richiesta (perché, ad esempio, non è in cache e deve leggere dal disco), il thread viene messo in stato di attesa e la CPU passa a un altro thread e/o processo secondo le regole dello scheduler.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6076
|
Quote:
![]() Si questo mi torna. Però le funzioni di I/O sono interrompibili dallo scheduler? Ultima modifica di Unrue : 18-03-2010 alle 13:44. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Certamente. Si tratta pur sempre di istruzioni che vengono eseguite dalla CPU, e lo scheduler le può interrompere in qualunque momento.
E', comunque, possibile per il kernel e a volte delle periferiche, disabilitare gli interrupt per brevissimi intervalli di tempo per non interrompere delle operazioni delicate.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Se ho ben inteso la domanda chiedi se le operazioni di I/O venagno eseguite in maniera serializzata. Il risultato finale si, anche se sui sistemi multiprogrammati possono essere ottimizzate per una migliore risposta hardware.
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se lancio due thread in due istanti diversi che vanno a scrivere alla stessa posizione del file, non ho alcuna garanzia su quale dei due mi vada a scrivere prima sul disco. Se lancio due thread, uno mi va a scrivere ed uno a leggere alla stessa posizione del file, anche qui il risultato è imprevedibile, indipendentemente da quale lancio prima o dopo. |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6076
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
A minimizzare lo spostamento della testina in realtà ci dovrebbe pensare lo scheduler.
Prima che il file arrivi sul disco nella sua locazione ce ne sono di passaggi ![]() Prima di tutto le scritture vengono salvate nel journal, poi lo scheduler si occupa di selezionare le scritture secondo il suo algoritmo. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
E' normale che sia così, e a livello applicativo puoi fare poco e niente (a meno che non sai già quali accessi farai).
I s.o. moderni hanno meccanismi per cercare di ridurre l'impatto degli accessi casuali, monitorando le richieste in attesa e cercando di schedularle in modo da minimizzare lo spostamento delle testine.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6076
|
Ok, grazie ad entrambi
![]() |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
se il thread A scrive sulla posizione x e dopo B scrive ancora su x, sul disco le operazioni saranno serializzate(sicuramente se la politica è FCFS ), poi se a livello logico ciò sia corretto o meno, dipende ovviamente dall' implementazione e dalla gestione programmatica della concorrenza. Ultima modifica di nuovoUtente86 : 19-03-2010 alle 14:09. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì però non c'è alcun vincolo sulla sequenza con cui vengono chiamate le syscall dato l'ordine in cui vengono attivati i thread. Quindi se questa cosa è vincolante conviene serializzare le scritture già dal programma. Magari usando un thread che si occupa di "consumare" le scritture prodotte dagli altri thread.
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Anche io ho affrontato da poco l'argomento, al di là di tutte le considerazioni, ditemi se sbaglio, ho trovato interessante come la politica di scheduling del processore cambia a seconda degli obiettivi del sistema operativo, che sia batch, interactive o real-time.
Quindi a mio parere, occorre anche tenere in considerazione la politica di default del sistema. Come dice cdimauro, Quote:
la CPU ne tiene conto durante la gestione dei processi. I processi chiamati "compute-bound" ai quali la CPU dedica molto tempo sono appunto quelli con pochi I/O e molta elaborazione. I processi "I/O bound" l'opposto. Quindi la CPU dedicherà maggior tempo ai primi, in quanto sarebbe stupido aspettare un dato che arriva dall'hard disk o da un'altra periferica. Insomma un ottimo algoritmo di scheduling tiene conto di tutte queste cose. Si dovrebbe parlare anche di priorità e valore di cortesia dei processi in quanto la CPU è influenzata da queste nel compito di gestione. |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Comunque, la CPU di suo non tiene conto di niente, è sempre lo scheduler a dover tenere conto dei singoli aspetti più o meno rilevanti per il sistema.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
![]() La CPU poverina, esegue e basta. ![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
In ogni caso lo scheduler della CPU e quello del disco sono indipendenti: potrebbero agire in sinergia ma anche no.
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
- timestamp di arrivo - peso della lettura - distanza dalla posizione del journal (seek time) |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Solitamente viene data alta priorità alle operazioni sull' area di swap.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:23.