Qual è lo scopo principale del process di swapper in Unix?

Qual è lo scopo principale del process di swapper in Unix?

Il process Swapper ha il PID 0 e immagino che sia il primo process che si carica. Qualcuno può gettare più luce su questo argomento?

Non è stato un process di sostituzione dagli anni '90, e lo scambio non è stato veramente utilizzato fin dagli anni '70.

Unices ha smesso di usare swapping un tempo fa. Sono stati sisthemes operativi pagati per la domanda per alcuni decenni – dal sistema V R2V5 e da 4.0BSD. Il process di swapper, come lo era, è stato utilizzato per eseguire operazioni di swap di process . Ha usato per scambiare interi processi – inclusi tutti i dati di struttura del kernel-space per il process – per discendere e sostituirli nuovamente. Sarebbe svegliato regolarmente dal kernel e avrebbe scansionato la tabella di process per determinare quali processi scambiati e pronti per essere eseguiti possono essere scambiati e quali processi swapped-in-but-sleep potrebbe essere sostituito. Tutto il libro di text su Unix degli anni '80 entrerà in questo dettaglio in dettaglio, incluso l'algorithm di swap. Ma è in gran parte irrilevante per le pagine a richiesta, anche se hanno mantenuto il vecchio meccanismo di scambio per diversi anni. (I BSD hanno provato abbastanza duro per evitare di scambiarsi, ad esempio per la paging.)

Processo # 0 è il primo process nel sistema, eseguito manualmente dal kernel. E ' fork() s process 1, il primo process utente. Quello che fa diverso da quello dipende da quello che Unix è il sistema operativo in realtà . Come già accennato, i BSD prima di FreeBSD 5.0 ​​hanno mantenuto il vecchio meccanismo di scambio e il process # 0 semplicemente è caduto nel codice swapper nel kernel, la function scheduler() , dopo aver terminato l'initialization del sistema. Il sistema V era molto simile, tranne che il process # 0 era convenzionalmente denominato sched piuttosto che swapper . (I nomi sono scelte piuttosto arbitrarie.) Infatti, la maggior parte – forse tutte – le Unices avevano un vecchio meccanismo di sostituzione (in gran parte inutilizzato) che si appendeva attorno come process # 0.

Linux, tradizionalmente, è stato un po 'diverso dalle Unices, in quel process # 0 è il process di inattività , in esecuzione cpu_idle() . Non fa nulla, in un ciclo infinito. Esiste in modo che ci sia sempre un task pronto per essere pianificato.

Anche questa è una descrizione non aggiornata. Alla fine degli anni '80 e agli inizi degli anni '90 è stata l'avvento dei sisthemes operativi multi-threading, per cui il process # 0 è diventato semplicemente il process di sistema . Nel mondo delle vecchie Unices a filettatura singola, si potrebbe avere solo un stream di esecuzione separato per eseguire un task continuo del kernel tramite una fork() process. Quindi tutti i compiti del kernel ( vmdaemon , pagedaemon , pagezero , bufdaemon , syncer , ktrace e così via sui sisthemes FreeBSD, ad esempio) erano processi a basso numero, fork() ed per process # 0 dopo che fork() ed ìnit . Nelle Unices multi-threaded, non ha senso generare un context di process integer per qualcosa che viene eseguito interamente nello spazio del kernel e non necessita di uno spazio di indirizzi, di una tabella di descrittori di file e di tutto ciò che è a se stesso. Quindi tutti questi compiti sono diventati (essenzialmente) thread, condividendo lo spazio di indirizzi di un singolo process di sistema.

Lungo la strada, parecchie Unices hanno perso il vecchio meccanismo dello swapper, che stavano cercando il loro massimo per evitare di usare comunque. Il codice di initialization di OpenBSD ora semplicemente scende in un while(1) tsleep(…); loop, ad esempio, senza meccanismo di scambio in nessun punto.

Così oggi il process # 0 su un Unix è il process di sistema che effettua in modo efficace una serie di thread del kernel che eseguono una serie di cose, che vanno dalle operazioni di pagine in output, attraverso i flussi di cache dei file system e l'azzeramento del buffer, inattivo quando non c'è altro da eseguire .

Il process 0 è un process speciale (chiamato swapper o il process di inattività) che viene eseguito quando il sistema è inattivo, cioè nessun altro process è in programma. È l'unico process che può ricall la chiamata di sistema idle() .

Questo è il primo process da generare, che crea init (PID 1) che inizia altri processi.

 root 1 0 /sbin/init 

È anche ansible controllare l' man idle .

Vedere anche: Comprensione del kernel Linux – Process Scheduling

La ragione è storica e programmatica. L'attività intriggers è l'esecuzione dell'attività, se nessun'altra attività è runnable, come l'hai detto. Ha la priorità più bassa ansible, per questo motivo non funziona nessun altro task è runnable.

Motivazione programmata: questo semplifica il process di pianificazione molto, perché non devi preoccuparti del caso speciale: "Cosa succede se nessun task è runnable?", Perché c'è sempre alless una task runnable, l'attività intriggers. Inoltre è ansible contare la quantità di tempo della CPU utilizzata per each attività. Senza il task inattivo, quale task ha il time-cpu che nessuno ha bisogno?

Motivo storico: prima che avessimo cpus in grado di scendere o andare in modi risparmio energetico, HAD whereva funzionare a piena velocità in qualsiasi momento. Ha eseguito una serie di istruzioni NOP, se non sono stati eseguiti compiti. Oggi la pianificazione dell'attività intriggers scende normalmente dalla CPU usando le istruzioni HLT (halt), in modo da risparmiare energia. Quindi c'è una funzionalità in qualche modo nell'attività inattesa nei nostri giorni.

In Windows è ansible visualizzare l'attività intriggers nell'elenco di processi, è il process inattivo.