Domanda

Solo curioso. Come funziona in realtà la funzione Sleep () lavoro (dichiarata in windows.h)? Forse non solo che l'attuazione, ma chiunque. Con questo voglio dire - come viene implementato? Come si può rendere il codice "stop" per un tempo specifico? Anche curioso di sapere come cin >> e quelli effettivamente lavoro . Che cosa fanno esattamente?

L'unico modo che conosco come "blocco" qualcosa di continuare a correre è con un ciclo while, ma considerando che questo richiede una quantità enorme di potenza di elaborazione in confronto a quello che succede quando si sta invocando metodi per leggere da stdin (basta confrontare un po '(vero) per una lettura dallo standard input), sto indovinando che non è quello che fanno.

È stato utile?

Soluzione

Il sistema operativo utilizza un meccanismo chiamato uno scheduler per tenere tutti i thread o processi è la gestione comportarsi bene insieme.

diverse volte al secondo, l'orologio hardware del computer interrompe la CPU, che provoca scheduler del sistema operativo per diventare attivato. Lo scheduler sarà poi guardare tutti i processi che stanno cercando di correre e decide quale si arriva a correre per il prossimo intervallo di tempo.

Le diverse cose che usa per decidere dipendere da ogni stato processi, e quanto tempo si è avuto prima. Quindi, se l'attuale processo ha utilizzato la CPU pesantemente, impedendo ad altri processi di fare progressi, farà l'attuale processo di attesa e di swap in un altro processo in modo che possa fare un certo lavoro.

Più spesso, però, la maggior parte dei processi stanno per essere in uno stato di attesa. Per esempio, se un processo è in attesa di input dalla console, il sistema operativo può guardare le informazioni processi e vedere che io porti la sua attesa di. Può controllare tali porte per vedere se hanno tutti i dati per il processo di lavorare su. Se lo fanno, si può avviare il processo di nuovo, ma se non ci sono dati, quindi questo processo viene saltata per il timeslice corrente.

Per quanto riguarda sleep(), qualsiasi processo può notificare al sistema operativo che si vorrebbe aspettare un po '. Lo scheduler verrà quindi attivato anche prima di un interrupt di processo (che è anche cosa succede quando un processo tenta di fare un blocco di leggere da un flusso che non ha dati pronti per essere letti,) ed il sistema operativo prende nota di ciò che il processo è aspettando. Per un sonno, il processo attende un allarme venga attivato, o può semplicemente cedere nuovamente ogni volta che viene riavviato fino a quando il timer è terminato.

Dato che il sistema operativo riprende solo i processi dopo che qualcosa lo fa per prevenire un processo in esecuzione, come ad esempio il processo di cedimento o l'interrupt timer hardware ho già detto, sleep() non è molto preciso, come precisa dipende dal sistema operativo o hardware, ma è di solito dell'ordine di uno o più millisecondi.

Se è necessaria una maggiore precisione, o aspetta molto brevi, l'unica opzione è quella di utilizzare il ciclo occupato costrutto lei ha citato.

Altri suggerimenti

Gli orari del sistema operativo come i processi Run (quali processi sono ammissibili per l'esecuzione, in che ordine, ...). Sleep() probabilmente emette una chiamata di sistema che dice al kernel “non mi lascia usare il processore per x millisecondi”.

In breve, Sleep () dice al sistema operativo di ignorare il processo / thread per un po '.

'cin' utilizza una tonnellata di operatori di overload. Il '>>', che di solito è giusto bit-shift, è sovraccarico per praticamente ogni tipo di operando di destra in C ++. Una funzione separata è fornita per ogni uno, che legge dalla consolle e converte l'input in qualsiasi tipo variabile avete dato. Ad esempio:

std::cin::operator>> (int &rhs);

Non è vero C ++ - Non ho lavorato con i flussi e sovraccarico in un po ', in modo da non mi ricordo il tipo di ritorno o l'ordine esatto di argomenti. Tuttavia, questa funzione viene chiamata quando si esegue cin >> una variabile intera.

L'esatta implementazione sottostante dipende dal sistema operativo.

La risposta dipende dal sistema operativo, ma in generale, il sistema operativo sia orari qualche altro codice per eseguire altrove in un altro thread, o se non ha letteralmente nulla a che fare, si arriva alla CPU di aspettare fino a quando si verifica un evento di hardware , che fa sì che la CPU per passare a un codice chiamato un gestore di interrupt, che può quindi decidere quale codice da eseguire.

Se siete alla ricerca di un modo più controllato di bloccare una discussione / processo in un programma multi-threaded, uno sguardo ai semafori, mutex, CriticalSections ed eventi. Queste sono tutte tecniche utilizzate per bloccare un processo o thread (senza caricare la CPU tramite un costrutto po ').

Lavorano essenzialmente fuori di un linguaggio Wait / segnale in cui il filo bloccato è in attesa e altri segnali di processo per segnalalo alle ricominciare. Questi (almeno in Windows) possono anche avere i timeout, fornendo così una funzionalità simile a sleep ().

A un livello basso, il sistema ha una routine chiamata "scheduler" che invia le istruzioni da tutti i programmi in esecuzione nella CPU (s), che in realtà li gestiscono. Le chiamate di sistema come "Sleep" e match "usleep" per istruzioni che dicono lo scheduler di ignorare quel filo o un processo per un certo periodo di tempo.

Per quanto riguarda i flussi di C ++, il "cin" nasconde la maniglia file effettivo (stdin e stdout in realtà sono tali maniglie) si sta accedendo, e l'operatore ">>" per esso nasconde le chiamate sottostanti per leggere e scrivere. Fin dalla sua un'interfaccia l'attuazione può essere specifico sistema operativo, ma concettualmente è ancora facendo le cose come printf e scanf sotto il cofano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top