Как фреймворки java fork -join распределяют задачи по процессору?

Может кто-нибудь объяснить, как фреймворки java fork-join распределяют задачи для процессора. Можем ли мы это контролировать?

2 ответа

Решение

Зависит от ОС

на солярисе; Вы можете связать процессы или LWP (потоки) с набором процессоров (который может содержать 1-n процессоров / ядер)

на Linux; вы можете привязать процесс к 1-n процессорам / ядру через набор задач

не знаю на окнах

так что теоретически ответ "да" на солярисе, нет на 2 других платформах. Что касается соляриса, я думаю, что вам нужно вызвать jni, чтобы выполнить связывание при создании потока. В качестве альтернативы, если вы гарантируете, что потоки запускаются при запуске и никогда не перезагружаются в течение жизни vm, тогда вы можете запустить процесс, подождать n секунд, а затем проверить LWP, используя jstackнайдите нужные потоки, а затем привяжите эти потоки к предварительно определенному набору процессоров с помощью nids (native ids) в выходных данных jstack, poolbind & pooladm & poolcfg соответствующие команды, которые вам нужны на Solaris.

Фреймворки стилей соединения вилки обычно используют кражу работы для планирования задачи. Т.е. у каждого потока есть свой планировщик. И новые задачи ставятся в очередь в том же потоке, в котором они были созданы. Только когда очередь планировщика одного потока становится пустой, он "крадет" задачу, или работу, у другого планировщика.

Это явно упрощение.

Другие вопросы по тегам