Oto powszechna definicja procesu w tle:
„Proces w tle to program, który działa bez udziału użytkownika. wiele procesów w tle może działać w wielozadaniowym systemie operacyjnym, takim jak Linux, podczas gdy użytkownik wchodzi w interakcję z procesem pierwszoplanowym Niektóre procesy w tle, takie jak na przykład demony, nigdy nie wymagają interwencji użytkownika. Inne są tylko tymczasowo w tle, podczas gdy użytkownik jest zajęty programem działającym obecnie na pierwszym planie. Tak więc inny proces może spać i zajmować przestrzeń wymiany, dopóki nie zostanie aktywowany, co sprawia, że obecnie jest procesem w tle. ”
Biorąc pod uwagę tę definicję, czy nie uczyniłoby procesu takiego jak Apache2 procesem działającym w tle, ponieważ nigdy nie wchodzi w interakcję z danymi wejściowymi użytkownika w terminalu? I czy nie uwzględniałoby to większości procesów w tle, ponieważ większość procesów działających w systemie nie obsługuje danych wejściowych użytkownika w terminalu? Co dziwne, osobiście nie uważałbym Apache2 za proces działający w tle, ponieważ użytkownik wchodzi z nim w interakcję za pośrednictwem żądań http (tylko nie przez terminal).
Komentarze
- Myślę, że są tu dwie definicje. Jedna dotyczy danych wejściowych użytkownika (czy proces może akceptować dane wejściowe użytkownika, na przykład terminal). Druga dotyczy tego, czy proces śpi i siedzi w przestrzeni wymiany, czy nie. Tutaj możesz nazywaj oba te procesy jako procesy w tle, co sprawia, że termin jest mylący
Odpowiedź
Proces pierwszoplanowy nie wymagają interakcji użytkownika. Możesz to zrobić
cp very_large_file destination
, a to zablokowałoby twój terminal do czasu zakończenia kopiowania i zostałoby uznane za proces pierwszoplanowy bez interakcji użytkownika. Punkt tutaj jest to, czy proces blokuje wykonywanie innych procesów aż do ich zakończenia.
Na dwa sposoby możesz zrobić proces pierwszoplanowy w tło:
1- Dodanie znaku ampersand ( & ) na końcu wiersza poleceń:
cp very_large_file destination &
2- Zatrzymanie procesu pierwszego planu i przeniesienie go na tło:
cp very_large_file destination
CTRL + Z
bg
Teraz apache2
z pewnością liczy się jako proces w tle: tak, możesz wchodzić z nim w interakcję za pośrednictwem żądań http, ale po prostu nasłuchuje na porcie 80 (domyślnie), czekając na takie żądanie: nie blokuje systemu, dopóki użytkownik nie złoży żądania.
I dlaczego bierzesz pod uwagę większość procesów uznawanych za procesy w tle? Jest to rzeczywiście normalne w „wielozadaniowym systemie operacyjnym”.
Komentarze
- Z ciekawości, jeśli mam program, który blokuje, ale działa w sesji ekranu GNU lub tmux, a następnie zostawiam tę sesję screen / tmux i zwracam sterowanie do terminala (ale oczywiście ignorują sygnał HUP (rozłączenia), więc nadal działają), czy byłyby uważane za tło proces? Myślę, że można by argumentować, że są to procesy pierwszoplanowe, ponieważ w ramach swojej sesji blokują się, mimo że nie blokują się w głównym terminalu.
- @JohnMerlino Powiedziałbym, że
screen
/tmux
jest procesem pierwszoplanowym w tym przypadku, a kiedy " zwracasz sterowanie do terminala " wysyłasz go w tło.
Odpowiedź
Istnieją dwie popularne definicje „Proces w tle”, jeden w kategoriach ogólnych, a drugi dokładny i specyficzny dla systemu UNIX.
W szerokim znaczeniu „proces w tle” można nazwać dowolnym procesem, który nie wchodzi w interakcję z użytkownikiem siedzącym na konsola. W tym sensie Apache jest procesem w tle.
W terminologii unixowej „proces w tle” ma precyzyjną definicję. proces w tle to proces, który jest uruchamiany z terminala, ale obecnie nie ma możliwości interakcji z nim minal. (Upraszczam, nie biorąc pod uwagę grup procesów). Proces w tle zazwyczaj uzyskuje się, uruchamiając zadanie w tle w powłoce:
$ myprogram & [1] 12345 $
lub uruchamiając program, a następnie zawieszenie go i pozwolenie na kontynuację w tle:
$ myprogram ^Z [1]+ Stopped myprogram $ bg [1]+ myprogram & $
Jeśli uruchomisz program bez &
, jest na pierwszym planie. W danym momencie może istnieć tylko jeden proces na pierwszym planie w danym terminalu . (Lub bardziej ogólnie, pojedyncza grupa procesów, jeśli proces pierwszoplanowy uruchamia pewne podprocesy.) Wbudowane polecenia powłoki bg
i fg
zmieniają, który proces jest na pierwszym planie. Gdy proces jest w tle, jeśli próbuje odczytać lub zapisać do terminala, jest zatrzymany przez sygnał SIGTTIN lub SIGTTOUT .
Uważam, że twoja intuicja, że Apache nie jest procesem w tle, ponieważ współdziała z użytkownikiem przez HTTP, jest dziwna. Apache nie wchodzi w interakcję z użytkownikiem: jest to interakcja ze zdalną przeglądarką internetową (która oddziałuje z użytkownikiem) lub zautomatyzowanym klientem (który nie wchodzi w interakcję z użytkownikiem). Jeśli uważasz, że jakikolwiek proces, który „wchodzi w interakcję z procesem interaktywnym, jest procesem interaktywnym, to każdy proces jest interaktywny, co czyni go bezużytecznym pojęciem.
Definicja, którą cytujesz, łączy procesy w tle z procesami bezczynnymi. Nie ma powodu, dla którego proces w tle miałby być uśpiony lub zamieniony bardziej niż proces pierwszoplanowy. Na przykład proces w tle może wykonywać ciężkie obliczenia. I odwrotnie, jeśli użytkownik odejdzie od konsoli i istnieją inne aktywne procesy, procesy pierwszoplanowe mogą zostać zamienione.