Подтвердить что ты не робот

Java - связь между потоками и процессорами

Я новичок в многопоточности, и я работаю над проектом, в котором я пытаюсь использовать 4 процессора в своей программе Java. Я хотел сделать что-то вроде

int numProcessors = Runtime.getRuntime().availableProcessors();
ExecutorService e = Executors.newFixedThreadPool(numProcessors);

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

Кроме того, предполагается, что служба пула потоков будет повторно использовать потоки, но если он увидит, что на другом ЦП будет больше, будет ли он убить поток и создать новую там?

4b9b3361

Ответ 1

Будет ли это гарантировать, что у меня будет один поток, работающий на процессор?

Если у вас есть четыре задачи, которые необходимо выполнить одновременно, вы можете ожидать, что у них есть поток. В JVM HotSpot он создает объект Thread, который является прокси-сервером для фактического потока при создании пула. Когда фактические потоки создаются и как, имеет значение для вас.

В то время, когда я создаю потоки, система не будет занята, однако через некоторое время она будет чрезвычайно занята. Я думал, что ОС будет выбирать наименее загруженный CPU для создания потоков, но как это работает, если ни один из них не будет особенно занят во время создания?

Темы создаются ОС и добавляются в список потоков для расписания.

Кроме того, предполагается, что служба пула потоков будет повторно использовать потоки, но если он увидит, что на другом ЦП будет больше, будет ли он убить поток и создать новую там?

Java не имеет права говорить по этому поводу. ОС решает. Он не убивает и не перезапускает потоки.

Нити не привязаны к процессорам так, как вы предлагаете. ОС передает потоки между процессорами, на основе которых один поток должен запускаться и какие ЦП свободны.

Ответ 2

нет, он ничего не гарантирует о том, где выполняются потоки

Фактически планировщик потоков ОС может переносить потоки вокруг ядер по мере их соответствия (так что одна строка может быть на ядре 0 и следующем на ядре 4)

вы можете установить affinity потоков, но это недоступно в java напрямую (AFAIK)

Ответ 3

", если он видит, что на другом процессоре больше доступности, он убьет поток и создаст новый там?"

Нет необходимости убивать и создавать другую, чтобы использовать доступный CPU. Темы - это объекты памяти, которые не привязаны к конкретному процессору и могут перемещаться из одного процессора в другой. Исполнение потока представляет собой цикл, подобный этому:

  • Thread.start() помещает поток в очередь процессора
  • когда имеется доступный процессор, планировщик берет первый поток в очереди процессора, который помещается в процессор.
  • когда поток блокируется на занятой блокировке или ждет завершения операции ввода-вывода, он снимается с процессора и помещается в соответствующую очередь. Когда блокировка освобождается или операция ввода-вывода завершается, поток перемещается из этой очереди обратно в очередь процессора.
  • когда поток работает слишком долго без блокировки (зависит от времени работы, например, 50 мс), происходит прерывание, и планировщик смотрит, есть ли потоки в очереди процессора. Если есть, текущий поток снимается с процессора и помещается в конец очереди процессора, а первый поток в очереди помещается в процессор. Таким образом, длинный поточный поток также позволяет выполнять другие потоки.

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