Механизмы переключения контекстов.
![]() |
активная задача знает более сложные механизм,
в какой момент осуществляется чем у синхронных
переключение, т.е. это переключение генерирует сама задача
![]() | ![]() | ||
Замечания: любая задача, попадая на уровень ядра приобретает статус процесса; каждому процессу сопоставляется стек, в который записываются данные, соответствующие контексту этого процесса; далее при работе процесса поддерживается обновление стека информацией; это позволяет заморозить/разморозить задачу.
Существуют 2 пути:
1) полностью написать эту систему;
2) использовать программный трюк, который позволял бы использовать возможности однопользовательской ОС для создания многопользовательской ОС.
Вызов подпрограммы:
В однопользовательских ОС имеется всего один стек для выполнения программ.
2 требования к организации подпрограммы:
1) параметры процедуры передаются по значению, а обратно передается результат;
2) процедуры могут вызываться рекурсивно в явном виде или неявном.
Пусть есть 2 подпрограммы:
P (основная программа) Q (вызываемая программа)
Для программы P:
- подготавливаются параметры для передачи;
- сохраняется контекст программы для возвращения;
- замена контекста P на контекст Q.
Для программы Q:
- подготавливаются параметры для ее контекста;
- замена контекста Q на контекст P.
Примечание: параметры передаются через стек.
![]() |
| ||||
| |||||
Попрограмма(x, y), например, Pascal, а в Си – наоборот
При дальнем вызове до y в Pascal’e:
mov ax, [bp+6] ; 4 байта – дальний вызов (сегмент и смещение)
bp+2 – первый адрес
Замечание:
1) не всегда удобно использовать переменные (лучше использовать указатель на эту переменную); если используется указатель на переменную, то необходимо помнить:
les si, ук_х ; ES:SI – CS и ES:[SI+2] - IP
2) a) Pascal запоминает все РОНы (РОН – Регистр Общего Назначения);
б) Си запоминает только те регистры, которые участвуют в подпрограмме;
в) Assembler вообще ничего не запоминает.
Используя язык Си, следует запоминать дополнительно значения всех регистров в той технологии, которая будет использована в переключении контекстов.
Вызов сопрограммы:
2 сложности (проблемы):
1) окончание подпрограммы, имеющей статус сопрограммы;
![]() | |||||
| |||||
| |||||
2) сохранение контекста каждой сопрограммы (где-нибудь в ядре) и развитие изменения контекста каждой сопрограммы;
|
|
| |||||||||
![]() | ![]() | ![]() |
CS:IP
Пусть мы написали 2 функции:
1) создание нового процесса;
Дескриптор – указатель на область памяти, где хранятся данные о контексте.
2) переключение от “старого” процесса к “новому” (дескр_стар, дескр_нов);
ее подфункции:
а) модернизация точки возврата “старого” процесса;
б) переключение на “новый” процесс;
@ - точка возврата
@ находится по адресу SS:SP
![]() | |||||
|
|