![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| AnReykfi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 7.12.2009 Репутация: нет Всего: нет |
Здравствуйте!
У меня вот выявилась проблема: Надо сдавать КП, а я ни как не могу написать программу. Суть программы: Написать на Pascal или Delphi (другого не знаю) следующее: Диспетчеризация процессов (очередей или заявок) с учётом относительных приоритетов. Нам дано: 1-ая Очередь из которой нам приходят "процессы". Фиксированного размера(размер=сколько заявок нужно обработать, мы вводим в ручную кол-во заявок) Заранее не известно какой "процесс" придёт. Очередь забивается заранее в ручную в стек на подобие массива, или связанных списков, или организации стека-ДЕК на выбор. Каждый элемент в массиве описывается следующими параметрами как: - Номер процесса - Время прихода к процессору - Длительность выполнения "процесса" - и самое важное: ПРИОРИТЕТ данного "процесса". 2-ая очередь: Динамически изменяющаяся, зависит от кол-ва элементов помещенных в неё. Можно сортировать. Типа "динамически-отсортированного буфера". По видимому как я понимаю должно быть как на картинке: ![]() Теперь суть: Забиваем наш типа "СТЕК", из эН-элементов сколько мы захотим, это будет Очередь 1: Приходит заявка из 1ой очереди, если процессор не занятый, и нет заявок во 2ой очереди (либо она пуста), то заявка начинает выполняться процессором столько времени, сколько ей нужно. Тута начинается цикл: Приходит вторая заявка, если заявка Номер 1 еще не обслужилась процессором, то Заявка Номер 2 становиться в Очередь 2, если обслужилась то начинает выполнение вторая заявка. Приходит 3тья заявка, а Первая еще обслуживается, то она становиться в очередь 2. Но вот случилось "чудо", Первая заявка облужилась, но по времени прихода пришла Четвертая заявка, теперь начинается "разбор полетов" между 4той-которая только что пришла, 3тье и 2ой-которые уже были на приеме у процессора, но не были выполнены. Из Очереди 2 Ищется Заявка с наивысшим приоритетом(например "0")(как я поняла метотодом банальной сортировки) и сравнивается с новенькой, если кто-то из Очереди 2 выше приоритетом "Новенькой" 4той из Очереди 1, то заявка из Очереди 2 становиться на выполнение, а 4тая заявка становиться в Очередь 2 и ждёт своего часа; если же "Новенькая" выше приоритетом заявок из Очереди 2 то она становиться на выполнение, а остальные в очереди 2 ждут своего часа. Но вот пришла проблема, наш "СТЕК" а именно Очередь 1 стала пустой, а в Очереди 2 есть еще заявки, тогда мы их сортируем и "выполняем" по приоритетам. Организовать вывод на экран (или диалоговое окно): - возможность ручного заполнения СТЕКА-Очереди 1 нужным нам количеством заявок... - вывести состояние очереди 1 до выполнения диспетчеризации... - выполнить диспетчеризацию... - выводить через каждый такт состояние 1 очереди(какая типа заявка пришла), процессора (какая заявка щас выполняется и сколько тактов ей осталось), состояние Очереди 2 ( какие заявки стоят и в каком виде)... Итд... с тем количеством заявок которые мы указали...... Огранизовать это: - "СТЕК" - эти циклы - дружественный интерфейс Можно в Виндовсном окне или в ДОСе.... ну главное что бы мне было понятно. Ну вот и всё=))) Заранее спасибо=)) ЗЫ. Пыталась всё конкретно разжевать то что мне нужно. ЗЗЫ. тип данных любой. Это сообщение отредактировал(а) AnReykfi - 15.5.2010, 12:42 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Эта очередь определена по условию, или выдумана? Не определены рамки понятия "Приоритет" - от него зависит количество "очередей". Не определено понятие "такт". Либо это квант времени зависящий от заявки, либо от диспетчера. -------------------- |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
В 2006 г. была подобная задача. "Очередь без приоритетов" - название.
Ещё дополнительный вопрос к заданию - можно ли пользоваться готовыми классами, которые реализованы в Delphi? Это не очень принципиально, но уростит реализацию. И ещё вопрос - что вызывает затруднения? -------------------- |
|||
|
||||
| AnReykfi |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 7.12.2009 Репутация: нет Всего: нет |
СТОП, опредена следующими условиями: Если в ней ничего нет, то она пустая... Если в неё что-то собираемся ложить, то добавляется 1 элемент (Номер процесса, его приоритет и время выполнения) Если что-то еще приходит то Очередь "расширяется" еще на 1 и туда кладётся то что пришло.... а потом сортируется по приоритетам.. Если что-то из очереди 2 ставиться на выполнение, то на уменьшается на 1 элемент.... Если что-то в очередь кладется (т.е Пришел из Очереди 1 низкоприоритетная заявка(или заявка котрая вызвала тупик- застопоривание(Заявка из очереди 1 по приоритету = Завке из Очереди 2 ), а в Очереди 2 есть более приоритетная заявка, которая пошла только что в этот такт времени на выполнение), то очередь 1 не меняет своего размера. (кажись так...) Вот мои первые шаги в развитии данного вопроса.... коряво, знаю....
И вот типа вывод на Экран: ![]() Такт, как бы это сказать..... щас попробую нарисую табличку.... Сама очередь: Такт - типа взятие из массива элемента и его обработка(постановка на выполнение и само выполнение, либо установка в очередь 2) Номер процесса | 1 | 2 | 3 | 4 | 5 | 6 | ..... вводим в ручную _________________________________________ Когда пришел | 1 | 2 | 4 | 5 | 7 | 9 |..... в какой такт пришел на обработку _________________________________________ Приоритет | 2 | 1 | 3 | 0 | 1 | 2 |.... 0 - самый высокий приоритет _________________________________________ Время выполнения | 2 | 3 | 4 | 1 | 2 | 4 |.... сколько нужно тактов или "квантов времени на выполнении данного эН-ного процесса... _________________________________________ Теперь что должно в конце получиться: Такт | Процессор | Очередь 2 (то что ждет на выполнение) -------------------------------------------------------------------------------- 1 | 1 (3) | пусто 2 | 1 (2) | 2(1прио) 3 | 1 (1) | 2(1прио) 4 | 2 (2) | 3(3прио) 5 | 2 (1) | 4(0прио), 3(3прио) 6 | 4 (1) | 3(3прио) 7 | 5 (2) | 3(3прио) 8 | 5 (1) | 3(3прио) 9 | 6 (4) | 3(3прио) 10 | 6 (3) | 3(3прио) 11 | 6 (2) | 3(3прио) 12 | 6 (1) | 3(3прио) 13 | 3 (4) | пусто 14 | 3 (3) | пусто 15 | 3 (2) | пусто 16 | 3 (1) | пусто 17 | пусто | пусто Колличесво тактов для выполнения например этой задачки = 16, просто суммируем изначально ВСЁ время, которое требуется для выполнения ВСЕХ заявок. Т.е: 3 + 2 + 4 + 1 + 2 + 4 = 16, а 17тый нужен для сигнала окончания "моделирования". + я еще заметила одну закономерность, если так это можно сказать: если в Очереди1 и в Очереди 2 есть заявки с одинаковым приоритетом, то пусть выполняется та заявка, которая находиться в Очереди2, т. е На выполнения из Очереди1 пришла заявка с Приоритетом 1 , а в очереди 2 самая Приоритетная тоже имеет приоритет 1, то тогда Только что пришедшая заноситься в Очередь 2, а на выполнение встаёт та заявка, которая была из Очереди 2. Таким образом можно решить проблему "тупика". Ну вот.... Добавлено @ 00:40
Да чем угодно(Delphi, Pascal - библиотеки)! Главное что бы реализовался данный алгоритм.
Ну ка бы это сказать... вызывает затруднение много чего, не могу правильно реализовать этот "СТЕК", тот который у меня условно называется Очередь 1, потом логика забивается у меня на втором "if", не могу правильно по этому посторить программу, что за чем и в какой последовательности должно следовать..... + Из-за неопытности (учила Паскаль на 1ом курсе вечернего отделения и делали мы всего 6 лабораторок довольно простых, а этого маало, чертовски мало по сравнению с дневным отделением у которых было 27 лабораторок в сесместре + курсач) .... потом с периода конца первого курса по начало 5того мы больше Паскалем не занимались...... занимались каждый курс новым языком... MCL, Prolog, Assembler, MATLAB, GPSS... как говориться галопом по европам, а более углубленно Паскалем и другим языками мне не не удавалось заниматься, работа, семья, дети... То что требоваволось в институте, всё исправно выполняла... а тут задали ЭТО!.. я в шоке.... Это сообщение отредактировал(а) AnReykfi - 8.12.2009, 00:55 |
||||||||
|
|||||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
AnReykfi,
Можно пообщаться в аське, так как это будет быстрее обсудить и помочь. Я для интереса сам начал реализовывать эту задачку. Добавлено через 40 секунд Кстати, почему консоль? ТОлько из-за неопытности, или требование такое - без графического интерфейса? -------------------- |
|||
|
||||
| Демо |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Так как стоит задача реализовать простейшую модель диспетчеризации по приоритетам, без
Предлагаю с определения базовых типов и классов. 1. Структура для определения и хранения информации о задании:
Добавлено @ 01:32 2. Для обработки заданий, добавления будем использовать класс TProcessor Очередь будем хранить в TList.
Это начало реализации класса Добавлено @ 01:33 Здесь
Добавлено @ 01:35
В конструкторе передаём размер кванта времени, выделяемого каждой задаче. Далее предусмотрим, что его можно динамически менять. AddJob - добавление задания в очередь. Добавлено @ 01:37 Функция AddJob (заполнение структуры задания и добавление в очередь. Возвращает идентификатор добавленного задания (вдруг понадобтся). В классе определена с модификатором virtual для того, чтобы при необходимости её можно было в наследниках переопределить.
Добавлено @ 01:37 Конструктор и деструктор:
Добавлено через 11 минут и 39 секунд Отображать результаты работы процессора предлагаю в таком виде: Это сообщение отредактировал(а) Демо - 8.12.2009, 01:38 Присоединённый файл ( Кол-во скачиваний: 10 )
MainForm.JPG 41,22 Kb-------------------- |
||||||||||||
|
|||||||||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
В левой части - TListView, в кеотором будут отображаться все задания во время выполнения (вся очередь)
В правой части - протокол работы процессора - Это либо TListBox, либо TMemo. Это сообщение отредактировал(а) Демо - 8.12.2009, 01:45 -------------------- |
|||
|
||||
| Демо |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
В общем, немного всё поменялось.
Основное отличие - для каждого приоритета используется своя очередь. Это упрощает работу с очередями.
Добавлено @ 07:53 Для работы с очередью немного не подходит стандартный класс в Delphi (TQueue), так как он не даёт доступа к отдельным элементам очереди. Реализуем простой подобный класс.
Добавлено через 9 минут и 22 секунды Для хранения всех задания будем использовать массив очередей. В каждом элементе массива будет храниться очередь заданий с одинаковыми приоритетами.
Добавлено через 10 минут и 27 секунд Также определим Callback-функции для обработки протокола и изменения статуса заданий:
Это сообщение отредактировал(а) Демо - 8.12.2009, 07:57 -------------------- |
||||||||||
|
|||||||||||
| Демо |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Далее реализуем основной класс - Процессор.
В этом классе предусмотрим следующие функции: 1. Возможность создания очереди с различным количеством приоритетов 2. Добавление заданий в очередь двумя способами: - Пользователь может задать некоторые параметры сам - Пользователь генерирует задание не задавая параметров. В этом случае некоторые атрибуты выбираются случайным образом 3. Возможность остановки и запуска обработки очередей в любое время 4. Обработка очереди не должна приводить к зависанию интерфейса пользователя 5. Пользователь может динамически поменять длину кванта в пределах от 1 до 10 секунд. Для того, чтобы не блокировать интерфейс и реализовать задачу периодического вызова функции или процедуры для отсчёта квантов времени, нам идеально подойдёт стандартный реализованный в Delphi класс - TTimer. Добавлено @ 08:07
Добавлено @ 08:12
Добавлено @ 08:15
Это сообщение отредактировал(а) Демо - 8.12.2009, 08:19 -------------------- |
||||||
|
|||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Остановка и запуск процессора в любой момент:
-------------------- |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Это сообщение отредактировал(а) Демо - 8.12.2009, 10:33 -------------------- |
|||
|
||||
| Демо |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Для того, чтобы пользователь мог подключить свои обработчики, в реализации класса предусматриваем
две процедуры, которые и помогут это сделать: Одна функция предназначена для ведения протокола, вторая вызывается при каждой смене кванта времени процессора.
Добавлено @ 09:48 Для получения общего количества заданий и количества заданий заданного приоритета напишем 2 функции:
Добавлено через 3 минуты и 29 секунд Во время обработки активного задания необходимо для всех заданий в очереди увеличить счётчик ожидания квантов. Вынесем код в отдельную процедуру:
Добавлено через 5 минут и 4 секунды Для расшифровки статуса задания (получения статуса в текстовом виде) напишем простую функцию:
Добавлено через 6 минут и 2 секунды Ну и последняя функция в реализации класса - получение задания по его идентификатору:
Добавлено через 7 минут и 9 секунд Следующим нашим шагом будет реализация интерфеса между пользователем, графичечким интерфесом, и реализованным классом. Это сообщение отредактировал(а) Демо - 8.12.2009, 09:49 -------------------- |
||||||||||||||
|
|||||||||||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Добавлено @ 11:27 Основная форма будет выглядеть так: ![]() Это сообщение отредактировал(а) Демо - 8.12.2009, 11:28 -------------------- |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Ну и, наконец-то, - весь проект целиком.
Это сообщение отредактировал(а) Демо - 8.12.2009, 11:35 Присоединённый файл ( Кол-во скачиваний: 15 )
DispatchProcess.zip 7,46 Kb-------------------- |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |