Systemy operacyjne komputerów przemysłowych OS Linux, część 3

Iwona Kochanska´

Katedra Systemów Sonarowych WETI PG

Listopad 2019

GUT – Intel 2015/16 1/50 Pami˛ec´ fizyczna - liniowa (“flat”)

I wszystkie procesy współdziel ˛aten sam obszar pami˛eci

I przykładowe CPU: 8086-80206, ARM Cortex-M, 8- i 16-bit PIC, AVR, wi˛ekszos´c´ systemow 8- i 16-bitowych

GUT – Intel 2015/16 2/50 Pami˛ec´ fizyczna - model x86

GUT – Intel 2015/16 3/50 Pami˛ec´ fizyczna - model x86

I Pami˛ec´ fizyczna podzielona jest na strony

I Rozmiar strony jest rózny˙ dla róznych˙ architektur. W wi˛ekszosci´ przypadków to 4096 B

I Ograniczona przenosno´ s´c´ programów C

I Trzeba znac´ (lub sprawdzac)´ całkowit ˛ailos´c´ pami˛eciRAM

I Trzeba pilnowac,´ by procesy miały osobne obszary pami˛eci

I Zle´ napisane programy mog ˛apowodowac´ awari˛ecałego systemu

GUT – Intel 2015/16 4/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a

I Mapowanie wirtualnej przestrzeni adreswej na:

I przestrzen´ pami˛ecifizycznej RAM

I urz ˛adzenia, np. PCI, GPU RAM

I Zalety:

I kazdy˙ proces moze˙ miec´ własn ˛aprzestrzen´ adresow ˛a; przestrzenie adresowe s ˛aod siebie odseparowane,

I przestrzen´ adresowa j ˛adra jest niewidoczna dla przestrzeni adresowej uzytkownika˙

I pami˛ec´ fizyczna RAM moze˙ byc´ mapowana przez wiele procesów - pami˛ec´ współdzielona (shared memory)

I obszary pami˛ecimog ˛amiec´ rózne˙ ustawienia dost˛epu(read, write, execute)

GUT – Intel 2015/16 5/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a

I Dwie przestrzenie adresowe:

I adresy fizyczne - uzywane˙ przez urz ˛adzenia (DMA, peryferia)

I adresy wirtualne - uzywane˙ przez programy (instrukcje load/store dla procesorów RISC, wszelkie instrukcje dost˛epudo pami˛eciRAM dla procesorów CISC)

I Kazdy˙ adres w pami˛eci(fizycznej lub wirtualnej) mozna˙ przedstawic´ jako wielokrotnos´c´ rozmiaru strony oraz przesuni˛ecia

I Przestrzen´ adresowa pami˛eciwirtualnej

I dla procesorów 32-bitowych: od 0 do 0xffffffff, podzielona na strony o rozmiarze 4 kB

I dla procesorów 64-bitowych: 48 bitów adresu (maks. 256 TB), po połowie dla j ˛adra i przestrzeni uzytkownika˙

GUT – Intel 2015/16 6/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a

I Przestrzen´ adresowa podzielona na:

I przestrzen´ u˙zytkownika (user space) - high memory

I i przestrzen´ j ˛adra (kernel space) - low memory

GUT – Intel 2015/16 7/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a

I Segment danych (Data) - globalne i statyczne zmienne o zdefiniowanych, niezmiennych wartosciach;´ wszelkie zmienne nie zdefiniowane wewn ˛atrzfunkcji

I Segment BSS - globalne i statyczne zmienne o wartosci´ 0 lub bez wartosci´

I Sterta (Heap) - zmienne dynamiczne - przestrzen´ zarz ˛adzana poleceniami malloc, calloc, realloc, free; obszar współdzielony przez wszystkie w ˛atki,biblioteki współdzielone, moduły

I Stos (Stack) - zmienne lokalne; jesli´ wska´znikstosu zrówna si˛e ze wska´znikiemsterty, to oznacza koniec wolnej pami˛eci.

GUT – Intel 2015/16 8/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a

I Podział mi˛edzyprzestrzen´ uzytkownika˙ a przestrzen´ jadra: parametr PAGE_OFFSET konfiguracji j ˛adra

I typowy system 32-bitowy: PAGE_OFFSET = 0xc0000000, nizsze˙ 3GB - przestrzen´ uzytkownika˙

I przestrzen´ uzytkownika˙ alokowana dla procesu

I przestrzen´ j ˛adra - wspólna dla wszystkich procesów.

