LINUX.ORG.RU

Виртуальная память; карта памяти процесса; работа malloc()

 , , ,


2

4

Привет всем) Не могу никак разобраться с тем как происходит работа с памятью и как выглядит карта памяти процесса. Пока у меня такое представление: Процесс видит всю память которая есть в системе, пусть для примера 4гб, первый гиг резервируется ядром и никогда не будет доступен пользовательским процессам. Остальные 3 гб -> пространство которе процесс видит, но не обязательно может использовать. Когда программа загружается в память то разные ее части загружаются в разные сегменты(диапазоны адресов): стек который начинается сразу после пространства ядра и растет в сторону больших адресов пока не упрется в какой то лимит, сегмент куда отображаются файлы, куча, не инициализированные переменные, данные, и код.

Я читал статьи про устройство виртуальной памяти, как выглядит память процесса и тд. НО все описывается как то поверхностно.

У меня такой вопрос: как работает malloc()? ясно что он выделяет память в куче. Но если минимально сколько можно выделить вирт памяти это одна страничка, то что тогда именно делает malloc и вообще функции выделения динамической памяти?? Из чего складывается размер который программа занимает в памяти? Как расчитывается изначальный размер сегментов?

И самое главное: как посмотреть, как это работает на самом деле? То есть в самых мелких подробностях. Ну когда например Тодвальтс начинал писать ядро, он же знал что делать? Как начать и как организовать работу ядра? Подскажите пожалуйста с чего начать изучение всего этого)

man mmap
Вообще, работа malloc зависит от реализации в libc.
куча, например, может выделяться через mmap2 и расширяется при необходимости.

mittorn ★★★★★
()

У меня такой вопрос: как работает malloc()?

Там же MP2 посвящено этому

AlexVR ★★★★★
()
Ответ на: комментарий от mittorn

Это я понимаю. Не понимаю одного - если например я пишу char * ptr = (char *)malloc(10) - где то выделилось в куче или анонимно выделилась память размером 10 байт?? разве когда программа загрузилась то у нее нет уже выделенного буфера какого то размера? или malloc просто возвращает указатель с адресом, который уже доступен? или например память в куче кончилась а я хочу выделить, скажем 100 байт, то мне же никто 100 байт не выделит если размер странички 4кб скажем? или я чего не понимаю)?

maksspaces
() автор топика
Ответ на: комментарий от maksspaces

какой смысл выделять 10 байт если минимум сколько я могу выделять это страница? и почему происходит например page fault если я например к 11 байту обращаюсь? ведь страничка где эти 10 байт веделены мне? есть какие то записи в контексте процесса, сколько я конкретно выделил?

по советуйте способ погружения во все это)

maksspaces
() автор топика
Ответ на: комментарий от maksspaces

man brk

И ещё раз, все твои вопросы рассматриваются в рамках курса «Операционные системы и системное программирование»

AlexVR ★★★★★
()

карта памяти процесса.

Никак - выкинь свою убогую макулатуру для школьников от школьников.

Процесс видит всю память которая есть в системе

Никакой памяти нет - есть адресное пространство. Процесс никак не видит память.

пусть для примера 4гб, первый гиг резервируется ядром и никогда не будет доступен пользовательским процессам.

Да макулатура-то протухшее 20лет назад убожество. Тебя это волновать не должно.

Остальные 3 гб -> пространство которе процесс видит, но не обязательно может использовать.

Процесс ничего не видит.

сегменты(диапазоны адресов):

О боже, опять мусор 20летней давности - выкинь свою макулатуру.

пространства ядра

Опять протухшее тыщу лет назад говно - какое нахрен ещё пространство ядра. Никому это не интересно. Всё это начинаться может где угодно - и тебя волновать не должно.

Я читал статьи про устройство виртуальной памяти, как выглядит память процесса и тд. НО все описывается как то поверхностно.

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

Только мифология из прошлого тысячилетия передаваемая из уст в уста, от одного нуля к другому.

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

У меня такой вопрос: как работает malloc()?

Какие ещё нахрен сегменты - сегменты это протухшее убожество.

Память никак нельзя «выделить». Выкинь это убожество из лексикона - это для школьников.

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

Маллок - это абстракция над тупой абстракцией плоской/линейной памяти. Над твоим убогим «сегментом».

Т.е. у нас есть кусок памяти - это массив, который может только расти, либо уменьшаться. Это всё, чем для себя представляет память маллок.

Далее уже тупая индексация над этим массивом. И все твои «выделения» существуют только на уровне этого индекса. Типичная файловая система. Т.е. то, что связывает её с реальной памятью - это только тогда, когда ты пишешь и читаешь. Все «выделения» есть только внутри неё.

Память занимаемая программой - это кол-во страниц, которые заммапленны в свою «программу», которые являются уникальными для неё - используемые только ею. Т.е. не разделяемые с другими «программами».

И самое главное: как посмотреть, как это работает на самом деле?

Берёшь и смотришь.

То есть в самых мелких подробностях.

Берёшь и смотришь и читаешь - мануал от интела есть.

Ну когда например Тодвальтс начинал писать ядро, он же знал что делать?

Когда он писал ядро - он писал убогое говно, да и писал под примитвиное говно.

