#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Uruchamiam ten program na moim systemie Linux, nic nie wychodzi na terminalu, system operacyjny wydaje się nie działać Czy linux ma jakieś zabezpieczenia dla takiego programu, który może zabraknąć pamięci?
Odpowiedzi:
Jest to znane jako bomba widełkowa .
Nie całkiem. Każdy rozwidlenie wytwarza nowy proces z własną wirtualną przestrzenią adresową i wykorzystaniem pamięci. Każda kopia jest więc stosunkowo mała. W końcu zużyjesz całą pamięć fizyczną + swap w systemie, a zabójca braku pamięci (OOM) zacznie zabijać poszczególne procesy. Ale bomba widelcowa nadal będzie tworzyć procesy równie szybko (jeśli nie szybciej).
Jednym ze sposobów zapobiegania temu jest przede wszystkim ograniczenie liczby procesów użytkownika przy użyciu
ulimit -u
(zakładając, że używasz Bash; inne powłoki będą miały odpowiedniki).źródło
ulimit
jest to specyficzne dla bash; inne powłoki prawdopodobnie będą miały tę samą wbudowaną komendę, ale być może będą miały inną nazwę.Tak, chociaż może nie być domyślnie włączony w twoim systemie.
setrlimit
Połączenie systemu określa granice systemu - liczbę procesów na użytkownika.Najpierw spójrzmy na to w interfejsie API jądra (ponieważ wspomniałeś o „linux”): możesz użyć manpage dla setrlimit, który powie ci, żebyś zrobił coś takiego
Spowoduje to ustawienie maksymalnej liczby procesów na użytkownika (
RLIMIT_NPROC
) na 40 (miękki limit) i 50 (twardy limit).Teraz z powłoki, jeśli używasz bash, możesz użyć
ulimit
wbudowanego polecenia:Możesz ustawić limit, przekazując go jako argument:
ulimit --help
pokaże Ci, że istnieje kilka innych limitów, które możesz ustawić (jednym z nich może być maksymalna liczba deskryptorów plików używanych przez użytkownika).źródło
To zależy, czy chcesz go używać na poziomie użytkownika czy systemu. Na poziomie użytkownika
ulimit
(lub odpowiednie polecenia dla innych powłok) byłoby najłatwiejszym rozwiązaniem.Jednak na poziomie systemu istnieją mechanizmy zapobiegające zatrzymaniu systemu przez złośliwych użytkowników (lub po prostu nieużywających ulimit). Mechanizm cgroups w systemie Linux może ograniczać zasoby dla poszczególnych grup. Możesz zmusić (
pam_systemd
machanizmem), aby sesja użytkownika była w określonej grupie. Ma to inne zalety, na przykład dla harmonogramu procesora.źródło
/sys/fs/cgroup/
2. wyszukując w Google 3. przeglądającmake menuconfig
4. przeglądając/usr/src/linux/Documentation/cgroups
5. przeglądając dokumentację systemową. Przepraszam, nie mogę pomóc, ale wykorzystałem tylko te zasoby. Użyłem cgroups na pulpicie do kontrolowania zasobów.Użyj
ulimit -u
z powłoki bash, aby ustawić limit „maksymalnych procesów użytkownika”.Z powłoki C używasz
limit
polecenia.Jeśli potrzebujesz do tego wywołania systemowego, użyj
setrlimit
połączenia, aby ustawićRLIMIT_NPROC
.źródło
Ponieważ najnowsze odpowiedzi tutaj mają ponad 3 lata, chcę podkreślić, że nowsze jądra (od 4.3) mają wyraźne wsparcie, aby zapobiegać bombom widełkowym za pośrednictwem nowego „podsystemu PID”. (Zobacz https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c i https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
źródło