Изменение вектора прерывания
MS-DOS предоставляет две функции 35h и 25h прерывания 21h для чтения и установки вектора прерывания.
Функция 35h
Выполняет чтение адреса подпрограммы обработки прерывания.
· Вызов:
ah = 35h
al = номер прерывания
· Возвращаемое значение:
es:bx – указатель на подпрограмму прерывания
· Примечание. Функция получает адрес, указанного AL прерывания из таблицы векторов прерываний. BX содержит смещение, а ES сегмент адреса подпрограммы.
Пример.
mov ah, 35h ; номер функции
mov al, 21h ; номер прерывания
int 21h
В результате: (BX) = 048B, (ES) = 0DDE.
Функция 25h
Выполняет занесение нового вектора прерывания.
· Вызов:
ah = 25h
al = номер прерывания
ds:dx – указатель на подпрограмму обработки прерывания
· Возвращаемое значение:
Нет
· Примечание. Функция устанавливает адрес прерывания, указанного в al в таблицу векторов прерываний. dx содержит смещение, а ds сегмент устанавливаемой подпрограммы.
Дополнительные сведения о структуре DOS и BIOS
Прямое обращение к видеопамяти
Видеопамять компьютера любой конфигурации расположена в адресном пространстве оперативного запоминающего устройства (ОЗУ). Это позволяет напрямую адресовать видеопамять одним из косвенных способов адресации памяти. Видеопамять занимает адреса с A000h по BFFFh, что составляет 128 Кбайт. Для увеличения объёмов видеопамяти (до 64 Мбайт), она делиться на слои, так что по одному адресу находиться несколько ячеек, которые расположены в разных слоях. Обращение к видеопамяти зависит от видеорежима, который определяет количество точек по горизонтали и вертикали, а так же количество битов, отводимую для хранения кода цвета каждой точки. Графическими режимами управляет видеоадаптер.
Более простым для программирования, допускающим простой доступ к видеопамяти, является символьный режим, который мы и рассмотрим подробнее. Для работы в символьном режиме отводится 16 Кбайт памяти, начиная с адреса B800h. Экран делится на 80 столбцов и 25 строк. Общее количество знакомест 80 х 25= 2000. Для каждого знакоместа в видеопамяти отводится два байта: чётный байт – ASCII код символа, нечётный – байт атрибутов. Счёт строк и колонок идёт из верхнего левого угла экрана, в байте b800h:0000h хранится символ выводящийся в нулевой строке и нулевой колонке, в байте b800h:0001h хранится атрибут этого символа. В байте b800h:0002h хранится символ выводящийся в нулевой строке и первой колонке, в байте b800h:0002h хранится атрибут этого символа и т.д.
Байт атрибутов имеет следующую структуру:
Фон | Символ | |||||||
Атрибут | BL | R | G | B | I | R | G | B |
Номер бита |
BL | – | признак мерцания; | R | – | красный цвет; | |
G | – | зелёный цвет; | B | – | синий цвет; | |
I | – | Интенсивность свечения. |
Для доступа к видеопамяти в текстовом режиме можно использовать непосредственно один из сегментных регистров, например, ES:
mov ax, 0b800h ; записать в регистр
mov es, ax ; es адрес начала видеопамяти
xor bx, bx ; смещение символа от начала видеопамяти
mov dh, 00010100b ; атрибуты: на голубом фоне красный символ
mov dl, 65h ; ASCII код символа
mov word ptr es:[bx], dx ; запись в видеопамять символа и атрибута
inc bx ; смещение для
inc bx ; следующего символа
Другой способ доступа – размещение сегмента данных фиксировано, в области видеопамяти директивой AT.
video segment AT 0b800h
CHAR_ATRIB db 4000 dup(?)
video ends
code segment
assume cs: code, ds:video
START: mov ax, video
mov ds, ax
xor si, si
mov dl, byte ptr CHAR_ATRIB[si] ;чтение символа
inc si
mov dh, byte ptr CHAR_ATRIB[si] ;чтение атрибута
. . .
Буфер клавиатуры
В ОЗУ, начиная с адреса 0040h, находится область данных BIOS, в которой хранится различная системная информация: адреса портов устройств, количество тиков таймера, начиная с полуночи и т.д. В частности, в этой области организован буфер клавиатуры, который способен принять до 15 символов от клавиатуры. Исполняемая программа должна опрашивать этот буфер и извлекать из него символы, иначе буфер переполнится, о чём свидетельствует писк встроенного динамика при нажатии очередной клавиши.
Буфер организован как круговой массив, т.е. при достижении конца буфера, он, если возможно начинает заполняться сначала. Два указателя: "голова" и "хвост" определяют состояние буфера. "Голова" показывает на первую свободную ячейку буфера, куда записывается очередной символ, поступивший от клавиатуры. "Хвост" показывает символ, который будет прочитан исполняемой программой при очередном обращении к буферу. Если буфер пуст, оба указателя показывают на одну и ту же ячейку буфера. Адрес "головы" буфера находится по адресу word ptr 0040h:001ah, а адрес "хвоста" по адресу word ptr 0040h:001ch. Если содержимое обоих указателей совпадает, значит клавиши нажаты не были. Эту проверку можно использовать для вызова в программе функции, читающей символ из буфера клавиатуры.
Пример выполнения работы
Написать программу на ассемблере, выводящую в текущее положение курсора символ @. Следующий символ @ выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. Вывод осуществлять непрерывно с некоторой задержкой. Нажатие клавиши “0” завершает выполнение программы.
· Примечание. В программе необходимо вести отсчёт времени для задержки вывода символа @. Для этого необходимо изменить подпрограмму обработки прерывания от таймера 08h. Так как эта подпрограмма выполняет важные операции по управлению компьютером, для получения временного интервала используется прерывание 1Ch. Это прерывание вызывается из подпрограммы обработки прерывания 08h и содержит только команду iret. Предназначено оно специально для пользовательских программ, которым необходимо следить за интервалами отсчёта таймера.
Текст программы
data segment
DIRECT db 1 ; направление перемещения
EXIT db 0 ; признак завершения программы (не 0)
SYM db "@" ; символ, выводимый на экран
ATRIBUT1 db 14 ; атрибут символа (жёлтый)
ATRIBUT2 db 10 ; атрибут символа (зелёный)
POS dw 3840 ; позиция начального вывода символа
OLD_CS dw ? ; адрес сегмента старого вектора 1Сh
OLD_IP dw ? ; адрес смещения старого вектора 1Сh
data ends
code segment
assume cs:code, ds:data
; Подпрограмма обработки прерывания 1Сh
NEW_1C proc far
push ax ; сохранить все регистры
push bx
push cx
push dx
push ds
push es
mov ax, DATA ; установить ds на сегмент данных
mov ds, ax ; основной программы
mov ax, 40h ; установить es на
mov es, ax ; сегмент данных bios
mov ax, es:[1ch]
mov bx, es:[1ah]
cmp bx , ax
jne m5
jmp back
m5: mov al, es:[bx]
mov es:[1ch], bx
cmp al, 30h
jnz m1
mov EXIT, 1
jmp back
m1: cmp al, 35h
jne m6
mov dl, ATRIBUT1
mov dh, ATRIBUT2
mov ATRIBUT1, dh
mov ATRIBUT2, dl
jmp back
m6: cmp al, 38h ; стрелка вверх
jz m2
cmp al, 32h ; стрелка вниз
jz m3
cmp al, 34h ; стрелка влево
jz m4
cmp al, 36h ; стрелка вправо
jnz back ; неиспользуемая клавиша
mov DIRECT, 3
jmp back
m2: mov DIRECT, 1
jmp back
m3: mov DIRECT, 4
jmp back
m4: mov DIRECT, 2
back: pop es
pop ds
pop dx
pop cx
pop bx
pop ax
iret
NEW_1C endp
; Подпрограмма очистки экрана
CLS proc near
push cx
push ax
push si
xor si, si
mov ah, 7
mov dl, ' '
mov cx, 2000
CL1: mov es:[si], ax
inc si
inc si
loop CL1
pop si
pop ax
pop cx
ret
CLS endp
; Подпрограмма задержки
DELAY proc near
push cx
mov cx, 100
d12: push cx
xor cx,cx
d11: nop
loop d11
pop cx
loop d12
pop cx
ret
DELAY endp
; Подпрограмма вывода символа с заданным атрибутом
OUT_SYMBOL proc near
push ax
push bx
mov al, SYM
mov ah, ATRIBUT1
mov bx, POS
call DELAY
mov es:[bx], ax
pop bx
pop ax
ret
OUT_SYMBOL endp
; Основная программа
START: mov ax, DATA
mov ds, ax
; чтение вектора прерывания
mov ah, 35h
mov al, 1Ch
int 21h
mov OLD_IP, bx
mov OLD_CS, es
; установка вектора прерывания
push ds
mov dx, offset NEW_1C
mov ax, seg NEW_1C
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
pop ds
mov ax, 0B800h
mov es, ax
call CLS
call DELAY
p1: cmp EXIT, 0
jne quit
cmp DIRECT, 1
jz p2
cmp DIRECT, 2
jz p3
cmp DIRECT, 3
jz p4
mov ax, POS
add ax,160
cmp ax, 3999
jg p1
mov POS, ax
call OUT_SYMBOL
jmp p1
p2: mov ax, POS
sub ax, 160
jl p1
mov POS, ax
call OUT_SYMBOL
jmp p1
p3: mov ax, POS
sub ax, 2
jl p1
mov POS, ax
call OUT_SYMBOL
jmp p1
p4: mov ax, POS
add ax, 2
jg p1
mov POS, ax
call OUT_SYMBOL
jmp p1
quit: call CLS
mov dx, OLD_IP
mov ax, OLD_CS
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
mov ax, 4c00h
int 21h
CODE ends
end START
Варианты заданий
Во всех вариантах задания завершение программы осуществляется при вводе цифры 0.
1. Выводить последовательно цифры от 0 до 9 в одно место экрана. При вводе с клавиатуры какой-либо цифры менять темп вывода. Значение задержки между выводом очередного символа определять следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
2. Выводить в одно место экрана поочерёдно код пробела и код какого-нибудь символа. Задержка между выводом каждого символа определяется нажатием цифровой клавиши следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
3. Выводить в одно место экрана введённый символ до тех пор пока не будет введён другой символ. Менять при выводе атрибут символа циклически от 1 до 15. Для анализа нажатия клавиши использовать вектор 1Ch.
4. Выводить в текущее положение курсора символ #. Следующий символ # выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. Вывод осуществлять непрерывно с некоторой задержкой. Задержка между выводом каждого символа определяется нажатием цифровой клавиши, следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
5. Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. С клавиатуры можно ввести любую латинскую букву, при этом, выводимый символ изменяется на введённый символ. Вывод осуществлять непрерывно с некоторой задержкой. Задержка между выводом каждого символа определяется нажатием цифровой клавиши, следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
6. В программе имеются два циклических счётчика, считающих от 0 до 23 и от 0 до 79. Их значение определяет соответственно строку и столбец для вывода символа на экран. При нажатии какойлибо клавиши на экран выводится символ % в положение, определяемое состоянием счётчиков на момент вывода. Для анализа нажатия клавиши использовать вектор 1Ch.
7. В программе имеется циклический счётчик, считающий от 1 до 6. При нажатии любой клавиши содержимое счётчика преобразуется в ASCII код и выводится в определённое место экрана, после чего счётчик продолжает считать. Для анализа нажатия клавиши использовать вектор 1Ch.
8. Посчитать за какое время процессор выполнить 1 000 000 команд mov DI, SI; add DI, SI; mul SI. Для подсчёта времени использовать вектор 1Ch. Выводить на экран преобразованное в ASCII коды число тиков таймера, затраченное на операцию.
9. Очистить экран. Вывести несколько строк произвольного текста (атрибут 14). Перехватив прерывание печати экрана Print Screen (Int 5h), менять атрибуты всех строк экрана циклически от 1 до 15. Каждое нажатие клавиши Print Screen вызывает изменение атрибута.
10. Выводить ежесекундно в правом верхнем углу экрана системное время “часы:минуты:секунды”.
11. Вывести несколько строк произвольного текста, содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяются строчными и т. д.
12. В программе имеется циклический счётчик, считающий от 00h до FFh. Его значение преобразуется в ASCII код и выводится в левом верхнем углу экрана через 18 тиков таймера. При нажатии клавиши ‘2’ время вывода уменьшается вдвое, а при повторном нажатии время вывода увеличивается в два раза. Для анализа нажатия клавиши и подсчёта числа тиков таймера использовать вектор 1Ch.
13. Заполнить экран произвольной информацией. Перехватить прерывание 1Ch, по нажатию клавиши ‘1’ осуществить горизонтальный скроллинг всего экрана влево на один столбец, при нажатии клавиши ‘2’ скроллинг вправо на один столбец.
14. Очистить экран. Вывести несколько строк произвольного текста. Перехватить прерывание экрана (Int 5h). Первый вызов этого прерывания располагает строки вертикально, следующий «нормально» и т.д.
15. Очистить экран. Заполнить его произвольной информацией. Перехватить прерывание экрана (Int 5h). Первый вызов этого прерывания переносит строчки верхней половины экрана на место нижних, а нижние на место верхних. Следующий вызов прерывания снова меняет их местами и т.д.
16. Выводить последовательно цифры от 0 до 9 в одно место экрана. При вводе с клавиатуры какой-либо цифры менять темп вывода. Значение задержки между выводом очередного символа определять следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
17. Выводить в одно место экрана поочерёдно код пробела и код какого-нибудь символа. Задержка между выводом каждого символа определяется нажатием цифровой клавиши следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
18. Выводить в одно место экрана введённый символ до тех пор пока не будет введён другой символ. Менять при выводе атрибут символа циклически от 1 до 15. Для анализа нажатия клавиши использовать вектор 1Ch.
19. Выводить в текущее положение курсора символ #. Следующий символ # выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. Вывод осуществлять непрерывно с некоторой задержкой. Задержка между выводом каждого символа определяется нажатием цифровой клавиши, следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
20. Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. С клавиатуры можно ввести любую латинскую букву, при этом, выводимый символ изменяется на введённый символ. Вывод осуществлять непрерывно с некоторой задержкой. Задержка между выводом каждого символа определяется нажатием цифровой клавиши, следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
21. В программе имеются два циклических счётчика, считающих от 0 до 23 и от 0 до 79. Их значение определяет соответственно строку и столбец для вывода символа на экран. При нажатии какой-либо клавиши на экран выводится символ % в положение, определяемое состоянием счётчиков на момент вывода. Для анализа нажатия клавиши использовать вектор 1Ch.
22. В программе имеется циклический счётчик, считающий от 1 до 6. При нажатии любой клавиши содержимое счётчика преобразуется в ASCII код и выводится в определённое место экрана, после чего счётчик продолжает считать. Для анализа нажатия клавиши использовать вектор 1Ch.
23. Посчитать за какое время процессор выполнить 1 000 000 команд mov DI, SI; add DI, SI; mul SI. Для подсчёта времени использовать вектор 1Ch. Выводить на экран преобразованное в ASCII коды число тиков таймера, затраченное на операцию.
24. Очистить экран. Вывести несколько строк произвольного текста (атрибут 14). Перехватив прерывание печати экрана Print Screen (Int 5h), менять атрибуты всех строк экрана циклически от 1 до 15. Каждое нажатие клавиши Print Screen вызывает изменение атрибута.
25. Выводить ежесекундно в правом верхнем углу экрана системное время “часы:минуты:секунды” .
Вопросы по теме
В чём суть концепции прерывания?
Как работает система прерывания по вектору?
В чём отличие команд ret и iret?
Какие способы получения/изменения вектора прерывания Вы знаете?
Как вызвать программное прерывание?
Какие существуют способы передачи параметров в подпрограмму обработки прерываний и возврата параметров из неё?
Какие действия производит процессор при получения запроса на прерывание?
В чём отличие команд call и int?
Федеральное агентство РФ по образованию
Государственное образовательное учреждение
Высшего профессионального образования
Донской государственный технический университет
Кафедра "ПОВТ и АС"
Методы распределения загрузки многопроцессорных вычислительных систем
Методические указания к лабораторным работам
по дисциплине «Архитектура вычислительных систем»
Ростов-на-Дону
2003 г.
ВВЕДЕНИЕ
Задача распределения (планирования) загрузки вычислительной системы (ВС) возникают уже и том случае, когда имеется только один процессор. Типичным примером является планирование загрузки ЭВМ, работающей в режиме мультипрограммирования. Задача определения последовательности обработки процессов на ЭВМ известна в различных постановках и представляет собой серьезную самостоятельную проблему, называемую в исследовании операций задачей упорядочения. Содержанием задач упорядочения является выбор дисциплины обслуживания с таким расчетом, чтобы некоторый принятый критерий качества функционирования системы достигал экстремального значения.
При планировании загрузки для многопроцессорных и многомашинных систем, содержащих более одного процессора, задача существенно усложняется. Оптимальные решения получены лишь для некоторых частных случаев, в общем же случае решение не получено. Практически планирование загрузки теперь уже не сводится лишь и задаче упорядочения. Наряду с этой задачей должна быть решена, причем в первую очередь, задача распределения загрузки процессоров, т.е. задача определения того, какие именно программные блоки из числа заданных должны обрабатываться на каждом из процессоров. Иначе говоря, требуется сопоставить каждой вершине граф-схеме алгоритма или программы (работе) некоторый процессор и определить последовательность реализации работ таким образом, чтобы либо минимизировать общее время решения данной задачи на ВС, либо получить максимальную загрузку ВС и обеспечить заданную надежность. Существенной отличительной особенностью в данной задаче является то, что необходимо соблюдать требование очередности выполнения отдельных работ определяемой алгоритмом решения задачи.
Ниже рассматриваются некоторые методы анализа структур граф-схем программ и планирования загрузки многопроцессорных и многомашинных вычислительных систем. На примерах иллюстрируется использование этих методов.
ЗАНЯТИЕ №1
Ярусно-параллельные формы представления граф-схем алгоритмов и определениеих характеристик
1. ЦЕЛЬ ЗАНЯТИЯ: практическое закрепление знаний о преобразовании схем алгоритмов к ЯПФ с целью их распараллеливания.
2. ОСНОВНЫЕ СВЕДЕНИЯ.
Отличительной особенностью многопроцессорных и многомашинных ВС является возможность параллельного выполнения независимых ветвей программы. Это свойство системы связано, с одной стороны, с наличием нескольких независимых вычислителей, а с другой - со свойствами самих алгоритмов, допускающих во многих случаях выделения параллельных ветвей.
Существует много различных способов отражения структуры вычислительного процесса, определяемого заданной программой для вычислительной системы. В частности, можно отметить различного рода блок-схемы, динамические диаграммы, граф-схемы и т.п. Для вычислительных систем, в которых могут быть организованы параллельные процессы, наиболее удобным оказывается использование граф-схем.
Всякую программу можно представить как некоторую последовательность работ (операторов), в результате чего получаем функциональный граф.
Для того чтобы связать функциональную граф-схему с реализацией ее в вычислительной системе, необходимо сопоставить каждой вершине функциональной граф-схемы некоторый вес, выражающий в условных единицах время выполнения данной работы с помощью вычислительных средств (процессора, ЭВМ) определенной производительности. Этот вес будем писать рядом с вершиной функциональной граф-схемы, которая теперь будет называется временной функциональной граф-схемой.
рис.1.1.
На рис.1.1. показан пример временной функциональной граф-схемы. Для отображения разветвлений в программах вводятся связи по управлению: сплошные дуги соответствуют функциональным связям между вершинами графа, а пунктирные - связям по управлению. Величины Xi, i=1,2,...,9 являются исходными данными, а величины Yi, i=1,2,3 есть результаты, которые должны быть получены в процессе реализации программы.
Как показывают связи по управлению, в качестве результата работы ВС может получиться либо Y1, либо Y2, либо Y3. Число типов процессоров равно двум.
Пусть имеется две работы, которые являются непосредственно функционально связанными или связаны по управлению. Ту работу, в которой в качестве идентификатора операнда используется идентификатор результата другой работы, будем называть зависимой. Если некоторая работа Gj зависит от GY, то это означает,что при реализации программы работа GY должна быть выполнена раньше работы Gj.
Упорядочим, теперь вершины графа программы. Множеством первого яруса или просто первым ярусом называются те работы, которые не зависят ни от каких других работ. Множеством второго яруса или вторым ярусом называют те работы, которые зависят, по крайней мере, от одной работы, входящей в первый ярус, и не зависят ни от какой другой работы. И вообще, множеством f-го яруса или f-м ярусом называются те работы, которые зависят, по крайней мере, от одной работы (f-1)-го яруса и не зависят ни от одной работы, других ярусов с номерами, меньшими (f-1). Граф, соответствующий такому упорядочению работ, называется ярусно-параллельным графом, а относительно программы, сопоставляемой этому графу, говорят, что она представлена в ярусно-параллельной форме (ЯПФ).
На рис.1.2 показана ярусно-параллельная форма программы, представленной на рис.1.1. В дальнейшем формально будем рассматривать ЯПФ, содержащие только функциональные связи, так как это по существу не влияет на методику решения рассматриваемых ниже задач распределения загрузки.
рис.1.2
Для оценки структур ЯПФ вводятся специальные показатели. Эти показатели служат для классификации ЯПФ по их структурным особенностям, для оценки согласованности структуры решаемой задачи со структурой самой многопроцессорной вычислительной системы. С помощью показателей удобно сравнивать и оценивать структуры ЯПФ, соответствующие различным вариантам организации решения одной и той же задачи. Особый интерес представляет использование числовых характеристик на этапе исследования способности задачи к распараллеливанию и выбора алгоритма решения, ЯЛФ программы которого характеризуются наилучшими показателями.
Шириной f-го яруса в графе G ЯПФ программы называется число работ bf, входящих в этот ярус.
Шириной B графа G ЯПФ называется максимальная ширина яруса в G.
Длиной (трудоемкостью) lfim i-ой работы в f-м ярусе ЯПФ относительно процессора (ЭВМ) m-го типа называется время ее реализации напроцессоре (ЭВМ) этого типа.
Длиной яруса lf в графе G ЯПФ называется максимальная длина работы, входящей в этот ярус.
Длиной Ткр графа G ЯПФ называется величина наиболее длинного (критического) пути, ведущего к заключительному состоянию этого графа. Длина G определяет минимально-возможное время реализации данного графа.
Дебалансом яруса df называется разность между длиной яруса и длиной самой короткой работы, входящей в данный ярус.
Дебалансом графа d ЯЛФназывается сумма всех дебалансов ярусов данного графа.
Заполнением Ef яруса f в графе G называется сумма
где bf - число работ в f-м ярусе; lfim - длина i-й работы находящейся в f-м ярусе для m-го процессора.