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

Время работы двух программ выполняется отдельно, а затем вместе

Недавно я задал этот вопрос в интервью, и, хотя я делал все в порядке в первых двух частях [я предполагаю], я немного потрудился на третьем. Здесь вопрос:

У вас есть две Linux-программы: A и B. Когда вы запускаете отдельно, каждый A и B выполняют одну минуту, чтобы завершить работу в системе, которая только что была перезапущена. [то есть: новая система: вы перезагрузите ее, войдите в систему, получите приглашение оболочки, запустите программу.]

Что вы можете рассказать мне о программах, если:

a) при запуске вместе они занимают 2 минуты б) при запуске вместе они занимают 1 минуту c) при запуске вместе они занимают 30 секунд.

Я сказал для a), что если они берут ровно вдвое больше времени, когда они работают вместе, они не разделяют взаимного исключения и соперничают за все те же ресурсы, возможно, не используют каких-либо данных или инструкций кэш-памяти [и, таким образом, 't помогать друг другу из перспективы кеша], и каждая программа нуждается в полном использовании указанного ресурса для завершения, так что ОС не может их распараллелить.

В b) я сказал, что если они могут работать так же быстро вместе, они, вероятно, разделяют пространственную/временную локальность в наличных деньгах и могут поддаваться надлежащей конвейерной обработке таким образом, что, хотя программа A ожидает что-то, программа B может работать между этими этапами и наоборот - эффективно запускать их в течение одной минуты.

Для c), я немного застрял. Оглядываясь назад, я, вероятно, должен был сказать, что, возможно, программы A и B выполняли общую задачу, когда два из них одновременно запускали задачу быстрее, чем одна, работающая одна - например, сборщик мусора. Но самое лучшее, что я мог придумать, было то, что, возможно, они загрузились из одного сектора на жесткий диск, и это помогло им вместе работать быстро.

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

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

4b9b3361

Ответ 1

Вместе они берут 2 минуты, чтобы завершить

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

Также возможно, что это будет наблюдаемое поведение, если обе программы смогут и хотят насытить какой-либо другой ресурс отдельно от ЦП, например, какое-то устройство ввода-вывода. Однако, поскольку на практике, как правило, производительность устройств ввода/вывода не уменьшается линейно с нагрузкой, применяемой к ним, если они перенасыщены, я бы подумал, что менее вероятный сценарий и перейдет с привязкой к CPU в качестве первого предположения.

Вместе они берут 1 минуту для завершения

Две программы не оспаривают одни и те же ресурсы, или в системе достаточно ресурсов для удовлетворения потребностей обоих. Поэтому они не мешают друг другу.

Вместе они берут полминуты, чтобы завершить

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

Так как в этом случае время работы линейно уменьшается с количеством процессов (идеальное масштабирование), представляется более вероятным, что ресурс, ограничивающий программы, является CPU по тем же причинам, которые объясняются в сценарии "2 минуты". Это также хорошо согласуется с предположением "общего входа", поскольку вход не будет очень вероятным из одного источника, если таковые имеются, например, различные устройства ввода/вывода, обеспечивающие его.

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

Ответ 2

Для A они являются программами, конкурирующими за взаимоисключающий ресурс.

Для B, они независимые программы, которые действительно не взаимодействуют.

Для C, с которым вы боретесь, кажется, что у них обоих есть одна и та же работа. Например, есть очередь задач, которые нужно выполнить, обе программы способны выполнять задачи, и они знают, какие задачи были выполнены. Поэтому, если они оба запускаются в одно и то же время (при условии, что многоядерная машина, но даже тогда не обязательно, все, что важно, так это то, что у них нет узких мест в ресурсах), они получают работу за половину времени.

Ответ 3

См. Производительность в многопоточном приложении Java по другой причине, по которой процессы могут работать быстрее, когда у вас несколько.

Хотя я признаю, что очередь задач, которые могут выполняться одновременно, является гораздо более простой причиной для объяснения этого сокращения времени работы.