правильный шаблон параллелизма - PullRequest
0 голосов
/ 06 декабря 2009

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

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

CPU extends Thread

//in main

get process1
get process 2
get process 3
get process 4

cpu1.run(process1)
cpu2.run(process2)
cpu3.run(process3)
cpu4.run(process4)

Прав ли я, если предположить, что поскольку процессоры расширяют поток, все они будут работать одновременно для завершения 4 процессов, или это будет похоже на выполнение 4 процессов на одном процессоре?

Ответы [ 4 ]

0 голосов
/ 06 декабря 2009

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

Но в простом случае ответ обычно да.

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

0 голосов
/ 06 декабря 2009

Срезы времени говорят о том, что вам придется разделить один ЦП между N потоками, которые вы решили запустить. Там не будет никакого параллелизма.

0 голосов
/ 06 декабря 2009

В вашем примере каждый ЦП может запускать процесс одновременно, поэтому, если у вас есть только 4 процесса, у вас все хорошо.

Если вы хотите, чтобы ваша программа работала и в случае, когда процессов больше, чем процессоров, вам нужно нечто более сложное. В этом случае я бы порекомендовал вам взглянуть на среду параллелизма Java. Для самого простого решения, когда у вас есть более 4 процессов, которые вы хотите запустить, я бы использовал ExecutorService.newFixedThreadPool (4) и добавил бы каждый процесс (как вызываемый) в результирующий пул потоков, используя любой invokeAll () или отправить ().

НО это не дает вам параллелизма между всеми запущенными процессами (он подхватит 5-й процесс только после завершения одного из первых 4 процессов). Если вы хотите, чтобы ваша программа работала как настоящая многопоточная ОС (где больше процессов может быть активнее, чем доступно ЦП), вам нужно добавить какой-то планировщик, который может назначать часть процесса на одном из доступных ЦП, затем (до того, как первый будет сделан) пусть другой процесс использует тот же самый ЦП для части своей работы и т. д. Так что он должен будет разрешить выполнение части процессов, затем выполнить часть одного или нескольких других процессов, затем позволить первые делают немного больше своей работы и т. д., пока не будут выполнены все процессы. Тогда вашему симулятору также потребуется какой-то способ решить, когда процесс может быть «приостановлен» (то есть отложен планировщиком для последующего получения) ...

0 голосов
/ 06 декабря 2009

Это зависит в основном от 3 вещей:

  1. Вид операций, связанных с потоками. Они разделяют переменные? Им нужна синхронизация между собой или они совершенно независимы?
  2. Среда, в которой они выполняются. Вы вставили тег Java, но неясно, хотите ли вы дать своему симулятору возможность планировать процессы на нескольких (реальных) процессорах или просто использовать более одного ядра. Кстати, если вы планируете использовать больше реальных процессоров, вам следует избегать зеленых потоков ( wikipedia ).
  3. Если вы хотите использовать несколько реальных ядер, вам также следует позаботиться о структуре процессора. Какой тип кэша они разделяют? И так далее ..

Есть ли у вас какой-либо симулятор планировщика в вашей ОС?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...