2016-03-04 3 views
9

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

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

+0

какое приложение? – ArchLicher

+0

веб-приложение, написанное на Java, развернутое на сервере tomcat – user2296988

ответ

7

Я могу говорить с точки зрения Java, поэтому ваш вопрос: «Когда несколько пользователей обращаются к приложению, как обрабатываются потоки?». Ответ: все зависит от того, как вы его запрограммировали, если вы используете какой-либо контейнер для веб-приложений, они предоставляют механизм пула потоков, в котором у вас может быть более одного потока для пользовательских запросов пользователя, у пользователя есть один инициированный запрос и который поворот обрабатывается одним потоком, поэтому, если есть 10 одновременных пользователей, будет 10 потоков для обработки 10 запросов одновременно, теперь у нас есть Non-blocking IO теперь дни, когда обработка запроса может быть отключена от других потоков, что позволяет менее 10 потоков для обработки 10 пользователей.

Теперь, если вы хотите знать, как точно выполняется планирование потоков вокруг ядра процессора, оно снова зависит от ОС. Одна вещь, обычная, хотя «поток - это базовая единица распределения для CPU». Начните с зеленых нитей here, и вы поймете это лучше.

2

Tomcat использует поддержку многопоточности Java для обслуживания HTTP-запросов.

Для обслуживания http-запроса tomcat запускает поток из пула потоков. Бассейн поддерживается для эффективности, поскольку создание потока дорого.

Обратитесь к документации по Java о параллельности читать далее https://docs.oracle.com/javase/tutorial/essential/concurrency/

Пожалуйста, см конфигурацию пула потоков TOMCAT для получения дополнительной информации https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html

4

Вам нужно понять о планировщик потоков. Фактически, в одном ядре процессор делит свое время между несколькими потоками (процесс не является точно последовательным). В нескольких ядрах два (или более) потока могут одновременно запускать . Прочитано thread article in wikipedia. Я рекомендую Tanenbaum's OS book.

6

Неверная assuption является

Если только один процессор существует, то все потоки будут работать один за другим.

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

В общем, ОС будет отвечать за планирование единиц исполнения. В былые времена в основном такие объекты были процессами. Теперь могут быть процессы и потоки (некоторые планируют только на уровне потока). Для простоты пусть ssume OS имеет дело только с потоками.

OS затем может разрешить поток запускать до тех пор, пока он не достигнет точки, в которой он не сможет продолжить, например. ожидая операции ввода-вывода для cpmplete. Это хорошо для потока, так как он может использовать CPU для макс. Это плохо для всех других потоков, которые хотят получить некоторые циклы процессора самостоятельно. (В общем, всегда будет больше потоков, чем доступные CPU. Так что проблема не зависит от количества процессоров.) Чтобы улучшить интерактивное поведение, ОС может использовать срезы времени, которые позволяют потоку запускаться в течение определенного времени. По истечении времени среза поток принудительно удаляется из CPU, и ОС выбирает новый поток для запуска (может даже быть только что прерван).

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

Итак, для ОС совсем не важно, является ли набор потоков результатом одного пользователя (или даже одного вызова в веб-приложении) или был создан рядом пользователей и веб-вызовов.

1

Есть две точки, чтобы ответить на ваш вопрос: Thread Scheduling & Thread Communication

Thread Scheduling реализация является специфичной для операционной системы. Программист не имеет никакого контроля в этом отношении, кроме установки приоритета для Thread.

Thread Communication приводится в движение program/programmer.

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

Вы можете запускать свои потоки параллельно или вы можете дождаться, когда потоки завершит выполнение, прежде чем продолжить (join, invokeAll, CountDownLatch и т. Д.). Программист имеет полный контроль над управлением жизненным циклом потока.

0

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

0

В «классических» реализациях все веб-запросы, поступающие на один и тот же порт, сначала обслуживаются одним и тем же потоком. Однако, как только будет получен запрос (Socket.accept возвращает), почти все серверы немедленно разветвят или повторно используют другой поток для завершения запроса. Некоторые специализированные серверы с одним пользователем, а также некоторые продвинутые серверы следующего поколения, такие как Netty, не могут.

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

Однако вполне возможно написать пользовательский код для сервера, который связывает, а затем повторно использует конкретный поток для веб-запроса зарегистрированного пользователя или IP-адреса. Это может быть трудно масштабировать. Я думаю, что стандартные простые серверы, такие как Tomcat, обычно не делают этого.

Смежные вопросы