| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > mutex/condition_variable как работают изнутри? |
| Автор: boostcoder 31.8.2011, 14:36 |
| всем доброго дня. подскажите, как мьютекс к примеру, работает изнутри? при локе он устанавливает в шедулере какой-то флаг, при повторном локе которого, шедулер перестает обрабатывать все остальные потоки? мьютексы/переменные_состояния - объекты ядра? спасибо. Добавлено @ 14:37 зы если бы кто-то сориентировал ссылками на исходники ядра с интересующими моментами, был бы невероятно признателен |
| Автор: newbee 31.8.2011, 14:54 |
| /usr/src/linux/Documentation/mutex-design.txt Читай в самом конце, там и отсылки к исходникам. |
| Автор: azesmcar 31.8.2011, 15:31 |
Есть разные алгоритмы, не думаю, что ОС обязывается себя использовать какой-то конкретный. Можешь посмотреть для примера http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0, http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%BA%D0%BA%D0%B5%D1%80%D0%B0, Если задаешься такими вопросами, то пора читать http://www.amazon.com/Art-Multiprocessor-Programming-Maurice-Herlihy/dp/0123705916. |
| Автор: boostcoder 31.8.2011, 16:30 | ||
вот он: http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.38.y.git;a=blob;f=Documentation/mutex-design.txt;h=38c10fd7f4110448facd7089b985c4776d264d85;hb=HEAD. http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.38.y.git;a=blob;f=include/linux/mutex.h;h=94b48bd40dd735f77963fcd31797d32bb68b3379;hb=HEAD. http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.38.y.git;a=blob;f=kernel/mutex.c;h=a5889fb28ecff33eaf5fae64c9d2a50ca03cb2f7;hb=HEAD. нужно разбираться... но из декларации "struct mutex;" некоторые моменты понятны.
Добавлено через 4 минуты и 17 секунд по описанию, довольно простые алгоритмы.. |
| Автор: azesmcar 31.8.2011, 18:34 |
Это для двух потоков. |
| Автор: null56 5.9.2011, 00:21 | ||||||
| ну вообще, если не вдаваться в подробности планировщика, то разобрать работу с мьютексами несложно. для простоты можно рассмотреть, как работает однопроцессорное ядро. также нужно понимать, что некоторые вещи являются платформозависимые, я постараюсь показать лишь на x86 до самой структуры ты уже добрался (удалю отладочные поля)
итого всего три поля: типы atomic_t - платформозависимые, вот код для х86 http://lxr.linux.no/#linux+v3.0.4/arch/x86/include/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/include/asm/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/include/asm/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 5.9.2011, 00:33 |
| null56, спасибо. понял. все в тему! |