Привет Я создал серверную программу, которая запускает новый процесс после того, как он принимает соединение сокета. Существует несколько статически выделенных глобальных переменных, определенных в программе. Мой вопрос в том, что эти статические буферы распределяются дважды после fork? Или вилка только дублирует адресное пространство в куче и стеке вызовов?Статические переменные C и linux fork
ответ
всего адресное пространство дублируется, включая все глобальные переменные и текст программы.
fork()
дублирует изображение всего процесса. Все это. Таким образом, они выделяются дважды ... нет, они выделяются один раз для исполняемого образа, из которых теперь два, и нет, если вы ссылаетесь на один в родительском, то он не будет содержать тот же контент, что и у если вы используете общую память.
На static
, что ключевое слово означает, что это (от ISO C99):
объекта, чей идентификатор объявляется с внешней или внутренней связью, или с хранением класса спецификатором статическим имеют статический срок хранения , Срок его службы - это полное выполнение программы, и его сохраненное значение равно , инициализируется только один раз, до запуск программы.
Что в основном означает, что ваш буфер будет инициализирован один раз как часть процедуры запуска CRT, и это пространство исчезает только при выходе. В этом случае это хранилище исчезает при выходе каждого из них.
Все адресное пространство «дублируется» во время fork(2)
. Это часто делается с помощью copy-on-write, и есть более подробная информация об обмене программным текстом и библиотеками, но здесь это не актуально. Как родительский, так и дочерний процессы заканчиваются собственной копией статических данных.
В Linux используется механизм, называемый copy-on-write. Это в основном означает, что до тех пор, пока переменная не изменяется, родительский и новый процесс используют одну переменную. Но до изменения переменной она копируется, а новый процесс использует копию. Это делается по соображениям производительности, а техника называется ленивой оптимизацией. Поэтому вы не должны волноваться, что изменение переменной в одном процессе изменит ее на другую.
- 1. Статические переменные и потоки (C)
- 2. C# Webservice и статические переменные
- 3. C Параллельные процессы и статические переменные
- 4. Библиотеки и экспортирующие статические переменные в C++
- 5. Статические переменные в c
- 6. статические переменные в C
- 7. Статические переменные - C
- 8. Статические переменные в C и C++
- 9. Статические переменные в C#
- 10. Статические переменные C++ динамические
- 11. Статические переменные в C++
- 12. Статические переменные в C++
- 13. Статические переменные и многопоточность
- 14. C# статические и константные переменные памяти
- 15. C статические переменные и процессы разветвления
- 16. Статические переменные и производительность в Objective-c
- 17. Пространство имен C++ и статические переменные
- 18. Статические переменные в C++ и Java
- 19. C локальные и глобальные статические переменные
- 20. Статические переменные и extern в plain C
- 21. Статические методы и переменные
- 22. наследование и статические переменные
- 23. Статические переменные и методы
- 24. $ _POST и статические переменные
- 25. Неизменяемость и статические переменные
- 26. статические и внешние переменные
- 27. Публичные и статические переменные
- 28. Резьба и статические переменные
- 29. Статические переменные и функции
- 30. glfwGetTime() и статические переменные
Я работаю с около 10 МБ оперативной памяти, и я не вижу, сколько свободного падения памяти после вызова fork? Если статическое распределение происходит во время компиляции, то как развернуть его с помощью вилки? –
Статическое распределение не происходит во время компиляции - это происходит во время выполнения, реализация которого сохраняется до библиотеки C, о которой идет речь, но это должно быть сделано до 'main'. Таким образом, память является частью образа процесса, и это то, что вилка дублирует. –
@juxtapose: Когда вы работаете fork(), все, что происходит, - это то, что память, используемая программой, отмечена копией при записи. Таким образом, ваше использование плунжера не начнет расти до тех пор, пока вы не начнете писать в память, а затем только страницы, которые вы написали, должны быть не разделены. – btilly