![]() |
|
Модераторы: xvr |
![]()
|
|
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
всем доброго дня.
подскажите, как мьютекс к примеру, работает изнутри? при локе он устанавливает в шедулере какой-то флаг, при повторном локе которого, шедулер перестает обрабатывать все остальные потоки? мьютексы/переменные_состояния - объекты ядра? спасибо. Добавлено @ 14:37 зы если бы кто-то сориентировал ссылками на исходники ядра с интересующими моментами, был бы невероятно признателен Это сообщение отредактировал(а) boostcoder - 31.8.2011, 14:37 |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: нет Всего: 19 |
/usr/src/linux/Documentation/mutex-design.txt
Читай в самом конце, там и отсылки к исходникам. -------------------- You're face to face With man who sold the world |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
Есть разные алгоритмы, не думаю, что ОС обязывается себя использовать какой-то конкретный. Можешь посмотреть для примера Алгоритм Петерсона, Деккера, Если задаешься такими вопросами, то пора читать это. Это сообщение отредактировал(а) azesmcar - 31.8.2011, 15:31 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
вот он: тыц. mutex.h. mutex.c. нужно разбираться... но из декларации "struct mutex;" некоторые моменты понятны.
Добавлено через 4 минуты и 17 секунд по описанию, довольно простые алгоритмы.. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
ну вообще, если не вдаваться в подробности планировщика, то разобрать работу с мьютексами несложно. для простоты можно рассмотреть,
как работает однопроцессорное ядро. также нужно понимать, что некоторые вещи являются платформозависимые, я постараюсь показать лишь на x86 до самой структуры ты уже добрался (удалю отладочные поля)
итого всего три поля: типы atomic_t - платформозависимые, вот код для х86 http://lxr.linux.no/#linux+v3.0.4/arch/x86...de/asm/atomic.h операции с типами spinlock, в случае однопроцессорной системы и без возможности вытеснения ядра, вообще по идее ничего не должны делать, в противном случае имеют место платформозависимые ассемблерные вставки для работы с этими типами вот основные интерфейсы http://lxr.linux.no/#linux+v3.0.4/include/linux/spinlock.h для х86 в многопроцессорной системе, попытка завладеть спинлоком, ВРОДЕ БЫ, сводилась к асмовской вставке, где в бесконечном цикле осуществлялась операция проверить-изменить переменную далее основные методы создание - ничего интересного, лишь инициализация
блокировка
тут интерес вызывает __mutex_fast_lock, которая в случае занятости мьютекса (count) дергает другую функцию __mutex_lock_slowpath http://lxr.linux.no/#linux+v3.0.4/arch/x86.../mutex_32.h#L24 вот код __mutex_lock_slowpath http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L401 которая вызывает другую функцию блокировки __mutex_lock_common http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L133 если убрать из нее различные примочки времени компиляции, то ключевыми тут будут - запрет вытесняемости http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L140 - далее добавление в очередь ожидания, повторная попытка завладеть мьютексом, спать если мьютекс по прежнему занят (schedule) http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L204 - ну и выход из очереди http://lxr.linux.no/linux+v3.0.4/kernel/mutex.c#L251 напоминаю: переменная current хранит адрес структуры текущего процесса/потока Итог: если мьютекс заблокирован, то в в список ожидающих задач (поле wait_list) добавляется текущая и управление передается планировщику освобождение мьютекса http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L110 опять ключевым является вызов функции fastpath_unlock http://lxr.linux.no/#linux+v3.0.4/arch/x86.../mutex_32.h#L73 которая в случае обнаружения ожидающих задач (по значению count) дергает __mutex_unlock_common_slowpath http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L309 которая пробуждает первый ожидающий в очереди процесс/поток http://lxr.linux.no/#linux+v3.0.4/kernel/mutex.c#L326 по поводу флагов, если судить по тем исходникам, что я привел, в структуре thread_info поле state принимает значение TASK_UNINTERRUPTIBLE видимо это что - то значит для планировщика http://lxr.linux.no/#linux+v3.0.4/include/linux/sched.h#L172 извиняюсь, если понаделал каких - то ошибок в описании, хотел убрать лишнее, чтобы показать элементарный механизм блокировки/разблокировки мьютекса и вызов ожидающих задач. сейчас поздно, я уже сплю, поэтому я надеюсь, что правильно понял вопрос ТС |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
null56, спасибо. понял. все в тему!
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |