Цель работы: изучить СД «стек» и «очередь», научиться их программно реализовывать и использовать.
З а д а н и е
1. Для СД «стек» и «очередь» определить:
1.1. Абстрактный уровень представления СД:
1.1.1. Характер организованности и изменчивости.
1.1.2. Набор допустимых операций.
1.2. Физический уровень представления СД:
1.2.1. Схему хранения.
1.2.2. Объем памяти, занимаемый экземпляром СД.
1.2.3. Формат внутреннего представления СД и способ его интерпретации.
1.2.4. Характеристику допустимых значений.
1.2.5. Тип доступа к элементам.
1.3. Логический уровень представления СД.
Способ описания СД и экземпляра СД на языке программирования.
2. Реализовать СД «стек» и «очередь» в соответствии с вариантом индивидуального задания в виде модулей на языках Pascal и С.
3. Разработать программы на языках Pascal и С, моделирующие вычислительную систему с постоянным шагом по времени (дискретное время) в соответствии с вариантом индивидуального задания (табл.16) с использованием модулей, полученных в результате выполнения пункта 2. Результат работы программ представить в виде таблицы 15. В первом столбце указывается время моделирования 0, 1, 2, …, N. Во втором — для каждого момента времени указываются имена объектов (очереди — F1, F2, …, FN; стеки — S1, S2, …, SM; процессоры — P1, P2, …, PK), а в третьем — задачи (имя, время), находящиеся в объектах.
|
|
Таблица 15
Результаты работы программы
Время | Объекты | Задачи |
F1 | (имя,время),(имя,время),...,(имя,время) | |
: | ::: | |
FN | (имя,время),(имя,время),...,(имя,время) | |
S1 | (имя,время),(имя,время),...,(имя,время) | |
: | ::: | |
SM | (имя,время),(имя,время),...,(имя,время) | |
P1 | (имя,время) | |
: | : | |
PK | (имя,время) | |
F1 | (имя,время),(имя,время),...,(имя,время) | |
: | ::: | |
FN | (имя,время),(имя,время),...,(имя,время) | |
S1 | (имя,время),(имя,время),...,(имя,время) | |
: | ::: | |
SM | (имя,время),(имя,время),..., (имя,время) | |
P1 | (имя,время) | |
: | : | |
PK | (имя,время) | |
: | : | ::: |
Таблица 16
Варианты индивидуальных заданий
Номер варианта | Номер модуля для стека | Номер модуля для очереди | Номер задачи |
Окончание табл.16
Варианты задач
|
|
1. Система состоит из процессора P, трех очередей F0, F1, F2 и стека S (рис.9). В систему поступают запросы. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
P: Byte;{приоритет задачи 0 —высший,
1 — средний, 2 — низший}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // Имя запроса
unsigned Time; // Время обслуживания
char P; /* Приоритет задачи: 0 — высший,
1 — средний, 2 — низший */
};
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста, можно обрабатывать задачи из очереди F1. Если и она пуста, то можно обрабатывать задачи из очереди F2. Если все очереди пусты, то система находится в ожидании поступающих задач (процессор свободен), либо в режиме обработки предыдущей задачи (процессор занят). Если поступает задача с более высоким приоритетом, чем обрабатываемая в данный момент, то обрабатываемая помещается в стек и может обрабатываться тогда и только тогда, когда все задачи с более высоким приоритетом уже обработаны.
Рис.9. Система задач 1 — 3
2. Система состоит из процессора P, трех очередей F0, F1, F2 и стека S (см. рис.9). В систему поступают запросы. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
P: Byte;{приоритет задачи 0 — высший, 1 — средний, 2 —низший}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
unsigned Time; // время обслуживания
char P; /* приоритет задачи: 0 — высший, 1 — средний, 2 — низший */
};
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста, можно обрабатывать задачи из очереди F1. Если и она пуста, то можно обрабатывать задачи из очереди F2. Если все очереди пусты, то система находится в ожидании поступающих задач (процессор свободен), либо в режиме обработки предыдущей задачи (процессор занят). Если обрабатывается задача с низшим приоритетом и поступает задача с более высоким приоритетом, то обрабатываемая помещается в стек и может обрабатываться тогда и только тогда, когда все задачи с более высоким приоритетом уже обработаны.
3. Система состоит из процессора P, трех очередей F0, F1, F2 и стека S (см. рис.9). В систему поступают запросы. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
P: Byte;{приоритет задачи 0 — высший,
1 — средний, 2 — низший}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // Имя запроса
unsigned Time; // Время обслуживания
char P; /* Приоритет задачи: 0 — высший,
1 — средний, 2 — низший */
};
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста, можно обрабатывать задачи из очереди F1. Если и она пуста, то можно обрабатывать задачи из очереди F2. Если все очереди пусты, то система находится в ожидании поступающих задач (процессор свободен), либо в режиме обработки предыдущей задачи (процессор занят). Если поступает задача с более высоким приоритетом, чем обрабатываемая в данный момент, то обрабатываемая помещается в стек, если она выполнена менее чем на половину по времени, и может обрабатываться тогда и только тогда, когда все задачи с более высоким приоритетом уже обработаны.
4. Система состоит из двух процессоров P1 и P2, трех очередей F0, F1, F2 и двух стеков S1 и S2 (рис.10).
Рис.10. Система задчи 4
В систему поступают запросы. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
P: Byte;{приоритет задачи 0 — высший,
1 — средний, 2 — низший}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
unsigned Time; // время обслуживания
|
|
char P; /* приоритет задачи: 0 — высший,
1 — средний, 2 — низший */
};
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Задача из очереди F0 поступает в свободный процессор P1 или P2, если оба свободны, то в P1. Если очередь F0 пуста, то обрабатываются задачи из очереди F1. Задача из очереди F1 поступает в свободный процессор P1 или P2, если оба свободны, то в P1. Если очереди F0 и F1 пусты, то обрабатываются задачи из очереди F2. Задача из очереди F2 поступает в свободный процессор P1 или P2, если оба свободны, то в P1. Если процессоры заняты и поступает задача с более высоким приоритетом, чем обрабатываемая в одном из процессоров, то задача из процессора помещается в соответствующий стек, а поступающая — в процессор. Задача из стека помещается в соответствующий процессор, если он свободен, и очереди с задачами более высокого приоритета пусты.
5. Система состоит из трех процессоров P1, P2, P3, очереди F, стека S и распределителя R (рис.11).
Рис.11. Система задач 5 и 6
В систему поступают запросы на выполнение задач трех типов — Т1, Т2 и Т3, каждая для своего процессора. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
T: Byte;{тип задачи 1 — Т1, 2 — Т2, 3 — Т3}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // Имя запроса
unsigned Time; // Время обслуживания
char T; // Тип задачи: 1 — Т1, 2 — Т2, 3 — Т3
};
Поступающие запросы ставятся в очередь. Если в «голове» очереди находится задача Ti и процессор Ti свободен, то распределитель ставит задачу на выполнение в процессор Pi, а если процессор Pi занят, то распределитель отправляет задачу в стек и из очереди извлекается следующая задача. Если в вершине стека находится задача, процессор которой в данный момент свободен, то эта задача извлекается и отправляется на выполнение.
6. Система состоит из трех процессоров P1, P2, P3, очереди F, стека S и распределителя R (рис.11). В систему поступают запросы на выполнение задач трех типов — Т1, Т2 и Т3, каждая для своего процессора. Запрос можно представить записью
|
|
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
T: Byte;{тип задачи 1 — Т1, 2 — Т2, 3 — Т3}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // Имя запроса
unsigned Time; // Время обслуживания
char T; // Тип задачи: 1 — Т1, 2 — Т2, 3 — Т3
};
Поступающие запросы ставятся в очередь. Если в «голове» очереди находится задача Ti и процессор Рi свободен, то распределитель ставит задачу на выполнение в процессор Pi, а если процессор Pi занят, то распределитель отправляет задачу в стек и из очереди извлекается следующая задача. Задача из стека поступает в соответствующий ей свободный процессор только тогда, когда очередь пуста.
7. Система состоит из двух процессоров P1 и P2, трех очередей F1, F2, F3 и стека (рис.12).
Рис.12. Система задач 7 и 10
В систему могут поступать запросы на выполнение задач трех типов — Т1, Т2, Т3. Задача типа Т1 может выполняться только процессором P1. Задача типа Т2 может выполняться только процессором P2. Задача типа Т3 может выполняться любым процессором. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
T: Byte;{тип задачи 1 — Т1, 2 — Т2, 3 — Т3}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
unsigned Time; // время обслуживания
char T; // тип задачи: 1 — Т1, 2 — Т2, 3 — Т3
};
Поступающие запросы ставятся в соответствующие типам задач очереди. Если очередь F1 не пуста и процессор P1 свободен, то задача из очереди F1 поступает на обработку в процессор P1. Если процессор Р1 обрабатывает задачу типа Т3, а процессор Р2 свободен и очередь F2 пуста, то задача из процессора Р1 поступает в процессор Р2, а задача из очереди F1 в процессор Р1, если же процессор Р2 занят или очередь F2 не пуста, то задача из процессора Р1 помещается в стек.
Если очередь F2 не пуста и процессор P2 свободен, то задача из очереди F2 поступает на обработку в процессор P2. Если процессор Р2 обрабатывает задачу типа Т3, а процессор Р1 свободен и очередь F1 пуста, то задача из процессора Р2 поступает в процессор Р1, а задача из очереди F2 — в процессор Р2, если же процессор Р1 занят или очередь F1 не пуста, то задача из процессора Р1 помещается в стек.
Если очередь F3 не пуста и процессор P1 свободен, и очередь F1 пуста или свободен процессор Р2 и очередь F2 пуста, то задача из очереди F3 поступает на обработку в свободный процессор. Задача из стека поступает на обработку в свободный процессор Р1, если очередь F1 пуста, или в свободный процессора Р2, если очередь F2 пуста.
8. Система состоит из двух процессоров P1 и P2 и двух очередей F1, F2 и стека S (рис.13). В систему могут поступать запросы на выполнение задач двух типов — Т1 и Т2. Задача типа Т1 может выполняться только процессором P1. Задача типа Т2 может выполняться любым процессором.
Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
T: Byte; {тип задачи 1 — Т1, 2 — Т2}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
unsigned Time; // время обслуживания
char T; // тип задачи 1 — Т1, 2 — Т2
};
Рис.13. Система задачи 8
Поступающие запросы ставятся в соответствующие типам задач очереди. Если очередь F1 не пуста и процессор P1 свободен, то задача из очереди F1 поступает на обработку в процессор P1. Если процессор Р1 обрабатывает задачу типа Т2, а процессор Р2 свободен, то задача из процессора Р1 поступает в процессор Р2, а задача из очереди F1 в процессор Р1, если же процессор Р2 занят, то задача из процессора Р1 помещается в стек.
Если очередь F2 не пуста и процессор P2 свободен, то задача из очереди F2 поступает на обработку в процессор P2. Если процессор Р2 занят, а процессор Р1 свободен и очередь F1 пуста, то задача из очереди F2 поступает в процессор Р1, а задача из стека поступает на обработку в свободный процессор Р2, если F2 пуста, или в свободный процессор Р1, если очередь F1 пуста и задачу нельзя поместить в процессор Р2.
9. Система состоит из двух процессоров P1 и P2 и трех очередей F1, F2, F3 и стека (рис.14).
Рис.14. Система задачи 9
В систему могут поступать запросы на выполнение задач двух типов — Т1 и Т2. Задача типа Т2 обрабатывается процессором P2. Задача типа Т1 сначала обрабатывается процессором P1, затем результат обработки (Т1`) обрабатывается процессором Р2.
Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
T: Byte; {тип запроса}
Time1: Word; {время обработки
процессором Р1. Для задач
типа Т2 Time1=0}
Time2: Word; {время обработки
процессором Р2}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
char T; // тип запроса
unsigned Time1; /* время обработки
процессором Р1. Для задач
типа Т2 Time1=0 */
unsigned Time2; /* время обработки
процессором Р2 */
};
Поступающие запросы на выполнение задач типа Т1 и Т2 ставятся в соответствующие типам задач очереди. Результат обработки Т1` задачи Т1 процессором Р1 ставится в очередь F3. Если очередь F1 не пуста и процессор P1 свободен, то задача из очереди F1 поступает на обработку в процессор P1.
Если очередь F3 не пуста и процессор P2 свободен, то задача из очереди F3 поступает на обработку в процессор P2. Если процессор Р2 занят выполнением задачи типа Т2, то она помещается в стек, а задача из очереди F3 — в процессор Р2. Задача из стека возвращается в процессор Р2, если очередь F3 пуста. Задача из очереди F2 поступает на обработку в процессор P2, если он свободен и очередь F3 и стек пусты.
10. Система состоит из двух процессоров P1 и P2, трех очередей F1, F2, F3 и стека (см. рис.12). В систему поступают запросы. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Time: Word; {время обслуживания}
P: Byte;{приоритет задачи 0 — высший,
1 — средний, 2 — низший}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // имя запроса
unsigned Time; // время обслуживания
char P; /* приоритет задачи: 0 — высший,
1 — средний, 2 — низший */
};
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F1. Задача из очереди F1 поступает в свободный процессор P1 или P2, если оба свободны, то в P1. Если очередь F1 пуста, то обрабатываются задачи из очереди F2. Задача из очереди F2 поступает в свободный процессор P1 или P2, если оба свободны, то в P1. Если очереди F1 и F2 пусты, то обрабатываются задачи из очереди F3. Задача из очереди F3 поступает в свободный процессор P1 или P2, если оба свободны, то в P2. Если процессоры заняты и поступает задача с более высоким приоритетом, чем обрабатываемая в одном из процессоров, то задача из процессора помещается в стек, а поступающая — в процессор. Задача из стека поступает в один из освободившихся процессоров, если все задачи с более высоким приоритетом уже обработаны.
11. Система состоит из двух процессоров Р1 и Р2, двух стеков S1 и S2 и четырех очередей F1, F2, F3, F4 (рис.15).
Рис.15. Система задачи 11
В систему могут поступать запросы на выполнение задач двух приоритетов — высший (1) и низший (2). Задачи сначала обрабатываются процессором P1, затем P2. Запрос можно представить записью
на языке Pascal:
Type
TInquiry= record
Name: String[10]; {имя запроса}
Р: Byte; {приоритет}
Time1: Word; {время выполнения задачи процессором P1}
Time2: Word; {время выполнения задачи процессором P2}
end;
на языке C:
typedef struct TInquiry
{
char Name[10]; // Имя запроса
char Р; // Приоритет
unsigned Time1; /* Время выполнения
задачи процессором P1 */
unsigned Time2; /* Время выполнения
задачи процессором P2 */
};
Запросы на выполнение задач высшего приоритета ставятся в очередь F1, а поступающие с процессора Р1 — в очередь F3. Запросы на выполнение задач низшего приоритета, поступающие с генератора задач, ставятся в очередь F2, а поступающие с процессора Р1 — в очередь F4.
Процессор Р1 обрабатывает запросы из очередей F1 и F2, а процессор Р2 — из очередей F3 и F4. Процессор сначала обрабатывает задачи из очереди задач с высшим приоритетом, затем из очереди задач с низшим приоритетом. Если процессор выполняет задачу с низшим приоритетом и приходит запрос на выполнение задачи с высшим приоритетом, то выполняемая задача помещается в соответствующий процессору стек, а пришедшая задача — в процессор. Задача из стека возвращается в процессор, если все задачи большего приоритета обработаны.