Научная статья на тему 'Аппаратная поддержка диспетчера задач с глобальной очередью в многопроцессорных системах'

Аппаратная поддержка диспетчера задач с глобальной очередью в многопроцессорных системах Текст научной статьи по специальности «Математика»

CC BY
473
104
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
НЕДЕТЕРМИНИРОВАННЫЕ АВТОМАТЫ / АЛГОРИТМЫ ДИСПЕТЧЕРИЗАЦИИ ЗАДАЧ / АППАРАТНАЯ РЕАЛИЗАЦИЯ АЛГОРИТМОВ / МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ / NONDETERMINISTIC AUTOMATA / ALGORITHMS FOR TASK SCHEDULING / HARDWARE IMPLEMENTATION OF ALGORITHMS / MULTIPROCESSOR SYSTEMS

Аннотация научной статьи по математике, автор научной работы — Вашкевич Николай Петрович, Бикташев Равиль Айнулович, Меркурьев Андрей Игоревич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Вашкевич Николай Петрович, Бикташев Равиль Айнулович, Меркурьев Андрей Игоревич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Аппаратная поддержка диспетчера задач с глобальной очередью в многопроцессорных системах»

ИНФОРМАТИКА, ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА И УПРАВЛЕНИЕ

УДК 681.3.012

Н. П. Вашкевич, Р. А. Бикташев, А. И. Меркурьев АППАРАТНАЯ ПОДДЕРЖКА ДИСПЕТЧЕРА ЗАДАЧ С ГЛОБАЛЬНОЙ ОЧЕРЕДЬЮ В МНОГОПРОЦЕССОРНЫХ СИСТЕМАХ

Аннотация. Представлены результаты исследований по аппаратно-программной реализации функции диспетчеризации многопроцессорных операционных систем с глобальной очередью задач, а также формальное описание алгоритмов синхронизации взаимодействующих процессов при диспетчеризации задач на основе аппарата недетерминированных автоматов. Проведено моделирование алгоритмов на языке VHDL и проанализированы полученные результаты.

Ключевые слова: недетерминированные автоматы, алгоритмы диспетчеризации задач, аппаратная реализация алгоритмов, многопроцессорные системы.

Abstract. The article presents the results of research on hardware and software implementation of scheduling functions for multiprocessor operating systems with the global task queue. The authors give a formal description of algorithms for synchronization of cooperating processes in the scheduling of tasks on the basis of the apparatus of nondeterministic automata. The article also gives an account of the simulation of algorithms in VHDL and the analysis of research results.

Key words: nondeterministic automata, algorithms for task scheduling, hardware implementation of algorithms, multiprocessor systems.

Введение

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

Традиционно процедура диспетчеризации и связанная с ней синхронизация процессов осуществляются программным способом в пространстве ядра с применением механизма монитора [1]. Такой способ хорошо отработан, но требует значительных временных затрат на выполнение системных вызовов, связанных с вхождением процесса в монитор, и реализацию очереди блокированных процессов, возникающую из-за конкуренции множества процессоров при доступе к диспетчеру. Этот фактор существенно увеличивает время ожидания процессов и, следовательно, снижает общую производительность многопроцессорной системы. Известно, что на диспетчеризацию процессов уходит до десятка тысяч процессорных тактов, что соответствует временным потерям в несколько микросекунд на самых высоких частотах работы процессоров.

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

Аппаратная реализация требует поиска методов формализации алгоритмов функционирования, способных упростить и облегчить процесс проектирования соответствующих устройств. В работе использован аппарат недетерминированных автоматов (НДА) [2] для формализации алгоритмов управления диспетчеризацией задач в многопроцессорной системе и связанных с ней синхронизацией параллельных процессов.

1. Формализация алгоритма синхронизации процессов при диспетчеризации задач в многопроцессорных системах

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

В общем случае алгоритм диспетчеризации в явном виде связан с взаимодействием процессов. С одной стороны - задачи (процессы, потоки), требующие своего выполнения, с другой стороны - обслуживающие их процессорные узлы. Эти действия необходимо синхронизировать таким образом, чтобы обеспечить так называемое «рандеву» [3], когда}-й процессорный узел должен дождаться поступления задачи, а і-я задача - освобождения одного из

процессоров, после чего она будет обслуживаться в течение некоторого времени.

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

