Lock в операционной системе

Lock в операционной системе

28.10.2015 12:35:03 Просмотров 27 Источник

Прочел про команду LOCK# для процессора архитектуры x86, которая блокирует шину памяти на время выполнения команды следующей. Возник такой вопрос, насколько я знаю для реализации локов процессов используется схема примерно следующая: поставить лок на изменение адреса памяти какого-то (не очень понимаю как это происходит более детально), выполнить изменения, снять лок.

Вопросы следующие:

  • Что происходит когда процесс/поток говорит что хочет залочить изменение блока адресов, например 1024-1040? Бит какой-то выставляется где-то или что? (Рассматривается многоядерная система и какой-то общий кусок памяти)
  • Что будет если процесс залочил изменение памяти, а после отвалился? Снимает ли ОС лок или что?

UPD: То есть в моем понимании раз мы можем атомарно изменить значение с 0 до 1, то это позволяет нам где-то вести инфу о том, что процесс 1 вошел в критическую область, но ему же нужно после этого допустим 100500 операций выполнить и после этого выйти из критической области, но где хранится информация какие адреса в памяти он собирается изменять (его критическая область) в результате этих 100500 операций? Или тупо просто каждая команда с LOCK# выполняется до релиза?

Если всё вверху звучит как бред, объясните, пожалуйста, как это работает на самом деле. :)

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5#comment505758_461818
Назвались Эллочкой — отыгрывайте хотя бы женский пол :)
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5#comment505907_461818
@avp, если знаете ответ, не стесняйтесь, высказывайтесь :)
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5#comment506026_461818
Вас интересует локинг именно внутри ядра (на самом нижнем уровне сильно зависит от архитектуры) или в user level? В любом случае лучший ответ в сорсах.
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5#comment506033_461818
@avp, да, как раз внутри ядра, мне достаточно примера для какой-то одной архитектуры, к примеру там блокируется шина памяти (хотя как мне сказали - это уже прошлый век), выставляется бит в какой-то структуре ядра что страница общей памяти или область залочена и при попытке записать в нее что-то другим процессом он приостанавливается и вносится в список ожидающих, как-то так я это себе представляю, но хотелось бы чуточку подробнее :)
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5#comment506059_461818
В первом приближении есть 2 уровня блокировок -- активная (spinlock) -- циклически опрашиваем бит в обусловленном (для этого ресурса) месте (про BTS Вам уже сказали) и блокировка с уходом в диспетчер. Во втором случае смотрим на ресурс (опять битик где-то) и если он занят, то записываем себя в очередь к ресурсу, отмечаем себя (в TCB) как ждущего и вызываем scheduler. Когда процесс, владеющий ресурсом будет его освобождать, он снимет наше ожидание (в нашем TCB) и выкинет нас из очереди к ресурсу. Когда-нибудь sсheduler увидит, что мы активны и вернет нам управление... Коротеньнко, как-то так.

Ответы - Lock в операционной системе / Lock в операционной системе

dsnk

28.10.2015 11:31:11

UPD: То есть в моем понимании раз мы можем атомарно изменить значение с 0 до 1, то это позволяет нам где-то вести инфу о том, что процесс 1 вошел в критическую область, но ему же нужно после этого допустим 100500 операций выполнить и после этого выйти из критической области, но где хранится информация какие адреса в памяти он собирается изменять (его критическая область) в результате этих 100500 операций? Или тупо просто каждая команда с LOCK# выполняется до релиза?

Нет необходимости где-то хранить адреса памяти, это забота программиста, использовать элементы синхронизации потоков/процессов во время обращения к разделяемой области памяти. Если логика программы подразумевает несколько таких областей, для каждой предусматривается свой элемент(ы) синхронизации.

UPD: Выполнение префикса LOCK совместно с операцией (для примера) BTS - Проверка и установка бита, при некоторых оговорках, позволяют создать простейший элемент межпроцессорной синхронизации.

https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5/461902#comment505971_461902
вопрос как раз в том как работает примитив синхронизации на уровне код примитива - операция на процессоре (ядрах) - внутренние структуры операционной системы пример: 2 процесса на разных ядрах, каждый пытается изменить общий кусок памяти; что, где, куда, когда? :) спасибо!
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5/461902#comment505979_461902
короче говоря, как это разрулила операционная система у себя под капотом? команды, что где хранит, взаимодействие ядер и тп )
https://ru.stackoverflow.com/questions/461818/lock-%d0%b2-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b9-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b5/461902#comment506032_461902
@EllochkaCannibal, в смысле управления памятью внутри ядра речь всегда идет о страницах. Локируются дескрипторы физических страниц (есть такая структура данных в ядре), участвующих в некой операции. А к процессу, конечно, есть привязка, и при exit они разблокируются вместе с освобождением других ресурсов, приписанных к процессу.
Pavel Mayorov

28.10.2015 12:57:59

Нигде ничего не хранится. Если один поток обращается к памяти, находясь в критической области - второй поток может обращаться к той же самой области памяти, находясь снаружи критической области.

Кстати, само понятие "критическая секция" означает не защищенную область памяти - а участок программы, в котором не могут находиться два потока одновременно.

Закрыть X