Структуры данных «стек» и «очередь» (Pascal/С)

Цель работы: изучить СД «стек» и «очередь», научиться их программно реализовывать и использовать.

З а д а н и е

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. Процессор сначала обрабатывает задачи из очереди задач с высшим приоритетом, затем из очереди задач с низшим приоритетом. Если процессор выполняет задачу с низшим приоритетом и приходит запрос на выполнение задачи с высшим приоритетом, то выполняемая задача помещается в соответствующий процессору стек, а пришедшая задача — в процессор. Задача из стека возвращается в процессор, если все задачи большего приоритета обработаны.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: