Разница между процессом и потоком

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

10 ответов


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

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

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

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


для связи между двумя процессами я полагаю, что вы можете использовать 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();
}

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


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

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


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


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

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

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

A , очереди сообщений. Синхронизация между процессами может мне сделана с помощью семафоров

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


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


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


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

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


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