Управление памятью и процесс - PullRequest
1 голос
/ 23 июля 2011

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

Ответы [ 4 ]

2 голосов
/ 23 июля 2011

Да, в современных операционных системах существует отдельная куча для каждого процесса. Между прочим, существует не просто отдельный стек для каждого процесса, но есть отдельный стек для каждого потока в процессе. Таким образом, процесс может иметь множество независимых стеков.

Но не все операционные системы и не все аппаратные платформы предлагают эту функцию. Вам нужен блок управления памятью (аппаратно), чтобы это работало. Но настольные компьютеры имеют эту функцию с тех пор ... ну ... некоторое время назад ... 386-CPU? (оставьте комментарий, если вы знаете лучше). Однако вы можете оказаться на каком-то микропроцессоре, который не имеет этой функции.

В любом случае: ограничение размера кучи в основном ограничено операционной системой и оборудованием. Аппаратные ограничения особенно из-за ограниченного количества адресного пространства, которое это позволяет. Например, 32-битный процессор не будет обрабатывать более 4 ГБ (2 ^ 32). Процессор, который имеет расширения физических адресов (PAE), который поддерживают текущие процессоры, может адресовать до 64 ГБ, но это делается с помощью сегментов, и один отдельный процесс не сможет использовать эту функцию. Он всегда будет видеть 4 ГБ макс.

Кроме того, операционная система может ограничивать объем памяти по своему усмотрению. В Linux вы можете видеть и устанавливать ограничения с помощью команды ulimit. Если вы выполняете некоторый код не изначально, а, например, в интерпретаторе / виртуальной машине (такой как Java или PHP), то эта среда может дополнительно ограничить размер кучи.

2 голосов
/ 23 июля 2011

Кучи действительно локальны для процесса.Ограничения устанавливаются операционной системой.Память также может быть ограничена количеством битов, используемых для адресации (т. Е. 32-битные данные могут одновременно адресовать только 2G 4G памяти).

1 голос
/ 23 июля 2011

В современной многозадачной ОС с преимущественным управлением каждый процесс получает свое адресное пространство.Набор страниц памяти, которые он может видеть, отделен от страниц, которые могут видеть другие процессы.В результате, да, каждый процесс видит свой собственный стек и кучу, потому что стек и куча являются просто областями памяти.Таким образом, куча была эффективно распределена между всеми процессами.

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

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

1 голос
/ 23 июля 2011

«куча» является локальной для процесса, но она распределяется между потоками, а стек - нет, это для каждого потока.

Что касается лимита, например, в linux он установлен ulimit (см. Man-страницу).

...