Где я могу читать о sbrk()
в некоторых деталях?
Как это точно работает?
В том, какие ситуации были бы, я хочу использовать sbrk()
вместо громоздкого malloc()
и new()
?
btw, для чего расширение sbrk()
?
Посмотрите на Спецификация для 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;
}
Современные операционные системы будут делать гораздо больше, такие как страницы карты в адресное пространство и Добавить информацию отслеживания для каждого блока памяти выделена.
SBRK довольно устарели, в наши дни вы будете использовать MMAP, чтобы отобразить некоторые страницы из / dev / Zero. Это, безусловно, не то, что вы используете вместо Malloc и друзей, это более способ реализации тех. Кроме того, конечно, он существует только на операционных системах на основе POSIX, которые заботятся о обратной совместимости к древнему коду.
Если вы найдете Malloc и New Cumbersome, вы должны посмотреть в сборку мусора вместо этого ... Но будьте осторожны, есть потенциальная стоимость производительности для этого, поэтому вам нужно понять, что вы делаете.
В последующих запросах не возвращается только значение файла 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 и новые обеспечивают в любом случае.
Посмотрите на спецификацию для 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 для вашего кода.
Вы никогда не захотите использовать 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 и обычно поднимается вверх по направлению к стеку.