Процесс и поток - PullRequest
       17

Процесс и поток

2 голосов
/ 07 октября 2008

Какими данными не будут делиться Process и Thread?

Заранее благодарим всех, кто предоставляет свое время

Ответы [ 5 ]

3 голосов
/ 07 октября 2008

Отдельные процессы не передают данные друг другу.

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

2 голосов
/ 07 октября 2008

Это зависит от контекста. Полностью отдельные процессы в большинстве случаев не разделяют одну и ту же память, но в некоторых случаях дочерние процессы будут использовать то же пространство памяти, что и родительский, например, когда вы используете fork в Unix. В более старой версии Windows (95,98, ME) есть область общей памяти, которая используется всеми процессами, но в основном это просто пространство для системных DLL, а не для данных.

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

1 голос
/ 08 октября 2008

В теории операционных систем (и AFAIK это относится к таким операционным системам, как Windows, Linux, * BSD, ...) процесс определяется как поток со своей собственной таблицей страниц , т.е. пространство виртуальной памяти.

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

1 голос
/ 07 октября 2008

ПО по умолчанию: нет обмена данными между процессами, но с использованием методов межпроцессного взаимодействия, таких как Socket, Pipes, RPC и т. Д., Вы можете поделиться данными.

0 голосов
/ 07 октября 2008

В UNIX процессы могут обмениваться дескрипторами файлов со своими дочерними процессами, если дескрипторы файлов не настроены на закрытие в exec (FD_CLOEXEC). Аналогично, Windows поддерживает совместное использование дескрипторов с дочерними процессами, устанавливая lpSecurityAttributes->bInheritHandle в TRUE при вызове CreateFile() и затем bInheritHandles в TRUE при вызове CreateProcess. Не говоря уже о том, что функция Microsoft C времени выполнения _open() принимает флаг _O_NOINHERIT.

В Linux системный вызов clone() дает вам большой контроль над тем, что дочерний процесс делит со своим родителем: все от адресного пространства (CLONE_VM) до таблицы дескрипторов файлов (CLONE_FILES) к идентификатору родительского процесса (CLONE_PARENT) может быть либо общий, либо общий. Конечно, эта функциональность была добавлена ​​для поддержки потоков ядра.

Локальное хранилище потоков (TLS) индексируется по-разному для каждого потока в процессе, но фактическая память распределяется между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...