реклама на сайте
подробности

 
 
> Принцип работы ОС, как?
Denisvak
сообщение Aug 21 2007, 18:47
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 7-03-06
Из: Санкт-Петербург
Пользователь №: 15 038



Добрый вечер.
Задача примерно такая...
Есть две-три функции которые крутятся в бесконечном цыкле - необходимо чтобы они выполнялись как бы паралельно, и процессорное время было поделено между ними поровну. Хочу разобраться как работают ОС и написать свой код для этого...применять какую либо готовую ОС не вижу смысла для подобной задачи...да просто хочется самому понять принцып.

Вопросы:
1.Есть код...те самые три функции...
Код
void Function_1(void){
    for(;;){
    ..............
    }
}
void Function_2(void){
    for(;;){
    ..............
    }
}
void Function_3(void){
    for(;;){
    ..............
    }
}


как делить между ними процессорное время? Так понимаю что таймером...но вот к примеру таймер сработал когда "мы" находились в середине функции Function_1...выполнение прервалось и перешли к Function_2...Function_3....дальше возвращаемся в Function_1. Но вот как узнать на каком участке кода "мы" прервали функцию и откуда надо продолжить её выполнение?



P.S. большая просьба не удалять тему...поиском пользовался но ничего не нашел sad.gif
Спасибо

Сообщение отредактировал Denisvak - Aug 21 2007, 18:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Aug 22 2007, 08:33
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Denisvak @ Aug 21 2007, 21:47) *
применять какую либо готовую ОС не вижу смысла для подобной задачи...да просто хочется самому понять принцып.
Возьмите документацию и исходники какой-нибудь готовой ОС и попробуйте разобраться по ним - это будет продуктивнее, чем если кто-то будет пытаться изложить здесь всю теорию своими словами, к тому же будете иметь пример реализации перед глазами. Вот тут перечислены некоторые небольшие ОС, с которых можно начать изучение.
Кратко примерно так: существует понятие "контекст задачи" - это содержимое всех регистров (включая указатель стека) на момент прерывания задачи. Каждая задача имеет свой собственный стек, где она размещает локальные переменные, адреса возвратов и т.д. При переключении задач контекст текущей задачи сохраняется на ее стеке, указатель стека переключается на стек следующей задачи и контекст восстанавливается из стека в регистры.
Поскольку переключение контекста обычно происходит в одной и той же точке - в процедуре смены контекста, то значение счетчика команд сохранять не нужно - оно уже автоматически сохранено на стеке текущего процесса при вызове этой функции.

P.S. А насчет применять готовую - весь вопрос в потраченном времени. Ведь ничто не мешает хорошо разобраться как работает готовое и применить его, если подходит. Плюсов три:
1) Вы сэкономите время на написании с нуля.
2) В готовом ошибки ищут все, кто пользует это готовое, а в вашем коде вы будете искать их водиночку.
3) Те, кто писали готовое имеют несколько больший опыт и могли учесть в своей реализации нюансы, о которых вы и не догадываетесь, но которые в неподходящий момент вам вылезут боком.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 11:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016