Два или более процессоров и один или несколько модулей памяти используют для взаимодействия
одну и ту же шину. Если процессору нужно считать слово из памяти , он сначала проверяет,
свободна ли шина. Если шина свободна , процессор помещает адрес нужного слова на шину,
устанавливает несколько сигналов управления и ждет , когда память поместит на шину нужное
слово. Если шина занята, процессор просто ждет, когда она освободится. Это все упирается в
пропускную способность шины, что ограничивает производительность, если процессоров много.
Чтобы разрешить эту проблему, нужно добавить кэш -память к каждому процессору.
Поскольку теперь считывать слова можно из кэш -памяти , движения в шине будет
меньше, и система сможет поддерживать большее количество процессоров.
Еще одна возможность — каждый процессор имеет не только кэш -память , но и свою
локальную память. Чтобы оптимально использовать такую конфигурацию, компилятор
должен поместить в локальные модули памяти программу, константы, другие данные ,
предназначенные только для чтения, стеки и локальные переменные. Общая разделенная
память используется только для общих переменных.
Предположим , что память согласована по последовательности. Что произойдет , если
процессор 1 содержит в своей кэш-памяти строку, а процессор 2 пытается считать слово из
той же строки кэш -памяти ?
При отсутствии специальных правил процессор 2 получит копию этой строки в свою кэш
-память . В принципе помещение одной и той же строки в кэш-память дважды вполне
приемлемо. А теперь предположим , что процессор 1 изменяет строку, и сразу после этого
процессор 2 считывает копию этой строки из своей кэш-памяти. Он получит устаревшие
данные, нарушая контракт между программным обеспечением и памятью. Ни к чему хорошему
это не приведет.
Эта проблема, которую называют непротиворечивостью кэш , очень важна. Если ее не
разрешить, нельзя будет использовать кэш-память, и число мультипроцессоров,
подсоединенных к одной шине, придется сократить до двух - трех. Было предложено
множество различных решений, но все эти алгоритмы, называемые протоколами когерентности
кэширования, различаются в некоторых деталях, и не допускают одновременного появления
разных вариантов одной и той же строки в разных блоках кэш-памяти.
Во всех решениях контроллер кэш -памяти разрабатывается так, чтобы кэш -память
могла перехватывать запросы на шине, контролируя все запросы шины от других
процессоров и других блоков кэш -памяти и предпринимая те или иные действия в
определенных случаях. Эти устройства называются кэш-памятью с отслеживанием (snooping
caches или snoopy caches). Набор правил, которые выполняются кэ -памятью, процессорами и
основной памятью, чтобы предотвратить появление различных вариантов данных в
нескольких блоках кэш-памяти, формируют протокол когерентности кэширования. Единица
передачи и хранения кэш-памяти называется строкой кэш -памяти .
Самый простой протокол когерентности кэширования называется сквозным
кэшированием. Рассмотрим 4 случая, приведенные в таблице. Если процессор пытается
считать слово, которого нет в кэш-памяти , контроллер кэш -памяти загружает в кэш -
память строку , содержащую это слово. Строку предоставляет основная память, которая
в этом протоколе всегда обновлена. В дальнейшем информация может считываться из
кэш-памяти.
Действие Локальный запрос Удаленный запрос
Промах при чтении Вызов данных из памяти
Попадание при чтении Использование данных из
локальной кэш -памяти
Промах при записи Обновление данных в
памяти
Попадание при записи Обновление основной и Объявление элемента кэш -
кэш -памяти памяти недействительным
В случае промаха кэш -памяти при записи слово, которое было изменено, записывается в
основную память. Строка, содержащая нужное слово, не загружается в кэш -память . В
случае результативного обращения к кэш -памяти при записи кэш обновляется, а слово
плюс ко всему записывается в основную память . Суть протокола состоит в том, что в
результате всех операций записи записываемое слово обязательно проходит через
основную память, чтобы информация в основной памяти всегда обновлялась.
Рассмотрим все эти действия снова, но теперь с точки зрения кэш -памяти с
отслеживанием. Назовем кэш -память, которая выполняет действия, кэш-1, а кэш с отслеживанием
— кэш -2. Если при считывании произошел промах кэша-1, он запрашивает шину, чтобы
получить нужную строку из основной памяти. Кэш-2 видит это, но ничего не делает. Если
нужная строка уже содержится в кэш -1, запроса шины не происходит , поэтому кэш -2 не знает о
результативных считываниях из кэша-1.
Процесс записи более интересен. Если процессор 1 записывает слово, кэш-1 запрашивает
шину как в случае промаха кэш, так и в случае попадания. Всегда при записи кэш-2 проверяет
наличие у себя записываемого слова. Если данное слово отсутствует, кэш -2 рассматривает это
как промах отдаленной памяти и ничего не делает.
А теперь предположим, что кэш-1 записывает слово, которое присутствует в кэш-2. Если
кэш-2 не произведет никаких действий, он будет содержать устаревшие данные, поэтому элемент
кэш-памяти, содержащий измененное слово, помечается как недействительный. Соответствующая
единица просто удаляется из кэш -памяти. Все кэш отслеживают все запросы шины, и всякий раз,
когда записывается слово, нужно обновить его в кэш-памяти инициатора запроса, обновить его
в основной памяти и удалять его из всех других кэш. Таким образом, неправильные варианты
слова исключаются.
Процессор кэш-памяти-2 вправе прочитать то же самое слово на следующем цикле. В этом
случае кэш-2 считает слово из основной памяти, которая уже обновилась. В этот момент
кэш-1, кэш-2 и основная память содержат идентичные копии этого слова. Если какой-нибудь
процессор произведет запись, то другие кэш будут очищены , а основная память опять обновится.
Возможны различные вариации этого основного протокола. Например, при успешной записи
отслеживающий кэш обычно объявляет недействительным элемент, содержащий данное слово. С
другой стороны, вместо того чтобы объявлять слово недействительным, можно принять новое
значение и обновить кэш-память . По существу , обновить кэш-память — это то же самое, что
признать слово недействительным, а затем считать нужное слово из основной памяти.
Во всех кэш-протоколах нужно сделать выбор между стратегией обновления и стратегией
с признанием данных недействительными. Эти протоколы работают по разному. Сообщения об
обновлении несут полезную нагрузку, и следовательно, они больше по размеру, чем сообщения
о недействительности, но зато они могут предотвратить дальнейшие промахи кэш-памяти.
Другой вариант — загрузка отслеживающей кэш -памяти при промахах. Такая загрузка никак
не влияет на правильность выполнения алгоритма. Она влияет только на производительность.
Возникает вопрос : какова вероятность, что только что записанное слово вскоре будет записано
снова? Если вероятность высока, то можно говорить в пользу загрузки кэш-памяти при
промахах записи (политика заполнения по записи). Если вероятность мала, лучше не
обновлять кэш-память в случае промаха при записи . Если данное слово скоро будет
считываться, оно все равно будет загружено после промаха при считывании, и нет смысла
загружать его в случае промаха при записи.
Это решение не очень эффективно. Каждая операция записи должна передаваться в
основную память по шине, а при большом количестве процессоров это затруднительно.
Поэтому были разработаны другие протоколы. Все они характеризуются одним общим свойством: не
все записи проходят непосредственно через основную память. Вместо этого при изменении
строки кэш-памяти внутри кэш -памяти устанавливается бит, который указывает, что строка в
кэш -памяти правильная, а в основной памяти — нет. В конечном итоге эту строку нужно будет
записать в основную память , но перед этим в память можно произвести много записей. Такой
тип протокола называется протоколом с обратной записью.
Один из популярных протоколов с обратной записью называется MESI. В его основе
лежит протокол однократной записи. Протокол MESI используется в Pentium II и других
процессорах для отслеживания шины. Каждый элемент кэш-памяти может находиться в одном
из следующих четырех состояний:
1. Invalid — элемент кэш -памяти содержит недействительные данные .
2. Shared — несколько кэш могут содержать данную строку; основная память обновлена.
3. Exclusive — никакой другой кэш не содержит эту строку; основная память обновлена.
4. Modified — элемент действителен; основная память недействительна; копий элемента
не существует.
При загрузке процессора все элементы кэш -памяти помечаются как недействительные.
При первом считывании из основной памяти нужная строка вызывается в кэш -память
данного процессора и помечается как Е (Exclusive), поскольку это единственная копия в кэш -
памяти
При последующих считываниях процессор использует эту строку и не использует
шину. Другой процессор может вызвать ту же строку и поместить ее в кэш-память, но
при отслеживании исходный держатель строки (процессор 1) узнает, что он уже не
единственный, и объявляет, что у него есть копия. Обе копии помечаются состоянием S
(Shared). При последующих чтениях кэшированных строк в состоянии S процессор не
использует шину и не меняет состояние элемента.
Затем процессор 2 записывает эту строку снова, что делает недействительной копию в
кэш-памяти процессора 3 .
Наконец, процессор 1 производит запись в слово в этой строке. Процессор 2 видит
это и передает на шину сигнал, который сообщает процессору 1, что нужно подождать, пока
строка не будет записана в основную память. Когда это действие закончится, процессор
помечает собственную копию строки как недействительную, поскольку он знает, что
другой процессор собирается изменить ее. Появляется ситуация, в которой процессор
записывает что-либо в некэшированную строку. Если применяется политика write-allocate,
строка будет загружаться в кэш-память и помечаться как М. Если политика write-allocate
не применяется, запись будет производиться непосредственно в основную память, а строка
в кэш-памяти сохранена не будет.
Когда запрос памяти приходит в блок управления памятью, производится проверка и определяется,
находится ли нужное слово в локальной памяти. Если да, то запрос отправляется по локальной шине.
Если нет, то запрос направляется по системной шине к системе, которая содержит данное слово.
Вторая операция занимает гораздо больше времени, чем первая. Выполнение программы из
удаленной памяти занимает гораздо больше времени, чем выполнение той же программы из локальной
памяти.
Согласованность памяти гарантирована в машине NC-NUMA, поскольку там
отсутствует кэш -память. Каждое слово памяти находится только в одном месте, поэтому
нет никакой опасности появления копии с устаревшими данными : здесь вообще нет копий.
Имеет большое значение, в какой именно памяти находится та или иная страница, поскольку
от этого зависит производительность. Машины NC-NUMA используют сложное программное
обеспечение для перемещения страниц, чтобы максимально увеличить производительность.
Обычно существует «сторожевой » процесс (демон), так называемый страничный
сканер, который запускается каждые несколько секунд. Он должен следить за статистикой
использования страниц и перемещать их таким образом, чтобы улучшить
производительность. Если страница окажется в неправильном месте, страничный сканер
преобразует ее таким образом, чтобы следующее обращение к ней вызвало ошибку из -
за отсутствия страницы .
Когда происходит такая ошибка, принимается решение о том, куда поместить эту
страницу, возможно, в другую память, из которой она была взята раньше. Для
предотвращения пробуксовки существует следующее правило - если страница была
помещена в то или иное место, она должна оставаться в этом месте на время некоторое
время.
Каждый раз переходить к удаленной памяти, чтобы получить доступ к слову,
которого нет в локальной памяти , очень невыгодно: это сильно снижает
производительность. Однако с добавлением кэш -памяти нужно будет добавить и способ
совместимости кэшей. Для создания мультипроцессоров действительно большого размера
нужен совершенно другой подход .
Самый популярный подход для построения больших мультипроцессоров CC-NUMA
(Cache Coherent NUMA — NUMA с согласованной кэш -памятью) — мультипроцессор на
основе каталога.
Основная идея состоит в сохранении базы данных, которая сообщает, где именно
находится каждая строка кэш -памяти и каково ее состояние. При обращении к строке
кэш -памяти из базы данных выявляется информация о том, где находится эта строка и
изменялась она или нет. Поскольку обращение к базе данных происходит на каждой
команде, которая обращается к памяти, база данных должна находиться в высокоскоростном
специализированном аппаратном обеспечении, которое способно выдавать ответ на
запрос за долю цикла шины.
Рассмотрим в качестве примера систему из 256 узлов, в которой каждый узел состоит
из одного процессора и 16 Мбайт ОЗУ, связанного с процессором через локальную
шину. Общий объем памяти составляет 232 байтов. Она разделена на 226 строк кэш -памяти
по 64 байта каждая . Память статически распределена по узлам: 0-16 М в узле 0, 16 М-32
М — в узле 1 и т. д. Узлы связаны через сеть ). Сеть может быть в виде решетки,
гиперкуба или другой топологии. Каждый узел содержит элементы каталога для 2 18 64-
байтных строк кэш -памяти , составляя свою 224-байтную память. На данный момент мы
предполагаем, что строка может содержаться максимум в одной кэш -памяти.
Чтобы понять, как работает каталог, проследим путь команды LOAD из процессора 20,
который обращается к кэшированной строке. Сначала процессор, выдавший команду, передает
ее в блок управления памятью, который переводит ее в физический адрес, например
0x24000108. Блок управления памятью разделяет этот адрес на три части,. В десятичной
системе счисления эти три части — узел 36, строка 4 и смещение 8. Блок управления
памятью видит, то слово памяти, к которому производится обращение, находится в узле 36,
а не узле 20, поэтому он посылает запрос через сеть в узел 36, где находится нужная
строка, и узнает, есть ли строка 4 в кэш -памяти, и если да, то где именно.
36 4
Когда запрос прибывает в узел 36, он направляется в аппаратное обеспечение каталога. Оно
индексирует таблицу их 218 элементов ( один элемент на каждую строку кэш -памяти ) и извлекает
элемент 4.
Видно, что эта строка отсутствует в кэш -памяти , поэтому аппаратное
обеспечение вызывает строку 4 из локального ОЗУ, отправляет ее в узел 20
и обновляет элемент каталога 4, чтобы показать, что эта строка находится в кэш -памяти
в узле 20.
А теперь рассмотрим второй запрос , на этот раз о строке 2 из узла 36. Видно,
что эта строка находится в кэш -памяти в узле 82. В этот момент аппаратное
обеспечение может обновить элемент каталога 2, чтобы сообщить , что строка находится
теперь в узле 20, а затем может послать сообщение в узел 82, чтобы строка из него была
передана в узел 20, и объявить недействительной его кэш -память.
Очевидным недостатком этой разработки является то, что строка может быть
кэширована только в одном узле. Чтобы строки можно было кэшировать в нескольких
узлах, потребуется какой-то способ их нахождения (например, чтобы объявлять
недействительными или обновлять их при записи ).
Возможны различные варианты. Одна из возможностей — предоставить каждому
элементу каталога к полей для определения других узлов, что позволит сохранять
каждую строку в нескольких блоках кэш -памяти ( допустимо до k различных узлов).
Вторая возможность — заменить номер узла битовым отображением, один бит на
узел. Здесь нет ограничений на количество копий, но существенно растут
непроизводительные затраты. Каталог, содержащий 256 битов для каждой 64- байтной (512-
битной) строки кэш -памяти , подразумевает непроизводительные затраты выше 50%.
Третья возможность — хранить в каждом элементе каталога 8-битное поле и использовать это
поле как заголовок связанного списка, который связывает все копии строки кэш -памяти
вместе. На практике используются все три стратегии.
Машины NUMA и CC-NUMA имеют один большой недостаток: обращения к удаленной
памяти происходят гораздо медленнее, чем обращения к локальной памяти . В машине
CC-NUMA эта разница в производительности в какой-то степени нейтрализуется благодаря
использованию кэш -памяти. Однако если количество требуемых удаленных данных сильно
превышает вместимость кэш -памяти , промахи будут происходить постоянно и
производительность станет очень низкой.
Существует архитектура в какой то мере свободная от недостатков UMA и NUMA. Она
называется СОМА (Cache Only Memory Access). В ней страницы памяти не имеют
собственных фиксированных машин, как в системах NUMA и CC-NUMA. Вместо этого
физическое адресное пространство делится на строки, которые перемещаются по
системе в случае необходимости.
Блоки памяти не имеют собственных машин. Память , которая привлекает строки по
мере необходимости, называется attraction memory. Использование основной памяти в
качестве большой кэш -памяти увеличивает частоту успешных обращений в кэш -память ,
а следовательно , и производительность.
Однако в системе СОМА появляется две новых проблемы:
1. Как размещаются строки кэш -памяти ?
2. Если строка удаляется из памяти , что произойдет, если это последняя копия?
Первая проблема связана со следующим фактом. Если блок управления памятью
транслировал виртуальный адрес в физический и если строки нет в аппаратной кэш -
памяти, то очень трудно определить, есть ли вообще эта строка в основной памяти.
Аппаратное обеспечение здесь не поможет, поскольку каждая страница состоит из
большого количества отдельных строк кэш -памяти, которые перемещаются в системе
независимо друг от друга. Даже если известно, что строка отсутствует в основной
памяти , как определить, где она находится? В данном случае нельзя спросить об этом
собственную машину, поскольку таковой машины в системе нет.
Было предложено несколько решений этой проблемы. Можно ввести новое
аппаратное обеспечение, которое будет следить за тегом каждой строки кэш -памяти .
Тогда блок управления памятью может сравнивать тег нужной строки с тегами всех строк
кэш -памяти, пока не обнаружит совпадение.
Другое решение — отображать страницы полностью, но при этом не требовать
присутствия всех строк кэш -памяти. В этом случае аппаратному обеспечению понадобится
битовое отображение для каждой страницы, где один бит для каждой строки указывает на
присутствие или отсутствие этой строки. Если строка присутствует, она должна
находиться в правильной позиции на этой странице . Если она отсутствует, то любая
попытка использовать ее вызовет прерывание, что позволит программному обеспечению найти
нужную строку и ввести ее.
Таким образом, система будет искать только те строки, которые действительно
находятся в удаленной памяти.
Мультикомпьютеры
Это параллельные компьютеры, в которых каждый процессор имеет свою собственную память,
к которой другие процессоры не могут получить прямой доступ. Программы на разных
процессорах в мультикомпьютере взаимодействуют друг с другом с помощью примитивов
send и receive, которые используются для передачи сообщений ( поскольку они не могут
получить доступ к памяти других процессоров с помощью команд LOAD и STORE). Это
различие полностью меняет модель программирования.
Каждый узел в мультикомпьютере состоит из одного или нескольких процессоров, ОЗУ
( общее для процессоров только данного узла ), диска и(или) других устройств ввода-вывода, а
также процессора передачи данных. Процессоры передачи данных связаны между собой по
высокоскоростной коммуникационной сети. Используется множество различных топологий, схем
коммутации и алгоритмов выбора маршрута. Все мультикомпьютеры сходны в одном: когда
программа выполняет примитив send, процессор передачи данных получает уведомление и
передает блок данных в целевую машину (возможно, после предварительного запроса и получения
разрешения).
Мультикомпьютеры бывают разных типов и размеров , поэтому очень трудно привести
хорошую классификацию. Тем не менее можно назвать два общих типа : МРР и COW.
МРР — процессоры с массовым параллелизмом.
СгауТЗЕ - использует процессоры DEC Alpha 21164. Это суперскалярный процессор RISC,
способный выдавать 4 команды за цикл. Alpha — это 64- битная машина с 64- битными
регистрами. Размер виртуальных адресов ограничен до 43 битов, а физических — до 40
битов. Таким образом, возможен доступ к 1 Тбайт физической памяти.
Каждый процессор Alpha имеет двухуровневую кэш-память, встроенную в микросхему
процессора. Кэш-память первого уровня содержит 8 Кбайт для команд и 8 Кбайт для
данных. Кэш -память второго уровня — это смежная трех входовая ассоциативная кэш-
память на 96 Кбайт, содержащая и команды и данные вместе . Кэш -память обоих уровней
содержит команды и данные только из локального ОЗУ, а это может быть до 2 Гбайт
на процессор. Поскольку максимальное число процессоров равно 2048, общий объем
памяти может составлять 4 Тбайт.
Каждый процессор Alpha заключен в особую схему, которая называется оболочкой
(shell). Оболочка содержит память, процессор передачи данных и 512 специальных регистров
(так называемых Е-регистров). Эти регистры могут загружаться адресами удаленной памяти
с целью чтения или записи слов из удаленной памяти (или блоков из 8 слов ). Это значит,
что в машине ТЗЕ есть доступ к удаленной памяти , но осуществляется он не с
помощью обычных команд LOAD и STORE. Эта машина представляет собой гибрид
между NC-NUMA и МРР, но все-таки больше похожа на МРР. Непротиворечивость памяти
гарантируется, поскольку слова, считываемые из удаленной памяти , не попадают в кэш -
память .
Узлы в машине ТЗЕ связаны двумя разными способами. Основная топология — дуплексный 3-
мерный тор. Например , система, содержащая 512 узлов, может быть реализована в виде куба
8x8x8. Каждый узел в 3-мерном торе имеет 6 каналов связи с соседними узлами ( по направлению
вперед, назад, вправо, влево, вверх и вниз). Скорость передачи данных в этих каналах связи равна
480 Мбайт/с в любом направлении.
Узлы также связаны одним или несколькими GigaRings — подсистемами ввода-вывода
с коммутацией пакетов, обладающими высокой пропускной способностью. Узлы используют
эту подсистему для взаимодействия друг с другом, а также с сетями, дисками и другими
периферическими устройствами. Они по ней посылают пакеты . Каждый GigaRing состоит
из пары колец шириной в 32 бита, которые соединяют узлы процессоров со
специальными узлами ввода-вывода. Узлы ввода-вывода содержат гнезда для сетевых
карт, дисков и других устройств.
В системе ТЗЕ может быть до 2048 узлов, поэтому неисправности будут
происходить регулярно. По этой причине в системе на каждые 128 пользовательских узлов
содержится один запасной узел. Испорченные узлы могут быть замещены запасными во
время работы системы без перезагрузки. Кроме пользовательских и запасных узлов есть
узлы, которые предназначены для запуска серверов операционной системы, поскольку
пользовательские узлы запускают не всю систему, а только ядро . В данном случае
используется операционная система UNIX.
Intel/Sandia Option Red
Option Red состоит из 4608 узлов, которые организованы в трехмерную сетку.
Процессоры установлены на платах двух разных типов. Платы kestrel используются в
качестве вычислительных узлов, а платы eagle используются для сервисных , дисковых,
сетевых узлов и узлов загрузки . Машина содержит 4536 вычислительных узлов, 32
сервисных узла , 32 дисковых узла, 6 сетевых узлов и 2 узла загрузки .
Плата kestrel содержит 2 логических узла , каждый из которых включает 2 процессора
и разделенное ОЗУ на 64 Мбайт. Каждый узел kestrel содержит собственную 64- битную
локальную шину и сетевой адаптер. Платы eagle также содержат процессоры Pentium Pro,
но всего два на каждую плату. Кроме того, они отличаются высокой производительностью
процесса ввода-вывода.
Платы связаны в виде решетки 32x38x2 в виде двух взаимосвязанных плоскостей 32x38
В каждом узле находится маршрутизатор с шестью каналами связи: вперед , назад,
вправо , влево, с другой плоскостью и с платой kerstel или eagle. Каждый канал связи
может передавать информацию одновременно в обоих направлениях.
Применяется пространственная маршрутизация, когда пакеты сначала потенциально
перемещаются в другую плоскость, затем вправо-влево, затем вперед-назад и, наконец, в
нужную плоскость, если они еще не оказались в нужной плоскости.
Два перемещения между плоскостями нужны для повышения отказоустойчивости.
Предположим, что пакет нужно переместить в соседний узел, находящийся впереди
исходного, но канал связи между ними поврежден. Тогда сообщение можно отправить в другую
плоскость, затем на один узел вперед, а затем обратно в первую плоскость, минуя таким
образом поврежденный канал связи.
Систему можно логически разделить на 4 части: сервис, вычисление, ввод -вывод и
система. Сервисные узлы — это машины UNIX общего назначения с разделением времени,
которые позволяют программистам писать и отлаживать свои программы .
Вычислительные узлы запускают большие приложения. Они запускают не всю систему
UNIX, а только микроядро. Узлы ввода-вывода управляют 640 дисками.
Есть два независимых набора узлов ввода-вывода. Узлы первого типа предназначены
для секретной работы, а узлы второго типа — для несекретной работы . Эти два набора
вводятся и удаляются из системы вручную, поэтому в каждый момент времени
подсоединен только один набор узлов, чтобы предотвратить утечку информации с
секретных дисков на несекретные диски. Наконец, системные узлы используются для
загрузки системы.
COW — Clusters of Workstations (кластеры рабочих станций )
Второй тип мультикомпьютеров — это системы COW или NOW (Network of Workstations —
сеть рабочих станций ). Обычно он состоит из нескольких сотен персональных
компьютеров или рабочих станций, соединенных посредством сетевых плат. Различие
между МРР и COW аналогично разнице между большой вычислительной машиной и
персональным компьютером. У обоих есть процессор, ОЗУ, диски, операционная система и т.
д. Но в большой вычислительной машине все это работает гораздо быстрее ( за
исключением, может быть, операционной системы). Однако они применяются и управляются
по-разному.
Исторически система МРР отличалась высокоскоростной сетью. Но с появлением
коммерческих высокоскоростных сетей это отличие начало сглаживаться . Преимущество
системы COW над МРР в том, что COW полностью состоит из доступных компонентов,
которые можно купить. Эти части выпускаются большими партиями. Эти части, кроме того ,
существуют на рынке с жесткой конкуренцией, из -за которой производительность растет , а
цены падают. Вероятно, системы COW постепенно вытеснят ММР, подобно тому, как
персональные компьютеры вытеснили большие вычислительные машины, которые
применяются теперь только в специализированных областях.
Существует множество различных видов COW, но доминируют два из них:
централизованные и децентрализованные. Централизованные системы COW представляют
собой кластер рабочих станций или персональных компьютеров, смонтированных в большой
блок в одной комнате. Иногда они компонуются более компактно, чем обычно, чтобы
сократить физические размеры и длину кабеля. Как правило, эти машины гомогенны и не
имеют никаких периферических устройств, кроме сетевых карт и, возможно, дисков.
Децентрализованная система COW состоит из рабочих станций или персональных
компьютеров, которые раскиданы по зданию или по территории учреждения. Большинство
из них простаивают много часов в день, особенно ночью . Обычно они связаны через
локальную сеть. Они гетерогенны и имеют полный набор периферийных устройств. Самое
важное, что многие компьютеры имеют своих владельцев.