Задание №22 — Многопоточность
В файле содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Будем говорить, что процесс B зависит от процесса A, если для выполнения процесса B необходимы результаты выполнения процесса A. В этом случае процессы могут выполняться только последовательно. Информация о процессах представлена в файле в виде таблицы. В первом столбце таблицы указан идентификатор процесса (ID), во втором столбце таблицы – время его выполнения в миллисекундах, в третьем столбце перечислены с разделителем «;» ID процессов, от которых зависит данный процесс. Если процесс является независимым, то в таблице указано значение 0.
Типовой пример организации данных в файле:
| ID процесса B | Время выполнения процесса B (мс) | ID процесса(ов) А |
| 1 | 4 | 0 |
| 2 | 3 | 0 |
| 3 | 1 | 1; 2 |
| 4 | 7 | 3 |
Определите минимальное время, через которое завершится выполнение всей совокупности процессов, при условии, что все независимые друг от друга процессы могут выполняться параллельно.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Правильный ответ
17
Пояснение
Решение:
Независимый процесс стартует в нулевой момент, а зависимый может начаться только тогда, когда закончились все процессы, от которых он зависит. Поэтому момент завершения процесса равен , где — процессы из третьего столбца; для независимого процесса просто . Вся совокупность закончится в момент, равный наибольшему из значений .
В прилагаемом файле каждая зависимость ведёт к процессу с меньшим номером, поэтому хватает одного прохода по таблице сверху вниз (в электронной таблице это делается формулой в четвёртом столбце). Получаем:
| ID процесса | Время выполнения, мс | Зависит от | Момент завершения, мс |
|---|---|---|---|
| 1 | 4 | 0 | 4 |
| 2 | 3 | 0 | 3 |
| 3 | 1 | 1; 2 | 5 |
| 4 | 7 | 3 | 12 |
| 5 | 6 | 3 | 11 |
| 6 | 3 | 5 | 14 |
| 7 | 1 | 4; 6 | 15 |
| 8 | 2 | 7 | 17 |
| 9 | 7 | 0 | 7 |
| 10 | 8 | 0 | 8 |
| 11 | 6 | 9 | 13 |
| 12 | 6 | 10 | 14 |
То же самое короткой программой:
# данные из прилагаемого файла: ID: (время выполнения, [от кого зависит])
data = {
1: (4, []),
2: (3, []),
3: (1, [1, 2]),
4: (7, [3]),
5: (6, [3]),
6: (3, [5]),
7: (1, [4, 6]),
8: (2, [7]),
9: (7, []),
10: (8, []),
11: (6, [9]),
12: (6, [10]),
}
finish = {}
for i in sorted(data):
dur, deps = data[i]
finish[i] = max([finish[d] for d in deps], default=0) + dur
print(max(finish.values()))
Наибольшее значение в последнем столбце равно 17 мс (его даёт процесс 8) — это и есть минимальное время выполнения всей совокупности процессов.
Ответ: 17