2013-03-26 2 views
0

У меня установлена ​​Ubuntu 12.10 (ядро 3.9.0-rc2) на VMWare. Я дал ему 512 МБ ОЗУ.
кота/Proc/MemInfo показывает:
MemTotal: 507864 KB
MemFree: 440180Процесс убит из-за слишком большой памяти?

Я хочу использовать своп (по некоторым причинам), поэтому я написал программу C, которая выделяет массив 500MB (с использованием таНос ()) и заполняет его барахлом. Однако программа будет убита, прежде чем она сможет заполнить весь массив, и на экране появится сообщение «Killed».

Я хотел спросить, является ли это нормальным поведением и в чем причина этого? По моему мнению, обмен должен использоваться, потому что свободного ОЗУ недостаточно.

Редактировать: Я не упоминал, что у меня есть обмен 1 ГБ. cat/proc/swaps показывает:
/dev/sda5 Размер: 1046524 Использовано: 14672.
«Используемое» количество увеличивается, когда я запускаю программу, использующую память. Но, как вы можете видеть, много свопов осталось. Так почему же программа должна быть «убита»?

+0

Google для 'overcommit Linux '; и да, это настраивается и может быть отключено. Кстати, вы, вероятно, имеете в виду Ubuntu 12.10, ядро ​​Linux находится в версии 3.8 на http://kernel.org/ (и Ubuntu 12.10, вероятно, имеет более раннее ядро). BTW, ваша память 512 МБ не полностью доступна для данных: ядро, программа и другие процессы тоже есть в этой памяти! –

+0

Проверьте вывод 'ulimit', если разрешено 500 МБ данных. –

+0

@ott: ulimit показывается неограниченно. –

ответ

1

Так что я не смог найти верный ответ. У меня есть временное решение:

Я изменил настройки виртуальной машины, чтобы предоставить виртуальную машину 512 МБ. Теперь я вернулся обратно в 2 ГБ и провел 5 параллельных программ, каждый из которых потреблял 500 МБ. К счастью, все они запускаются, и обмен используется.

Мне просто нужно было использовать своп для проекта по управлению свопами.

0

Также важно, как вы написали свою программу на C, чтобы выделить память, а какие - флагов компилятора. Например, если вы статически выделяете память (например, Double A [N] [N]), поведение отличается от динамического ее распределения: (например, использование malloc/calloc). Статические распределения ограничены моделью памяти компилятора (средняя, ​​малая и т. Д., Часто можно указать). Может быть, хорошая отправная точка:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

ли эта помощь?

 Смежные вопросы

  • Нет связанных вопросов^_^