Детерминированный маллок в раздвоенном процессе - PullRequest
2 голосов
/ 18 ноября 2011

Я хочу, чтобы разветвленный процесс, который является копией его родительского процесса, получал те же адреса, возвращаемые при каждом вызове функции malloc, что и его родительский процесс. Как мне этого добиться?

На самом деле я пытаюсь добиться двух реплицированных процессов, которые выполняют одно и то же. Я в основном делаю это, чтобы обнаружить мягкие ошибки, то есть, если есть расхождение, это должно быть из-за ошибки, а не недетерминизма. Теперь, так как malloc недетерминирован, это приведет к расхождению двух процессов, чего я хочу избежать.

Если это невозможно, могу ли я зарегистрировать адреса, возвращенные malloc для родительского процесса, и использовать те же адреса для разветвленного процесса. Будет ли это работать?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

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

echo 0 > /proc/sys/kernel/randomize_va_space

(но рандомизация адресного пространства - это функция, которая может повысить безопасность вашей системы)

Однако это не гарантирует, что родительский и дочерний процессы будут иметь одинаковое поведение (потому что между ними есть небольшая разница: возвращение fork() и их pid). И вы не можете быть уверены, что их схема распределения достаточно схожа. Представьте, что после разветвления (разветвленная) программа выполняет что-то вроде

 char *p = malloc (8192*(3 + (getpid() % 10) + time(NULL) % 100));

тогда вы должны ожидать, что malloc запросит совершенно разные размеры в родительском и дочернем элементах с разными возвращаемыми адресами malloc. Итак, этот надуманный пример показывает, что ваше требование нереально.

2 голосов
/ 18 ноября 2011

Просто нет способа сделать это с malloc. Возвращенный адрес malloc не определен как детерминированный (особенно переносимый). Попытка синхронизировать его между процессами, даже дочерними и родительскими, скорее всего, бесполезна.

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

0 голосов
/ 21 мая 2012

Нельзя сделать это со стандартом mallocНо вы можете написать свой собственный распределитель, который имеет детерминированный способ выделения.Например, в качестве пула выделения используйте static char pool[POOL_SIZE]; достаточного размера. Адрес pool остается неизменным для fork().Все указатели на pool.Вуаля!

0 голосов
/ 18 ноября 2011

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

...