Как начать и как организовать работу ядра? Подскажите пожалуйста с чего начать изучение всего этого)

Учится думать. Вся логика работы выводится чисто эмпирически - это всё убогое говно создававшиеся посредственностями, а реализации вообще убогая отрыжка аутиста.

Но как и любая существующая в реальном мире система - она подвластна определённой конкретной логике, в отличии от мифологии школьников, поэтому существует - она выводима. Вывести её ты можешь штудируя мануал, либо методом тыка. Естественно для этого надо уметь читать отрыжку скудоумных объясняторов.

anonymous
()
Ответ на: комментарий от AlexVR

Убогий и протухший мусор для школьников.

В пдфнике написан типичный и убогий мусор, который писал нулёвый школьник.

Пол пдфника нулина пытался объяснить зачем же делить память на блоки, при этом несёт какую-то херню.

Блочная адресация - типичный пример из реальной жизни. У любого школьника есть адрес школы и его конкретный класс. Почему их ЦА это не ясно - у меня вопросы к их образованию, почему они высерают тотальных овощей. Есть параграфы/страницы/номера в макулатуре.

Далее, связность/множественная связность понятие доступное школьнику. Идентификация то же. Почему каждому школьнику можно назначить «номер» и в паспорте и в ещё какой-либо херне. Те же номера телефонов.

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

Т.е. виртуальная память - это связанные через какую-то реализацию ассоциативных связей - адрес/адрес 2-х адресных пространств. Как это реализуется и что это - понимает любой школьник. Почему под листочком номер пять написано число задачи номер 15.

Т.е. система билетов типичный представитель, с которой школьник сталкивался.

Почему связываются идентификаторы блоков, а не адресуемых объектов - понятно так же любому школьнику по наблюдениям из реальной жизни. Почему есть номер школы и номер класса.

Так же логически выводятся все остальные особенности памяти тупо из постановки и условий задачи.

А вся проблема в том, что думать школьника никто не учит. Так и живём.

anonymous
()
Ответ на: комментарий от anonymous

Т.е. у нас есть кусок памяти - это массив, который может только расти, либо уменьшаться. Это всё, чем для себя представляет память маллок.

Выкинь мусор, в котором ты это прочитал. It's deprecated.

#include <stdio.h>
#include <stdlib.h>
#include <proc/readproc.h>

void print_status() {
  struct proc_t usage;
  look_up_our_self(&usage);
  printf( "  usage: %lu\n  sbrk: %p\n", usage.vsize, sbrk(0) );
}

int main() {

  printf( "Start\n" );
  print_status();

  printf( "\nmalloc for buf1\n" );
  char *buf1 = malloc(1*1024*1024);
  print_status();
  printf( "  buf1: %p\n", buf1);
  
  printf( "\nmalloc for buf2\n" );
  char *buf2 = malloc(1*1024*1024);
  print_status();
  printf( "  buf2: %p\n", buf2);

  printf( "\nfree buf1\n" );
  free(buf1);
  print_status();

  printf( "\nfree buf2\n" );
  free(buf2);
  print_status();

  return 0;
}
AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

О, да школьничек меня пытается ловить. Это так мило.

Ну давай я тебя в очередной раз мокну в говно.

malloc(1*1024*1024);

Какое отношение это имеет к маллоку?

implementation allocates the memory as a private anonymous mapping using mmap(2)

Т.е. балаболка высрала мне особенность частной имплементации для частного же случая, в котором маллок просто проксирует другой «аллокатор»? Ну да - молодец. А что сказать-то хотел?

anonymous
()
Ответ на: вместо тысячи слов от dzidzitop

Вот это отсос

opensource.apple.com использует недействительный сертификат безопасности.

Сертификат истёк 06.09.2015 02:59. Текущее время — 08.09.2015 00:06.

Deleted
()

Ядро выделяет процессу некоторое количество страниц на старте под статичные сегменты - код, данные и т. д. malloc по необходимости запрашивает еще страницы через sbrk (устарело) или mmap, запоминает их и по мере запросов размечает их память как использованную.

То есть тут два слоя: ядро выделяет процессу память страницами, при нарушении получишь сегфолт. А malloc внутри этой памяти выделяет программе логически свободную (не выданную им же раньше или уже освобожденную через free) память.

В памяти процесс занимает столько сколько ему выдано страниц (с поправкой на разделяемые с другими процессами). Реально в них остаются неиспользованные куски, то есть на логическом уровне памяти занято меньше, но разница мала.

Размер сегментов в ELF'е описан, кроме стека (определяется ОС) и кучи. Куча - это просто дополнительная память, данная процессу для malloc и аналогов.

anonymous
()

Я - жертва еще более старой макулатуры. Считаю, что стек растет в сторону меньших адресов.

Rupricht ★★
()
Ответ на: комментарий от mittorn

Просто возвращает указатель

Или не просто. Смотря сколько памяти нужно и сколько есть у процесса.

anonymous
()
Ответ на: комментарий от anonymous

да. Я почему-то думал, что там mmap2 используется, а не brk. Видимо, видел такое в кастомных аллокаторах.

mittorn ★★★★★
()
Ответ на: комментарий от anonymous

школьничек меня пытается ловить

Где FFT, пидорас?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.