Традиционный подход, связанный с таким обслуживанием, аналогичен задаче «спящего парикмахера» [1, 3], который широко применялся для вычислительных систем с одним процессором. Для многопроцессорных систем такой подход должен быть расширен до задачи, которую можно назвать «работа парикмахерской». Эта задача иллюстрирует отношения «клиент-сервер», которые имеют место между процессами в многопроцессорных вычислительных системах. Причем аналогом процессоров является коллектив парикмахеров, а аналогом задач выступают клиенты парикмахерской [4].

Формальное описание алгоритма взаимодействия процессов в данной задаче базируется на использовании моделей недетерминированных автоматов [2]. Модели представляются в виде систем канонических уравнений, описывающих все реализуемые события управляющего алгоритма [4]. Весь алгоритм работы диспетчера содержит три части: клиентскую (постановка задачи в очередь), серверную (обслуживание процессорами) и «рандеву» (наличие задачи и готовность одного из процессоров к обслуживанию этой задачи). Для описания алгоритма введены основные частные события, представленные в табл. 1. В последней колонке представлено их соответствие сигналам на схеме устройства синхронизации процессов диспетчера задач.

Таблица 1

Обозначение события Описание частного события Сигналы на схемах

1 2 3

SI Поступление задачи извне S task arrived

SFQ В очереди имеются свободные места S fifo full

SQ Задача в очереди S task in queue

tZ Запрос у-го процессора диспетчером S_proc zaprj

SGPj Задача готова к обслуживанию в у-м процессоре, у-й процессор помещается в пул занятых S task readyj

SPj SPZ у-й процессор выдал сигнал подтверждения запроса S_proc_pzaprj

SsPj у-й процессор помещается в пул свободных S_proCjfreej

Ss В процессорном пуле имеются свободные процессоры S_proc_free

S у-й процессор задачу принял S_proc_prinyalj

SPj SSL у-й процессор выбран для обслуживания задачи S_proc selj

SA у-й процессор выполняет обслуживание задачи Аппаратно не реализовано

Окончание табл. 1

1 2 3

б0е Удалить задачу из очереди \\

Снять задачу с исполнения \\

БО Выполнение задачи закончено \\

Б1 Бкт Выдача результата выполнения текущей задачи \\

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

- для процесса «клиент», реализуемого диспетчером до момента рандеву:

^ (1 + 1) = V ;

- для процесса «сервер», реализуемого процессором до момента рандеву:

Б/ (1 + 1) = бЦ Б{д Б{Р]- V Б/ Б^ ;

БРт(1 + 1) = БР^ БоР}. (2)

Система канонических уравнений, описывающая события после рандеву:

БА (1 + 1) = Б/ Б^/ V Б% бЕ ; БРО (1 + 1) = Б% Б§ V Б/ Б^т ;

Б<кт (1 + 1) = Б% бе V Брт БО; Б*0Р (1 + 1) = б^бЬт ;

Б§р' (1 + 1) = БО Б*Кт V Бр Брр . (3)

Уравнениям соответствует граф недетерминированного автомата (рис. 1), содержащий клиентскую и серверную части алгоритма управления взаимодействующими процессами до момента «рандеву» (до оператора объединения /(&)) и после «рандеву», а также выбор /-го процессора для обслуживания очередной задачи.

Выбор /-го процессора для обслуживания очередной задачи (событие Б^) связан с синхронизацией параллельных процессов, определяющих

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

6

Рис. 1. Граф НДА-алгоритма управления взаимодействующими процессами при диспетчеризации задач в многопроцессорной системе

Система уравнений для событий, определяющих входы у-го процессора в монитор, и его выбора имеет вид

где Бр, - событие, определяющее наличие заявки от свободного у-го процессора на обслуживание очередной задачи; Брр - событие, определяющее прием заявки для обращения к разделяемым данным (прием заявки от свободного у-го процессора на обслуживание очередной задачи):

Бур (^ + 1) = (Бр у БУР ) Б!Рь ; (5)

Бу, - комбинационное событие, обеспечивающее взаимоисключение при осуществлении процедуры выбора свободных процессоров для обслуживания очередной задачи на основе несовместимости события БР^ с другими событиями из их общего числа, равного Ы, определяется выражением

<т<ру' — рр1 рр2 рРу-1 <?Ру+1 бРы • (6)

■■■ ■■■ ; (6) Бру, - событие, обеспечивающее приоритет выбора у-го процессора на обслуживание очередной задачи. Алгоритм вычисления приоритетного события для циклической дисциплины обслуживания дан в работе [5].

