Важная информация

User Tag List

Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 30 из 30

Тема: Вытесняющая многозадачность (диспетчер mzkernel)

  1. #21
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Выпустил обновление. Из изменений: небольшая оптимизация при сохранении контекста при прерываниях. Добавлена возможность пуска новых и завершения старых потоков. Для этого используются две новых функции: KeStartThread и KeExitThread.

    Перед пуском нового потока необходимо инициализировать в памяти структуру состояния потока, указать адрес стека потока и разместить на его верхушке точку входа. Адрес структуры нового потока передается функции KeStartThread в регистре IY. Новые потоки находятся в состоянии готовности. Функцию KeStartThread можно вызывать только на IRQL=PASSIVE из какого-нибудь потока. При этом, если приоритет нового потока выше, чем у текущего - то текущий поток будет сразу вытеснен, а управление - отдано новому потоку.

    Поток может завершиться, вызвав функцию KeExitThread по Call или Jp, эта функция не возвращается. Управление передается следующему по приоритету потоку, находящемуся в состоянии готовности. Последний поток с самым низким приоритетом (system idle thread) не должен завершаться или входить в режим ожидания, иначе происходит сбой.

    Изменен способ хранения структур потоков в памяти. Если раньше это был массив структур, длина которого известна во время компиляции, то теперь это односвязный список, элементы которого отсортированы по приоритету в порядке его убывания (это соответствует возрастанию числа, кодирующего приоритет). По-прежнему требуется, чтобы все потоки имели разный приоритет. В сортированном односвязном списке добавление и удаление - дорогие операции, имеющие сложность O(n), однако пуск и завершение потоков происходят редко, поэтому сложность не критична.

    Я не делал любимую многими функцию "TerminateThread" - прибитие одного потока из другого, по той причине, что если прибиваемый поток находится в состоянии ожидания - то его необходимо удалить из списка потоков, ожидающих некий объект. Но поскольку список этот односвязный - то удалить из него элемент невозможно. Надо или хранить в структуре потока указатель на начало списка, или делать двусвязный список. И то, и другое затратно по памяти и по быстродействию операций ожидания и выхода из ожидания, а толку от TerminateThread без защиты памяти мало. Чтобы снять заглючившую задачу, недостаточно прибить поток. Надо еще освободить его ресурсы, а если он перепахал память - то пиши пропало.

    Следующий шаг - динамический приоритет потоков. Здесь опять потребуется изменять структуры данных системы. Чтобы изменить приоритет потока, нужно изменить его положение в списке потоков, отсортированном по приоритетам. Во-первых для списков такое перемещение само по себе затратное - O(n), а с односвязным списком вообще все печально. Фактически придется как бы прибить поток и запустить его заново, и это будет очень тормозно. Возможно, вместе с динамическим приоритетом потоков я добавлю возможность иметь потоки с одинаковым приоритетом и Round-Robin. Для этого придется радикально поменять формат "базы данных" диспетчера, сделав его более похожим на то, что используется в Windows NT.

    Ну а с динамическим приоритетом станут возможными, наконец, мутексы.

    ---------- Post added at 04:25 ---------- Previous post was at 04:16 ----------

    Цитата Сообщение от SfS Посмотреть сообщение
    Может. Но стандартный системный таймер - 10мс, что как бы 100Гц. Оттуда вызывется планировщик.
    Планировщик-то вызывается, но потоки не переключаются каждое прерывание. Quantum для Round-Robin может составлять величину, превышающую интервал между прерываниями.
    Цитата Сообщение от SfS Посмотреть сообщение
    Кроме того - он вызывается из системных вызовов. Ну, скажем, вызвал ты select() или блокирующий read() - если данных нет, то управление будет отдано другим задачам-потокам.
    Внутри системы это приводит к вызову WaitForObject. Все это реализовано в моем диспетчере.
    Цитата Сообщение от SfS Посмотреть сообщение
    "хорошо сказывается на интерактивности системы" то, что для всяких мышек есть аппаратное прерывание.
    Вот как раз аппаратные прерывания от мышек - это по-моему плохая идея. Достаточно опрашивать мышку с частотой обновления экрана, как это сделано на Spectrum и Amiga. Все равно курсор мыши на экране нельзя сдвинуть быстрее, чем отобразится следующий кадр. В качестве бонуса получаем очень плавное перемещение курсора. Кто видел живую Амигу - не даст соврать.
    Последний раз редактировалось Barmaley_m; 22.07.2014 в 05:19.

  2. #22
    Guru Аватар для CodeMaster
    Регистрация
    26.04.2009
    Адрес
    г. Воронеж
    Сообщений
    6,234
    Спасибо Благодарностей отдано 
    140
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    182 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Вытесняющая многозадачность отличается от кооперативной тем, что решение о смене контекста принимается не задачей, а диспетчером.
    А как управление вернётся в диспетчер если задача не стала его отдавать (глюк, проблемы с железом)? Т.е. эта модель работает, до тех пор когда в системе нет проблем.

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    "Фоновый инициатор вытеснения" - это возможность, но не необходимость.
    Это необходимая часть RealTime ОС, для остальных можно найти другие варианты возвраты управления в диспетчер, но этот наверное проще.
    "Во времена всеобщей лжи говорить правду - это экстремизм" - афоризм.

  3. #23
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CodeMaster Посмотреть сообщение
    А как управление вернётся в диспетчер если задача не стала его отдавать (глюк, проблемы с железом)?
    Вспомнился старый анекдот:
    - Пап, а правда что Windows-98 многозадачная ?
    - Да, сынок.
    - А покажи как это.
    - Щас, дискету доформатирую. ))

  4. #24
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Просмотрел тему здесь и на Хабре, и увидел очередное изобретение велосипеда. Ни в коем случае не осуждаю и не высмеиваю топикстартера - сам грешил подобным "велосипедостроением" , поэтому, надеюсь, мой пост не будет совсем уж бесполезным.
    Существуют uC/OS, FreeRTOS, ScmRTOS, TNKernel + еще десятки подобных мелких RTOS (по факту это просто вытесняющие диспетчеры), и они не упоминаются в обсуждениях (по-крайней мере я не увидел), вместо этого имеются ссылки на Windows и ReactOS, которые достаточно сложны и, имхо, не совсем соответствуют микроконтроллерной проблематике. Также существует классическая "библия велосипедостроителей" - Jean J. Labrosse "μC/OS, The Real-Time Kernel" - там очень подробно расписаны все нюансы работы мелких RTOS и ряд интересных проблем типа инверсии приоритетов и способы борьбы с ними.
    P.S. Лично мой выбор "велосипеда" c 2006 года - tnkernel.com, открыто, бесплатно, просто, быстро и мощно. Каюсь, в свое время тоже чуток поучаствовал в улучшении этого "велосипеда", теперь там часть кода за моим авторством. Также, весьма вероятно, из озорства, напишу ретро-порт TNKernel для PDP-11

  5. #25
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CodeMaster Посмотреть сообщение
    А как управление вернётся в диспетчер если задача не стала его отдавать (глюк, проблемы с железом)? Т.е. эта модель работает, до тех пор когда в системе нет проблем.
    Выше уже рассматривался этот вопрос. Многозадачность и защита от неправильного поведения задач - это разные вещи. На голом Z80 без аппаратных примочек реализовать защиту невозможно. Если же подразумевать, что все задачи работают корректно - то управление вернется в диспетчер ровно тогда, когда нужно.
    Цитата Сообщение от CodeMaster Посмотреть сообщение
    Это необходимая часть RealTime ОС
    Многозадачная ОС и RealTime ОС - это где-то пересекающиеся, но не совпадающие множества. Для RealTime ОС гарантируется время реакции на событие. В моем диспетчере, как и во многих других, в том числе Windows и Linux, это не гарантируется. Так что они не являются RealTime ОС.
    Цитата Сообщение от CodeMaster Посмотреть сообщение
    для остальных можно найти другие варианты возвраты управления в диспетчер, но этот наверное проще.
    Возврат управления в диспетчер осуществляется не просто так "чтобы было", а с определенной целью. Например, отработать событие, могущее вызвать переключение потоков. Если в системе нет прерываний ("фонового инициатора вытеснения") - то источником таких событий может быть работа задач.

    ---------- Post added at 13:42 ---------- Previous post was at 13:34 ----------

    Цитата Сообщение от Vslav Посмотреть сообщение
    Просмотрел тему здесь и на Хабре, и увидел очередное изобретение велосипеда.
    Спасибо за обзор альтернатив! В этой теме уже довольно много альтернатив упоминалось, так что она превращается в единое место на форуме, куда сходится информация о реализациях многозадачности на ZX. Это тоже хорошо.
    Цитата Сообщение от Vslav Посмотреть сообщение
    tnkernel.com, открыто, бесплатно, просто, быстро и мощно.
    Мой диспетчер тоже открытый, бесплатный и простой. Не скажу, что тормозной - старался оптимизировать. Насчет мощности - планы на реализацию дополнительных важных функций тоже имеются!

    ---------- Post added at 13:47 ---------- Previous post was at 13:42 ----------

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    - Щас, дискету доформатирую. ))
    Вот этот абсурд стал возможен из-за того, что в Win95/98 драйвер дисковода слишком часто и надолго переводит систему в состояние, когда многозадачность как бы отключена. Ну типа запрет прерываний, долгая работа на IRQL=DISPATCH_LEVEL и т.п. В Windows NT драйвер дисковода был чуть лучше, но все равно там было много таких мест, убивающих многозадачность. Я изучал его исходники. Драйвер параллельного порта был еще хуже. Сканнеры, подключаемые через параллельный порт, блокировали во время работы все задачи даже на Win2000/XP. Когда появился HyperThreading - то он даже рекламировался тем способом, что "ваша система больше не будет виснуть во время работы сканнера". Так как хоть один логический процессор виснет, остается еще второй, на котором система может как-то ковылять.

    Дрова этому виной, одним словом.
    Последний раз редактировалось Barmaley_m; 22.07.2014 в 14:38.

  6. #26
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Лично мой выбор "велосипеда" c 2006 года - tnkernel.com,
    А в списке портов там z80 не вижу.
    Вы tnkernel именно на z80 юзали ?
    V6Z80P - Back for Good

  7. #27
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Valen Посмотреть сообщение
    А в списке портов там z80 не вижу.
    Вы tnkernel именно на z80 юзали ?
    Нет, официального порта под Z80 нет, но основная официальная ветка писалась универсальным образом и существуют рабочие порты под разные 8/16-битные процессоры. То есть, особых препятствий к портированию на Z80 нет. К тому же сегодня посмотрел - у Z80 есть возможность программно получить значение флага разрешения прерываний (копирование во флаг четности при ld A,I) поэтому все нормально. А вот на 580ВМ80 уже пришлось бы извращаться с отдельной внешней переменной.

    Сам же использую свою отдельную ветку, специально оптимизированную под 32-битники (там используется особенность что операции чтения и сохранения указателей являются атомарными относительно прерываний ну и еще кучка оптимизаций) под Windows (эмуляция поверх Win32 API), ARM7, ARM9, Cortex-M0/M3/М4 и PowerPC e300.

    В-общем, это было бы хорошее и интересное дело - написать порт TNKernel для Z80. Но насколько реально полезное - я не знаю, RTOS дает преимущества при разработке сложного софта - сетевых стеков, стеков USB, файловых систем и прочего. А в 64К адресного пространства это все уже не влезает никак, поэтому целесообразность практического (не для хобби) использования RTOS на 8/16-битниках с моей точки зрения сомнительна. Ну, можно, да. Но нонешние цены на 32-битники вытеснили 8/16-битники совсем уж в нижний сегмент простых проектов. Мои последние мелкие 8-битные проекты на STM8 были без RTOS, только bare hardware.

    PS. Под FreeRTOS нагугливается неофициальный порт под Z80, можно и на него посмотреть, принципы те же самые.

  8. #28
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    ... RTOS дает преимущества при разработке сложного софта - сетевых стеков, стеков USB, файловых систем и прочего. А в 64К адресного пространства это все уже не влезает никак ...
    Можете назвать конкретные цифры для нескольких проектов, например "PIC18, прошивка с поддержкой того, сего, и ещё вот этого занимает вот столько килобайт"? Я такое не собирал, мне чтобы ориентироваться.

  9. #29
    Junior
    Регистрация
    24.06.2016
    Адрес
    г. Владивосток
    Сообщений
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Просмотрел тему здесь и на Хабре, и увидел очередное изобретение велосипеда.
    ...
    Существуют uC/OS, FreeRTOS, ScmRTOS, TNKernel + еще десятки подобных мелких RTOS
    ...
    Также существует классическая "библия велосипедостроителей" - Jean J. Labrosse "μC/OS, The Real-Time Kernel" - там очень подробно расписаны все нюансы работы мелких RTOS и ряд интересных проблем типа инверсии приоритетов и способы борьбы с ними.
    ...
    P.S. Лично мой выбор "велосипеда" c 2006 года - tnkernel.com, открыто, бесплатно, просто, быстро и мощно. Каюсь, в свое время тоже чуток поучаствовал в улучшении этого "велосипеда", теперь там часть кода за моим авторством. Также, весьма вероятно, из озорства, напишу ретро-порт TNKernel для PDP-11
    Вот здесь http://dfrank.bitbucket.org/tneokern...implement.html расписано, почему и как TNKernel глючный.

  10. #30
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vladk Посмотреть сообщение
    Вот здесь http://dfrank.bitbucket.org/tneokern...implement.html расписано, почему и как TNKernel глючный.
    Эта тема довольно давно обсуждалась на Электрониксе. Человек просто взял TNKernel, поработал с ним, увидел что можно улучшить для своих целей и написал на его основе бранч, который назвал TNeo. Имхо, у этого товарища замечания, по большей части, к стилистике, хотя, надо признать, есть и пара реальных ошибок/опечаток. Кстати, я в свое время поступил точно так же - взял оригинальный TNKernel и произвел полный рефакторинг (у меня был свой список замечаний, побольше и посерьезней), итоговыми исходниками я с автором поделился, но в основную ветку он внес только часть предложенных мной изменений (их там нормально было предложено - время переключения контекста сократилось в пару раз). Ну и ладно, человек в своем праве, хотя на мой взгляд тут есть некоторый излишний консерватизм, но то такое. А вообще подход у автора достаточно основательный, при разработке RTOS архитектурные решения принимались на основе изучения достаточно серьезных статей (были у нас небольшие дискуссии, по мутексам в частности), так что на мелочи типа сколько операторов return в функции обращать внимания не стоит - это всегда недолго и переписать под свой вкус, лицензия позволяет.

Страница 3 из 3 ПерваяПервая 123

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Диспетчер памяти в KAY-1024...
    от SoftFelix в разделе KAY
    Ответов: 16
    Последнее: 30.08.2010, 12:07
  2. диспетчер ROM памяти
    от p@lex в разделе Память
    Ответов: 5
    Последнее: 29.03.2010, 22:58
  3. Многозадачность
    от captain cobalt в разделе Оси
    Ответов: 23
    Последнее: 23.04.2005, 19:04

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •