Här är en vanlig definition av en bakgrundsprocess:
”En bakgrundsprocess är ett program som körs utan användarinmatning. A antal bakgrundsprocesser kan köras på ett multitasking-operativsystem, till exempel Linux, medan användaren interagerar med förgrundsprocessen. Vissa bakgrundsprocesser, till exempel demoner, kräver aldrig användarinmatning. Andra är bara i bakgrunden tillfälligt medan användaren är upptagen med att programmet för närvarande körs i förgrunden. Så att den andra processen kan sova och ta upp utbytesutrymme tills den är aktiverad, vilket gör det för närvarande till en bakgrundsprocess. ”
Med tanke på den definitionen, skulle det inte göra en process som apache2 till en bakgrundsprocess eftersom den aldrig interagerar med användarens inmatning i terminalen? Och skulle inte det betrakta de flesta processbakgrundsprocesser, eftersom de flesta processer som körs i ett system inte handlar om användarinmatning i terminalen? Konstigt nog skulle jag personligen inte betrakta apache2 som en bakgrundsprocess eftersom en användare interagerar med det via http-förfrågningar (bara inte en terminal).
Kommentarer
- Jag tror att det finns två definitioner här. Den ena handlar om användarinmatning (om en process kan acceptera användarinmatning, till exempel terminalen). Den andra är om en process sover och sitter på swap-utrymme eller inte. Här kan du hänvisa till båda dessa som bakgrundsprocesser, vilket gör termen förvirrande
Svar
En förgrundsprocess gör inte kräver användarinteraktion. Du kan göra
cp very_large_file destination
och detta skulle blockera din terminal tills kopian är klar och anses vara en förgrundsprocess utan användarinteraktion. här är om processen blockerar körningen av andra processer tills den avslutas.
Två sätt du kan göra en förgrundsprocess i en bakgrund:
1- Lägga till ett tecken ( & ) i slutet av din kommandorad:
cp very_large_file destination &
2- Avbryta en förgrundsprocess och sedan föra den i bakgrunden:
cp very_large_file destination
CTRL + Z
bg
Nu apache2
skulle definitivt räknas som en bakgrundsprocess: ja du kan interagera med den via http-förfrågningar men den lyssnar helt enkelt på port 80 (som standard) och väntar på en sådan begäran: det blockerar inte systemet förrän användaren gör en begäran.
Och varför tar du problem vid de flesta processer som betraktas som bakgrundsprocesser? Detta är verkligen normalt i ett ”multi-tasking operativsystem”.
Kommentarer
- Av nyfikenhet, om jag har ett program som blockerar men den körs i en GNU-skärmsession eller tmux, och sedan lämnar jag skärmen / tmux-sessionen och återgår kontrollen till terminalen (men de ignorerar naturligtvis HUP-signalen (hangup) så att de fortfarande kör), skulle de anses vara en bakgrund bearbeta? Jag antar att du skulle argumentera för att de är förgrundsprocesser eftersom de blockerar, även om de inte blockerar i huvudterminalen, under sin session.
- @JohnMerlino Jag skulle säga att
screen
/tmux
är förgrundsprocessen i detta fall och när du " returnerar kontrollen till en terminal " du skickar det i bakgrunden.
Svar
Det finns två vanliga definitioner av ”Bakgrundsprocess”, en i allmänna termer och en exakt och specifik för unix.
I vid bemärkelse kan du kalla ”bakgrundsprocess” varje process som inte interagerar med användaren som sitter vid I denna mening är Apache en bakgrundsprocess.
I unix-terminologi har ”bakgrundsprocess” en exakt definition. En bakgrundsprocess är en process som startas från en terminal men för närvarande hindras från att interagera med ter minal. (Jag förenklar genom att inte överväga processgrupper.) Du får vanligtvis en bakgrundsprocess genom att starta ett bakgrundsjobb i ett skal:
$ myprogram & [1] 12345 $
eller genom att starta en programmet, sedan avbryta det och låta det fortsätta i bakgrunden:
$ myprogram ^Z [1]+ Stopped myprogram $ bg [1]+ myprogram & $
Om du startar ett program utan &
, det står i förgrunden. Det kan bara finnas en enda process i förgrunden i en given terminal åt gången. (Eller mer allmänt, en enda processgrupp, om förgrundsprocessen startar några underprocesser.) Skalets inbyggda bg
och fg
ändrar vilken process är i förgrunden. När en process är i bakgrunden, om den försöker läsa eller skriva till terminalen, stoppas den av en SIGTTIN- eller SIGTTOUT-signal .
Jag tycker att din intuition att Apache inte är en bakgrundsprocess eftersom den interagerar med användaren via HTTP konstigt. Apache interagerar inte med användaren: den interagerar med en fjärrwebbläsare (som interagerar med användaren) eller en automatiserad klient (som inte interagerar med användaren). Om du betraktar någon process som interagerar med en interaktiv som en interaktiv process, är vilken process som helst interaktiv, vilket gör det till ett värdelöst koncept. s ingen anledning till varför en bakgrundsprocess skulle sova eller bytas ut mer än en förgrundsprocess. En bakgrundsprocess kan till exempel göra någon tung beräkning. Omvänt, om användaren går bort från konsolen och det finns andra aktiva processer, kan förgrundsprocesser bytas ut.