2. Моделирование алгоритма на языке УИБЬ

Аппаратная поддержка алгоритма диспетчеризации задач реализована в части синхронизации взаимодействующих процессов. Другие функции, такие как сохранение и восстановление контекста, перемещение процессов из очереди готовых задач в очередь ожидающих и т.п., реализуются традиционным путем и в данной модели не рассматриваются.

Устройство аппаратной поддержки рассмотрено на примере многопроцессорной системы, состоящей из восьми процессоров, объединенных общей шиной. Возможны два варианта подключения диспетчера к процессорному узлу. В первом варианте для передачи сигналов между процессором и диспетчером используется общая шина, что создает нежелательный дополнительный трафик на ней. Во втором варианте устройство диспетчеризации имеет собственный интерфейс взаимодействия с каждым процессором, т.е. в каждом процессорном узле реализован интерфейс для запроса и приема идентификаторов задач от диспетчера. Реализован второй подход, хотя он несколько усложняет процессорный блок, поскольку требует дополнительных выводов для вновь введенных сигналов. Общий вид системы представлен на рис. 2.

Клиентский процесс развивается следующим образом. Если имеется некоторая задача, ожидающая обслуживания, то диспетчер при условии, что имеются свободные процессоры, устанавливает активный уровень сигнала «Запрос» (Б ргос харг) на линии того процессора, который выбирается из числа свободных по заданному алгоритму. Процессор, получивший сигнал

диспетчера о его выборе для обслуживания текущей задачи, выходит из спящего режима и сообщает диспетчеру о том, что готов к приему и выполнению задачи. Для этого процессор устанавливает активный уровень сигнала «Подтверждение запроса» (8_ргос_ргарг), который воспринимает диспетчер. Кроме того, процессор снимает сигнал «Свободен» (Б_ргос_/гее), тем самым выходит из пула свободных. Процессор назначен, и далее диспетчер переходит к непосредственной передаче идентификатора задачи процессору. Для этого он извлекает идентификатор задачи из внутреннего регистра, выставляет его на шину (V_task_id) и передает в процессор сигнал «Задача готова» (S_task_ready). Этот сигнал гарантирует достоверность присутствия на шине идентификатора текущей задачи (V_task_id). Процессор фиксирует идентификатор на своем внутреннем регистре, после чего выставляет сигнал «Задача принята» (S_proc_prinyal).

ЦП < V_task_id ^ S task ready Sproczapr S_proc_prinyal S_proc_pzapr S_proc_free ^ Диспетчер

Рис. 2. Интерфейс взаимодействия одного процессора с диспетчером

Серверный процесс развивается так. Процессор, не занятый обслуживанием задачи (свободный), находится в спящем режиме. Сигнал «Свободен» (S_proc_free), поступающий от процессора к диспетчеру, принимает в этом случае активный уровень. Если в очереди имеются готовые задачи, выбирается обслуживающий процессор по приоритетному алгоритму, причем первый приоритет в данном случае присвоен процессору с номером І. Выбранный процессор выходит из спящего режима, выбирает задачу из начала очереди (S_fifo_read), получает идентификатор задачи по шине (V task id), выставляет сигнал «Задача принята» (S_proc_prinyal) и переходит в режим «Занято».

После этого диспетчер может снять данные с шины и перейти к назначению следующей задачи. Процессор, получивший идентификатор задачи, переходит к ее обслуживанию. Все сигналы интерфейса снимаются (на всех линиях устанавливается пассивный уровень). По завершении работы процессор извещает диспетчера о том, что свободен, путем установления активного уровня сигнала «Свободен» (S_proc_free), перемещается в пул свободных процессоров, поэтому диспетчер вновь будет учитывать его при распределении задач.

Аппаратно устройство синхронизации процессов при диспетчеризации задач представлено в виде четырех блоков: блок управления очередью задач, блок очереди задач FIFO, блок выбора процессора для обслуживания очередной задачи и блок управления ресурсами (рис. 3).

S fifo full ——=-►

S_fifo_empty

S_fifo_read —-—-—►

S_task_arrived

V_task

clk

S_proc_free_1

S_proc_free_^

S_proc_free_8

S_proc_pzapr_1

Блок управления очередью задач

S_proc_pzapr_8

S_proc_prinyal_1

S_proc_prinyal_8

reset

V_task_id

S_wrreq

S_rdreq

S_task_in_queue

