Re: Userspace spinlock
От: merk Россия  
Дата: 27.06.08 17:42
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Ingo Molnár считает, что «user-space spinlocks are broken beyond words for anything but perhaps SCHED_FIFO tasks».


RO>А почему?


цитато:

SCHED_FIFO: планировщик FIFO (First In-First Out)
Алгоритм SCHED_FIFO можно использовать только со значениями статического приоритета, большими нуля. Это означает, что если процесс с алгоритмом SCHED_FIFO готов к работе, то он сразу запустится, а все обычные процессы с алгоритмом SCHED_OTHER будут приостановлены. SCHED_FIFO — это простой алгоритм без квантования времени. Процессы, работающие согласно алгоритму SCHED_FIFO подчиняются следующим правилам: процесс с алгоритмом SCHED_FIFO, приостановленный другим процессом с большим приоритетом, останется в начале очереди процессов с равным приоритетом, и его исполнение будет продолжено сразу после того, как закончатся процессы с большими приоритетами. Когда процесс с алгоритмом SCHED_FIFO готов к работе, он помещается в конец очереди процессов с тем же приоритетом. Вызов функции sched_setscheduler или sched_setparam , который посылается процессом под номером pid с алгоритмом SCHED_FIFO приведет к тому, что процесс будет перемещен в конец очереди процессов с тем же приоритетом. Процесс, вызывающий sched_yield, также будет помещен в конец списка. Других способов перемещения процесса с алгоритмом SCHED_FIFO в очереди процессов с одинаковыми статическим приоритетом не существует. Процесс с алгоритмом SCHED_FIFO работает до тех пор, пока не будет заблокирован запросом на ввод/вывод, приостановлен процессом с большим статическим приоритетом или не вызовет sched_yield.
конец цитаты.

видимо наблюдается тот же эффект, что и при раундробин, который я предположил в топике несколько ниже.

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