2013-02-24 2 views
0

Если вы запустили программу foo.c в двух разных терминалах и напечатали адрес выполняемой локальной переменной. Они были бы такими же. Однако, в контексте разветвления и выполнения, например, внутри оболочки, я запускаю такую ​​программу foo.c. Он создаст ту же самую копию оболочки, а затем выполнит foo.c. Будет ли у них одинаковое виртуальное адресное пространство. А что, если программа рекурсивная называет себя, будет ли одна и та же переменная, рекурсивно называемая, все еще иметь одно и то же адресное пространство и как эта программа вырастает внутри собственного адресного пространства?Каковы случаи, когда программа имеет то же виртуальное адресное пространство

ответ

0

Если вы запустили программу foo.c в двух разных терминалах и напечатали адрес выполняемой локальной переменной. Они были бы такими же.

Не обязательно, современные операционные системы используют address space layout randomization, что означает, что адреса памяти могут (и делать) меняться от одного исполнения к другому.

в контексте разветвления и выполнения, например, например, внутри оболочки, я запускаю такую ​​программу foo.c. Он создаст ту же самую копию оболочки, а затем выполнит foo.c. Будет ли у них одинаковое виртуальное адресное пространство.

Нет, каждый процесс имеет свое виртуальное адресное пространство. Адреса переменных могут выглядеть одинаково, но запись в локальную переменную в одном процессе не влияет на другой процесс (если вы явно не разделяете память)

А что, если программа рекурсивная называет себя, будет одна и та же переменная, рекурсивно называемая, все еще имеет одно и то же адресное пространство и как эта программа вырастает внутри собственного адресного пространства?

Изучите разницу между процессами и потоками, чтобы лучше понять, что здесь происходит. Если программа forks, дочерний процесс имеет отдельное пространство адреса. Если функция вызывает себя в рамках программы, она будет выполняться в том же адресном пространстве, но локальные переменные будут раздельными в каждом стеке стека. Глобальные (или статические) переменные будут иметь один и тот же адрес памяти для вызовов функций.

+0

Итак, когда рекурсия происходит, она фактически создает нить сама по себе. Я думал, что потоки должны быть явно сделаны, как использование thread_fork (foo.c) - os161 (игнорировать мои аргументы). – user1675999

+0

Термин «рекурсия» обычно означает функцию, вызывающую себя, все в одном потоке и процессе. Может быть, я не понимаю, что вы подразумеваете под «рекурсивными вызовами программы». В потоке есть ** стек **, который растет внутри адресного пространства процесса во время рекурсивных вызовов функций. –

0

Если вы запустили foo.c в двух разных терминалах и напечатали адрес локальной переменной, они будут отображаться одинаково. ОДНАКО, это две разные переменные, которые имеют одинаковое значение.

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

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

На самом деле, это в случае, если вы икру процесс из foo.c

Если вы хотите, чтобы иметь общую память между двумя процесса, необходимо породить потоки или использовать shared memory.