Блок очереди задач FIFO

S_fifo_empty

Блок выбора процессора

S_proc_free

S_proc_sel_1

S_proc_sel_8

Блок управления ресурсами

S_fifo_fu

S_fifo_read

V_task_id

S_task_ready_1

S_task_ready_8

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

S_proc_zapr_1

S_proc_zapr_8

Рис. 3. Устройство синхронизации процессов при диспетчеризации задач

Блок управления очередью задач выполняет часть функций планировщика, т.е. формирует очередь задач и отслеживает ее состояние, используя для этого два сигнала. Активный уровень сигнала «FIFO заполнено» (S_fifo_fuU) сообщает планировщику о том, что принимать новые задачи запрещено, так как нет свободных регистров для записи и хранения новых идентификаторов. Так же обстоит дело и с поступающими задачами. Если в очереди нет места для записи новых идентификаторов задач, то они планировщиком не воспринимаются. Второй сигнал - «FIFO пустое» (SJifoempty) -указывает на то, что ни один идентификатор в очередь не поставлен, т.е. очередь задач пуста. О наличии задачи в очереди свидетельствует сигнал Staskinqueue. На его основе принимается решение о том, выводить из спящего режима процессор или нет. Если очередь задач пуста, то блок синхронизации не обращается к процессорам. Сигналы «FIFO заполнено» (SJifoJutt) и «FIFO пустое» (SJifo empty) формируются и поступают в блок управления очередью задач из блока FIFO.

Идентификаторы задач передаются в блок управления очередью задач по входной шине данных (Vtaskid). О том что на шине присутствует новая задача, планировщика извещает нарастающий фронт сигнала «Поступила задача» (Staskarrived). Если очередь не заполнена, то планировщик принимает данные с шины V task id и записывает их в конец очереди FIFO. Если очередь FIFO заполнена, данные на входной шине игнорируются. Запрос очередной задачи выполняет один из процессоров, выбранный в качестве обслуживающего. Для этого используется сигнал «Запрос задачи» (SJifo_readj). На основании этого сигнала блок диспетчеризации формирует сигнал «Чтение FIFO» (SJiforead) и передает его блоку управления очередью задач.

Планировщик управляет блоком очереди задач FIFO, пользуясь сигналами S_wrreq и Srdreq. S_wrreq используется для записи в очередь FIFO, а Srdreq - для чтения из нее. Блок очереди задач FIFO хранит поступающие идентификаторы задач. Идентификатор является частью контекста задачи и может состоять из нескольких полей, одно из которых указывает на адрес задачи в памяти.

Блок выбора процессора принимает все сигналы «Свободен» (S_proc_free) от всех процессоров в системе. Он определяет, присутствуют ли в данный момент в системе свободные процессоры, и, если в системе есть хотя бы один процессор, не занятый обслуживанием задачи, то этот блок устанавливает активный уровень сигнала «Есть свободные процессоры» (S_proc_free) и таким образом извещает блок синхронизации о том, что имеются «спящие» процессоры.

Выбор процессоров осуществляется схемой взаимоисключения, реализующей логическое выражение (б) и схемой приоритетов, реализация которой показана в [З]. Для сообщения блоку диспетчеризации о том, какой из процессоров выбран для обслуживания, служат сигналы (S_proc_sel_1, ..., S_proc_sel_8).

Блок управления ресурсами осуществляет взаимодействие очереди задач с процессорами по описанному ранее интерфейсу. Блок выбора процессора формирует информацию о том, какой из свободных процессоров выбран (на основании схемы приоритетов и взаимоисключения) для обслуживания текущей задачи. Идентификатор принятой на обслуживание задачи передается блоком очереди задач FIFO по шине V task id. Кроме того, блок управления очередью задач сообщает о состоянии очереди и осуществляет выборку идентификатора задач из блока очереди FIFO по требованию блока управления ресурсами. Все другие функции диспетчера и планировщика реализуются на уровне ядра операционной системы.

Модель устройства диспетчера была реализована на языке VHDL в виде четырех программных модулей. Ввод схем и работа производилась в свободно распространяемой версии системы Quartus II Version З.І Service Pack І, моделирование производилось в той же системе. Для проведения моделирования использовались два дополнительных блока.

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

ІІ

