ПредишенСледващото

Разпределение на огромни количества памет

В четвъртото издание на популярния ръководството са основите на програмирането в операционната система Linux. Отчетено използване C / C ++ библиотека и инструменти за развитие стан-дарт организация система повикване, файл I / O, процесите на взаимодействие, програмирането на черупката средства, създаване на графични потребителски интерфейси с GTK на инструменти + или QT интервала, използването на контакти и т.н., описани компилация. програми, свързването им в библиотеките и работа с терминала I / O. Има техники за приложения за писане в среди GNOME® и KDE®, за съхранение на данни с използване на бази данни MySQL® и отстраняване на грешки програми. Книгата е добре структурирана, което прави ученето лесно и бързо.

За начинаещите Linux-програмисти

Книга: Linux програмиране Основи

Разпределение на огромни количества памет

Раздели на тази страница:

Разпределение на огромни количества памет

Сега, когато видя, че операционната система Linux преодолява ограниченията на модела на паметта на OS MS-DOS, нека да я направи задача. 7.2 Информацията в програмата за упражнение изисква разпределението на паметта, толкова повече, отколкото физически там в колата, така че можем да предположим, че функцията изчистване започва да се проваля при приближаване на максималния размер на физическата памет, тъй като ядрото и всички други активни процеси, също се нуждаят от памет.

Упражнение 7.2. Заявка за всички физическа памет

С програма memory2.s ние ще поискаме повече памет, отколкото е физически там в колата. Трябва да се коригира определението за PHY_MEM_MEGS в съответствие с физическите ресурси на компютъра си.

#include
#include
#include
# определят A_MEGABYTE (1024 * 1024)
#define PHY_MEM_MEGS 1024 / * Регулиране на този номер
правилно * /
Int основни () знак * some_memory;
size_t size_to_allocate = A_MEGABYTE;
Int megs_obtained = 0;
докато (megs_obtained <(PHY_MEM_MEGS * 2)) some_memory = (char *)malloc(size_to_allocate);
ако megs_obtained ++ (some_memory = NULL!);
sprintf (somememory, "Hello World");
ФОРМАТ ( "% S - понастоящем се разпределя Megabytesn.", some_memory, megs_obtained);
> Друго изход (EXIT_FAILURE);
>
>
изход (EXIT_SUCCESS);
>

По-долу е малко съкратен заключение:

$ ./memory3
Hello World - понастоящем се разпределя 1 мегабайта
Hello World - понастоящем се разпределя 2 мегабайта
.
Hello World - сега разпределени в 2047 мегабайта
Hello World - сега разпределени в 2048 мегабайта

Друга интересна особеност е, че най-малко на тази машина се изпълнява програмата за нула време. По този начин, не само, че няма съмнение, използва цялата памет, но го е направил наистина бързо.

Ние ще продължим да учат и да видим колко място можем да отпусне на тази машина, използвайки memory3.c програма (Упражнение 7.3). Тъй като вече е ясно, че системата Linux е в състояние да управлява умело с искания за памет, всеки път, когато ние ще разпредели памет до 1 KB и писане на данни във всеки блок, получен от нас.

Упражнение 7.3. наличната памет

По-долу е memory3.c програма. По своята същност това е изключително вреден за потребителя и може сериозно да се отрази на споделеното машината. Ако сте загрижени за този риск, е по-добре да не го пуснете; ако попаднете върху изпълнението на тази програма, за усвояването на учебния материал няма да боли.

#include
#include
#include
# определят ONE_K (1024)
Int основни () знак * some_memory;
Int size_to_allocate = ONE_K;
Int megs_obtained = 0;
Int ks_obtained = 0;
докато (1) за (ks_obtained = 0; ks_obtained <1024; ks_obtained++) some_memory = (char *)malloc(size_to_allocate);
ако (some_memory == NULL) изход (EXIT_FAILURE);
sprintf (some_memory, "Hello World");
>
megs_obtained ++;
ФОРМАТ ( "Сега разпределени Megabytesn.", megs_obtained);
>
изход (EXIT_SUCCESS);
>

По това време, на изхода също е съкратен, както следва:

$ ./memory3
Сега отпуснати 1 мегабайта
.
Сега разпределени 1535 мегабайта
Сега разпределени 1536 мегабайта
Няма памет: Убит процес 2365
Убит

Споменът е отпусната на дадено заявление, управляван от ядрото на Linux. Всеки път, когато дадена програма пита за памет, опитвайки се да запомните или чете от паметта, която е била разпределена, Linux ядрото решава как да се справят с искането.

На първо място, ядрото може да използва свободно физическа памет, за да се срещне искане за отпускане на средства за памет за приложения, но когато физическата памет се изчерпи, ядрото започва да се използва така наречения суап област или суап. В Linux, това е отделна зона на диска, издаден по време на инсталацията на системата. Ако сте запознати с Microsoft Windows, работата на суап пространството в Linux е малко напомня на файла за виртуална памет в Windows. Но за разлика от Windows OS, когато пишете код не е необходимо да се притеснявате за местните или на световната купа (купчина), или около повиканата сегменти - Linux ядрото организира всичко за вас.

Данните от ядрото се движи и кода между физическата памет и суап пространството, така че при всяко четене от паметта или запис на данни в нея изглежда се намира в физическа памет, без значение къде са те в действителност пред Вашия опит да се свържат с тях.

В резултат на това, когато приложението остане без свободна памет и физически и суап пространство или когато тя надвишава максималния размер на стека ядрото ще се откаже да изпълни искане за допълнително разпределение, може да завърши програмата и да я разтоварят.

забележка

Това поведение е придружено от процеса на унищожаване е различно от поведението на стари версии на Linux и много други варианти на UNIX, които току-що завършили аварийна функция изчистване. Тя се нарича унищожаването поради липса на памет (недостиг на памет (OOM) убиец), и въпреки че тя може да изглежда твърде радикална, всъщност, е един разумен компромис между бърз и ефективен процес на разпределение и необходимостта да се защитят ядрото на пълното изчерпване на ресурсите, Това е сериозен проблем.

Означава ли това, очевидно неограничен източник на памет, последван от процеса на прекъсване и унищожаване, в резултат на проверка, функцията за връщане изчистване. то няма смисъл? Разбира се, не. Един от най-често срещаните проблеми в програми, написани на C, като се използва динамична памет, - записване извън разпределени блок. Когато това се случи, програмата не може да бъде завършена веднага, но най-вероятно ще пренапише някои вътрешни данни, използвани от изчистване на библиотеката съчетания.

Обичайната резултат - прекратява следващи покани за изчистване не са поради липса на памет, но поради увреждане на структурите на паметта. Тези проблеми могат да бъдат трудни за проследяване надолу, и колкото по-рано се открие грешка в програмите, толкова повече шансове за намиране на причината. В глава 10 на отстраняване на грешки и оптимизация, ние ще обсъдим някои от инструментите, които могат да ви помогнат да видите какви проблеми с паметта.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!