GUT – Intel 2015/16 9/50 Jednostka zarz ˛adzaniapami˛eci˛a

I Unit (MMU) - zestaw układów realizuj ˛acychdost˛epdo pami˛ecifizycznej z˙ ˛adanejprzez CPU. Do ich zadan´ nalezy:˙

I translacja pami˛eciwirtualnej do pami˛ecifizycznej,

I ochrona pami˛eci,

I obsługa pami˛ecipodr˛ecznej,

I zarz ˛adzanieszynami danych

I przeł ˛aczaniebanków pami˛eci(w systemach 8-bitowych)

I Układy MMU dziel ˛aprzestrzen´ logiczn ˛a(wirtualn ˛a)pami˛ecina strony, których rozmiar wynosi 2N (kilka kilobajtów).

I Page frame number (PFN) - indeks strony pami˛eci(N starszych bitów adresu pami˛eci).Młodsze M bitów adresu (przesuni˛ecie) pozostaje niezmienione

GUT – Intel 2015/16 10/50 MMU - Translation lookaside buffer

I Translation lookaside buffer (TLB) - asocjacyjna pami˛ec´ podr˛ecznasłuz˙ ˛acado mapowania adresów wirtualnych/fizycznych

I Jezeli˙ TLB nie posiada odpowiedniego przypisania (rozmiar pami˛eciTLB jest ograniczony) uruchamiane s ˛awolniejsze, sprz˛etowe mechanizmy procesora przeszukuj ˛acestruktury danych znajduj ˛acesi˛ew pami˛eci,co wymaga niekiedy pomocy ze strony oprogramowania (systemu operacyjnego).

I Pozycje w tych strukturach nazywaj ˛asi˛ewpisami (elementami) tablicy stron pami˛eci(PTEs - ang. entries), a cała struktura nazywana jest tablic ˛astron pami˛eci(ang. page table).

I Kompletny adres w pami˛ecifizycznej jest ustalany poprzez dodanie bitów przesuni˛eciado przetłumaczonego numeru strony.

GUT – Intel 2015/16 11/50 MMU - Translation lookaside buffer

I Jezeli˙ w strukturach TLB lub PTE nie znajduje si˛eodpowiedni opis aktualnie wykorzystywanej logicznej strony pami˛ecilub znajduj ˛acysi˛ewpis zabrania dost˛epuw danym trybie, MMU sygnalizuje CPU wyj ˛atekzwi ˛azany z bł˛ednym dost˛epemdo strony pami˛eci,tzw. .

GUT – Intel 2015/16 12/50 Mapowanie pami˛eciwirtualnej

Ka˙zdastrona pami˛eciwirtualnej mo˙zebyc:´

I niemapowana (próba dost˛epu-> SIGSEGV -> komunikat segmentation fault)

I mapowana na stron˛efizyczn ˛apami˛eci prywatn ˛adla procesu

I mapowana na stron˛efizyczn ˛apami˛eci współdzielon ˛az innym procesem

I mapowana na stron˛efizyczn ˛apami˛eci u˙zywan˛aprzez j ˛adro

I j ˛adromoze˙ dodatkowo mapowac´ strony p. wirtualnej na obszary pami˛ecizarezerwowane dla np. buforów pami˛ecisterowników

GUT – Intel 2015/16 13/50 Mapowanie pami˛eciwirtualnej - COW

I mapowanie i współdzielenie z flag ˛a “copy on write”

I gdy istnieje potrzeba współdzielenia duzej˙ ilosci´ danych

I zamiast rzeczywistego, kosztownego kopiowania pami˛ecizwracany jest wska´znikdo oryginalnych danych; kopiowanie jest wykonywane dopiero, gdy zachodzi potrzeba ich modyfikacji.

I Przykład: funkcja fork()

I tworzy proces potomny, który posiada dokładn ˛akopi˛ekontekstu procesu nadrz˛ednego, jak równiez˙ kopi˛ejego pami˛eci(mapowan ˛a na t ˛asam ˛aprzestrzen´ fizyczn ˛a).

I strony pami˛eci,które mog ˛abyc´ zmodyfikowane zarówno przez proces jak i jego potomka, otrzymuj ˛aznacznik "kopiowane przy zapisie".

I gdy jeden z procesów modyfikuje pami˛ec,´ kernel przechwytuje to wywołanie i kopiuje modyfikowane strony tak, aby zmiany dokonane przez jeden proces były niewidoczne dla drugiego. Od tej chwili proces nadrz˛edny i potomny zaczynaj ˛aodwoływac´ si˛edo

