Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Cosa fanno
Forum - C/C++ - Cosa fanno "a basso livello" le funzioni *sleep() ?

Avatar
NothingLeft (Normal User)
Newbie


Messaggi: 3
Iscritto: 05/12/2011

Segnala al moderatore
Postato alle 11:22
Lunedì, 05/12/2011
Ciao a tutti!
Ho aperto questa domanda per chiedere cosa fanno realmente le funzioni tipo sleep(). Ok, so che mettono in pausa il processo per il tempo indicato come parametro, ma più precisamente?
Chiedo questo perchè provando a misurare il tempo di esecuzione di un programma che ha una sleep() all'interno, il programma in questione mi stampa sempre 0.
Il programma in questione è questo:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. float diff(clock_t, clock_t);
  5.  
  6. int main(void) {
  7.         clock_t start, end;
  8.        
  9.         start = clock();
  10.        
  11.         sleep(2);
  12.        
  13.         end = clock();
  14.        
  15.         printf("%gs\n",  diff(end, start));
  16.        
  17.         return 0;
  18. }
  19.        
  20. float diff(clock_t end, clock_t start) {
  21.         return ((float)(end - start)) / CLOCKS_PER_SEC;
  22. }



Questo semestre ho Sistemi Operativi, e mi viene da pensare che la sleep() metta il processo in attesa di un segnale che lo risvegli, ma sono mie supposizioni, ovviamente. :asd:
Aspetto qualche chiarimento, grazie a tutti. :)

Ultima modifica effettuata da NothingLeft il 05/12/2011 alle 11:26
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Up
3
Down
V
Segnala al moderatore
Postato alle 16:22
Lunedì, 05/12/2011
In Unix dipende dall'implementazione; un modo di farlo e' utilizzare alarm.

Codice sorgente - presumibilmente C++

  1. static void
  2. sig_alrm(int signo)
  3. {
  4.     /* nothing to do, just returning wakes up sigsuspend() */
  5. }
  6.  
  7. unsigned int
  8. sleep(unsigned int nsecs)
  9. {
  10.     struct sigaction    newact, oldact;
  11.     sigset_t            newmask, oldmask, suspmask;
  12.     unsigned int        unslept;
  13.  
  14.     /* set our handler, save previous information */
  15.     newact.sa_handler = sig_alrm;
  16.     sigemptyset(&newact.sa_mask);
  17.     newact.sa_flags = 0;
  18.     sigaction(SIGALRM, &newact, &oldact);
  19.  
  20.     /* block SIGALRM and save current signal mask */
  21.     sigemptyset(&newmask);
  22.     sigaddset(&newmask, SIGALRM);
  23.     sigprocmask(SIG_BLOCK, &newmask, &oldmask);
  24.  
  25.     alarm(nsecs);
  26.  
  27.     suspmask = oldmask;
  28.     sigdelset(&suspmask, SIGALRM);    /* make sure SIGALRM isn't blocked */
  29.     sigsuspend(&suspmask);            /* wait for any signal to be caught */
  30.  
  31.     /* some signal has been caught,   SIGALRM is now blocked */
  32.  
  33.     unslept = alarm(0);
  34.     sigaction(SIGALRM, &oldact, NULL);  /* reset previous action */
  35.  
  36.     /* reset signal mask, which unblocks SIGALRM */
  37.     sigprocmask(SIG_SETMASK, &oldmask, NULL);
  38.     return(unslept);
  39. }



Il codice non e' mio, e' preso da Advanced Programming in the Unix Environment. Alarm e' una syscall che genera un segnale allo scadere del tempo prefissato ed e' gestita dal kernel (che ha il suo modo di tenere traccia del tempo che passa). Sigsuspend si occupa di sospendere il processo fintanto che un segnale non viene ricevuto.

Ultima modifica effettuata da pierotofy il 05/12/2011 alle 16:25
Perfetto, esaurientissimo! Era un po' come mi aspettavo, grazie mille! :D - NothingLeft - 05/12/11 20:47


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Up
4
Down
V
Segnala al moderatore
Postato alle 11:37
Lunedì, 05/12/2011
In Windows una Sleep causa il fatto che il thread viene posto in condizione

unrunnable

Quando il tempo è trascorso, lo scheduler lo pone in condizione

ready-to-run

Penso che Linux faccia in modo simile

Grazie mille per la risposta tempestiva e la delucidazione! :) - NothingLeft - 05/12/11 20:48


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM