Вопросик такого вот рода.
К примеру в ядре есть некоторый свой код. Который вызывается из некоторого системного вызова в ядре. При этом на свою работу данный код тратит много времени, и соответственно и работа данного системного вызова тоже становится долгой, при этом вся система становится "временно недоступной". Так что в момент работы этой фиговины даже мышь бегает прыжками в X.
Кто нибудь занимался реализацией задержек выполнения чего либо в ядре, что бы осуществить паузу в в выполнении текущей задачи и что бы она не только остановилась на время а передала там управление другим процессам внутри ядра - подскажите что и как делать?
реализация переключения "процессов" протекающих в ядре.
Модератор: Модераторы разделов
реализация переключения "процессов" протекающих в ядре.
Ubuntu 6.10 AMD64 2.6.20.3 reiserfs3.6 Gnome 2.16.1 & FreeBSD6.0 AMD64 ufs Gnome 2.14
- Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
- Контактная информация:
Re: реализация переключения "процессов" протекающих в ядре.
Искать по словам preemptible kernel.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: реализация переключения "процессов" протекающих в ядре.
ZeLLa
Для этого создаётся *поток ядра*, который выполняет список запросов. Постановкой запросов в некую очередь этого потока должен заниматься системный вызов, который вернёт задаче дескриптор, на котором она сможет повиснуть в ожидании.
Для этого создаётся *поток ядра*, который выполняет список запросов. Постановкой запросов в некую очередь этого потока должен заниматься системный вызов, который вернёт задаче дескриптор, на котором она сможет повиснуть в ожидании.
Re: реализация переключения "процессов" протекающих в ядре.
по-моему вы очень плохо читаете докуметацию =)
чтобы вызвать переключение процессов надо вызвать schedule(); если есть какая-либо другая задача, на которую надо выполнить переключение, то лучше всего использовать switch_to().
без включенного вытеснения в ядре, вам возможно будет действовать в двух основных направлениях:
1) Считать тики системного таймера непосредственно в коде модуля и следить за тем чтоб ваш код не отнимал слишком много времени.
2) Этим способом поступают нормальные люди) - проще всего организовывать очереди выполнения или тасклеты.
вот в таких направления можно работать. очень советую прочесть книгу Linux Device Drivers (она на английском) , найдете в ней много полезного.
чтобы вызвать переключение процессов надо вызвать schedule(); если есть какая-либо другая задача, на которую надо выполнить переключение, то лучше всего использовать switch_to().
без включенного вытеснения в ядре, вам возможно будет действовать в двух основных направлениях:
1) Считать тики системного таймера непосредственно в коде модуля и следить за тем чтоб ваш код не отнимал слишком много времени.
2) Этим способом поступают нормальные люди) - проще всего организовывать очереди выполнения или тасклеты.
вот в таких направления можно работать. очень советую прочесть книгу Linux Device Drivers (она на английском) , найдете в ней много полезного.
Re: реализация переключения "процессов" протекающих в ядре.
Здесь все зависит от того что конкретно реализовано.
Если реализован драйвер к которому производиться доступ через файл устройства или через файловую систему /proc то процесс выполняющий данный код драйвера в режиме ядра все равно может быть вытеснен другим процессом, если код ядра не запретил это (например можно запретить все прерывания).
Другое дело если реализован новый системный вызов, при переключении на нулевой уровень ядра все прерывания запрещаются и ваш системный вызов должен сам разрешить прерывания (если он этого захочет), но в этом случае уже надо не забывать о том, что твой код режима ядра может быть прерван в любую минуту, со всеми вытекающими отсюда последствиями.
Re: реализация переключения "процессов" протекающих в ядре.
тогда нужно узнать у автора будет ли его код исполняться в управляющем тракте ядра?
если ядро не поддерживает вытеснения, то процесс будет держать процессор пока выполняется в режиме ядра и добровольно не выйдет из него.
я разве системные вызовы происходят не в процессе? в коде по-моему явно заменяется содержимое регистров и происходит замена стека на стек режима ядра, но выполнение происходит в контексте процесса! так что системный вызов судя по всему может быть прерван. поправьте если ошибаюсь.
Если реализован драйвер к которому производиться доступ через файл устройства или через файловую систему /proc то процесс выполняющий данный код драйвера в режиме ядра все равно может быть вытеснен другим процессом, если код ядра не запретил это (например можно запретить все прерывания).
если ядро не поддерживает вытеснения, то процесс будет держать процессор пока выполняется в режиме ядра и добровольно не выйдет из него.
Другое дело если реализован новый системный вызов, при переключении на нулевой уровень ядра все прерывания запрещаются и ваш системный вызов должен сам разрешить прерывания (если он этого захочет), но в этом случае уже надо не забывать о том, что твой код режима ядра может быть прерван в любую минуту, со всеми вытекающими отсюда последствиями.
я разве системные вызовы происходят не в процессе? в коде по-моему явно заменяется содержимое регистров и происходит замена стека на стек режима ядра, но выполнение происходит в контексте процесса! так что системный вызов судя по всему может быть прерван. поправьте если ошибаюсь.