Разница между процессом и потоком - PullRequest
7 голосов
/ 22 апреля 2011

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

Ответы [ 10 ]

6 голосов
/ 22 апреля 2011

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

Использование сокетов является обычной практикой, но может быть крайне неэффективным, в зависимости от вашего приложения. Но если вы работаете с чистой Java, это может быть единственным вариантом, так как сокеты поддерживаются повсеместно.

Совместное использование памяти - это еще один метод, но он зависит от ОС и требует вызовов, специфичных для ОС. Вы должны будете использовать что-то вроде JNI для приложения Java для доступа к службам общей памяти. Доступ к общей памяти не синхронизирован, поэтому вам, вероятно, придется использовать семафоры для синхронизации доступа между несколькими процессами.

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

2 голосов
/ 20 мая 2013

Процесс - это совокупность пространства виртуальной памяти, кода, данных и системных ресурсов.Поток - это код, который должен последовательно выполняться внутри процесса.Процессор выполняет потоки, а не процессы, поэтому каждое приложение имеет по крайней мере один процесс, а процесс всегда имеет по крайней мере один поток выполнения, известный как основной поток.Процесс может иметь несколько потоков в дополнение к основному потоку.До введения нескольких потоков выполнения все приложения были спроектированы для запуска в одном потоке выполнения.

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

2 голосов
/ 22 апреля 2011

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

private static int KNOWN_PORT = 11000;//arbitrary valid port
private ServerSocket socket;
public void acquireProcessLock(){
   socket = new ServetSocket(KNOWN_PORT);
   INetAddress localhostInetAddres = ...
   try{
      socket.bind(localhostInetAddres );
   }catch(IOException failed){
      try{
       Socket socket = new Socket(localhostInetAddres ,KNOWN_PORT);
       socket.getInputStream().read();//block
      }catch(IOException ex){ acquireProcessLock(); } //other process invoked releaseProcessLock()
   }
}
public void releaseProcessLock(){
  socket.close();
}

Не уверен, что это действительно лучший способ сделать это, но я думаю, стоит задуматься.

1 голос
/ 22 апреля 2011

С системной точки зрения поток определяется его " состоянием " и " указателем инструкций ".

Указатель инструкции ( eip ) содержит адрес следующей инструкции, которая должна быть выполнена.

Поток " состояние " может быть: регистры (eax, ebx и т. Д.), сигналы , открытые файлы , код , стек , данные , управляемые этим потоком (переменные, массивы и т. д.), а также куча .

A process - это группа потоков, которые разделяют часть своего " состояния ": это может быть код , данные , куча . Надеюсь, я отвечу на ваш вопрос;)

EDIT: Процессы могут связываться через IPC (межпроцессное взаимодействие). Существует 3 механизма: общая память , очередь сообщений . Синхронизация между процессами может быть сделана с Semaphors

Синхронизация потоков может быть сделана с мьютексами ( pthread_mutex_lock, pthread_mutex_unlock и т. Д. )

1 голос
/ 22 апреля 2011

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

0 голосов
/ 25 апреля 2017

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

Например, если я вычисляю с 3 процессами, я должен позволить каждому из них завершить свою работу и ждать их результатов на системном уровне, в то же время регистры и память стека всегда заняты.Однако, если я сделаю это с 3 потоками, то, если поток 2 успешно завершит свою работу раньше, поскольку вычисленный результат уже был сохранен в общем пуле динамической памяти, мы можем просто убить его, не дожидаясь, пока другие предоставят свои результатыи это высвобожденные ресурсы регистров и запаса памяти могут быть использованы для других целей.

0 голосов
/ 19 марта 2015

Процесс:

  • Процесс - это не что иное, как исполняемая программа.
  • Каждый процесс имеет свое собственное адресное пространство памяти.
  • Процесс используется для сложных задач, т. Е. В основном для выполнения приложений.
  • Высокая стоимость связи между процессами.
  • Переключение с одного процесса на другой требует некоторого времени для сохранения и загрузки регистров, карт памяти и т. Д.
  • Процесс - подход операционной системы.

Тема:

  • Нить - это легковесный подпроцесс.
  • Тема разделяет одно и то же адресное пространство.
  • Стоимость связи между потоками низкая.

Примечание. Для каждого потока требуется как минимум один процесс.

0 голосов
/ 20 ноября 2013

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

0 голосов
/ 25 января 2013

Я полагаю, что процессы могут обмениваться данными через сторонние: файл или базу данных ...

0 голосов
/ 22 апреля 2011

Проверьте Терракотовый кластер или документацию Терракоты DSO Clustering , чтобы увидеть, как можно решить эту проблему (манипулирование байт-кодом, поддержание семантики Спецификации языка Java на уровне putfield / getfield и т. Д.) )

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