LINUX.ORG.RU

Вопрос про malloc, когда оперативы доступной нет, и нет swap

 ,


0

0

Скажите пожалуйста, что будет, если ядро не имеет своппинга, но есть MMU, и процесс пытается выделить память(не одним большим куском, а маленькими кусками в цикле), больше, чем есть физ. страниц?

Ничего не произойдет, пока ты не решишь использовать эту память. Вот тогда и будет прикол.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от I-Love-Microsoft

да, виснет все( причем, маллок то нормально возвращает, а при обращении к якобы выделенной памяти все виснет. Кто то может это объяснить?

kabanchik
() автор топика
Ответ на: комментарий от kabanchik

Зависать может только на специфической системе, где ядро сильно кастрировано. Ну или если железо проблемное. В нормальных условиях виснуть не будет, только засегфолтится приложение.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kabanchik

Типа возвращает не NULL? Тут то как раз подляна, при нехватке памяти там не NULL, тебе кажется что нормально выделилось. Если я правильно слухи воспринял ;)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от kabanchik

Ну, что поделать? reboot'ь, коннектся и смотри. То ли это — не скажу, но как минимум догадка. И да, настрой swap.

beastie ★★★★★
()
Ответ на: комментарий от beastie

embedded, свапа нет, на нанде свап делать не вариант. После ребута уже ничего не увидишь...

kabanchik
() автор топика
Ответ на: комментарий от kabanchik

Стопудово какой-нибудь блоб косячит. Или слишком свежее железо, и ведро тупо не портировали полноценно...

Что за железяка-то?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

В нормальных OS вернёт ENOMEM. ;)

С вашими же Linux'ами грешу всёж на overcommit. (Но не проверял, т.ч. на правах догадки.)

beastie ★★★★★
()
Ответ на: комментарий от kabanchik

640k хватит всем. На том, по ходу, и порешили. ;)

beastie ★★★★★
()
Ответ на: комментарий от beastie

В нормальных OS вернёт ENOMEM

Я в BSD не работал, увы. А в линуксе — да, пока не настроишь оверкоммит, будешь офигевать, не понимая причину сегфолта.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kabanchik

В линуксе ведро дырявое. Много косяков. Можно физически ограничить оверкоммитом, но тогда могут быть проблемы с говном от быдлокодеров (тормозиллой, хромоногим, либреохфисом и прочими быдлоподелками).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Не перегибай. Я сделал тебе нормальную аву которая смотрится на любом цвете фона. Так ты хотябы мысль свою донесешь — прочесть смогут.

deep-purple ★★★★★
()
Ответ на: комментарий от beastie

Ни разу не сталкивался. А вот с сегфолтами — да. Правда, чаще oom-killer убивает еще до сегфолта.

Eddy_Em ☆☆☆☆☆
()

процесс пытается выделить память(не одним большим куском, а маленькими кусками в цикле), больше, чем есть физ. страниц?

не делай так :-)

выхода (чтоб получать заветный NULL и ENOMEM при malloc) вижу два с половиной: играть с опциями mallopt, брать/делать другой аллокатор, патчить libc`шный malloc на тему флагов mmap.

MKuznetsov ★★★★★
()
Ответ на: комментарий от tailgunner

А что такого? Я как-то работал с пробитыми эмбеддщиками, под 10 лет опыта, но про оверкоммит они не знали, т.к. до этого работали исключительно с любимыми РТОС, и весь прогресс прошел мимо них.

AptGet ★★★
()
Ответ на: комментарий от AptGet

Выключить оверкоммит вообще не вариант?

нехороший вариант - он меняет политику для всей системы. В упомянутой эмбедщине придётся впаивать в два раза больше памяти :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

нехороший вариант - он меняет политику для всей системы. В упомянутой эмбедщине придётся впаивать в два раза больше памяти :-)

Это почему? O_O

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Да пошутил он. Не в 2, а в бесконечное число раз больше.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от tailgunner

Это не безграмотность, просто люди до этого не работали с Linux.

AptGet ★★★
()
Ответ на: комментарий от tailgunner

Это почему?

образно: malloc(smallpie) может повлечь за собой mmap(largeblock) и так для всех запущенных процессов. Чтобы ничего не ломалось придётся гарантировать что памяти хватит на все largeblock, а в эмбеддед это только паяльником

MKuznetsov ★★★★★
()
Ответ на: комментарий от AptGet

Ладно, сольюсь. Я ни разу в жизни ртось не использовал.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kabanchik

Запиши в /etc/sysctl.conf, скажем, так:

vm.overcommit_memory = 2
vm.overcommit_ratio = 100
(кстати, у меня так и записано на рабочем компе, но оперативы дофигища: аж 6ГБ).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

я буду всем нести ШГ

Не слушай никого, оставь как есть. Буду всем показывать как эталон.

no-such-file ★★★★★
()

malloc
маленькими кусками в цикле
в цикле
malloc
malloc в цикле

Мне ли одному кажется что это какой то анти-паттерн? Во всяком случае в прикладном программировании.

rezedent12 ☆☆☆
()

malloc - это библиотечная функция. Она выделяет память только из области уже выделенной твоему приложению операционной системой. При нехватке памяти malloc может:
1) вернуть ошибку выделения - думай сам что делать
2) завершить твою программу аварийно
3) запросить память у ОС расширение сегмента данных вызовом brk
4) запросить память у ОС анонимное отображение в память вызовом mmap

В случае 3 brk при нехватке памяти вернет ошибку ENOMEM и далее malloc поступит по принципу 1 или 2

В случае mmap может быть упомянутое веселье - виртуальная память будет выделена но реальные страницы в нее не распределены. При попытке чтения или записи сработает прерывание по отсутствию страницы и ОС выполнит запрос на swap, если его нет то будет прибито самое зажравшееся памятью приложение. Возможно ваше, возможно другое. Если повезет и прибьют не вас то вам предоставят освободившуюся память.

German_1984 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.