Правильно ли я предполагаю, что когда процесс вызывает malloc, может быть задействован I/O (свопинг кэшей и т. Д.), Чтобы сделать память доступной, что, в свою очередь, означает, что она может блокировать значительное время? Таким образом, не следует ли иметь две версии malloc в linux, скажем, «fast_malloc», которая подходит для получения меньших фрагментов. & гарантированно не блокирует (но может, конечно, все еще сбой с OUT_OF_MEMORY) и еще один async_malloc, где мы могли бы запросить произвольные -размер пространства, но требует обратного вызова?Не должно ли malloc быть асинхронным?
Пример: если мне нужен небольшой кусок памяти, чтобы освободить место для элемента в связанном списке, я могу предпочесть традиционный встроенный malloc, зная, что ОС сможет удовлетворить его 99,999% времени или просто выйти из строя , Другой пример: если я сервер БД, пытающийся выделить значительный кусок, чтобы поместить в него индексы, я могу выбрать async_malloc и обработать «сложность обратного вызова».
Причина, по которой я привел это, заключается в том, что я ищу для создания высококонкурентных серверов, обрабатывающих сотни тысяч веб-запросов в секунду и, как правило, избегая потоков для обработки запросов. Иными словами, в любое время в I/O я хочу, чтобы он был асинхронным (например, на основе libevent). К сожалению, я понимаю, что большинство C API не имеют надлежащей поддержки для одновременного использования. Например, вездесущая библиотека MySQL C полностью блокируется, и это всего лишь одна библиотека, которую используют мои серверы. Опять же, я всегда могу имитировать неблокирование путем выгрузки в другой поток, но это нигде не столь дешево, как ожидание результата через обратный вызов завершения.
Вызов 'malloc' по своей сути не вызовет больше ввода-вывода. Возможно, вы сбиваете с толку использование возвращенной памяти и просто выделяете вам память. Просто потому, что вы просите 100 МБ, это не означает, что 'malloc' немедленно вызовет 100 Мбайт обмена. Это происходит только тогда, когда вы * получаете доступ к памяти. – kaylum
C не указывает временные характеристики 'malloc()'. Конечно, это не первое приложение, которое имеет проблемы с сроками. Типичный 'malloc()' wohtin основной ОС избегает блокировки в течение длительного времени и вместо этого выделяет только при использовании. http://stackoverflow.com/q/19991623/2410359. – chux