GUT – Intelfizycznie 2015/16 róznych˙ stron. 14/50 Mapowanie pami˛eciwirtualnej - COW

GUT – Intel 2015/16 15/50 Zalety pami˛eciwirtualnej

I niepoprawne odwołania do pami˛eciprzechwytywane i sygnalizowane przez SIGSEGV

I proces działa we własnej przestrzeni pamieci, odizolowany od innych procesów

I efektywne wykorzystanie pami˛eci- współdzielenie cz˛esci´ kodu i danych ( np. bibliotek)

I mozliwo˙ s´c´ zwi˛ekszenia ilosci´ pami˛ecipoprzez pliki wymiany (swap files)

GUT – Intel 2015/16 16/50 Wady pami˛eciwirtualnej

I trudno ustalic,´ jakie jest aktualne zuzycie˙ pami˛eci(przez aplikacj˛e)

I “overcommit” - praktyka przedzielania pami˛eciwirtualnej bez gwarancji, ze˙ dost˛epnajest odpowiednia ilos´c´ pami˛ecifizycznej

I opó´znieniawprowadzane przez zarz ˛adzaniepami˛eci˛ai obsług˛e wyj ˛atków(page faults)

GUT – Intel 2015/16 17/50 Przestrzen´ pami˛ecij ˛adra

Przestrzen´ pamieci j ˛adra - kazdej˙ alokacji w przestrzeni wirtualnej odpowiada przestrzen´ fizyczna! Obszary:

I j ˛adro (kod i dane załadowane z obrazu j ˛adra podczas rozruchu systemu)

I segmenty: .text, .init, .data, .bss

I pami˛ec´ dla sterowników urz ˛adzen´

I moduły j ˛adra

GUT – Intel 2015/16 18/50 Przestrzen´ pami˛ecij ˛adra

I pami˛ec´ alokowana przez void * kmalloc(size_t size, int flags)

I slab allocator - efektywny mechanizm ci ˛agłej alokacji pami˛eci;

I zachowanie kmalloc zalezy˙ od parametru flags:

I GFP_KERNEL: zwykła alokacja, moze˙ zostac´ chwilowo wstrzymana (zwolniona) i ponownie zaalokowana. I GFP_ATOMIC: alokacja dokonana w całosci´ lub wcale.

I zwolnienie pami˛eci: void kfree(const void *objp);

I pami˛ec´ alokowana przez void *vmalloc(unsigned long size);

I wi˛eksze obszary pami˛eciniz˙ kmalloc() (przestrzen´ adresowa wirtualna jest ci ˛agła,ale fizyczna - niekoniecznie)

I odpowiednik malloc() w przestrzeni uzytkownika,˙

I zwolnienie pami˛eci: void vfree(const void *addr);

I Przykład programu: http://www.roman10.net/2011/07/29/linux- kernel-programmingmemory-allocation/

GUT – Intel 2015/16 19/50 Ile pami˛eciuzywa˙ j ˛adro?

I rozmiar obrazu j ˛adra

I zwykle j ˛adrojest małe w porównaniu z całkowit ˛ailosci´ ˛apami˛eci

I budowa małego j ˛adra ( Linux-tiny, Linux Kernel Tinification), projekt https://tiny.wiki.kernel.org/.

GUT – Intel 2015/16 20/50 Ile pami˛eciuzywa˙ j ˛adro?

Odczyt /proc/meminfo. Kernel memory usage to suma:

I Slab: pami˛ec´ alokowana przez slab allocator

I wi˛ecejinformacji - odczyt /proc/slabinfo

I KernelStack: przestrzen´ adresowa stosu

I PageTables: pami˛ec´ do przechowywania tablic stronicowania

I VmallocUsed: pami˛ec´ alokowana przez vmalloc()

I wi˛ecejinformacji - odczyt /proc/vmallocinfo

GUT – Intel 2015/16 21/50 Ile pami˛eciuzywa˙ j ˛adro?

GUT – Intel 2015/16 22/50 Ile pami˛eciuzywa˙ j ˛adro?

lsmod - ile pami˛ecizuzywa˙ kod i dane modułów j ˛adra?

GUT – Intel 2015/16 23/50 Obszar pami˛eciuzytkownika˙

I Stronicowanie na ˙z˛adanie(Demand-paging) - Linux mapuje strony pami˛ecifizycznej tylko wtedy, gdy program odwołuje si˛e do odpowiedniego miejsca w pami˛eciwirtualnej

