Пространство стека и кучи для современных компьютеров - PullRequest
2 голосов
/ 25 сентября 2010

Когда я пишу на C, как узнать, сколько стекового пространства доступно в памяти при запуске программы?Как насчет кучи?

Как определить, сколько памяти используется во время выполнения моей программы?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2010

Это все для Win32 (не совсем для C, все только для OS API):

Когда создается поток, он по умолчанию получает 1 МБ стека, который может быть изменен в любом CreateThreadИспользуемый вами API.

Вы можете заглянуть в информационный блок потока, чтобы найти фактическую информацию о стеке, но даже если это задокументировано, этот метод официально не поддерживается, см. http://en.wikipedia.org/wiki/Win32_Thread_Information_Block.

Кроме того, для 32-разрядного приложения вы можете адресовать только до 2 ГБ, поэтому для приложения, которое по своей конструкции использует много памяти, следует обратить внимание на общий размер виртуального адреса процессапространство (зафиксировано + зарезервировано), которое включает в себя все выделения кучи.Вы можете программно получить доступ к виртуальной памяти процесса с помощью API GlobalMemoryStatusEx, посмотрите на параметр ullTotalVirtual для виртуального адресного пространства.Как только ваш процесс становится близким к 1,8 или 1,9 ГБ VAS, выделение кучи и вызовы VirtualAlloc начинают давать сбой.Для «нормальных» приложений вам не нужно беспокоиться об исчерпании VAS, но всегда полезно проверять распределение при сбое.Кроме того, вы не должны получать переполнение стека, если у вас нет ошибки или плохой дизайн.

2 голосов
/ 25 сентября 2010

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

Если вы запрашиваете это для проверки ошибок или для того, чтобы убедиться, что ваша программа имеет достаточно памяти, т. Д., То не беспокойтесь об этом, серьезно. Что касается памяти ваших программ, вы можете использовать диспетчер задач (в Windows), если это только для отладки. Если вам нужно знать это в своей программе, я бы не стал рассчитывать на какое-либо нехакерное решение.

1 голос
/ 25 сентября 2010

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

Если вы настаиваете, вы можете посмотреть /proc/meminfo, brk(), getrlimit() и setrlimit() ( вот некоторые документы ) со значениями RLIMIT_STACK и RLIMIT_DATA для приближений и грубый.

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;

  /* Get the stack limit. */
  if (getrlimit(RLIMIT_STACK, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    exit(1);
  }

  printf("The stack soft limit is %llu\n", limit.rlim_cur);
  printf("The stack hard limit is %llu\n", limit.rlim_max);
  exit(0);
}

Изменено с здесь также см. man getrlimit в вашей системе

Если вы укажете , что и , почему вы хотите сделать это, у кого-то может быть лучший метод или способ сделать то, что вы хотите.

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