Свой менеджер памяти linux

Process Memory Management in Linux

Process memory management is a crucial aspect of any operating system. In Linux, memory management system is designed to efficiently manage memory usage, allowing processes to access and use memory they require while preventing them from accessing memory they do not own. In this article, we will discuss process memory management in Linux in detail, covering various aspects such as memory allocation, virtual memory, memory mapping, and more.

Memory Allocation

Memory allocation is process of assigning memory to a process or program. In Linux, kernel provides two main methods for memory allocation: static and dynamic.

Static Memory Allocation

Static memory allocation is done at compile-time, where memory allocation for a program is fixed and cannot be changed during runtime. memory is allocated in program’s data section or stack segment. data section contains global variables and static variables, while stack segment contains local variables.

Dynamic Memory Allocation

Dynamic memory allocation is done during runtime, where memory allocation for a program can be dynamically adjusted based on program’s requirements. kernel provides various system calls such as malloc(), calloc(), and realloc() to dynamically allocate memory. These functions allocate memory from heap segment of program’s address space.

Virtual Memory

Virtual memory is a memory management technique that allows a program to use more memory than is physically available in system. In Linux, virtual memory is implemented using a combination of hardware and software. hardware component is Memory Management Unit (MMU), which is responsible for translating virtual memory addresses to physical memory addresses. software component is kernel’s Virtual Memory Manager (VMM), which manages allocation and deallocation of virtual memory.

Memory Mapping

Memory mapping is a technique that allows a process to access a file’s contents as if it were part of process’s memory. In Linux, memory mapping is implemented using mmap() system call. mmap() system call maps a file into a process’s virtual memory address space, allowing process to read and write to file’s contents as if it were part of its own memory. Memory mapping is commonly used in applications such as databases and multimedia players, where large files need to be accessed efficiently.

Shared Memory

Shared memory is a technique that allows multiple processes to access same portion of memory. In Linux, shared memory is implemented using shmget(), shmat(), and shmdt() system calls. shmget() system call creates a shared memory segment, shmat() attaches shared memory segment to a process’s address space, and shmdt() detaches shared memory segment from process’s address space. Shared memory is commonly used in inter-process communication, where multiple processes need to share data efficiently.

Swapping

Swapping is a technique that allows kernel to move pages of memory from RAM to a swap space on disk when system’s memory is low. In Linux, swapping is implemented using a combination of hardware and software. hardware component is disk, which is used as swap space. software component is kernel’s Swapping Manager, which manages swapping process. When system’s memory is low, Swapping Manager selects pages of memory to swap out to disk, freeing up memory for other processes.

Читайте также:  Cpu x linux установка

Some additional concepts to consider include −

Kernel Memory Management

The Linux kernel itself also requires memory management, and it uses a separate set of memory management techniques to manage kernel memory. Kernel memory is used to store data structures and code required by kernel to operate. kernel uses techniques like memory mapping, page caching, and memory allocation to manage kernel memory.

Memory Protection

Memory protection is another critical aspect of memory management in Linux. Memory protection techniques prevent processes from accessing memory they are not authorized to access. MMU implements memory protection by using page tables, which map virtual memory addresses to physical memory addresses and track permissions for each memory page.

Memory Fragmentation

Memory fragmentation occurs when available memory is divided into small, non-contiguous chunks, making it difficult to allocate larger blocks of memory. Memory fragmentation can lead to performance issues and even crashes if system runs out of memory. Linux kernel uses several techniques to manage memory fragmentation, including memory compaction and defragmentation.

Memory Leak Detection

As mentioned earlier, failing to release dynamically allocated memory can result in memory leaks, where memory is not returned to system and can eventually cause program to crash due to insufficient memory. Detecting and fixing memory leaks is crucial for maintaining system stability and performance. Linux provides several tools for detecting memory leaks, including valgrind, which can detect memory leaks and other memory-related issues.

Conclusion

In conclusion, process memory management is a crucial aspect of any operating system, and Linux is no exception. Linux kernel provides a robust and efficient memory management system, allowing processes to access and use memory they require while preventing them from accessing memory they do not own. In this article, we discussed various aspects of process memory management in Linux, including memory allocation, virtual memory, memory mapping, shared memory, and swapping. Understanding these concepts is essential for any Linux developer or administrator to efficiently manage memory usage in their systems.