malloc(3) zwraca wska´znikdo pami˛eciwirtualnej

operacja odczytu/zapisu przechwytywana przez j ˛adro

page fault

j ˛adroznajduje obszar pami˛ecifizycznej GUT – Intel 2015/16i dodaje go 24/50 do tablicy stronicowania Obszar pami˛eciuzytkownika˙

I Bł ˛adstronicowania (page fault) - gdy j ˛adroprzechwytuje dost˛epdo strony pami˛ecinie mapowanej na pami˛ec´ fizyczn ˛a

I Dwa rodzaje bł˛edówstronicowania:

I minor - rozwi ˛azaniemjest znalezienie przez j ˛adrowolnego obszaru pami˛ecifizycznej i powiazanie go z przestrzeni ˛aadresow ˛a procesu w pami˛eciwirtualnej

I major - pami˛ec´ wirtualna jest mapowana na plik (np. za pomoc ˛a (2)). Próba odczytu z takiej pami˛eci:

I j ˛adromusi znale´zc´ obszar pami˛ecifizycznej I j ˛adromusi wypełnic´ pami˛ec´ fizyczn ˛adanymi z pliku

GUT – Intel 2015/16 25/50 Mapa pami˛eciprocesu

Dost˛epdo mapy pami˛eciprocesu - przez system plików proc

I Przykład: mapa pami˛eciprocesu init (PID 1)

... I Pierwsze trzy kolumny: adres pocz ˛atkui konca´ pami˛eciwirtualnej, flagi uprawnien:´ r = read w = write x = execute s = shared p = private (copy on write) I Mapowanie pami˛ecizwi ˛azanejz plikiem: kolumna 4: przesuni˛eciewzgl˛edem pocz ˛atkupliku, kolumna 5: numer urz ˛adzenia blokowego, kolumna 6: inod pliku, kolumna 7: nazwa pliku

GUT – Intel 2015/16 26/50 Partycja wymiany (Swap)

Partycja wymiany słuzy˙ do tymczasowego przechowywania danych w sytuacji, gdy ich ilos´c´ przekracza zasoby wolnej pami˛eciRAM lub gdy z róznych˙ powodów korzystniej jest przechowywac´ je na dysku twardym

I zwi˛ekszenie efektywnego rozmiaru pami˛ecifizycznej

I koszt obsługi partycji wymiany jest duzy˙ w systemie o małej ilosci´ pami˛ecifizycznej

I mechanizm rzadko uzywany˙ w systemach wbudowanych

GUT – Intel 2015/16 27/50 Wykorzystanie partycji wymiany do kompresji pami˛eci ()

I sterownik zram tworzy urz ˛adzenia blokowe: /dev/zram0, /dev/zram1, itd.

I zawartos´c´ pami˛ecijest kompresowana przed zapisem do zram

I współczynnik kompresji: 30% - 50%

I całkowity zysk wolnej pami˛eci:10%

I koszt: kompresja (przetwarzanie), zwi˛ekszone zuzycie˙ mocy

I stosowane w niektórych urz ˛adzeniach Android

GUT – Intel 2015/16 28/50 Mapowanie pami˛eci

I Proces rozpoczyna swoje zycie˙ z pewn ˛ailosci´ ˛apami˛eci

I segment kodu programu (text)

I segment danych (data)

I biblioteki wspóldzielone

I Proces moze˙ alokowac´ dodatkow ˛apami˛ec´

I na stercie (heap), podczas działania, za pomoc ˛a malloc(3); domyslnie´ bez ograniczen´

I na stosie (stack), za pomoc ˛a alloca(3); domyslnie´ - max. 8 MB; nie zalecane. Alokacja przekraczaj ˛acalimit -> sygnał SIGSEGV

I Ładowanie bibliotek współdzielonych - dlopen(3).

GUT – Intel 2015/16 29/50 Mapowanie pami˛eci(mmap)

I Proces moze˙ tez˙ alokowac´ pami˛ec´ za pomoc ˛a mmap(2)

mapuje length bajtów pami˛eciz pliku o deskryptorze fd, pocz ˛awszy od offset w pliku i zwraca wska´znikdo obszaru pami˛eci; prot - parametr ochrony (kombinacja read, write, execute i flagi MAP_SHARED lub MAP_PRIVATE)

GUT – Intel 2015/16 30/50 Mapowanie pami˛eci(mmap)

I Alokacja pami˛eciprywatnej

I flaga MAP_ANONYMOUS i fd = -1.

I malloc(3) w glibc alokuje pami˛ec´ do 128kB, potem woła mmap

I Alokacja pami˛eciwspółdzielonej

I flaga MAP_SHARED i fd = shm_open()

shm_open(3) - create POSIX shared memory objects

GUT – Intel 2015/16 31/50 Mapowanie pami˛eci(mmap)

I Alokacja pami˛eciurz ˛adzenia

I dokładna implementacja - zalezna˙ od sterownika

I Przykład: Linux frame buffer, /dev/fb0. Interfejs zdefiniowany w /usr/include/linux/fb.h, funkcja ioctl zwraca rozmiar ekranu i liczb˛ebitów na pixel mmap - prosba´ do sterownika wideo o udost˛epnieniebufora ramek dla aplikacji do odczytu/zapisu

I Przykład: interfejs strumieniowy wideo, V4L2 (/usr/include/linux/videodev2.h)

GUT – Intel 2015/16 32/50 Ile pami˛eciuzywa˙ aplikacja?

I polecenie free - ile wolnej pami˛eciwidzi j ˛adro

I j ˛adrowykorzystuje woln ˛apami˛ec´ na bufory i cache-e, które mog ˛abyc´ zwolnione/skompresowane w kazdej˙ chwili

GUT – Intel 2015/16 33/50 Ile pami˛eciuzywa˙ aplikacja?

I Wymuszenie zwolnienia cache-ów: echo 3 > /proc/sys/vm/drop_caches Numer 3 (lub 1 lub 2) - maska bitowa:

GUT – Intel 2015/16 34/50 Ile pami˛eciuzywa˙ aplikacja?

Dwie metryki ilosci´ pami˛eciuzywanej˙ przez proces

I Vss (virtual set size) - nazywana VSZ w komendzie ps i VIRT w top