работы процессора, выставляет все сигналы интерфейса «процессор-диспетчер», имитируя ответы процессора. Когда идентификатор задачи получен блоком имитации, запускается счетчик, который отсчитывает заданное число тактов работы процессора. На это время блок имитации процессора отключается от диспетчера точно так же, как если бы реальный процессор, получив задачу, перешел бы к ее обслуживанию. Таким образом, процессор затрачивает на обработку задачи время, отсчитываемое счетчиком. После выполнения счетчиком заданного количества тактов блок имитации процессора сообщает диспетчеру о том, что он свободен.

Общий вид структурной схемы моделирования представлен на рис. 4.

Рис. 4. Схема постановки эксперимента

Из рис. 4 видно, что практически все описанные ранее сигналы для данной системы являются внутренними и генерируются самостоятельно. Тактирование всех блоков производится синхросигналами CLK. Перед началом работы имитатора необходимо произвести начальный сброс системы (reset) и запустить генератор задач (start). Для проверки результатов моделирования использовались выводы proc_work_\j] и task_id_proc_\j]. Первый вывод

(proc_work_[j]) информирует о том, что j-й процессор получил идентификатор текущей задачи и приступил к ее обслуживанию. Шина task_id_proc_[j] передает номер идентификатора, который получил j-й процессор. Также при моделировании фиксировалась шина данных блока очереди FIFO для контроля поступающих в систему идентификаторов задач (task_id_in_fifo). Результаты моделирования представлены на рис. 5.

Рис. 5. Временная диаграмма работы системы с восемью процессорами

Временная диаграмма показывает, что идентификатор первой поступившей задачи с номером «0007» ровно через 10 тактов поступил в процессор 8, после чего процессор выставил сигнал о начале ее обслуживания. Второй идентификатор задачи под номером «000Б» поступил через 10 тактов в процессор 7. Этот процессор, аналогично предыдущему, выставил сигнал о том, что занят, и приступил к обслуживанию второй задачи. Очевидно, что те 10 тактов, которые предшествуют назначению задачи процессору, уходят на работу самого диспетчера.

Заключение

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

программной реализации, в которой только вызов функции монитора занимает сотни тактов.

Список литературы

1. Таненбаум, Э. Современные операционные системы / Э. Таненбаум. - 2-е изд. -СПб. : Питер, 2002. - 1040 с.

2. Вашкевич, Н. П. Недетерминированные автоматы в проектировании систем параллельной обработки : учебное пособие / Н. П. Вашкевич. - Пенза : Изд-во Пенз. гос. ун-та, 2004. - 280 с.

3. Эндрюс, Г. Р. Основы многопоточного параллельного и распределенного программирования : пер. с англ. / Г. Р. Эндрюс. - М. : Вильямс, 2003. - 512 с.

4. Вашкевич, Н. П. Формализация алгоритма синхронизации процессов при диспетчеризации задач в многопроцессорных системах с использованием механизма рандеву / Н. П. Вашкевич, Р. А. Бикташев // Информационные технологии. -2009. - № 12. - С. 12-17.

5. Вашкевич, Н. П. Аппаратная реализация функций синхронизации параллельных процессов при обращении к разделяемому ресурсу на основе ПЛИС / Н. П. Вашкевич, Р. А. Бикташев, Е. И. Гурин // Известия высших учебных заведений. Поволжский регион. Технические науки. - 2007. - № 2. - С. 3-12.

Вашкевич Николай Петрович

доктор технических наук, профессор, кафедра вычислительной техники, Пензенский государственный университет

E-mail: [email protected]

Бикташев Равиль Айнулович

кандидат технических наук, доцент, кафедра вычислительных машин и систем, Пензенская государственная технологическая академия

E-mail: [email protected]

Меркурьев Андрей Игоревич аспирант, Пензенский государственный университет

E-mail: [email protected]

Vashkevich Nikolay Petrovich Doctor of engineering sciences, professor, sub-department of computer science, Penza State University

Biktashev Ravil Aynulovich Candidate of engineering sciences, associate professor, sub-department of computer science, Penza State Technological Academy

Merkuryev Andrey Igorevich Postgraduate student,

Penza State University

УДК 681.3.012 Вашкевич, Н. П.

Аппаратная поддержка диспетчера задач с глобальной очередью в многопроцессорных системах / Н. П. Вашкевич, Р. А. Бикташев, А. И. Меркурьев // Известия высших учебных заведений. Поволжский регион. Технические науки. - 2011. - № 3 (19). - С. 3-14.

i Надоели баннеры? Вы всегда можете отключить рекламу.