Источник

Собственный менеджер памяти

Предлагаю провести небольшой мозговой штурм, дело в том, что мне необходимо реализовать для своей «ос» менеджер памяти. В идеале необходим интерфейс аля alloc, free. В моей ос уже реализован механизм виртуальных адресов (по 4кб страница), но я что то не могу определиться с тем, как этот менеджер организовать. Точнее сказать, нужно понять каким способом мне описать свободную «кучу», как из нее доставать свободные страницы, и, самое главное, как привести к минимуму фрагментацию памяти (видимо при освобождении памяти надо еще дефрагментировать «висячие» участки). Может кто подскажет или ткнет носом куда нужно.

Для начала определись с назначением твоей «ос» и посмотри на список фич/код тех же talloc/hoard/прочих (что там было в хромиумах?)

Можно почитать про SLAB и SLUB линуксовые, они по-моему и в википедии неплохо описаны.

Кстати, SMP уже сделали? А собираетесь? (От этого зависит наличие целого класса внутриядерных проблем).

2.3.5 Списки и "сборка мусора" 2.4 МНОГОСВЯЗНЫЕ СТРУКТУРЫ 2.5 ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ 

можно подробнее. О каких конкретно проблемах идет речь. SMP не делал, планирую только начать изучать этот вопрос

Читайте также:  Remote connect windows to linux

Вот почему то именно этот ресурс я упустил, хотя знаю, что там можно все найти. Спасибо за ссылку

Всем спасибо, решил делать по мануалу из osdev, там все понятно и доступно написано. использую linked_list

sudo cast energyclab

Кнут кусок говна — его говна нет ни в одной вменяемо рабочей стуктуре данных и аллокаторах. Это бездарный кусок говна.

Если ты хочешь по спорить — давай поспорим — выкатывай свой аллокатор, а я выкачу свой. Твой по главам кнута, мой по главам скилла. Когда ты будешь обоссан — ты больше никогда не будешь упоминать это убожество в разделе девелопмент, особенно рядом с ОС и её ведром.

Почитал я твоё 2.5 — это убожество, мало того, что это животное ничего не знает о вмеме — он ничего не знает о треадсейфе, нитях, да и вообще о свойвства текущего железа. Никогда в ведре НЕ БУДЕТ аллокатора на брёвнах и линкедлистах — это то же убожество, что описанно в ссылке выше.

И я очень рад, как я не раз тебе говорил, что есть на этом свете люди, а не жалкие животные типа тебя, благодаря которым мы имеем хоть что-то, что не тормазит как говно.

В этом мире есть только пуллы — запомни это, и прямая индексация. Это основа всех вменяемых аллокторов, системы страничтной адресации, на которой строится текушая модель вмема.

Аллокатор в глибц сделан на идеях кнута, только вот его даже жалкая жаба обоссывает. Но тут емулек-идиот советует пацану засунуть это говно в ведро — инфа сотка, что пацана ждёт явный успех.

Ах да ещё одно, там темку почистили — но погугли пожалуйста животное про то, почему на ссд есть 2-хки — это линейная скорость r/w и рандомные иопсы, подумай, почему рандомное io сливает лейному раз в 5 на топвых лоулатенси ссд, подумай причем тут префетч, а потом уже начни понимать — какое же гвоно ты несёшь.

Кому ты говоришь спасибо? Мне вот инетересно, почему ты решил делать по мануалу на ОСдеве от бездарей, которые к ОСдеву отношения не имеют, но на реальные вещи, которые используются в реальных ОС — ты клал? Тебе уже упоминали про слаб? Почему ты не почитал, неподумал почему ни в одной вменяемой ОС нет аллокатора на линкедлистах?

Как напишешь — отпишись сдесь. Посмотрим на твой аллокатор, а потом посмотрим на то, как это делают норм пацаны. Возможно ты прозреешь.

Лучше, наверное, кроме той статьи почитать ещё эту http://wiki.osdev.org/Page_Frame_Allocation (вот ещё есть, не знаю, насколько протухшее, про Linux https://www.kernel.org/doc/gorman/html/understand/understand009.html ), потому что чаще всего ядро всё-таки выделяет юзерспейсу только целые страницы, а куча со списками и прочим уже его проблема. А для внутриядерной динамической памяти лучше, наверное, SLAB/SLUB, про который выше писали.

1) интерфейс ос — это только выделение страниц виртуальной памяти, типа там brk-sbrk

Анон, ты пишешь хорошие, годные мысли, но их подача в духе «жрите быдло что я даю» неприемлема. Ты так самоутверждаешься, пар выпускаешь или ищешь дешёвой популярности? Мы будем тереть те посты что не отвечают формату сайта.

Кстати, какой у тебя был ник?

Не припомню такого. Можно ссылку на аккаунт?

У меня «норм» падача, просто меня бомбит от того, что люди нихрена не хотят слушать. Я отношусь к людям очень хорошо и стараюсь говорить так, чтобы до них дошло, даже если прийдётся орать «кнут — животное», чтоб хотябы на багете пронять.

Читайте также:  Jmeter запуск на linux

В этой теме я сначала написал норм коммент — т.е. там небыло «Жритебыдло» и прочее, а потом меня бомбануло от емулека — я выкатил тот каммент, что выше и все мои комменты потёрли(т.е. там где я рассказывал про оверкоммит(ниодного плохого слова в том комменте небыло), коммент в этом треде, где тоже ниодного плохого слова небыло). От этого у меня ещё больше бомбануло ну и пошло-поехало.

Вот тот же емулек — ему похрен что он несёт, ибо он балаболит ради балабльства( а таких тут 90%). Как мне с ним нормально говорить? Как мне отвечать людям, которые тыкают кнутом? Естественно у меня уже алергия на кнута, причем его адепты ничего не воспринимают.

Я не хочу, чтобы пацан слил полжизни на запил вменяемого аллокатора на линкедлистах, а потом плюнул на это дело и ушел в жабисты, причем правильно сделалает, ибо с кнутом в лоулевел делать нечего, а ничего другого пацан из этой темы так бы и не вынес.

Он уже отметил её как решенную, а если бы мой коммент не потёрли возможно мы бы с ним поговорили, а потом подключились пацаны, которые знают чуть больше, чем притивщину кнута.

Вначале в тему набегают нули с кнутами — их мильёны, а когда уже ТС уйдёт пилить по кнуту приходят норм пацаны, но пациент уже потерян и тему не читает.

Ты так самоутверждаешься, пар выпускаешь или ищешь дешёвой популярности?

Как я могу таким образом сомоутвердиться? Пар мне тоже выпускать не надо — мне абсалютно пофиг на этот мир и на то, что с ним станется. Дешевая популярность просто нереальна с моим подходом — это скорее антипопулярность.

Если бы я хотел дешевой популярности — я бы наобород боготворил то, что принято в мейнстриме. Это как в секте, если я прийду в секту кнутиансво(80%+ программистов) и скажу: «кнут идиот» — какую популярность я получу? Никакую. Если же я буду молиться на идола-кнута, то да — я получу популярность, да и других идолов из бородатых годов.

Мы будем тереть те посты что не отвечают формату сайта.

Я уже не раз говорил — это тупиковый подход. Этот раздел чисто девелопменский и основа его — скилл. Тут должно быть без разницы кто я, что я, как я говорю и прочее — это лишь хорошее дополнение.

Мне не нужна вежливость, мне не нужна сохранность моего попца от багета — это раздел, где я могу встретиться с пацанами и чему-то научиться, о чем-то поговорить. Притворная лесть, вежливость, «защита чувст верующих в кнута» и прочего тут не должно быть. С таким подходом лор превратится в хабр, либо любой другой жалкий девелопнет-ресурс, а я этого не хочу.

Если человек хоть что-то понимает — мне похрен как он говорил, правильно/нет и прочее. Так и должно быть в любом техразделе. Лучше пусть будет тотальный неадекват, чем тотальный анскилл. А формат и адекват — это уже вторичное и наживное.

superhackkiller1997, procoder99, osh5pntp8 в простонародье просто Царь(сишки).

Источник

Оцените статью
Adblock
detector