I całkowita ilos´c´ pami˛ecimapowanej przez proces (suma obszarów pokazanych w /proc//maps)

I Rss (resident memory size) - nazywana RSS w ps i RES w top

I całkowita ilos´c´ pami˛ecimapowanej na pami˛ec´ fizyczn ˛a

I wartos´c´ wi˛ekszaod rzeczywistej pami˛ecifizycznej zuzywanej˙ przez proces - obszary współdzielone policzone wielokrotnie!

GUT – Intel 2015/16 35/50 Komenda ps

I Komendy top i ps z BusyBox - ograniczona ilos´c´ informacji

I Pakiet procps - pełne wersje top i ps

I Komenda ps - pokazuje VSZ i RSS

GUT – Intel 2015/16 36/50 Komenda top

I top - podsumowanie pami˛eciwolnej i zuzywanej˙ przez procesy

Jesli Rss procesu ci ˛aglerosnie´ -> przeciek pami˛eci()!

GUT – Intel 2015/16 37/50 Narz˛edziesmem

Rok 2009 - dwie nowe metryki

I Uss (unique set size) - ilos´c´ pami˛ecizwi ˛azanejz pami˛eci˛a fizyczn ˛a,unikalna dla procesu; ilos´c´ pami˛eci,ktora si˛ezwolni po zakonczeniu´ działania procesu

I Pss (propotional set size) - dzieli sum˛eobszarów pami˛eci współdzielonej, zwi ˛azanych z pami˛eci˛afizyczn ˛a,na liczb˛e procesów mapuj ˛acychte obszary;

GUT – Intel 2015/16 38/50 Narz˛edziesmem

Informacja dost˛epnaw /proc//smaps

GUT – Intel 2015/16 39/50 Narz˛edziesmem

smem - narz˛edziezbieraj ˛acedane z plików smaps

I Strona projektu: https://www.selenic.com/smem.

I Napisane w Python-ie, instalacja w systemie wbudowanym wymaga obecnosci´ srodowiska´ Python, co moze˙ byc´ problemem smemcap - program zbieraj ˛acyinformacje z plików smaps i zapisuj ˛acyje w formie archiwum TAR, które mog ˛abyc´ nast˛epnie analizowane na komputerze hosta

GUT – Intel 2015/16 40/50 Narz˛edziesmem

GUT – Intel 2015/16 41/50 Narz˛edziesmem

GUT – Intel 2015/16 42/50 Narz˛edziesmem

GUT – Intel 2015/16 43/50 Wykrywanie przecieków pami˛eci

I Przeciek pami˛eci (memory leak) - pami˛ec´ jest alokowana, ale nie jest zwalniana, kiedy przestaje byc´ uzywana˙

I W systemach wbudowanych:

I urz ˛adzenia maj ˛amało pami˛eci

I urz ˛adzenia działaj ˛adługo bez ponownego uruchomienia

I Narz˛edziado wykrywania przecieków: mtrace i Valgrind.

GUT – Intel 2015/16 44/50 Wykrywanie przecieków pami˛eci- mtrace

I mtrace - komponent glibc sledz´ ˛acywywołania malloc(3), free(3) i pokrewnych funkcji

Wywołanie mtrace() w programie - Runtime: przypisanie log-a do zmiennej rozpocz˛ecie sledzenia´ (mtrace-example.c) srodowiskowej´ MALLOC_TRACE

I komenda mtrace do odczytu log-a I informacja o przecieku - po zakonczeniu´ programu

GUT – Intel 2015/16 45/50 Wykrywanie przecieków pami˛eci- Valgrind

I Valgrind - narz˛edziedo identyfikacji problemów z pami˛eci˛a

I nie trzeba re-kompilowac´ sprawdzanych programu i bibliotek, ale warto kompilowac´ z opcj ˛a-g (symbole debuggera)

I uruchamia program w srodowisku´ emulowanym

I wada: program działa z obnizon˙ ˛awydajnosci´ ˛a(słaba mozliwo˙ s´c´ testowania programów działaj ˛acychw czasie rzeczywistym)

GUT – Intel 2015/16 46/50 Wykrywanie przecieków pami˛eci- Valgrind

I Narz˛edziadiagnostyczne Valgrind:

I memcheck: domyslne´ narz˛edzie, wykrywa przecieki pami˛eci

I cachegrind: zwraca liczb˛eodwołan´ do pami˛ecicache procesora (cache hit rate)

I callgrind: zwraca koszt wywołan´ funkcji

I helgrind: wskazuje na niepoprawne uzycie˙ Pthread API, potencjalne zakleszczenia, wyst ˛apieniawyscigu´

I DRD: inne narz˛edzieanalizy uzycia˙ Pthread API

I massif: uzycie˙ stosu i sterty

I Wybór narz˛edzia:opcja -tool

I Dost˛epnejako pakiet zarówno dla Yocto Project jak i Buildroot

GUT – Intel 2015/16 47/50 Wykrywanie przecieków pami˛eci- Valgrind

Wykrywanie przecieków - narz˛edzie memcheck z opcj ˛a –leakcheck=full (drukuje linie gdzie wykryto przeciek)

GUT – Intel 2015/16 48/50 Brak pami˛eci

I Standardowy mechanizm alokacji pami˛ecito “over-commit” - j ˛adropozwala na alokacj˛epami˛ecidla aplikacji bez sprawdzania, czy dost˛epnajest pami˛ec´ fizyczna

I Out of Memory (OOM): gdy cała pami˛ec´ wirtualna została przydzielona.

I System operacyjny próbuje odzyskac´ pami˛ec´ i wyjs´c´ ze stanu OOM wywołuj ˛acnisokopriorytetowy proces OOM Killer (zabija procesy, az˙ problem zniknie).

I Działaj ˛aceprocesy, które napotykaj ˛ana stan OOM próbuj ˛ac zarezerwowac´ pami˛ec´ za pomoc ˛amalloc(), napotykaj ˛abł ˛ad. Dobrze napisane programy powinny byc´ przygotowane na tak ˛a sytuacj˛e.

I Oblicza “badness score” pomi˛edzy0 i 1,000 dla kazdego˙ procesu i zamyka ten z najwyzszym˙ wynikiem

GUT – Intel 2015/16 49/50 Brak pami˛eci

Zmiana parametru sposobu alokacji pami˛eciprzez j ˛adro: /proc/sys/vm/overcommit_memory:

I Option 0: heuristic over-commit (default)

I Option 1 (always over-commit, never check)

I przydatne tylko gdy program pracuje z duzymi,˙ rzadkimi tablicami i alokuje duze˙ obszary pami˛eci,ale zapisuje tylko mał ˛acz˛es´c´ tego obszaru

I rzadko spotykane w systemach wbudowanych

I Option 2 (always check, never over-commit)

I systemy czasu rzeczywistego, aplikacje “safety-critical”

I nie udaje si˛ealokacja obszaru wi˛ekszego niz˙ dopuszczalny limit, który wynosi: limit = sizeof(swap)+(total memory)*over-commit ratio

I over-commit ratio jest kontrolowane przez /proc/sys/vm/overcommit_ratio (domyslnie´ 50%) GUT – Intel 2015/16 50/50