|
3 / 3 / 2
Регистрация: 19.03.2016
Сообщений: 19
|
|
Многозадачность, алгоритм кругового планирования22.02.2019, 18:19. Показов 9437. Ответов 44
Всем здравствуйте!
Есть задача: Организуйте многозадачную среду (3 задачи) с выводом на экран номера задачи. Переключение происходит по алгоритму кругового планирования с выделенными квантами времени (используйте прерывание таймера). Задумка следующая. На каждую из трех задач назначается число, равное количеству необходимых выводов номера задачи. Задача представляется процедурой, которая в цикле выводит свой номер задачи на экран. Основная часть программы, этакий диспетчер, собственно, запускает эти задачи и прерывает тогда, когда ее время истекло. Если очередная процедура (задача) выполнилась полностью, то мы ее еще потом запустим, а если нет, то забываем о ней. Которые сутки мучаюсь с тем, как это реализовать. С самим алгоритмом планирования все понятно, но для его реализации необходимо уметь прерывать выполнение процедуры задачи "извне", то есть основной частью программы по истечении некоторого периода времени. И тут вопрос: возможно ли это? Как такое сделать через замену обработки прерывания таймера? Долго пыталась найти что-то хотя бы похожее на мою задачу, но безуспешно.. Очень надеюсь на Вашу помощь! Подойдут любые соображения также и по решению поставленной задачи. Заранее спасибо!
0
|
|
| 22.02.2019, 18:19 | |
|
Ответы с готовыми решениями:
44
Многозадачность Зубков С.В. DOS Многозадачность. Переключение между 3 задачами |
|
Модератор
|
|
| 22.02.2019, 20:22 | |
|
Да, конечно. Упустил, а это важно, т.к. это контекст наравне с регистрами, и даже более - это элемент переключения контекста.
0
|
|
|
3 / 3 / 2
Регистрация: 19.03.2016
Сообщений: 19
|
||
| 22.02.2019, 20:26 [ТС] | ||
|
ФедосеевПавел, сейчас, наверное, будет глупый вопрос, но все же. Область стеков для задач мне определять через сегмент данных (выделением памяти для какой-то переменной) или, к примеру, выделить 300 байт на весь стек с самого начала программы, а затем "поделить" указателями этот сегмент стека по 100 байт на каждую из задач (1-ый указатель - 1-100 байт, 2-ой - 101-200 и т.д.)?
Добавлено через 1 минуту
0
|
||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 22.02.2019, 20:27 | ||
|
pelgray, а без разницы. Главное - правильно инициализировать SS:SP.
Стек - обычная память. Только используется по своему. Добавлено через 45 секунд
0
|
||
|
3 / 3 / 2
Регистрация: 19.03.2016
Сообщений: 19
|
|
| 22.02.2019, 20:29 [ТС] | |
|
liv, спасибо за ответ, пошла "дерзать"
0
|
|
|
Модератор
|
|
| 22.02.2019, 20:41 | |
|
Эти "стеки" можно определять и как отдельные сегменты и как массивы в сегменте данных (сегменте неинициализированных данных). Если программа DOS com, то можно резервировать области за последней инструкцией программы. Можно даже обращаться к DOS для выделения памяти (GetMem+FreeMem). И ещё много разных способов.
Тут, как удобнее будет лично вам. Сама программа учебная и нетребовательна к памяти, именно поэтому способ реализации стеков безразличен.
0
|
|
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
| 22.02.2019, 20:55 | |
|
А я бы сделал хитро - скомпилил 3 COM-файла для задач, а основной ехешник - их лоадер, который выделяет память по 64кб (целый сегмент) через int 21h 48h. Тогда указатели стека для каждой задачи автоматически будут в конце сегментов, и не надо думать куда их отдельно сохранять. В тасклисте хранить сегменты, полученные при выделении памяти.
Добавлено через 5 минут Контекст неактивных задач можно в прерывании сбрасывать в стек этой же задачи, а при активации - вытаскивать оттуда. Тут главное конечно очень внимательно следить и понимать, чего где и когда в стеке лежит, и правильно сохранить/заменить адрес возврата. Добавлено через 1 минуту Уже прям целая операционная система получится
0
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 22.02.2019, 21:01 | |
|
Kukuxumushu, тоже вариант!
![]() Добавлено через 3 минуты Но первый вариант все-таки будет попроще, особенно на первом этапе
0
|
|
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||
| 22.02.2019, 21:04 | ||
|
Причём, поскольку лоадер у нас будет свой, то можно и не все 64кб выделять, а допустим 1кб вполне хватит, тогда и указатель стека лоадер может поставить на 0x03FF. PSP можно тупо игнорировать, как и его смещение
org 100h, мы же крутые - сделали собственный формат исполняемого файла!![]() Добавлено через 1 минуту
0
|
||
|
Модератор
|
|
| 22.02.2019, 21:04 | |
|
Это всего лишь способ выделения памяти под стеки - или средствами планировщика или запущенного процесса.
А также способ реализации задачи - собственная процедура или внешний файл. Но DOS com программа не настраивает сегментные регистры и sp - пользуется тем, что дал командный интерпретатор - в нашем случае "наш" планировщик. Таким образом в такой организации задания нет преимуществ перед предложенным ранее. Единственно - приходит понимание о природе запускаемых процессов.
0
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 22.02.2019, 21:17 | |
|
Kukuxumushu, кто спорит, поизвращаться всегда можно
![]() Добавлено через 7 минут Kukuxumushu, как раз отладка в первом случае будет проще, т.к. будет одна программа. Да и объем кода ничуть не будет больше. Полный контекст-то в любом случае надо переключать. И в чем выгода отдельных программ? Добавлено через 3 минуты Только в том, что не надо выделять специально стек? Сомнительная выгода...
0
|
|
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||
| 22.02.2019, 21:30 | ||
|
0
|
||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 22.02.2019, 21:39 | |
|
Kukuxumushu, ну, полной изоляции в ДОС по-любому нет
![]() И задача написать ОС не стоит. Для начального этапа обучения первый способ решения - самое то. Впрочем, создать вот такую псевдо-ОС - идея превосходная! Можно предложить pelgray ее тоже реализовать. ![]() Будет весьма полезно подойти с такой стороны.
0
|
|
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|||||||
| 23.02.2019, 00:05 | |||||||
|
pelgray, ФедосеевПавел, liv,
От Вас требуется организовать переключение задач, но сами задачи, не реальные, а мнимые, т.е., Вам нужно визуально, показать, что задачи как-то переключаются. Выводить только номер задачи. Это как в фильме "Синьор Робинзон", "опять о море", блин как круто сюжет закручен. ОСь, под каждую задачу, создает некоторую область памяти, с полной информацией о всех программах в системе. При замене задачи, подменяется этот блок и новая задача продолжается. Названия и полную информацию, Вы найдете в книгах "Операционные Системы" Таненбаума и/или Столлингса. Там есть разделы посвященные многозадачности. Это Вам домашнее задание. Чтобы не заснуть во время работы программы, будем выводить только IP, вернее его текущее значение.
Добавлено через 10 минут Kukuxumushu, см. выше.
0
|
|||||||
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|||||||||||
| 23.02.2019, 20:16 | |||||||||||
|
Поскольку тема взбудоражила общественность, и особенно liv, то я решил сделать многозадачную недооперационную систему, и назвал её SuperOS.
Будем рисовать и стирать российский флаг, каждую из полос которой будет обрабатывать отдельная задача в виде COM-файла. Код для белой полосы:
Теперь напишем операционную систему, на вход которой в командной строке будет подаваться произвольное количество имён файлов с задачами, а она будет динамически грузить их в память и переключать по таймеру. При загрузке каждой задачи ей дополнительно выделяется 100h байт стека в области после образа, в последней ячейке которого хранится указатель на реальную вершину стека задачи. Также при загрузке инициализируются все регистры новой задачи стандартными значениями. Сам список задач, состоящий из полей "адрес сегмента:адрес конца стека" также динамический и хранится в системном стеке ОС. При срабатывании таймера адрес возврата в задачу автоматически записывается в её стек, по этой причине нельзя подменять int 1ch, нужно int 8h. Затем происходит переключение контекста и возобновление следующей задачи. SuperOS завершает работу, выгружает из памяти все задачи и передаёт управление обратно DOS по нажатию любой клавиши.
Распаковав архив в диск C:\ досбокса и запустив SuperOS со списком задач через батник, получим результат, показанный на скрине.
3
|
|||||||||||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 24.02.2019, 00:02 | |
|
Kukuxumushu, шикарно, слов нет
В понедельник посмотрю внимательно. С первого взгляда все должно работать.Я ж не говорил, что это неправильный подход, а только то, что начинающему программисту проще был бы первый подход ![]() А с готовым решением ТС просто обязана с ним ознакомиться И сразить препода наповал
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
| 24.02.2019, 18:33 | ||||||
|
Интересная тема. Я всё не читал, но добавил ещё одну фичу в код Kukuxumushu: регулировку скорости переключения. Теперь рисуется плавно, без рывков (можно увеличить коэффициент до 16, напрмиер, будет ещё плавнее, хотя при 4 уже нормально)
![]()
4
|
||||||
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
| 24.02.2019, 18:54 | |
|
Jin X, я кстати отказался от этой идеи как расово неверной, поскольку таймер меняет скорость хода и системных часов. А вот как бы сделать это всё независимо???
0
|
|
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
| 24.02.2019, 19:00 | |
|
Кстати, тему можно выделить и поместить в раздел "Программирование ОС"
![]() Добавлено через 3 минуты Jin X, а всё, супер! Я понял твою идею. Апдейт принимается в релиз))
0
|
|
|
3 / 3 / 2
Регистрация: 19.03.2016
Сообщений: 19
|
||||||
| 02.03.2019, 19:23 [ТС] | ||||||
|
Всем снова привет!
Не ожидала, что эта задача так заинтересует знатоков) Особенно удивила SuperOS от Kukuxumushu и доработка от Jin X. Только я пока не разбирала, как оно работает.. Сама суть понятна) Не подскажите, кстати, почему здесь принципиально использовать прерывание 08h? И с какой целью нужно вызывать старый обработчик в новом? Из-за часов? А если это было бы прерывание 1ch, то старый вызывать не нужно? Constantin Cat, не поняла, что Вы имели в виду... Но если делать просто вывод номера задачи по очереди, разве это не будет обычным выводом в цикле? По рекомендациям liv и ФедосеевПавел у меня получилось вот такое (TASM): Кликните здесь для просмотра всего текста
Работает, долго отлаживала, но есть проблемка. У меня есть некоторые догадки, но я не уверена в них.. В общем: при запуске с командной строки по очереди работает каждая задача и "до упора", то есть пока не достигнет конца (выведет нужное количество раз свой номер). Это не очень похоже на то, что я хотела бы видеть, потому что здесь не очевидно, что прерванная задача на половине потом возобновляется. При запуске с дебаггера, с точкой останова в обработчике, становится видно, что задачи действительно чередуются. Собственно, такой же результат, какой я получаю после останова, я бы хотела получать при обычном запуске, но что-то, видно, я делаю не так.. Приложила к сообщению скриншоты результатов в этих двух случаях. Некоторые предположения насчет причины происходящего. 1) В какой-то момент выполнения задачи (процедуры task_thread) устанавливается запрет прерывания. Для исключения такого специально устанавливаю флаг, чтобы прерывания срабатывали. В эту процедуру по непонятным мне причинам управление приходит со снятым флагом.. Но эта теория маловероятна, потому что, опять же, при проходе с отладчиком снятия флага замечено не было. 2) При запуске с отладчиком "накапливаются" прерывания, поскольку останов я делаю в блоке, где эти прерывания запрещены. Об истинности этого судить не могу. К такому выводу пришла только после многих попыток запуска кода.. По итогу вопрос: как же мне реализовать наглядное чередование? Очень надеюсь на помощь! Заранее всем спасибо!
0
|
||||||
| 02.03.2019, 19:23 | |
|
Алгоритм планирования Short Job First Объяснить программу (Алгоритм планирования, Планировщик) Алгоритм планирования процессов First-Come, First-Served (FCFS) Алгоритм планирования Round Robin с квантом времени (переделать программу) Недетерминированные алгоритмы: Cоставить алгоритм, который сравнивает с порогом возможное решение задачи планирования работ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|