Felosztása hatalmas mennyiségű memóriát

Felosztása hatalmas mennyiségű memóriát

A negyedik kiadás a népszerű útmutatóban a programozás alapjaival a Linux operációs rendszer. Figyelembe venni: a C / C ++ könyvtár és stan-dard fejlesztési eszközök Szervezet rendszer hívás, a fájl I / O, mivel a kölcsönhatási folyamatok, a programozása kagylószerű elem, grafikus felhasználói felületek készítéséhez az eszközöket GTK + vagy a Qt, a használata aljzatok, stb leírt összeállítása. programok, őket összekötő c könyvtárak és együttműködik a terminális I / O Vannak technikák pályázatkészítés környezetben GNOME® és KDE®, adattárolás adatbázisok felhasználásával MySQL® hibakeresés és programokat. A könyv jól strukturált, ami a tanulás egyszerű és gyors.

A kezdő Linux-programozók

Könyv: Linux programozás alapjai

Felosztása hatalmas mennyiségű memóriát

Szakaszok ezen az oldalon:

Felosztása hatalmas mennyiségű memóriát

Most, amikor látta, hogy a Linux operációs rendszer kiküszöböli a korlátozások a memória modellje OS MS-DOS, csináljunk vele feladat. 7.2 Az adatok a gyakorlat program kéri a elosztását memória, több mint fizikailag ott az autó, így feltételezhető, hogy a malloc függvény kezd nem, amikor közeledik a maximális fizikai memóriát, mert a kernel és az összes többi futó folyamatok is szükség van a memória.

Feladat 7.2. Request minden fizikai memória

A memory2.s programot fogunk kérni több memóriát fizikailag ott a kocsiban. Meg kell állítani a meghatározását PHY_MEM_MEGS összhangban fizikai erőforrások számítógép.

#include
#include
#include
#define A_MEGABYTE (1024 * 1024)
#define PHY_MEM_MEGS 1024 / * A szám
megfelelően * /
int main () char * some_memory;
size_t size_to_allocate = A_MEGABYTE;
int megs_obtained = 0;
while (megs_obtained <(PHY_MEM_MEGS * 2)) some_memory = (char *)malloc(size_to_allocate);
if (some_memory = NULL!) megs_obtained ++;
sprintf (somememory, "Hello World");
printf ( "% s - most kiosztott Megabytesn.", some_memory, megs_obtained);
> Else exit (EXIT_FAILURE);
>
>
exit (EXIT_SUCCESS);
>

Az alábbi, kissé rövidített következtetés:

$ ./memory3
Hello World - most kiosztott 1 megabájt
Hello World - most kiosztott 2 megabyte
.
Hello World - most kiosztott 2047 MB
Hello World - most kiosztott 2048 MB

Egy másik érdekes tulajdonsága, hogy legalább ezen a gépen fut a program, nincs idő. Így nem csak mi nem kétséges használni az összes memóriát, de tette nagyon gyorsan.

Mi továbbra is tanulni és látni, hogy mennyi helyet tudunk kiosztani a gép használata memory3.c programot (Exercise 7,3). Mivel ez már világos, hogy a Linux rendszer képes ügyesen kezelni memóriával kéréseket, minden alkalommal, akkor a memóriát és 1 KB és írni az adatokat az egyes blokkokban érkezett hozzánk.

Feladat 7.3. rendelkezésre álló memória

A következő a memory3.c programot. Jellegéből adódóan rendkívül barátságtalan a felhasználó és komolyan befolyásolja a megosztott gépen. Ha aggasztja ezt a kockázatot, akkor jobb, ha nem fut ez; ha talál magának a E program végrehajtásának, az asszimiláció az anyag nem fog fájni.

#include
#include
#include
#define ONE_K (1024)
int main () char * some_memory;
int size_to_allocate = ONE_K;
int megs_obtained = 0;
int ks_obtained = 0;
míg a (1) az (ks_obtained = 0; ks_obtained <1024; ks_obtained++) some_memory = (char *)malloc(size_to_allocate);
if (some_memory == NULL) exit (EXIT_FAILURE);
sprintf (some_memory, "Hello World");
>
megs_obtained ++;
printf ( "Most kiosztott Megabytesn." megs_obtained);
>
exit (EXIT_SUCCESS);
>

Ebben az időben, a kimenet is lerövidül, az alábbiak szerint:

$ ./memory3
Most kiosztott 1 megabájt
.
Most kiosztott 1535 megabájt
Most kiosztott 1536 megabájt
Out of Memory: Killed folyamat 2365
elesett

A lefoglalt memória kérelem által kezelt kernel Linux. Minden alkalommal, amikor egy program kéri a memória és próbál memorizálni, vagy olvassa el a memóriából, hogy kiosztásra került, a Linux kernel úgy dönt, hogyan kell kezelni a kérést.

Először is, a kernel használja a szabad fizikai memória, hogy megfeleljen az alkalmazás memória kiosztás kérelmet, de ha a fizikai memória kimerült, a kernel elkezdi használni az úgynevezett swap-terület vagy csere. A Linux, ez egy külön terület a lemez, megjelent a rendszer telepítése során. Ha ismeri a Microsoft Windows, a művelet a swap terület a Linux egy kicsit emlékeztet a lapozófájl Windows. De ellentétben a Windows operációs rendszer írásakor kód nem kell aggódnia a helyi vagy globális halom (heap), vagy körülbelül lapozható szegmensek - Linux kernel szervezni mindent elvégez.

A kernel mozog adatok és kód közötti fizikai memória és a swap hely, hogy minden olvasás a memóriából vagy írására bele tűnik található a fizikai memória, nem számít, hol vannak valójában előtt a kísérlet a kapcsolatot velük.

Ennek eredményeként, amikor az alkalmazás memóriája megtelik, és a fizikai és a swap területet, vagy ha a mérete meghaladja a verem, a kernel nem fogja végrehajtani a kérelem újbóli felosztását, akkor a teljes program és távolítható el.

megjegyzés

Ez a viselkedés kíséri a pusztítás folyamata eltér a viselkedése régebbi verziói Linux és sok más UNIX változatok, amelyek éppen befejezett vészleállító funkció malloc. Ezt nevezik a pusztítás miatt kevés a memória (out of memory (OOM) killer), és bár úgy tűnik, túl radikális, sőt, egy ésszerű kompromisszum a gyors és hatékony elosztást, illetve annak szükségességét, hogy megvédjék magukat a sejtmagba a teljes kimerültség források, ez egy komoly probléma.

Vajon ez a látszólag korlátlan forrás memória követi a megszakítás és a pusztítás folyamat eredményeként ellenőrzése, a visszatérő malloc függvény. nincs értelme? Természetesen nem. Az egyik leggyakoribb probléma a programokban C-ben írt, a dinamikus memória, - a felvétel kívül kijelölt blokk. Amikor ez történik, a program nem hajtható végre azonnal, de akkor valószínűleg átírni néhány belső által használt adatok malloc könyvtári rutinok.

A szokásos eredmény - megszakítja következő hívás malloc nem hiánya miatt a memória, hanem azért, mert a kár, hogy a memória struktúrákat. Ezek a problémák nehezen lehet lenyomozni, és minél hamarabb hibát észlel a program, annál nagyobb az esély, hogy megtalálják az okát. A 10. fejezet, hibakeresés és optimalizálás, megbeszéljük néhány eszközt, amelyek segítségével azonosítja az emlékezet.

Kapcsolódó cikkek