Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 128

В каких случаях удобнее использовать processes , в каких удобнее threads?

12.10.2019, 17:57. Показов 3076. Ответов 21

Студворк — интернет-сервис помощи студентам
Привет! Экзаменационный вопрос:

show a real case
example in which you would choose processes, and another in which you would choose threads


---------------------------------------------------------------------------------------------------------------------------------------------

Например, в каком случае я выберу threads - веб сервер. Сервер принимает тысячи запросов в секунду и чтобы всех их обслужить он создает threads, таким образом сервер не тупит, успевает обрабатывать все запросы.

А вот в каких случаях удобнее и предпочтительнее использовать processess. Напишите, пожалуйста, реальные примеры с жизни + объяснение.

++ если есть, что добавить к threads - добавляйте!

Век живи, век учись.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2019, 17:57
Ответы с готовыми решениями:

В каких случаях использовать обращение self::, а в каких $this. В чём разница между ними?
Привет! Сейчас пишу регистрацию в стиле ооп. Пишу функцию __construct в классе Registration class Registration{ protected $Name; ...

В каких случаях необходимо использовать equals, а в каких ==
Пожалуйста, можете привести пример, каких случаях необходимо использовать equals, а в каких == ?

В каких случаях надо создавать индексы к полям, а в каких - нет?
Не могу понять, в каком случае надо создовать индексы к полям а вкаких нет. если надо, то в каком случае индекс надо создать для каждого...

21
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 18:38
https://www.cyberforum.ru/blogs/18334/blog310.html там по сути полезным является только пример с процессами
3
2 / 2 / 0
Регистрация: 08.10.2019
Сообщений: 11
12.10.2019, 18:38
У потоков общие ресурсы и общая область памяти, а у процессов нет.
1
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
12.10.2019, 19:34
Про процессы.

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

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

Различные распределенные системы: клиент-серверые, облака или распределённые по нескольким компам вычисления. Тут в принципе нет варианта выполнить подобное в виде потоков.

Добавлено через 4 минуты
Ещё вспомнил экзотик из жизни. Была закрытая библиотека, которая способна работать только в 32х битном режиме. Нужно было прикрутить её к 64х битному процессу. Что бы сделать подобное пришлось запустить отдельный 32х битный процесс, который работал с этой библиотекой. А 64х битный процесс уже работал с 32х битным процессом.
2
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 128
12.10.2019, 19:59  [ТС]
Ygg, Alexei55555, Evg,
Спасибо!

А мой пример с threads - правильный ? Или еще могу что-то добавить в деталях.

Заранее Спасибо!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 20:19
Цитата Сообщение от robben_55 Посмотреть сообщение
А мой пример с threads - правильный ?
Если для экзамена, то правильный

Если по-настоящему, то надо спрашивать специалистов. У web-сервера очень короткий сеанс: получил соединение, выплюнул данные и завершил работу. В таких условиях, возможно, без потоков будет работать быстрее. Но в современном web'е уже может быть всё и не так просто

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Если для экзамена, то правильный
Правда вывод не совсем корректно сделан. Многопоточный сервер в первую очередь нужен ради того, чтобы на многоядерном процессоре работать эффективно. Чем больше ядер, тем лучше работает, а от программиста никаких дополнительных усилий не требуется. А "не тупит и успевает обрабатывать запросы" от многопоточности мало зависит. Сетевые соединения всё равно операционной системой обрабатываются последовательно. Да и чтение файлов с диска условно последовательно. Это одни из узких мест, и многопоточность там не особенно и спасает
1
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 128
12.10.2019, 20:33  [ТС]
Часть текста с книги Operating Systems by Silberschatz.

It is generally more efficient to use one process that contains multiple threads. If the web-server process is
multithreaded, the server will create a separate thread that listens for client
requests. When a request is made, rather than creating another process, the
server creates a new thread to service the request and resume listening for
additional requests.

---------------------------------------------------------------------------------------------------------------------------

Я только начал изучать эти вопросы. Уважаемые форумчане, правильно ли тут написано ?
С уважением.

Добавлено через 1 минуту
+ а ядро операционной системы использует threads ?
могу ли я так же включить его в свой вопрос?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 20:47
Здесь сказано, что после получения запроса от клиента, создаётся отдельный поток, который этот запрос обработает и выплюнет ответ клиенту (to service the request). Вероятно, подразумевается, что сам процесс исполнения запроса является длительным, т.е. непосредственное время обработки запроса сильно превышает время, требуемое на создание потока. В каком-то смысле это помогает "не тупить и успевать обрабатывать запросы"

Т.е. я понял, что тут имел в виду автор, но по простому объяснить это сложно. Но совсем вкратце - так сделано НЕ для того, как я это писал в конце поста #6. А именно ради того, чтобы не тупить. В ссылке из поста #2 почитай раздел 2.2. Здесь необходимость вынесения работы в поток продиктована примерно такими же соображениями

Добавлено через 2 минуты
Цитата Сообщение от robben_55 Посмотреть сообщение
+ а ядро операционной системы использует threads ?
Кратко: нет. Более развёрнуто: вопрос поставлен некорректно. Ядро создаёт возможность для работы потоков. Объяснять сложно и долго. Можешь попробовать почитать тут https://www.cyberforum.ru/blog... g4913.html, есть некоторая вероятность, что после этого начнёшь лучше понимать
1
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 128
12.10.2019, 21:04  [ТС]
Finally, most operating-system kernels are now multithreaded. Several
threads operate in the kernel, and each thread performs a specific task, such
as managing devices, managing memory, or interrupt handling. For example,
Solaris has a set of threads in the kernel specifically for interrupt handling;
Linux uses a kernel thread for managing the amount of free memory in the
system.

Опять-таки та же книга.


Я прочитал ваш FAQ, но ничего не понял.
Если не трудно, тут можете написать самые тривиальные примеры, когда предпочтительнее использовать threads, а когда processes. Если не составит труда напишите тут, пожалуйста. Если да - благодарен вам за попытки мне помочь.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 21:33
Цитата Сообщение от robben_55 Посмотреть сообщение
Finally, most operating-system kernels are now multithreaded. Several
threads operate in the kernel, and each thread performs a specific task, such
as managing devices, managing memory, or interrupt handling. For example,
Solaris has a set of threads in the kernel specifically for interrupt handling;
Linux uses a kernel thread for managing the amount of free memory in the
system.
Я не знаю, что это, но это явно какая-то сильно внутренняя кухня ядра операционной системы. К тем потокам, которые используются на пользовательском уровне, внутриядерные потоки отношения не имеют. Это просто однофамильцы. Возможно, что внутри ядра они даже называются не thread, а как-то иначе, просто автор для простоты назвал их словом thread

Цитата Сообщение от robben_55 Посмотреть сообщение
Если не трудно, тут можете написать самые тривиальные примеры, когда предпочтительнее использовать threads, а когда processes
См. пост #2 и пост #4
1
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 128
12.10.2019, 21:41  [ТС]
Ygg, Уважаемый.

Ваш пример про софт , который вещает каналы.

Например может ли это быть программа для IPTV ?
Например сама программа когда запускается - она и является процессом+ а ещё когда мы хотим смотреть HBO TV например, чтобы мы могли смотреть этот канал , программа создаёт новый процесс , чтобы показывать нам данный канал ? И даже если ошибка в трансляции идёт от сервера HBO , данный процесс запустивший Канал для просмотра hbo можно закрыть (то есть нажав на крестик) и данная проблема в трансляции никак не перейдёт на главный процесс , так так процессы изолированы друг от друга ?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
12.10.2019, 22:05
Цитата Сообщение от robben_55 Посмотреть сообщение
Например может ли это быть программа для IPTV ?
Я описал реализацию серверной части IP-сервера от Elecard. Там не видео по запросу, а постоянно работающие "живые" широковещательные каналы. Желающие подключаются к каналам и смотрят их. Проблемы клиентов, их подключение или отключение не влияет на работу серверной части. Серверная часть работает всегда в соответствии с заданным расписанием.

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

Потоки.

Тактовая частота процессора (ядра) ограничена, но ядер может быть несколько. Если задача для своего решения требует миллиарда простых операций, то при выполнении на одном ядре решение займёт некоторое фиксированное время. Если же разбить задачу на несколько независимых частей и каждую часть выполнять на своём ядре, то время можно сократить в столько раз, сколько задействовано ядер. Есть, например, алгоритмы сортировки, которые построены на разбивании данных и сортировки каждой части в отдельном потоке с последующим слиянием результатов. Алгоритмы кодирования видео активно используют разделение картинки на части и параллельный обсчёт каждой части.

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

Некоторые задачи можно разбить на части, но нельзя распараллелить. Каждая следующая часть требует результатов полученных предыдущей частью. Если такие задачи подразумевают потоковую обработку данных (новые данные постоянно поступают для обработки), то можно организовать конвейер. Все части задачи будут выполняться последовательно, но каждая в своём потоке. Это позволяет параллельно выполнять первую часть для новых данных, вторую часть для предыдущих данных и т.д. Многие медиа-плееры построены на данном принципе. Одна часть читает файлы, вторая декодирует, третья как-то обрабатывает, четвёртая выводит на экран.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
12.10.2019, 22:49
Лучший ответ Сообщение было отмечено robben_55 как решение

Решение

Цитата Сообщение от robben_55 Посмотреть сообщение
чтобы мы могли смотреть этот канал , программа создаёт новый процесс , чтобы показывать нам данный канал ?
Я если честно сильно не знаком с технологиями IPTV, но например, как работает кабельное... На каждое соединение клиента не нужен отдельный процесс, иначе серверное оборудование просто захлебнется, со стороны сервера просто выполняется широковещательная рассылка, а приемники просто принимают пакеты и декодируют их в соответствии с протоколом. Что значит широковещательная рассылка, это рассылка не конкретным клиентам в сети, а всем и поддерживать связь между клиентом и сервером не нужно. Т.е. серверу "наплевать" сколько клиентов его пакеты принимают, его задача только отправлять эти пакеты.
По поводу IPTV я не знаю, но как минимум всё идет по протоколу UDP - это когда нет постоянного подтверждения между клиентом и сервером о успешности доставки пакета. Например в TCP когда клиент не принял пакет, он направляет серверу уведомление об этом, и сервер заново высылает пропущенные пакеты, и так же со стороны сервера, если подтверждение от клиента не пришло, то он опять же заново высылает пакеты. Вот в таком виде соединений, лучше использовать процессы.
А потоки используют для ускорений вычислений и для работы с общей памятью, когда потоку нет смысла жить отдельно от процесса и это по сути одно целое, только разбитое по ядрам ЦП.

Добавлено через 6 минут
Кстати, Google chrome, насколько мне известно, на каждую вкладку создает отдельный процесс, как раз для того, что бы не убивать весь браузер или он не тормозил, когда одна из вкладок подвисла
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
13.10.2019, 14:43
Цитата Сообщение от robben_55 Посмотреть сообщение
It is generally more efficient to use one process that contains multiple threads. If the web-server process is
multithreaded, the server will create a separate thread that listens for client
requests. When a request is made, rather than creating another process, the
server creates a new thread to service the request and resume listening for
additional requests.
Цитата Сообщение от robben_55 Посмотреть сообщение
Например, в каком случае я выберу threads - веб сервер.
Цитата Сообщение от robben_55 Посмотреть сообщение
А мой пример с threads - правильный ?
Ваш пример соответвствует написанному в книге. Это так только на системах, где потоки значительно "легче" процессов. Линукс, напр. к таким не относится. А между прочим, именно на нем крутится львиная доля веб-серверов.
Цитата Сообщение от robben_55 Посмотреть сообщение
Например, в каком случае я выберу threads - веб сервер.
В случае веб сервера, вам правильный ход мысли указал Evg.
Апач, напр. испльзует отдельные процессы на Линуксе и потоки на Венде для каждого соединения. Это его делает тормозным. Нджинкс, напротив, использует один мастер-процесс для всех соединений и быстро передает его на обработку рабочим процессам (обычно по количеству ядер).
Цитата Сообщение от robben_55 Посмотреть сообщение
Если не трудно, тут можете написать самые тривиальные примеры
Ваше вам уже написали. Процессы - если нужна изоляция, напр. вкладки Хромиума. Потоки, если нужен параллельный доступ к одной области данных.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.10.2019, 15:02
gng,
Решения с потоками по идее должно быть в целом шустрее чем решение с процессами и в линуксе тоже. Например при переключении контекста если с одного ядра слезет задача сервера, и на это же ядро залезет другая задача этого же сервера, то в случае с процессами будут страдать кеши, а с потоками такой проблемы нет потому что память то одна. А у процессов - каждому отдельный участок памяти. Но с процессами иногда надежнее.

Насчёт нгинкс они вроде отказались от мастер процесса который раздаёт соединения на обработку, вместо этого каждый процесс теперь может принимать соединения (каждый процесс садится на одинаковый порт за счёт so_reuseport)
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
13.10.2019, 15:19
Цитата Сообщение от Undisputed Посмотреть сообщение
Насчёт нгинкс они вроде отказались от мастер процесса который раздаёт соединения на обработку, вместо этого каждый процесс теперь может принимать соединения (каждый процесс садится на одинаковый порт за счёт so_reuseport)
Посмотрел. Появилась опция конфигурации reuseport. По умолчанию у меня на nginx 1.10 не включена. Попробую включить для интереса. Спасибо.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.10.2019, 15:25
gng,
Ок, не за что.
https://m.habr.com/ru/post/259403/
Если интересно тут подробно расписано, с какой версии это работает. Бенчмарки тоже есть
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.10.2019, 15:39
Цитата Сообщение от Undisputed Посмотреть сообщение
а с потоками такой проблемы нет потому что память то одна
У них только общая память для глобальных данных. Если потоки будут выделять память через malloc, то это тоже будет разная память. Конкретно в случае web-сервера почти наверняка так и будет. А в случае какой-нибудь счётной задачи - почти наверняка НЕ будет. Правда в последнем случае данные скорее всего будут размещаться в стеке, а потому с точки зрения кэша тоже нет никакой разницы по сравнению с процессами
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.10.2019, 15:53
Evg,
ну зависит от того как вообще организованы данные.
наличие маллок ведь != разная память
множество потоков вполне себе может использовать один и тот же пул
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.10.2019, 16:08
Цитата Сообщение от Undisputed Посмотреть сообщение
множество потоков вполне себе может использовать один и тот же пул
Конечно, может. Но в случае web-сервера поток выделяется для того, чтобы выполнить условно независимую задачу. Это один из способов применения потока. Я так понимаю, что в посте #15 ты говорил именно о web-сервере

Когда речь идёт о кэше, то речь об одних и тех же данных можно вести только тогда, когда они действительно одни и те же с точностью до cache-line байт (величина порядка 64 байт). И только тогда, когда потоки долбятся в один и тот же маленький фрагмент, можно говорить о более эффективном использовании кэша. Как только потоки начали долбиться в соседние фрагменты (пусть и выделенные внутри одного пула памяти), то тут уже два физически разных cache-line'а, а следовательно, уже нет принципиальной разницы между потоками и процессами с точки зрения кэша
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2019, 16:08
Помогаю со студенческими работами здесь

В каких случаях нужно создавать динамические переменные, а в каких статические?
такой же вопрос и по массивам ! Объясните пожалуйста !

В каких случаях создаётся имя в кодировке utf-16 файла или папки, а в каких нет?
Друзья! Вынужден ковыряться со сторонними файлами, где без кодировки utf-16 не обойтись, век бы её не знал. Хотелось бы выяснить принцип...

Объясните в каких случаях используеться char, а в каких string?
Зачем(в каких случаях) использовать char, и char *... Зачем(в каких случаях) использовать string...

В каких случаях предпочтительней использовать процедуры
В каких случаях предпочтительней использовать процедуры&

В каких случаях лучше использовать класс с параметрами?
public class Pair<TFirst,TSecond>{ public TFirst First; public TSecond Second; } Если сделать вот так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru