Easyelectronics.ru

Электроника для всех
Текущее время: 17 сен 2019, 01:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 12:52 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Хочу немного поговорить о механизме вытеснения контекста.

Как вы, я совершенно уверен, не хуже меня знаете, контекст процесса на подавляющем большинстве архитектур состоит из содержимого следующих важных штуков:
1.1. Все регистры общего назначения.
1.2. Статусные регистров.
1.3. Указатель стека.
1.4. Счетчик комманд.
2. Содержимое стека.
3. а также несвязанная непосредственно с работой процессора часть контекста, которая может быть, а может и не быть... может зависеть, от используемой диспетчеризации. Сюда возможно входят маски разрешенных прерываний, возможно блокировки, дескриптор текущего процесса... и бла-бла-бла, бла-бла-бла.

В первом пункте сгруппировано все то, с что лежит непосредственно в процессоре. Содержимое стека обычно находится в оперативной памяти (иные случаи брать не будем, к ним особый подход). Третий пункт тоже брать не будем, дело техники.

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

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

Вот собственно об этом многообразии вариантов я и хочу поговорить.

1. Где хранить содержимое регистров?
По сути варианта два-три.
1.1 Содержимое регистров можно хранить в специально отведённой под это дело структуре.
1.2 Содержимое регистров можно хранить в стеке.


Linux используется первый, и, возможно третий варианты. FreeRTOS, насколько мне известно использует второй. К сожалению, вопрос крайне плохо гуглабелен... Кто что использует надо рыть в исходниках.
Процедура сохранения содержимого регистров в стек очень проста, равно как и процедура загрузки. С другой стороны, со снятием мгновенного состояния процессора возникают проблемы, ведь если мы состояние сохранили, то для возвращения к нормальной работе, состояние надо сперва загрузить (вернуть на место указатель стека), и дополнительные манипуляции делать очень сложно. Распечатать мгновенное содержимое уже не так просто. Ровно по этой же причине инициализация нового контекста требует финтов ушами (впрочем не самых сложных).
Процедура смены контекста здесь очень проста и линейна:
Код:
void substitution(){
save_processor_state_to_stack();
changeContext();
load_processor_state_from_stack();
};

, где save_processor_state_to_stack, load_processor_state_from_stack практически полностью состоят из push и pop, и сохраняют всё состояние процессора, кроме указателя стека и счетчика команд, а changeContext - это функция, которая занимается в первую очередь сохранением и загрузкой нового указателя стека. Это, кстати, фундаментально, что указатель стека надо хранить отдельно от всех регистров, потому что невозможно загрузить его из стека, который незнамо где находится. Возврат при смене контекста осуществляется прямо в точку предыдущего вызова substitution, ибо счетчик команд как бы сам собой сохраняется в стеке (или в регистрах) и уже готов к выходу. Очень удобно.

При втором варианте процедура смены контекста чуть сложнее.
Код:
void change_process(process* old, process* set)
{
procstate_operate = &(old->state);
save_procstate();
if (old->status==RUN)
{
   old->status=PAUSE;
   procstate_operate = &(set->state);
   load_procstate();
}
else
{
   old->status=RUN;   
   return;
};

Здесь сохраняется уже всё состояние процессора, и возврат при смене контекста осуществляется в точку сохранения. Отсюда пляски с бубнами для определения того, вышли мы из функции сохранения первый, или же второй раз. Для этого приходится наворачивать статусы... Отдельная тема с procstate_operate - внешней глобальной переменной, с которой работают load_procstate и save_procstate.
Тут напрашивается, конечно
Код:
load_procstate(&(set->state));
, но, это тонкости войны с оптимизацией компилятора, о которой долго рассказывать. Без этой фишки надо заморачиваться с флагами компиляции (наверное можно по другому, как-нибудь... через аттрибуты).
В этом варианте свободы гораздо больше, состояние процессора снимается практически без искажений, а функции load_procstate и save_procstate можно использовать во множестве других вариантах применения...

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


ИТОГО:
Хранить в стеке:
+ Простота реализации вытеснения.
+ Скорость
- Сложность инициализации процесса.
- Разрастание стека в момент сна.
Хранить в структуре:
- Сложнее
- Медленнее
+ Большая свобода по сравнению с первым вариантом.


2. Архивировать ли содержимое стека, или использовать несколько стеков?
Тут все гораздо проще. Когда у контроллера мало памяти создавать даже 100-байтные стеки под все процессы несколько расточительно. Но, можно динамически выделять память под неактивный стек, копировать его туда, а на его место распаковывать нужный. Таким образом всегда используется только один стек и место не тратится. В минусах, что очевидно, скорость...

1. Много стеков:
+ Быстро
- Расточительно
2. Архивирование стеков:
- Медленно
- Есть тонкости реализации, связанные с "копированием по живому стеку".
+ Экономия памяти


********************
Выше я изложил свои мысли по вариантам того, как можно вытеснять контекст.

А теперь, собственно то, о чем я хотел поговорить.
Какие еще есть мысли о том, как можно, нужно или не нужно вытеснять контекст?
Может быть, проблемы, нестыковки, возможности... Может, материал для размышлений.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 13:56 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3283
так как у каждого процесса всё равно свой стэк сохранять контекст куда-то еще отдельно смысла не вижу.
про
- Сложность инициализации процесса.
- Разрастание стека в момент сна.

не понял.
так же как и про
Хранить в структуре:
+ Большая свобода по сравнению с первым вариантом.

в обоих случаях это всего лишь область памяти, где подряд лежит состояние регисров, какая вообще разница?

если вам 100 байт (из которых от трети до половины уйдёт под сохранение контекста) на процесс выделить статически жалко то с динамическим выделением памяти всё будет еще хуже. ничего там наэкономить не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Память так или иначе выделяется динамически. Иначе количество процессов ограничена. Но, дефрагментация памяти, конечно может быть страшная. Но и экономия все же будет значительная, и, что самое главное, так мы страхуемся от ошибок связанных с выходом стека за диапазон. По сути, думать о размере стека вообще не нужно.

Ответить на вопрос, какая разница между вариантами , куда сохранять, сложнее.

Наверное, с точки зрения пользователя разница действительно так себе.
Но оперировать с отдельно сохраненным состоянием несравнимо проще. Проще копировать, модифицировать, без вычления из стека. Кроме того, удобно, когда все лежит в одном месте, а стек отделен от состояния...

но, преимущества действительно довольно умозрительны. Тем не менее, posix предполагает именно такой подход. Интересно, почему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 16:10 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3283
Mirmik писал(а):
Память так или иначе выделяется динамически. Иначе количество процессов ограничена. Но, дефрагментация памяти, конечно может быть страшная. Но и экономия все же будет значительная, и, что самое главное, так мы страхуемся от ошибок связанных с выходом стека за диапазон. По сути, думать о размере стека вообще не нужно.

вы тогда определитесь про что речь идёт, если это freertos/scmrtos/ucos/... и 100байт памяти, то никакого динамического выделения память там по хорошему вообще быть не должно.
потому что как стэк используется можно оценить и выделить столько что заведомо в любой ситуации хватит, а вот что делать если через некоторое время из-за дефрагментации память закончится? нормальный менеджер памяти сам сожрёт куда больше чем сможет сэкономить.

а если мегабайты памяти то есть готовый [uc]Linux берите да пользуйтесь.
приспосабливать механизмы из второго в первое не надо.

Mirmik писал(а):
Ответить на вопрос, какая разница между вариантами , куда сохранять, сложнее.
Наверное, с точки зрения пользователя разница действительно так себе.
Но оперировать с отдельно сохраненным состоянием несравнимо проще. Проще копировать, модифицировать, без вычления из стека. Кроме того, удобно, когда все лежит в одном месте, а стек отделен от состояния...

сделайте
typedef struct{
int regA;
int regB;
...
} tContext;

tContext * pContext;
и перед тем как в стэк контекст складывать, сделайте pContext = SP; и дальше обращаясь по этому указателю можете думать что оно лежит отдельно, разницы нет никакой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 16:41 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
_pv писал(а):
сделайте
typedef struct{
int regA;
int regB;
...
} tContext;

tContext * pContext;
и перед тем как в стэк контекст складывать, сделайте pContext = SP; и дальше обращаясь по этому указателю можете думать что оно лежит отдельно, разницы нет никакой.


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

_pv писал(а):
вы тогда определитесь про что речь идёт.

а если мегабайты памяти то есть готовый [uc]Linux берите да пользуйтесь.
приспосабливать механизмы из второго в первое не надо.


Речь идёт о возможных вариантах, об общих принципах.
В том числе и о универсальных. Давайте пока вообще забудем и о freertos/scmrtos/ucos/ и о линуксах, посиксах.
Как эту задачу надо решать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 16:44 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4255
Откуда: Кемеровская область, Киселевск
CoOS забыли упомянуть

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 16:49 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Странно. Первый раз слышу это название. А там чего?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 16:52 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4255
Откуда: Кемеровская область, Киселевск
Ничего страшного, наверстаете.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 17:02 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Oxford писал(а):
Ничего страшного, наверстаете.

А она чем-нибудь интересна, чтобы ее наверстывать? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 20:02 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Это тебе полезно будет? ссылка


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 20:52 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Спасибо. Я такого длинного и подробного описания этого класса систем никогда в литературе не встречал.

Даже жаль, что тут такие фундаментальные проблемы, как-то невозможность иметь более одного бесконечного цикла, невожность возвращения к низкоприоритетной задаче, при блокировке высокоприоритетной точно также неразрешимы, как и при кооперативном диспетчере...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 21:10 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
А в чем сложности-то, если отбросить всю словесную шелуху? Какой-то проект, момент? Или общая проблема?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 14 окт 2014, 23:25 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Общая проблема. Продолжаю работу над "Конструктором операционной системы" под гордым именем genos Я когда-то о нем писал, только много воды утекло. В системе должна присутствовать возможность вытеснения контекста, причем максимально аппаратно независимая. Вариантов много, излишне перегружать проект, реализуя все - крайне нехочется. пытаюсь выработать решение или набор решений.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 15 окт 2014, 09:57 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4255
Откуда: Кемеровская область, Киселевск
Лучше бы аппаратную ОС запилили бы.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вытеснение контекста всякое-разное.
СообщениеДобавлено: 15 окт 2014, 11:25 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
А какие функции ОС можно делегировать аппаратной части?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB