Адресное пространство процесса (память процесса)
Когда программа запускается на выполнение, ядро выделяет для нее место в оперативной памяти.
Память запущенной программы (процесса) разделена на ряд непрерывных секций. Команды из секций выполняются последовательно. При развертывании программы секции разделяются и каждая готова для работы.
Некоторые секции уже известны перед запуском процесса
В этой секции хранится код программы, машинные инструкции (исполняемый код), сюда нельзя ничего записывать. Эта секция существует в read-only чтобы предотвратить несанкционированное изменение кода программы.
изначально эта секция пуста, и существует на чтение/запись.
Аргументы командной строки и переменных окружения. Это могут быть
Программист, когда использует в программе указатели, использует память процесса (адресное пространство) и работает только с ней! Указатели = работа с адресным пространством процесса (логические адреса).
#memory #theory
Когда программа запускается на выполнение, ядро выделяет для нее место в оперативной памяти.
Память запущенной программы (процесса) разделена на ряд непрерывных секций. Команды из секций выполняются последовательно. При развертывании программы секции разделяются и каждая готова для работы.
Некоторые секции уже известны перед запуском процесса
.text, .data, .bss. Их можно посмотреть после компиляции:$ size ./a.out
.text еще может называться code space..data может называться data space..text (младшие адреса 0x0)В этой секции хранится код программы, машинные инструкции (исполняемый код), сюда нельзя ничего записывать. Эта секция существует в read-only чтобы предотвратить несанкционированное изменение кода программы.
.data
Хранятся глобальные, статические переменные, которые определены, например:int i = 2;
char name[20];
изначально эта секция пуста, и существует на чтение/запись.
.bss
Хранятся глобальные, статические переменные, которые НЕ определены, например:int i;
int x;
.heap
Динамическая аллокация памяти (для долгоживущих объектов). Она аллоцируется, когда процесс стартует, и не привязана ни какому файлу (месту на диске), а .text, .data, .bss можно увидеть в /proc/$(pidof a.out)/maps файле..stack
Может расширяться и сжиматься по мере вызова функций (frames). Содержит аргументы функций, локальные переменные функций (короткоживущие объекты). Вызов функции приводит к помещению в стек (создание кадра), когда функция возвращает управление, кадр уничтожается. Размер у стека фиксированный (8 MiB)..env (0xfffffff...)Аргументы командной строки и переменных окружения. Это могут быть
argc, argv, envp (переменные окружения)..debug
Ключ -g при компиляции, добавляется отладочная информация.Программист, когда использует в программе указатели, использует память процесса (адресное пространство) и работает только с ней! Указатели = работа с адресным пространством процесса (логические адреса).
#memory #theory
Физическая память (компоненты)
Вот некоторые компоненты, которые входят в управление памятью в ядре Linux:
1. Менеджер памяти (Memory Manager): Отвечает за управление памятью в системе, включая выделение и освобождение памяти для процессов, управление страницами памяти и своппинг.
2. Страницы памяти (Memory Pages): Физическая память разделена на блоки фиксированного размера, называемые страницами. Ядро управляет этими страницами, отслеживая их использование и перемещая их между различными областями памяти (например, активными, неактивными, свободными).
Управление памятью с помощью страниц позволяет операционной системе эффективнее использовать память, обеспечивать защиту памяти и использовать техники виртуализации памяти, такие как подкачка (swapping) и разделяемая память.
3. Таблицы страниц (Page Tables): Используются для отображения виртуальных адресов памяти на физические адреса. Каждый процесс имеет свою таблицу страниц, которая используется при переводе виртуального адреса в физический.
4. Служба кэширования страниц (Page Cache): Часть памяти, используемая для кэширования содержимого файлов. Это ускоряет доступ к файлам, сохраняя их данные в памяти.
5. Буферы (Buffers): Используются для кэширования данных, предназначенных для блочных устройств, таких как жесткие диски.
6. Слэб аллокатор (Slab Allocator): Специализированный аллокатор памяти для часто создаваемых и уничтожаемых структур данных в ядре, таких как объекты
Слэб аллокатор используется процессами ядра, включая kworkers и kthreads, для выделения памяти под структуры данных, необходимые им для выполнения своих задач. Слэб аллокатор помогает этим процессам и потокам ядра эффективно управлять памятью, выделяя и освобождая память для часто используемых структур данных, что улучшает общую производительность системы.
7. Система свапа (Swap): Механизм, позволяющий использовать часть жесткого диска как расширение физической памяти, перемещая на диск те страницы памяти, которые редко используются.
Физическая память ядра обычно защищена от прямого доступа пользовательскими процессами, так как ошибка в таком процессе может привести к сбою всей системы. Вместо этого, пользовательские процессы работают с виртуальной памятью, и когда они нуждаются в ресурсах ядра, они используют системные вызовы, которые являются контролируемым способом взаимодействия с ядром.
#memory #theory
Вот некоторые компоненты, которые входят в управление памятью в ядре Linux:
1. Менеджер памяти (Memory Manager): Отвечает за управление памятью в системе, включая выделение и освобождение памяти для процессов, управление страницами памяти и своппинг.
2. Страницы памяти (Memory Pages): Физическая память разделена на блоки фиксированного размера, называемые страницами. Ядро управляет этими страницами, отслеживая их использование и перемещая их между различными областями памяти (например, активными, неактивными, свободными).
Управление памятью с помощью страниц позволяет операционной системе эффективнее использовать память, обеспечивать защиту памяти и использовать техники виртуализации памяти, такие как подкачка (swapping) и разделяемая память.
3. Таблицы страниц (Page Tables): Используются для отображения виртуальных адресов памяти на физические адреса. Каждый процесс имеет свою таблицу страниц, которая используется при переводе виртуального адреса в физический.
4. Служба кэширования страниц (Page Cache): Часть памяти, используемая для кэширования содержимого файлов. Это ускоряет доступ к файлам, сохраняя их данные в памяти.
5. Буферы (Buffers): Используются для кэширования данных, предназначенных для блочных устройств, таких как жесткие диски.
6. Слэб аллокатор (Slab Allocator): Специализированный аллокатор памяти для часто создаваемых и уничтожаемых структур данных в ядре, таких как объекты
task_struct.Слэб аллокатор используется процессами ядра, включая kworkers и kthreads, для выделения памяти под структуры данных, необходимые им для выполнения своих задач. Слэб аллокатор помогает этим процессам и потокам ядра эффективно управлять памятью, выделяя и освобождая память для часто используемых структур данных, что улучшает общую производительность системы.
7. Система свапа (Swap): Механизм, позволяющий использовать часть жесткого диска как расширение физической памяти, перемещая на диск те страницы памяти, которые редко используются.
Физическая память ядра обычно защищена от прямого доступа пользовательскими процессами, так как ошибка в таком процессе может привести к сбою всей системы. Вместо этого, пользовательские процессы работают с виртуальной памятью, и когда они нуждаются в ресурсах ядра, они используют системные вызовы, которые являются контролируемым способом взаимодействия с ядром.
#memory #theory
Виртуальная память (компоненты)
1. .text
2. .data
3. .bss
4. Heap (куча)
5. Stack (стек)
6. Shared Memory (Разделяемая память).
Эти секции находятся в виртуальном адресном пространстве процесса и управляются страничным механизмом операционной системы для отображения в физическую память.
Более подробный разбор и описание секций в этом посте.
#memory #theory
1. .text
2. .data
3. .bss
4. Heap (куча)
5. Stack (стек)
6. Shared Memory (Разделяемая память).
Эти секции находятся в виртуальном адресном пространстве процесса и управляются страничным механизмом операционной системы для отображения в физическую память.
Более подробный разбор и описание секций в этом посте.
#memory #theory
Shared Memory (Разделяемая память)
Это механизм, который позволяет двум или более процессам обмениваться данными путем доступа к одному и тому же участку физической памяти. Это один из методов межпроцессного взаимодействия (Inter-Process Communication, IPC).
В операционных системах, таких как Unix и Linux, разделяемая память позволяет процессам более эффективно обмениваться большими объемами данных, поскольку данные не нужно копировать между процессами; вместо этого данные существуют в общем пространстве памяти, к которому все процессы имеют доступ. Это также может увеличить производительность приложений, поскольку доступ к разделяемой памяти обычно быстрее, чем использование других механизмов IPC, таких, как каналы (pipes) или сокеты.
#memory #theory
Это механизм, который позволяет двум или более процессам обмениваться данными путем доступа к одному и тому же участку физической памяти. Это один из методов межпроцессного взаимодействия (Inter-Process Communication, IPC).
В операционных системах, таких как Unix и Linux, разделяемая память позволяет процессам более эффективно обмениваться большими объемами данных, поскольку данные не нужно копировать между процессами; вместо этого данные существуют в общем пространстве памяти, к которому все процессы имеют доступ. Это также может увеличить производительность приложений, поскольку доступ к разделяемой памяти обычно быстрее, чем использование других механизмов IPC, таких, как каналы (pipes) или сокеты.
#memory #theory
Разбор секций вывода команды:
Часть 1.
Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.
#memory #utils #theory
$ free -h
Часть 1.
Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.
#memory #utils #theory
Разбор секций вывода команды:
Часть 2.
Секция buff/cache (Page Cache). Забит страничным кэшом.
Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.
Когда вы создаете новый файл в Linux и записываете в него данные, в первую очередь информация попадает в кэш операционной системы (а страницы памяти для этого файла помечаются как грязные), а не напрямую на диск. Это делается для увеличения производительности, поскольку работа с кэшем памяти быстрее, чем с диском.
#memory #utils #theory
$ free -h
Часть 2.
Секция buff/cache (Page Cache). Забит страничным кэшом.
Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.
Когда вы создаете новый файл в Linux и записываете в него данные, в первую очередь информация попадает в кэш операционной системы (а страницы памяти для этого файла помечаются как грязные), а не напрямую на диск. Это делается для увеличения производительности, поскольку работа с кэшем памяти быстрее, чем с диском.
#memory #utils #theory
Страничный кэш и vmtouch
Существует утилита
Files: 1
Directories: 0
Resident Pages: 1/1 4K/4K 100%
Elapsed: 5.8e-05 seconds
Таким образом, вся информация файла
Если сделать:
то файл будет прочитан из памяти RAM, а не с диска. Когда вы запрашиваете чтение файла, система сначала проверяет, есть ли данные файла в кэше, и если они там есть, то читает их оттуда, минуя необходимость обращения к диску.
#memory #utils #theory
Существует утилита
vmtouch, она может показать какой процент указанного файла находится в страничном кэше:$ vmtouch /etc/passwd
Files: 1
Directories: 0
Resident Pages: 1/1 4K/4K 100%
Elapsed: 5.8e-05 seconds
Таким образом, вся информация файла
/etc/passwd находится в оперативной памяти и может быть доступна для чтения без задержки на доступ к диску. Это ускоряет работу системы, так как чтение данных из оперативной памяти гораздо быстрее, чем чтение с диска.Если сделать:
$ cat /etc/passwd
то файл будет прочитан из памяти RAM, а не с диска. Когда вы запрашиваете чтение файла, система сначала проверяет, есть ли данные файла в кэше, и если они там есть, то читает их оттуда, минуя необходимость обращения к диску.
#memory #utils #theory
Как устроена память в Linux и как эффективно с ней работать. Отличный урок, рекомендую, сам узнал много полезного, и главное все можно на практике попробовать, а не сухая теория.
Ссылка: https://www.youtube.com/watch?v=gSsChHMjugs
#memory #theory
Ссылка: https://www.youtube.com/watch?v=gSsChHMjugs
#memory #theory
——— НАВИГАЦИЯ ———
Git: #git
Жвачка: #fun
Ядро: #kernel
Разное: #misc
ПО: #software
Игры: #games
Книги: #books
Люди: #people
Сборка: #build
Утилиты: #utils
Python: #python
Теория: #theory
Debian: #debian
Новости: #news
Оболочка: #shell
Память: #memory
СПО: #opensource
Терминал: #terminal
Мои мысли: #thoughts
Безопасность: #security
Информация канала: #info
Конфигурационные файлы: #dotfiles
Кто я: https://xn--r1a.website/krxnotes/246
Откуда берется информация: https://xn--r1a.website/krxnotes/500
Поддержать канал:
Git: #git
Жвачка: #fun
Ядро: #kernel
Разное: #misc
ПО: #software
Игры: #games
Книги: #books
Люди: #people
Сборка: #build
Утилиты: #utils
Python: #python
Теория: #theory
Debian: #debian
Новости: #news
Оболочка: #shell
Память: #memory
СПО: #opensource
Терминал: #terminal
Мои мысли: #thoughts
Безопасность: #security
Информация канала: #info
Конфигурационные файлы: #dotfiles
Кто я: https://xn--r1a.website/krxnotes/246
Откуда берется информация: https://xn--r1a.website/krxnotes/500
Поддержать канал:
2202 2036 6907 4603
Спасибо, что читаете!