2011-02-02 4 views
8

Привет Я создал серверную программу, которая запускает новый процесс после того, как он принимает соединение сокета. Существует несколько статически выделенных глобальных переменных, определенных в программе. Мой вопрос в том, что эти статические буферы распределяются дважды после fork? Или вилка только дублирует адресное пространство в куче и стеке вызовов?Статические переменные C и linux fork

ответ

10

всего адресное пространство дублируется, включая все глобальные переменные и текст программы.

+0

Я работаю с около 10 МБ оперативной памяти, и я не вижу, сколько свободного падения памяти после вызова fork? Если статическое распределение происходит во время компиляции, то как развернуть его с помощью вилки? –

+1

Статическое распределение не происходит во время компиляции - это происходит во время выполнения, реализация которого сохраняется до библиотеки C, о которой идет речь, но это должно быть сделано до 'main'. Таким образом, память является частью образа процесса, и это то, что вилка дублирует. –

+6

@juxtapose: Когда вы работаете fork(), все, что происходит, - это то, что память, используемая программой, отмечена копией при записи. Таким образом, ваше использование плунжера не начнет расти до тех пор, пока вы не начнете писать в память, а затем только страницы, которые вы написали, должны быть не разделены. – btilly

2

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

На static, что ключевое слово означает, что это (от ISO C99):

объекта, чей идентификатор объявляется с внешней или внутренней связью, или с хранением класса спецификатором статическим имеют статический срок хранения , Срок его службы - это полное выполнение программы, и его сохраненное значение равно , инициализируется только один раз, до запуск программы.

Что в основном означает, что ваш буфер будет инициализирован один раз как часть процедуры запуска CRT, и это пространство исчезает только при выходе. В этом случае это хранилище исчезает при выходе каждого из них.

6

Все адресное пространство «дублируется» во время fork(2). Это часто делается с помощью copy-on-write, и есть более подробная информация об обмене программным текстом и библиотеками, но здесь это не актуально. Как родительский, так и дочерний процессы заканчиваются собственной копией статических данных.

1

В Linux используется механизм, называемый copy-on-write. Это в основном означает, что до тех пор, пока переменная не изменяется, родительский и новый процесс используют одну переменную. Но до изменения переменной она копируется, а новый процесс использует копию. Это делается по соображениям производительности, а техника называется ленивой оптимизацией. Поэтому вы не должны волноваться, что изменение переменной в одном процессе изменит ее на другую.

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