Как делает sbrk (), работают в C++?

Где я могу читать о sbrk() в некоторых деталях?

Как это точно работает?

В том, какие ситуации были бы, я хочу использовать sbrk() вместо громоздкого malloc() и new()?

btw, для чего расширение sbrk()?

7
задан WiSaGaN 15 June 2016 в 06:46
поделиться

5 ответов

Посмотрите на Спецификация для BRK / SBRK .

Вызов в основном просит ОС выделить еще несколько памяти для приложения, увеличивая предыдущее «разрывное значение» на определенную сумму. Эта сумма (первый параметр) - это сумма дополнительной памяти, которое затем получает ваше приложение.

Большинство элементарных реализаций MALLOC создают призыв к системе SBRK, чтобы получить блоки памяти, которые они разделены и отслеживают. Функция функция MMAP обычно принимается как лучший выбор (именно поэтому mallocs, как поддерживает DLMalloc как с помощью #ifdef).

Что касается «Как это работает», SBRK на его самый простой уровень может выглядеть что-то подобное:

uintptr_t current_break; // Some global variable for your application.
                         // This would probably be properly tracked by the OS for the process
void *sbrk(intptr_t incr)
{
    uintptr_t old_break = current_break;
    current_break += incr;
    return (void*) old_break;
}

Современные операционные системы будут делать гораздо больше, такие как страницы карты в адресное пространство и Добавить информацию отслеживания для каждого блока памяти выделена.

8
ответ дан 6 December 2019 в 15:22
поделиться

SBRK довольно устарели, в наши дни вы будете использовать MMAP, чтобы отобразить некоторые страницы из / dev / Zero. Это, безусловно, не то, что вы используете вместо Malloc и друзей, это более способ реализации тех. Кроме того, конечно, он существует только на операционных системах на основе POSIX, которые заботятся о обратной совместимости к древнему коду.

Если вы найдете Malloc и New Cumbersome, вы должны посмотреть в сборку мусора вместо этого ... Но будьте осторожны, есть потенциальная стоимость производительности для этого, поэтому вам нужно понять, что вы делаете.

4
ответ дан 6 December 2019 в 15:22
поделиться

В последующих запросах не возвращается только значение файла cookie, другие метаданные остаются на клиенте.

При определении файла cookie на сервере в ответе, содержащем имя, значение и другие метаданные файла cookie, создается заголовок Set-Cookie . Несколько файлов cookie создадут несколько заголовков Set-cookie в ответе.

Когда браузер делает последующие запросы, он проверяет свою «базу данных» доступных файлов cookie, чтобы увидеть, какие файлы cookie подходят для запрашиваемого пути. Затем создается единственный заголовок Cookie в запросе, который содержит только ряд пар имя/значение соответствующих cookie-файлов.

Это важно, чтобы держать жесткий контроль над количеством файлов cookie и размером данных, в противном случае вы можете обнаружить, что вес данных cookie, отправляемых для каждого запроса может быть сдерживающим для производительности. Это было бы намного хуже, если бы метаданные также возвращались вместе с файлами cookie.

-121--4780333-

Причина, по которой все говорят, чтобы использовать побитовый &, а затем сравнить с нулем или флагом:

  0111 1000        // kbd.flags 
& 0001 0000        // Injected
          =
  0001 0000        // (!= 0 or ==Injected)
-121--4121303-

Вы отметили этот C++, так почему вы используете «громоздкий» malloc (), а не новый? Я не уверен, что громоздко в маллоке в любом случае; внутренне, может быть, так, но почему вас это волнует? И если вы заботились (например, из соображений детерминизма), вы могли бы выделить большой пул и внедрить свой собственный распределитель для этого пула. Конечно, в C++ для этого можно перегружать новый оператор.

sbrk используется для приклеивания библиотеки C к управлению памятью ОС базовой системы. Поэтому выполняйте вызовы ОС, а не используя функцию sbrk (). Относительно того, как это работает, это зависит от системы. Например, если вы используете библиотеку Newlib C (обычно используемую во встроенных системах «голый металл» с компилятором GNU), вы должны реализовать sbrk самостоятельно , так что как он работает в этих условиях, зависит от вас, пока он достигает необходимого поведения расширения кучи или отказа.

Как вы можете видеть по ссылке, она не делает много и было бы чрезвычайно громоздко использовать напрямую - вы, вероятно, в конечном итоге обернуть его во все функциональные возможности, которые malloc и новые обеспечивают в любом случае.

1
ответ дан 6 December 2019 в 15:22
поделиться

Посмотрите на спецификацию для brk/sbrk .

Вызов, в основном, просит ОС выделить больше памяти для приложения, увеличив предыдущее «значение разрыва» на определенную величину. Этот объем (первый параметр) - это объем дополнительной памяти, который затем получает приложение.

Большинство элементарных реализаций malloc основаны на вызове системы sbrk для получения блоков памяти, которые они разделяют и трек. Функция mmap обычно считается лучшим выбором (именно поэтому mallocs вроде dlmalloc поддерживают оба с # ifdef).

Что касается «как это работает», то sbrk на самом простом уровне может выглядеть примерно так:

uintptr_t current_break; // Some global variable for your application.
                         // This would probably be properly tracked by the OS for the process
void *sbrk(intptr_t incr)
{
    uintptr_t old_break = current_break;
    current_break += incr;
    return (void*) old_break;
}

Современные операционные системы сделают гораздо больше, например, сопоставят страницы в адресном пространстве и добавят информацию отслеживания для каждого выделенного блока памяти.

-121--3894524-

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

-121--4043517-

Это зависит от того, что вы имеете в виду под «громоздким». sbrk, как правило, больше не используется напрямую, если вы не используете собственный распределитель памяти: IE, оператор, переопределяющий «new». Даже тогда я мог бы использовать маллок, чтобы дать мне первоначальную память.

Если вы хотите узнать, как реализовать malloc () поверх sbrk (), ознакомьтесь с http://web.ics.purdue.edu/~cs354/labs/lab6/ , которое является упражнением, проходящим через это.

Однако в современной системе не следует касаться этого интерфейса. Так как вы называете malloc и новый громоздкий, я подозреваю, что у вас нет всего необходимого опыта, чтобы безопасно и правильно использовать sbrk для вашего кода.

0
ответ дан 6 December 2019 в 15:22
поделиться

Вы никогда не захотите использовать sbrk вместо malloc или free. Она не портативна и обычно используется только реализаторами стандартной библиотеки Си или в случаях, когда она недоступна. Она довольно хорошо описана в ее man page:

Description

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

sbrk() увеличивает данные программы. пространство за байтами приращения. sbrk() - это не системный вызов, это просто библиотека на Си. обёртка. Вызываю sbrk() приращение 0 может быть использовано для поиска текущее местоположение перерыва в программе.

Return Value

On success, brk() return ноль, и sbrk() возвращает указатель на начало нового района. Ошибка, -1 возвращается, а errno устанавливается в ENOMEM.

Наконец, malloc и free не громоздки - это стандартный способ выделения и освобождения памяти на C. Даже если вы хотите реализовать собственный аллокатор памяти, лучше всего просто использовать malloc и free в качестве основы - общий подход заключается в том, чтобы выделить большой кусок памяти одновременно с malloc и обеспечить выделение памяти из него (вот что такое суб-аллокаторы, или пулы, обычно реализуют)


о происхождении имени sbrk (или его двоюродного брата brk), оно может иметь какое-то отношение к тому факту, что конец кучи обозначен указателем, известным как "перелом". Куча начинается сразу после сегментов BSS и обычно поднимается вверх по направлению к стеку.

1
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: