Вопрос

Мой вопрос несколько концептуальный, как данные родительского процесса совместно используются с дочерним процессом, созданным fork() Позвоните или с потоком, созданной pthread_create()

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

Я ценю частичные и полные ответы заранее, если мне пропущу любой существующий ресурс, извините, я сделал несколько поисков в Google, но не смог найти хорошие результаты

Спасибо снова за ваше время и ответы

Это было полезно?

Решение

Семантика вилки () и Pthread_create () немного отличаются.

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

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

TL; DR версия: с вилкой (), вы не видите изменения другого парня; с pthread_create () вы делаете.

Другие советы

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

Существует большая разница между процессами, созданными fork и между потоками, созданными с pthread_create. Отказ Процессы не разделяют глобальные переменные и должны общаться через трубы, розетки или другие инструменты, предоставленные ОС. Хорошим решением MPI - это библиотека передачи сообщений для межпроцессной связи.

Темы совсем разные. Нить, созданная с pthread_create Разделяет все глобальные переменные со своим абонентом. Кроме того, вызывающий абонент может передавать произвольную структуру в нить, и эта структура также будет передана. Это означает, что человек должен быть чрезвычайно осторожен при программировании потоками - такое количество обмена опасна и ошибка. То pthread API обеспечивает мюметексы и условия для прочной синхронизации между потоками (хотя она все еще требует практики и опыта для правильной реализации).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top