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

User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 30

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

  1. #11
    Activist Аватар для Alex/AT
    Регистрация
    14.03.2005
    Адрес
    Russia, Saint-Petersburg
    Сообщений
    213
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    Там в каментах что-то про файберы говорится - мол с ними совсем другой коленкор - есть инфа на русском про эти самые файберы ?
    Файберы от тредов отличаются моделью многозадачности. Треды - вытесняющая модель, файберы - кооперативная.

    Если строго, то в моём scheduler_g2 - гибрид тредов и файберов, модель там кооперативно-вытесняющая. Но по сути на ZX реально применимы только файберы - частота единственно имеющегося прерывания от таймера для вытесняющей модели крайне мала , а большинству задач надо успеть в один и тот же экран выполниться.
    Последний раз редактировалось Alex/AT; 15.07.2014 в 02:18.

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

    По умолчанию

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    есть инфа на русском про эти самые файберы ?
    Файберы (Fiber) - это нечто, похожее на потоки (Threads), но в некоторых ОС, таких как Win32, допускается исполнение (неодновременное) нескольких файберов в одном потоке. Отсюда происходит и термин. Thread - нить, а Fiber - волокно, т.е. боле мелкая, составляющая часть нити.

    Каждый файбер имеет свой стек, как и поток. Но переключение между файберами происходит только вручную. Есть функция, например Win32 SwitchToFiber(HANDLE), которая переключает исполнение на заданный файбер. При этом состояние текущего файбера (стек) сохраняется. Когда другой файбер сам вызовет SwitchToFiber() на исходный файбер - то исполнение первого файбера будет продолжено.

    Файберами нельзя полноценно заменить потоки. Однако меня долгое время интересовало, зачем они вообще нужны и что интересного можно сделать с их помощью. В комментариях на хабре как раз приведены ссылки. Основное применение и структура файберов обычно выглядит так:

    ... code ...
    ... call some_function ...
    ... code ...

    При этом функция some_function где-то внутри себя вызывает SwitchToFiber, переключая исполнение на другой файбер, и когда другой файбер отдаст управление назад - функция some_function делает какие-то завершающие действия и возвращается.

    Такая модель удобна, например, при проходе по файлу, организованному блочно, например .avi-файлу, где блоки звука перемежаются с блоками видео. Тогда можно сделать два файбера, один из которых обрабатывал бы только звук, а другой - только видео. В функции some_function следует разместить код чтения из входного файла, и в случае нахождения блока, принадлежащего "чужому" файберу - переключить исполнение на него.

    ---------- Post added at 19:19 ---------- Previous post was at 19:05 ----------

    Цитата Сообщение от Alex/AT Посмотреть сообщение
    На самом деле - не проще взять на развитие мой scheduler_g2? ( http://zx-pk.ru/showthread.php?t=21281 )
    Спасибо, я поизучаю твой проект. Не знал о его существовании. Ну и в любом случае я делал бы свой, т.к. хотелось поупражняться в этом деле

    ---------- Post added at 19:24 ---------- Previous post was at 19:19 ----------

    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Треды - вытесняющая модель, файберы - кооперативная.
    С этим согласен полностью.
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Но по сути на ZX реально применимы только файберы - частота единственно имеющегося прерывания от таймера для вытесняющей модели крайне мала , а большинству задач надо успеть в один и тот же экран выполниться.
    А вот с этим категорически не согласен. При чем тут вообще прерывания от таймера к модели многозадачности? Вытесняющую многозадачность можно реализовать и вовсе без прерываний. Я думаю, дело в том, что многие заблуждаются насчет вытесняющей многозадачности в том, что будто бы ее основная идея - быстрое переключение между потоками (Round Robin), чтобы обеспечить их псевдопараллельное исполнение. Нет, на самом деле это тоже можно сделать, но вытесняющая многозадачность - это более широкое понятие, чем Round-Robin.

    В том диспетчере, который я опубликовал, вообще отсутствует упомянутое переключение по таймеру. Мои потоки переключаются только тогда, когда происходят события, требующие переключения потоков. Эти события могут происходить и по таймеру, и генерироваться внутри потоков, поэтому переключения потоков могут происходить как чаще, чем частота прерываний, так и реже. И вообще, чем реже - тем лучше, т.к. на переключение расходуется процессорное время.

  3. #13
    Activist Аватар для Alex/AT
    Регистрация
    14.03.2005
    Адрес
    Russia, Saint-Petersburg
    Сообщений
    213
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вытесняющую многозадачность можно реализовать и вовсе без прерываний.
    Извини, но это бред. Для принудительного вытеснения задачи нужен инициатор переключения контекста. Без фонового инициатора вытеснения возможна только кооперативная многозадачность. Даже если мы будем "вытеснять" задачу сами в пределах ядра при вызовах функций ядра - всё равно это будет де факто кооперативная многозадачность, просто кооперативность будет обеспечиваться ядром, как частью задачи, и в контексте задачи.

    Простой пример: что будет, если задача не вызовет ни одну функцию ядра, вызывающую "вытеснение"? Тогда - либо прерывание (таймер) и вытеснение есть, либо вытеснения нет, и имеем чистую кооперативную модель.

    Конечно, сделать вытесняющую многозадачность можно и с вытеснением раз в 1/50 секунды, но смысла в этом большого реально нет. Основное применение шедулера на ZX, как мне видится, это возможность в фоне считать "длинные" и вспомогательные задачи, параллельно исполняя основные, которые отрисовывают результат.

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

    Почему настоятельно советую попробовать взять мой планировщик - собственно по двум причинам: а) он сильно оптимизирован; б) он умеет то, что жизненно необходимо ZX - хотя бы приблизительную синхронизацию с экраном. При условии, конечно, что задачи сообщают адекватное время выполнения в кооперативной модели. Как это работает - можно посмотреть в примерах. Он под GPLv2, поэтому можно смело выкладывать в GIT, если будут идеи - я присоединюсь к доработке, времени 100% мейнтейнить, к сожалению, нет. Да, код самого планировщика получился к сожалению достаточно сложным, оптимизация требует жертв. Там очень много комментариев, которые помогут разобраться.
    Последний раз редактировалось Alex/AT; 15.07.2014 в 21:49.

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

    По умолчанию

    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Извини, но это бред.
    Прошу заметить, я тебя не оскорблял.
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Для принудительного вытеснения задачи нужен инициатор переключения контекста. Без фонового инициатора вытеснения возможна только кооперативная многозадачность.
    Извини, но это неверно (в надежде на то, что дискуссию удастся вернуть в предметное русло, не буду употреблять по отношению к твоим словам оскорбительное слово "бред"). Вытесняющая многозадачность отличается от кооперативной тем, что решение о смене контекста принимается не задачей, а диспетчером. Википедию хотя бы почитай. "Фоновый инициатор вытеснения" - это возможность, но не необходимость.

    Несмотря на то, что без вытеснения по прерываниям работа системы будет в некоторой степени детерминированной (наподобие кооперативной многозадачности), отсутствие знаний о работе хотя бы одного из потоков превращает работу такой системы в недетерминированную, когда каждый конкретный поток не знает, когда у него заберут процессорное время. Например, в моем диспетчере поток, устанавливая объект "Event", не знает, будет ли он при этом вытеснен. Это зависит от того, ожидает ли сигнализации этого объекта другой поток с более высоким приоритетом.

    Ну и да, в моем диспетчере поддерживается вытеснение и по прерываниям, если в процедуре их обработки будут вызываться функции вида "SetEvent".
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Даже если мы будем "вытеснять" задачу сами в пределах ядра при вызовах функций ядра - всё равно это будет де факто кооперативная многозадачность, просто кооперативность будет обеспечиваться ядром,
    Ошибка именно здесь. Если обеспечивается ядром - значит уже не кооперативность.

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

    "Настоящие" современные ОС тоже не переключают контекст потоков без необходимости. Это дорогая операция. Зачем жечь время процессора зря? Даже переключение по таймслайсам для реализации Round-Robin псевдопараллельного исполнения использует интервалы времени, сравнимые или превышающие 1/50с.
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Основное применение шедулера на ZX, как мне видится, это возможность в фоне считать "длинные" и вспомогательные задачи, параллельно исполняя основные, которые отрисовывают результат.
    В этом смысл многозадачности вообще, а не только на ZX. Длительная работа в режиме Round-Robin - это плохая ситуация даже на современных "больших" ОС, так как каждая задача при этом работает медленнее, чем хотелось бы.
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Никто, опять же, не мешает запихать принудительную кооперативность в некие системные вызовы ядра - и получим примерно то, что сделано в твоём планировщике
    Нет, получим не то, что сделано в моем планировщике, а Windows 3.11. Это там была "принудительная кооперативность" при вызове функции GetMessage или PeekMessage, а в других ситуациях контекст не переключался.

    То, что сделано у меня - это переключение контекста по событиям, которые, по принятому принципу работы, являются основаниями для смены контекста. Быстро и максимально отдать время процессора приоритетным (важным) потокам; когда они чего-то ждут, например, нажатия клавиши - отдать время остальным.

    Прерывания здесь важны, конечно, но и без них бы было примерно то же самое.

    Точно так же сделано в реальных больших ОС. Я разрабатывал диспетчер после долгого и подробного курения исходников ReactOS (аналог Windows). Там, конечно, реализовано больше, чем у меня - но не в один день Москва строилась; и не все из этого нужно на ZX.
    Цитата Сообщение от Alex/AT Посмотреть сообщение
    Почему настоятельно советую попробовать взять мой планировщик - собственно по двум причинам: а) он сильно оптимизирован; б) он умеет то, что жизненно необходимо ZX - хотя бы приблизительную синхронизацию с экраном.
    Хорошо, спасибо. Обязательно поизучаю!

  5. #15
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,258
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    84
    Поблагодарили
    36 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Даже переключение по таймслайсам для реализации Round-Robin псевдопараллельного исполнения использует интервалы времени, сравнимые или превышающие 1/50с.
    ЕМНИП, частота вызова шедулера в том же linux может измеряться килогерцами. Как подсказывает Кэп и опыт, это хорошо сказывается на интерактивности системы, но крайне плохо на общей производительности.

  6. #16
    Activist Аватар для Alex/AT
    Регистрация
    14.03.2005
    Адрес
    Russia, Saint-Petersburg
    Сообщений
    213
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Прошу заметить, я тебя не оскорблял.
    Если обидел - извини, но сказанное противоречит собственно исходному определению вытесняющей многозадачности.

    Из фактического куда есть смысл смотреть: на ZX нет в целом смысла ждать прерывания для вытеснения потока - основное применение планировщика - распараллеливание действий типа отрисовки экрана, фонового обсчёта данных, обработки клавомыши, etc. А значит нормально подойдёт только кооперативная модель. Во многих демах и игрушках, кстати, можно найти свои суб-планировщики, и основная идея лично у меня была унифицировать подобный механизм так, чтобы практически любую процедуру можно было запихать под планировщик без принципиальных переделок. В том, что получилось - достаточно приблизительно посчитать такты, и расставить вызовы Slice/Idle.
    Последний раз редактировалось Alex/AT; 16.07.2014 в 18:01.

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

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

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    ЕМНИП, частота вызова шедулера в том же linux может измеряться килогерцами.
    Не следует путать частоту вызова планировщика с длительностью time slice. Потоки могут делать сколько угодно системных вызовов, и некоторые из них прямо или косвенно вызывают планировщик и приводят к смене контекста. time slice - это интервал переключения ядром потоков с одинаковым приоритетом в режиме Round-Robin при условии, что эти потоки не делают вызовов ядра, приводящих к перепланировке. Только что погуглил - в линуксе этот интервал составляет 100мс, а в винде - около 20мс, причем в случае винды серверная и клиентская версии используют разные значения. В серверной винде time slice дольше.
    Цитата Сообщение от Vitamin Посмотреть сообщение
    Как подсказывает Кэп и опыт, это хорошо сказывается на интерактивности системы,
    Интерактивность системы обеспечивается правильным распределением задач по потокам и правильным присвоением их приоритета. Если придерживаться правила иметь более высокий приоритет у потоков, осуществляющих взаимодействие с пользователем - то и получится высокая интерактивность. Помню, у нас в универе была машина на RSX-11 с терминалами. Один комп на 15 студентов. Бывало, человек 10 одновременно запускало компиляцию. Компилировалось жутко медленно, минут по 5 даже для коротких программ. Но при этом редактор у всех работал без задержек. Потому что его приоритет был выше, чем у компилятора.

    ---------- Post added at 03:34 ---------- Previous post was at 03:26 ----------

    Цитата Сообщение от Alex/AT Посмотреть сообщение
    но сказанное противоречит собственно исходному определению вытесняющей многозадачности.
    Пожалуйста в студию определение со ссылкой на источник.

  9. #18
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,258
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    84
    Поблагодарили
    36 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Не следует путать частоту вызова планировщика с длительностью time slice.
    Чот попутал, да. Давненько не брал в руки шашек
    А если не RR алгоритм, то там как?

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

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    А если не RR алгоритм, то там как?
    RR-алгоритм применяется только когда в системе имеется несколько потоков с одинаковым приоритетом в состоянии готовности.

    Если в состоянии готовности находятся потоки с разным приоритетом - то процессорное время получает тот из них (один), который имеет высший приоритет. Остальные не получают процессорного времени до тех пор, пока поток с высшим приоритетом не перейдет в состояние ожидания.

    Вот цитата из MSDN, Windows SDK
    "Threads are scheduled to run based on their scheduling priority. Each thread is assigned a scheduling priority. The priority levels range from zero (lowest priority) to 31 (highest priority). Only the zero-page thread can have a priority of zero. (The zero-page thread is a system thread responsible for zeroing any free pages when there are no other threads that need to run.)

    The system treats all threads with the same priority as equal. The system assigns time slices in a round-robin fashion to all threads with the highest priority. If none of these threads are ready to run, the system assigns time slices in a round-robin fashion to all threads with the next highest priority. If a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread (without allowing it to finish using its time slice), and assigns a full time slice to the higher-priority thread. For more information, see Context Switches."

  11. #20
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    ЕМНИП, частота вызова шедулера в том же linux может измеряться килогерцами. Как подсказывает Кэп и опыт, это хорошо сказывается на интерактивности системы, но крайне плохо на общей производительности.
    Может. Но стандартный системный таймер - 10мс, что как бы 100Гц. Оттуда вызывется планировщик.

    Кроме того - он вызывается из системных вызовов. Ну, скажем, вызвал ты select() или блокирующий read() - если данных нет, то управление будет отдано другим задачам-потокам.

    "хорошо сказывается на интерактивности системы" то, что для всяких мышек есть аппаратное прерывание.

Страница 2 из 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

Ваши права

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