Задания
Версия для печати и копирования в MS Word
Тип 22 № 75286
i

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

В таб­ли­це пред­став­ле­ны иден­ти­фи­ка­тор (ID) каж­до­го про­цес­са, его дли­тель­ность в мс и ID по­став­щи­ков дан­ных для за­ви­си­мых про­цес­сов. Для не­за­ви­си­мых про­цес­сов в ка­че­стве ID по­став­щи­ка дан­ных ука­зан 0.

В мо­мент, когда про­цесс готов к за­пус­ку, он ста­вит­ся в оче­редь. Если не­сколь­ко про­цес­сов ока­зы­ва­ют­ся го­то­вы к за­пус­ку од­но­вре­мен­но, пер­вым ста­вит­ся в оче­редь тот про­цесс, у ко­то­ро­го мень­ше ID.

Од­но­вре­мен­но может вы­пол­нять­ся не более 3 про­цес­сов. Если в какой-то мо­мент в си­сте­ме ра­бо­та­ет менее 3 про­цес­сов, то при на­ли­чии го­то­вых к за­пус­ку про­цес­сов вы­би­ра­ет­ся и за­пус­ка­ет­ся пер­вый про­цесс из оче­ре­ди.

За какое время будут вы­пол­не­ны все про­цес­сы?

В от­ве­те на­пи­ши­те число  — тре­бу­е­мое время в мс.

За­да­ние 22

Спрятать решение

Ре­ше­ние.

На­ри­су­ем время вы­пол­ня­е­мых про­цес­сов:

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

Все про­цес­сы будут вы­пол­не­ны за 42 мс.

 

При­ве­дем ре­ше­ние на языке Python.

import collections

 

def solve():

# За­груз­ка дан­ных из файла

with open("22dz.txt", "r") as f:

processes_data = {}

for line in f:

parts = line.strip().split('\t')

pid = int(parts[0])

duration = int(parts[1])

providers = [] if parts[2] == '0' else [int(p) for p in parts[2].split(',')]

processes_data[pid] = {"duration": duration, "providers": providers}

 

current_time = 0

running = {} # {pid: end_time}

ready = collections.deque()

completed = set()

# Со­зда­ем за­ви­си­мо­сти для каж­до­го про­цес­са

dependencies = {pid: set(data["providers"]) for pid, data in processes_data.items()}

 

# Из­на­чаль­но за­пус­ка­ем про­цес­сы без за­ви­си­мо­стей

for pid, deps in dependencies.items():

if not deps:

ready.append(pid)

ready = collections.deque(sorted(ready))

 

while len(completed) < len(processes_data):

# Об­нов­ля­ем время до сле­ду­ю­ще­го за­вер­ше­ния про­цес­са

if running:

current_time = min(running.values())

 

# Об­ра­бот­ка за­вер­шен­ных про­цес­сов

finished = [pid for pid, t in running.items() if t <= current_time]

for pid in finished:

del running[pid]

completed.add(pid)

# Об­нов­ля­ем за­ви­си­мо­сти дру­гих про­цес­сов после за­вер­ше­ния

for p, deps in dependencies.items():

if p not in completed and p not in running and p not in ready:

if pid in deps:

deps.remove(pid)

if not deps:

ready.append(p)

ready = collections.deque(sorted(ready))

# За­пус­ка­ем новые про­цес­сы, если есть сво­бод­ные слоты

while len(running) < 3 and ready:

pid = ready.popleft()

end_time = current_time + processes_data[pid]["duration"]

running[pid] = end_time

 

# Если ни­че­го не про­ис­хо­дит, и про­цес­сы за­стря­ли

if not running and not ready and len(completed) < len(processes_data):

break # За­да­ча за­стря­ла, не­воз­мож­но за­вер­шить

 

return current_time

 

print(solve())

 

 

Ответ: 42.


Аналоги к заданию № 75259: 75286 Все