Cpu z mutex locked что это
Содержание .
- Отключить устройство HDMI из диспетчера устройств
- Обновите Windows 10
- Обновите ваши драйверы
- Запустите средство устранения неполадок BSOD
- Запустите сканирование SFC
- Запустить DISM
- Проверьте жесткий диск
- Переустановите драйвер Sound Blaster
- Очистите свой компьютер и переустановите модули оперативной памяти
- Проверьте аппаратные проблемы
Решение 1. Отключите устройство HDMI из диспетчера устройств .
Как мы упоминали ранее, ошибки BSoD часто вызваны проблемами с программным обеспечением, и немногие пользователи сообщили, что отключение их устройства HDMI исправило ошибку SYSTEM EXIT OWNED MUTEX. Очевидно, что некоторые устройства HDMI имеют проблемы со звуковыми картами X-Fi, поэтому для решения этой проблемы рекомендуется отключить ваше устройство HDMI. Для этого вам необходимо выполнить следующие шаги:
- Откройте Power User Menu, нажав Клавиша Windows + X и в меню выберите Диспетчер устройств .
- Когда откроется Диспетчер устройств , вам нужно найти устройство HDMI, щелкнуть его правой кнопкой мыши и выбрать в меню Отключить .
После отключения устройства HDMI проблема с ошибкой SYSTEM EXIT OWNED MUTEX BSoD должна быть решена.
Решение 2. Обновление Windows 10
Microsoft постоянно обновляет Windows 10, и многие новые функции добавляются. В дополнение к новым функциям Microsoft исправляет недостатки безопасности и проблемы совместимости с определенным программным и аппаратным обеспечением. Поскольку ошибки BSoD вызваны несовместимым аппаратным или программным обеспечением, рекомендуется регулярно выполнять обновление Windows, чтобы Windows 10 работала без ошибок.
Решение 3. Обновите драйверы
Как упоминалось ранее, многие ошибки BSoD могут быть вызваны вашим программным обеспечением, и если ваши драйверы не полностью совместимы с Windows 10, вы можете получить ошибку SYSTEM EXIT OWNED MUTEX. Чтобы решить эту проблему, настоятельно рекомендуется регулярно обновлять драйверы. Установка последних драйверов относительно проста, и все, что вам нужно сделать, это посетить веб-сайт производителя вашего оборудования и загрузить последние версии драйверов для ваших устройств. Стоит отметить, что почти любой драйвер может вызвать эту ошибку, поэтому обязательно обновите столько драйверов, сколько сможете.
Обновлять драйверы автоматически
Поиск драйверов самостоятельно может занять много времени. Поэтому мы советуем вам использовать инструмент, который сделает это автоматически. Использование автоматического средства обновления драйверов, безусловно, избавит вас от необходимости поиска драйверов вручную и всегда будет поддерживать вашу систему в курсе последних версий драйверов.
Модуль обновления драйверов Tweakbit (одобрен Microsoft и Norton Antivirus) поможет вам автоматически обновлять драйверы и предотвращать повреждение ПК, вызванное установкой неправильных версий драйверов. После нескольких тестов наша команда пришла к выводу, что это наиболее автоматизированный решение.
Вот краткое руководство о том, как его использовать:
- Загрузите и установите средство обновления драйверов TweakBit
- После установки программа начнет сканирование вашего компьютера на наличие устаревших драйверов автоматически. Driver Updater проверит установленные вами версии драйверов по своей облачной базе данных последних версий и порекомендует правильные обновления. Все, что вам нужно сделать, это дождаться завершения сканирования.
- По завершении сканирования вы получите отчет обо всех проблемных драйверах, найденных на вашем ПК. Просмотрите список и посмотрите, хотите ли вы обновить каждый драйвер по отдельности или все сразу. Чтобы обновить один драйвер за раз, нажмите ссылку «Обновить драйвер» рядом с именем драйвера. Или просто нажмите кнопку «Обновить все» внизу, чтобы автоматически установить все рекомендуемые обновления.
Примечание.Некоторые драйверы необходимо установить в несколько этапов, поэтому вам придется нажмите кнопку «Обновить» несколько раз, пока все его компоненты не будут установлены.
Решение 4. Запустите средство устранения неполадок BSOD .
Следующее, что мы собираемся попробовать, это встроенный в Windows 10 инструмент устранения неполадок.Этот инструмент можно использовать для решения всевозможных проблем, в том числе проблем BSOD.
Вот как запустить средство устранения неполадок Windows 10:
- Откройте приложение Настройки и перейдите в раздел Обновление и безопасность .
- Выберите «Устранение неполадок» в меню слева.
- Выберите BSOD на правой панели и нажмите Запустить средство устранения неполадок .
- Следуйте инструкциям на экране для устранения неполадок.
Решение 5. Запустите сканирование SFC
Следующий инструмент устранения неполадок, который мы собираемся попробовать, – это сканирование SFC. Это средство устранения неполадок командной строки, которое также может решать различные системные проблемы. Таким образом, это может быть также полезно здесь.
- Щелкните правой кнопкой мыши кнопку «Пуск» и откройте Командную строку (Admin).
- Введите следующую строку и нажмите Enter: SFC/SCANNOW
- Подождите, пока процесс не будет завершен (это может занять некоторое время).
- Если решение найдено, оно будет применено автоматически.
- Теперь закройте командную строку и перезагрузите компьютер.
Решение 6 – Запустите DISM
DISM – это инструмент командной строки, который развертывает образ системы заново. Этот процесс может привести к решению различных проблем, включая проблемы BSOD.
Мы рассмотрим как стандартные, так и процедуры, которые используют установочный носитель ниже:
- Стандартный способ
- Щелкните правой кнопкой мыши Пуск и откройте командную строку (администратор).
- Вставьте следующую команду и нажмите Enter:
- DISM/Online/Cleanup-Image/RestoreHealth
- DISM/Online/Cleanup-Image/RestoreHealth
- Подождите, пока сканирование не закончится.
- Перезагрузите компьютер и попробуйте обновить снова.
- С установочного носителя Windows
- Вставьте установочный носитель Windows.
- Щелкните правой кнопкой мыши меню «Пуск» и выберите в меню «Командная строка» («Администратор»).
- В командной строке введите следующие команды и нажмите Enter после каждого:
- dism/online/cleanup-image/scanhealth
- dism/online/cleanup-image/restorehealth
- Теперь введите следующую команду и нажмите Enter:
- DISM/Online/Cleanup-Image/RestoreHealth /source:WIM:X:SourcesInstall.wim:1/LimitAccess
- Обязательно измените значение X с буквой подключенного диска при установке Windows 10.
- После завершения процедуры перезагрузите компьютер.
Решение 7. Проверьте жесткий диск
Если ваш жесткий диск не в лучшей форме, произойдет ошибка BSOD. Таким образом, вы должны запустить инструмент диагностики диска, который сообщит вам, если ваш жесткий диск поврежден.
Вот как запустить команду chkdsk в Windows 10:
- Введите Расширенный запуск (перезагрузите компьютер, удерживая клавишу Shift ).
- Выберите Устранение неполадок> Дополнительные параметры .
- Выберите Командная строка в списке параметров.
- Когда появится командная строка, введите следующие строки и нажмите Enter после каждой строки, чтобы запустить ее:
- bootrec.exe/rebuildbcd
- bootrec.exe/fixmbr
- bootrec.exe/fixboot
- Некоторые пользователи также рекомендуют запускать дополнительные команды chkdsk . Для выполнения этих команд вам необходимо знать буквы дисков для всех разделов жесткого диска. В командной строке вы должны ввести следующее (но не забудьте использовать буквы, которые соответствуют разделам вашего жесткого диска на вашем ПК):
- chkdsk/r c:
- c hkdsk/r d:
- chkdsk/r c:
Решение 8. Переустановите драйвер Sound Blaster .
- Нажмите Ключ Windows + X и выберите Диспетчер устройств из списка.
- При запуске Диспетчер устройств найдите свой аудиодрайвер, щелкните его правой кнопкой мыши и выберите Удалить .Если доступно, установите флажок Удалить программное обеспечение драйвера для этого устройства и нажмите ОК .
- После удаления драйвера перезагрузите компьютер.
- Если ошибка исправлена и звук работает нормально, вы можете продолжить использовать драйвер по умолчанию. Если есть какие-либо проблемы со звуком, не стесняйтесь обновить ваш аудио драйвер.
Хотя пользователи сообщали о проблемах с аудиодрайвером Sound Blaster, вы можете попробовать это решение, даже если вы не использовали звук Sound Blaster.
Решение 9. Очистите компьютер и установите модули оперативной памяти .
Многие ошибки BSoD вызваны проблемами с оперативной памятью, и если вы получаете ошибку SYSTEM EXIT OWNED MUTEX, вы можете проверить свою оперативную память. Чтобы выполнить этот шаг, вам нужно открыть корпус вашего ПК, поэтому убедитесь, что на ваш компьютер нет гарантии. После того, как вы откроете свой компьютер, вам нужно будет очистить его от пыли с помощью сжатого воздуха. Когда ваш компьютер очищен от пыли, аккуратно извлеките модули оперативной памяти и поменяйте их местами. Несколько пользователей сообщили, что переустановка модулей RAM навсегда исправила ошибку BSoD SYSTEM EXIT OWNED MUTEX, поэтому обязательно попробуйте это.
Решение 10. Проверьте наличие проблем с оборудованием
Как упоминалось ранее, ошибки BSoD обычно возникают из-за неисправного ОЗУ, поэтому всегда полезно проверить, правильно ли работает ОЗУ. Для этого вы можете удалить один или несколько модулей оперативной памяти и проверить, хорошо ли работает ваш ПК без него. Возможно, вам придется проверить все модули ОЗУ по одному, прежде чем вы найдете тот, который вызывает эту ошибку.
В дополнение к удалению модулей ОЗУ, вы также можете использовать такие инструменты, как MemTest86 + для проверки вашей ОЗУ. Просто создайте загрузочный USB-диск или компакт-диск с MemTest на нем и загрузите компьютер с этой USB-флешки или компакт-диска. Запустите MemTest и дайте ему проверить вашу оперативную память на пару часов. Чтобы найти неисправный модуль, вам, возможно, придется тестировать один модуль памяти за раз, прежде чем найти неисправный.
В дополнение к вашей оперативной памяти любой другой аппаратный компонент может вызвать эту ошибку, поэтому обязательно проверьте материнскую плату и жесткий диск. Стоит также отметить, что любое недавно установленное оборудование, которое не полностью совместимо с вашим ПК, может вызвать эту ошибку, поэтому обязательно удалите его или замените и проверьте, работает ли ваш компьютер без него.
Примечание редактора . Этот пост был первоначально опубликован в июне 2016 года и с тех пор был полностью переработан и обновлен для обеспечения свежести, точности и полноты.
В биосе ничего по этому поводу нет, настроить там можно чуть ли не одни параметры boot. Про процессор же там только краткая сводка.
Пробовал еще аидой, та тоже видит одно ядро, работающее в 2 потока. В диспетчере устройств на вкладке "процессор" он выводит 4 штуки.
Есть другие программы, что там показывает? , в BIOS ходил, там есть какая-то инфа? .
Значит софт криво определяет по какой-то причине, вот это вопрос. То что в диспетчере задач 4, это хорошо, значит все верно работает. ОС 7 шла с ноутбуком?
KoVaNi - Это проц на ноутбуке, обозначение буква М.
Возможно ядро системы установленной у вас для 1 ядерной. Win7 ??
или.. .
Как проверить, все ли ядра моего многоядерного процессора работают?
Запустите Диспетчер задач Windows* и откройте закладку Performance (Быстродействие) . Вы должны увидеть диаграмму для каждого ядра. Если вы не видите диаграммы для каждого ядра, выполните следующие проверки:
Убедитесь, что Диспетчер задач настроен на отображение нескольких диаграмм:
Выберите "Диспетчер задач"
Нажимайте View/CPU History/One Graph Per CPU
Убедитесь в том, что настройки BIOS для системы и процессора установлены правильно.
Убедитесь, что в настройках BIOS задействованы все ядра процессора
Убедитесь, что у Вас установлены все последние обновления операционной системы.
Запустите программу идентификации процессоров Intel® Processor Identification, чтобы убедиться, что в вашей системе установлен подлинный процессор Intel®, и он определяется правильно.
Проверить процессор
Как можно отключить ядро в многоядерном процессоре?
В BIOS системных плат Intel® для настольных ПК имеется опция для отключения вторичных ядер. В системных платах Intel для настольных ПК эта опция BIOS обычно называется «Core Multiplexing Technology» (технология мультиплексирования ядер) . Если вы используете системную плату другого производителя, необходимо уточнить у поставщика системы, есть ли в вашем ПК подобная опция.
4.3 Проблемы со спином
Если блокировка получена во время процесса вращения, ранее заблокированная сопрограмма не сможет получить блокировку.Если имеется много заблокированных сопрограмм, каждый раз, когда блокировка получается посредством вращения, тогда ранее заблокированному процессу будет трудно получить блокировку. Вхождение в состояние голода.
Для того, чтобы сопрограммам не удавалось долго захватывать блокировки, начиная с версии 1.8 было добавлено состояние, а именно состояние Mutex из-за отсутствия доступа. В этом состоянии не будет никакого вращения. Как только сопрограмма снимает блокировку, она обязательно разбудит сопрограмму и успешно заблокирует ее.
Предыдущий анализ был сосредоточен только на изменениях битов Waiter и Locked во время процесса блокировки и разблокировки, а теперь мы рассмотрим роль битов голода.
У каждого Mutex есть два режима, называемых Нормальным и Голодным. Два режима объясняются отдельно ниже.
4.1 Условия вращения
Когда программа заблокирована, программа автоматически определит, возможно ли вращение. Неограниченное вращение будет оказывать сильное давление на процессор, поэтому важно определить, может ли оно вращаться.
Вращение должно соответствовать всем следующим условиям:
- Количество вращений должно быть достаточно маленьким, обычно 4, что максимум 4 вращения
- Количество ядер процессора должно быть больше 1, иначе вращение не имеет смысла, потому что никакие другие сопрограммы не могут снять блокировку в это время.
- Число процессов в механизме планирования сопрограмм должно быть больше 1, например, использование GOMAXPROCS () для установки процессора в 1 не может включить вращение.
- Запускаемая очередь в механизме планирования сопрограмм должна быть пустой, в противном случае планирование сопрограмм будет отложено
Видно, что условия отжима очень жесткие, иными словами, отжим включается только тогда, когда он не занят.
4.1 нормальный режим
По умолчанию режим Mutex нормальный.
В этом режиме сопрограмма не будет немедленно переходить в очередь блокировки, если блокировка не удалась. Вместо этого она определит, выполнено ли условие вращения. Если оно выполнено, она запустит процесс вращения и попытается захватить блокировку.
2.2 Мьютекс-метод
Mutext предоставляет два метода для внешнего мира.На самом деле, есть только два метода:
- Lock (): метод блокировки
- Unlock (): метод разблокировки
Ниже мы анализируем процесс блокировки и разблокировки. Существует два случая блокировки: успешная и неудачная. Если блокировка успешна, блокировка получается напрямую. После сбоя текущая сопрограмма блокируется. Аналогичным образом, существует два типа обработки в зависимости от того, существует ли блокирующая сопрограмма при разблокировке. ,
Мьютекс
Mutex используется, чтобы гарантировать, что только один поток выполняет часть кода в течение определенного периода времени.
концепция:
Нижний уровень мьютекса - это мьютекс, а мьютекс - это, по сути, счетчик только с двумя значениями 0 или 1.
0: это означает, что мьютекс не может быть получен, а это означает, что критический ресурс, к которому необходимо получить доступ, недоступен.
1: это означает, что мьютекс может быть получен, а это означает, что можно получить доступ к критически важному ресурсу, к которому необходимо получить доступ.
Заблокировать и разблокировать
Операция блокировки: уменьшение счетчика, сохраненного мьютексом в мьютексе, на 1
операция разблокировки: увеличивает счетчик, сохраненный мьютексом в мьютексе
Исследование принципа реализации мьютекса
После приведенного выше примера мы уже знаем, что чистый i ++ или ++ i не является атомарной операцией, могут быть проблемы с согласованностью данных, но блокировка и разблокировка будут добавлены операции вычитания, поэтому в Для достижения операции блокировки взаимного исключения большинство архитектур предоставляют инструкции подкачки или обмена. Функция этой инструкции заключается в прямом обмене данными регистра и блока памяти. Поскольку существует только одна инструкция, атомарность гарантируется, даже если она является многопроцессорной платформой, и циклы шины для доступа к памяти также являются последовательными.Когда команда обмена на одном процессоре выполняется, команда обмена другого процессора может только ждать цикла шины.
СледовательноПсевдокод блокировки и блокировки примерно такой
При блокировке возникают две ситуации, а именно анализ выражения if в псевдокоде:
С помощью этих концепций мы можем попытаться использовать логику блокировки мьютекса для достижения взаимного исключения.
3.2 Блокировка заблокирована
Предположим, что блокировка была занята другими сопрограммами во время блокировки. Процесс блокировки в это время показан на следующем рисунке:
Как видно из приведенного выше рисунка, когда сопрограмма B снова блокирует уже занятую блокировку, счетчик официантов увеличивается на 1, и в это время сопрограмма B будет заблокирована и не будет активирована, пока значение Locked не станет равным 0.
Взаимоисключающий
Все еще говорим о концепции взаимного исключения между потоками процессов
Критический ресурс: Ресурсы, совместно используемые многопоточным потоком выполнения (совместное использование потоков), называются критическими ресурсами.
Критический раздел: Внутри каждого потока код, который обращается к критическим ресурсам, называется критической секцией.
Атомарность: Операция, которая не будет прервана никаким механизмом планирования. Операция имеет только два состояния: завершено или не завершено.
Операция доступа: Выполнять неатомарные операции с критическими ресурсами в критических регионах.
Взаимоисключающий: В любое время взаимное исключение гарантирует, что существует и только один (поток) поток выполнения входит в критическую область, обращается к критическому ресурсу и реализует защиту критического ресурса.
Сначала смоделируйте логику реализации захвата билетов:
Глобальные общие данные рассматриваются как количество голосов. Всего билетов 100. Четыре потока имитируют скальперы, которые захватывают билеты и продают их. Посмотрите, будут ли затронуты проблемы безопасности потоков, упомянутые выше. происходят:
Разумеется, анализируя приведенные выше результаты, можно увидеть, что доступ четырех потоков к критическим ресурсам не так рациональный и упорядоченный, как мы думали, потому что потоки выполняются с упреждением, а операция сокращения также не является атомарной операцией, и билет может был ограблен. Но он не был напечатан, временной интервал прибыл или данные обновляются в памяти, как только они были уменьшены, и к ним снова обращаются другие потоки выполнения, что приводит к операциям множественного доступа, в результате в неоднозначности результатов программы.
Обобщите причину из логики кода
- После того, как оператор if определит, что условие истинно, код может одновременно переключиться на другие потоки.
- usleep - это процесс имитации ожидания. В этом долгом бизнес-процессе может быть много потоков, входящих в сегмент кода.
- Сама операция вычитания не является атомарной операцией и может быть прервана.
- Выньте ассемблерный код части операции вычитания, чтобы проанализировать, почему она может быть прервана:
- Соответствует трем инструкциям по сборке:
mov: загружает общую переменную g_ticket из памяти в регистр
sub: обновите значение в регистре и выполните операцию -1.
mov: записать новое значение из регистра обратно в адрес памяти общей переменной g_ticket
Чтобы решить вышеуказанные проблемы, необходимо сделать три вещи:
- Код должен иметь взаимоисключающее поведение: когда код входит в критическую секцию для выполнения, другим потокам не разрешается входить в критическую секцию.
- Если несколько потоков одновременно требуют выполнения кода в критическом разделе, и ни один поток не выполняется в критическом разделе, то только одному потоку может быть разрешено войти в критический раздел.
- Если поток не выполняется в критическом разделе, он не может помешать другим потокам войти в критический раздел.
Чтобы достичь этих трех точек,По сути, для управления им нужен замок. Эта блокировка, предусмотренная в Linux, называется мьютексом.。
4.1 Что такое спин
Вращение соответствует инструкции CPU «PAUSE». CPU ничего не делает с этой инструкцией, что эквивалентно простоям CPU. Это эквивалентно спящему режиму в течение короткого периода времени, а время очень короткое. Текущая реализация - 30 тактовых циклов.
В процессе отжима он будет непрерывно обнаруживать, становится ли Locked равным 0. Два последовательных интервала обнаружения предназначены для выполнения этих инструкций PAUSE. Он отличается от режима сна и не требует перевода сопрограммы в режим сна.
4.2 Преимущества Spin
Преимущество вращения состоит в том, чтобы более полно использовать процессор и максимально избегать переключения сопрограмм. Поскольку сопрограмма, которая в настоящее время подает заявку на блокировку, имеет ЦП, если блокировка получена после короткого вращения, текущая сопрограмма может продолжать работать без перехода в состояние блокировки.
3.1 Простой замок
Предполагая, что в настоящее время заблокирована только одна сопрограмма и нет помех от других сопрограмм, процесс показан на следующем рисунке:
Процесс блокировки определит, установлен ли флаг Locked 0. Если он равен 0, бит Locked установлен в 1, указывая, что блокировка прошла успешно. Как видно из рисунка выше, после успешной установки блокировки устанавливается только бит Locked, а остальные биты состояния не изменяются.
3.3 Простая разблокировка
Предположим, что при разблокировке нет других блокировок сопрограммы. В это время процесс разблокировки показан на следующем рисунке:
Поскольку нет других сопрограмм, блокирующих ожидание блокировки, вам нужно только установить бит Locked на 0 при разблокировке, и вам не нужно освобождать семафор.
4.2 режим голодания
Возможность захватить блокировку во время процесса вращения должна означать, что сопрограмма одновременно сняла блокировку.Мы знаем, что если заблокированная сопрограмма ожидает освобождения блокировки, она также освободит семафор, чтобы разбудить ожидающую сопрограмму и проснуться. Сопрограмма начинает работать после получения ЦП. В это время обнаруживается, что блокировка была прервана, и она должна снова блокироваться, но перед блокировкой она будет определять, сколько времени прошло с последнего блока до текущего блока. Пометить как «голодный» режим перед блокировкой.
В режиме голодания процесс отжима не запускается, то есть, как только сопрограмма снимает блокировку, сопрограмма будет разбужена, пробужденная сопрограмма успешно получит блокировку, и это также уменьшит число ожидания на единицу.
Состояние Woken используется для связи во время процесса блокировки и разблокировки. Например, одновременно две сопрограммы блокируются, а одна разблокируется. Заблокированная сопрограмма может находиться в процессе вращения. В это время Woken отмечен. Это 1, которое используется для уведомления сопрограммы разблокировки о том, что нет необходимости освобождать семафор. Например, вы можете просто разблокировать его. Вам не нужно освобождать семафор. Я получу блокировку сразу.
Вы можете задаться вопросом, почему Go не может быть более надежным и не паниковать, выполняя Unlock () несколько раз?
Если вы думаете о логике разблокировки, вы можете понять, что это на самом деле трудно сделать. Процесс разблокировки делится на установку Locked на 0, а затем определение значения Waiter. Если значение> 0, семафор освобождается.
Если существует несколько Unlock (), то семафор может быть освобожден каждый раз. Это приведет к пробуждению нескольких сопрограмм. После пробуждения нескольких сопрограмм они продолжат захватывать блокировки в логике Lock (), что определенно увеличит реализацию Lock (). Сложность также приведет к ненужному переключению сопрограмм.
2.1 Мьютекс структура
Исходный пакет src/sync/mutex.go:Mutex Структура данных мьютекса определяется:
- Mutex.state указывает состояние мьютекса, например, заблокирован он или нет.
- Mutex.sema представляет семафор: сопрограмма блокирует ожидание семафора, а разблокированная сопрограмма освобождает семафор и пробуждает сопрограмму в ожидании семафора.
Мы видим, что Mutex.state - это 32-разрядная целочисленная переменная, которая реализуется внутри системы и делится на четыре, чтобы записать четыре состояния Mutex.
На следующем рисунке показана схема памяти Mutex:
- Заблокировано: указывает, заблокирован ли Mutex 0: не заблокирован 1: заблокирован.
- Woken: указывает, были ли пробуждены сопрограммы, 0: нет пробужденных сопрограмм 1: пробуждены существующие сопрограммы, и выполняется блокировка.
- Голодание: указывает, обрабатывает ли Mutex состояние голодания, 0: отсутствие голодания, 1: состояние голодания, что указывает на то, что сопрограмма блокируется более 1 мс.
- Официант: указывает количество сопрограмм, которые заблокированы в ожидании блокировки. Когда сопрограмма разблокирована, определяется, нужно ли освобождать семафор.
Коррупция между сопрограммами на самом деле является правом назначения значения для Locked. Если для поля Locked установлено значение 1, это означает, что блокировка прошла успешно. Если это невозможно, он заблокирует и будет ожидать семафор Mutex.sema. Как только сопрограмма, удерживающая блокировку, будет разблокирована, ожидающая сопрограмма будет по очереди пробуждена.
Woken и Starving в основном используются для управления процессом захвата блокировки между сопрограммами.
Многопоточная синхронизация и мьютекс (блокировка мьютекса, переменная условия, блокировка чтения-записи, блокировка вращения, семафор)
Во-первых, концепция синхронизации и взаимного исключения
Современные операционные системы в основном являются многозадачными операционными системами, то есть одновременно выполняется большое количество планируемых объектов. В многозадачной операционной системе несколько задач, выполняющихся одновременно, могут:
- Оба нужны Доступ / использование одного и того же ресурса ;
- Есть зависимости между несколькими задачами, выполнение задачи Зависит от Для другой задачи.
Это относится к ряду программных сегментов, проходящих между различными задачами, их работа должна выполняться строго в соответствии с определенной последовательностью. Эта последовательность зависит от конкретной задачи, которая должна быть выполнена. Самый основной сценарий: Два или более процессов или потоков координируются и синхронизируются в запущенном процессе и выполняются в заранее определенной последовательности. Например, операция задачи A зависит от данных, сгенерированных задачей B.
Это относится к нескольким фрагментам программы, проходящим между различными задачами. Когда задача запускает один из фрагментов программы, другие задачи не могут запускать ни один из них. Только после того, как задача закончила запускать этот фрагмент программы Можете бежать. Самый основной сценарий: Общий ресурс может использоваться только одним процессом или потоком одновременно, и несколько процессов или потоков не могут использовать общие ресурсы одновременно.
Mutex Lock (синхронизация)
В многозадачной операционной системе для одновременного выполнения нескольких задач может потребоваться один и тот же ресурс. Процесс немного похожий: в отделе компании, пока я использую принтер для печати вещей (еще не закончил), другие также используют принтер для печати вещей в данный момент.Если ничего не сделано, напечатанные вещи должны быть повреждены. а.
Существует также такая блокировка в потоке-мьютексе. Mutex - это простой метод блокировки для управления доступом к общим ресурсам. Mutex имеет только два состояния, а именно:Блокировка и разблокировка。1. валентность: Блокировка мьютекса как атомарной операции, что означает, что операционная система (или библиотека pthread) гарантирует, что, если поток блокирует мьютекс, никакой другой поток не сможет успешно заблокировать мьютекс одновременно;
2. уникальность: Если поток блокирует мьютекс, никакой другой поток не может заблокировать мьютекс, пока он не будет разблокирован;
3. Ожидание не занято: Если поток заблокировал мьютекс, а второй поток пытается заблокировать мьютекс, второй поток будет приостановлен (не занимает ресурсы процессора), пока первый поток не освободит мьютекс. Пока мьютекс не заблокирован, второй поток просыпается и возобновляет выполнение, а мьютекс заблокирован.
[Процесс работы мьютекса выглядит следующим образом]:
1. Заблокируйте мьютекс перед доступом к критической области после общего ресурса;
2. Снимите блокировку блокировки мьютекса после завершения доступа. Отпустите блокировку блокировки мьютекса после завершения доступа;
3. После блокировки мьютекса любые другие потоки, пытающиеся снова заблокировать мьютекс, будут блокироваться до тех пор, пока блокировка не будет снята. После блокировки мьютекса любые другие потоки, пытающиеся снова заблокировать мьютекс, будут блокироваться до тех пор, пока блокировка не будет снята.
[Демо] (режим блокировки):
[Демо] (неблокирующий режим):
Условные переменные (синхронизация)
В отличие от блокировок мьютекса, условные переменные используются для ожидания, а не для блокировки. Условные переменные используются для автоматической блокировки потока, пока не возникнет особая ситуация , Переменная условияИспользуется с мьютексом。
Переменные условия позволяют нам спать и ждать появления определенных условий. Условные переменные - это механизм синхронизации с глобальными переменными, разделяемыми между потоками, которые в основном включают два действия:- Поток зависает в ожидании "условия условной переменной для выполнения";
- Другой поток делает «условия истинными» (сигнализирует, что условия выполняются).
Обнаружение состояния выполняется под защитой мьютекса.Поток должен сначала заблокировать мьютекс перед изменением состояния условия, Если условие ложно, поток автоматически блокирует и освобождает мьютекс в ожидании изменения состояния. Если другой поток изменяет условие, он сигнализирует о связанной переменной условия, пробуждает один или несколько потоков, ожидающих его, восстанавливает мьютекс и повторно оценивает условие , Если два процесса совместно используют читаемую и записываемую память, условные переменные можно использовать для синхронизации потоков между двумя процессами.
[Условие переменной операции потока выглядит следующим образом]:
1. Инициализация: Init () или pthread_cond_tcond=PTHREAD_COND_INITIALIER Атрибут имеет значение NULL;
Подождите, пока условие будет выполнено: Pthread_wait, pthread_timewait.wait () снимает блокировку и блокирует переменную условия ожидания, чтобы быть истинной. Timewait () устанавливает время ожидания, оно не сигнализируется и возвращает ETIMEOUT (блокировка гарантирует, что только один поток ожидает)
3. Активируйте условные переменные: Pthread_cond_signal, pthread_cond_broadcast (активировать все ожидающие потоки)
4. Очистить переменные условия: Destroy; нет потоков, ожидающих, в противном случае возвращаем EBUSY. Очистить переменную условия: destroy; нет потоков, иначе возвращаем EBUSY.
(1) экземпляр переменной состояния потока 1
Джек остановил такси и остановился, когда никого не увидел. Через некоторое время Сьюзен пришла на площадку, чтобы подготовиться к поездке, но не пришла, поэтому она подождала. Через некоторое время Майк поехал на это место, Сунсан сел в машину Майка и уехал. Как показано:
(2) переменная условия потока экземпляр 2
Джек ехал на такси, чтобы остановиться, и никто не ожидал. Через некоторое время Сьюзен пришла на площадку, чтобы подготовиться к поездке, и увидела такси Джека. Через некоторое время Майк поехал на площадку и не увидел никого ожидающего. Как показано:
В-четвертых, блокировка чтения-записи (синхронизация)
Блокировки чтения-записи аналогичны мьютексам, за исключением того, что блокировки чтения-записи допускают параллелизм изменений. Мьютекс заблокирован или разблокирован, и только один поток может заблокировать его одновременно.
Блокировки чтения-записи могут иметь три состояния: заблокированы в режиме чтения, заблокированы в режиме записи и разблокированы.
Только один поток может одновременно удерживать блокировку чтения-записи в режиме записи, но несколько потоков могут одновременно удерживать блокировку чтения-записи в режиме степени.
[Характеристики блокировки чтения-записи]:
- Если другие потоки читают данные, другим потокам разрешено выполнять операции чтения, но операции записи не допускаются;
- Если другие потоки записывают данные, другим потокам не разрешается читать или записывать.
[Правило блокировки чтения-записи]:
- Если поток применяет блокировку чтения, другие потоки могут применять блокировку чтения, но не могут применять блокировку записи;
- Если поток применяет блокировку записи, другие потоки не могут применять блокировку чтения и не могут применять блокировку записи.
Блокировки чтения-записи подходят для структур данных.Гораздо больше читает, чем пишетСитуация.
Пять, спин блокировка (синхронизация)
Функция спин-блокировки выполняет ту же функцию, что и мьютекс, с той лишь разницей, что мьютекс блокирует отказ ЦП после перехода в спящий режим, тогда как спин-блокировка не приводит к отказу процессора. Она ожидает, пока блокировка не будет получена.
Спинлоки используются меньше в пользовательском режиме и больше в ядре! Используйте сценарии спин-блокировки: Время удержания блокировки относительно короткое или меньше времени двух переключений контекста 。
Интерфейс функции спин-блокировки в пользовательском режиме такой же, как и мьютекс.Замените мьютекс вращением в pthread_mutex_xxx ()Например: pthread_spin_init ().Шесть, семафор (синхронизация и взаимоисключение)
Семафоры широко используются для синхронизации и взаимного исключения между процессами или потоками. Семафоры по сути являются неотрицательным целочисленным счетчиком, который используется для управления доступом к общедоступным ресурсам.
При программировании вы можете судить о том, имеете ли вы доступ к общедоступным ресурсам, в зависимости от результата работы со значением семафора. Когда значение семафора больше 0, вы можете получить к нему доступ, в противном случае оно заблокируется. Примитив PV - это операция с семафором, операция P уменьшает семафор на единицу, а операция V уменьшает семафор на единицу.
[Семафор используется для синхронизации]:
[Семафоры используются для взаимного исключения]:
Обработка данных потока:
По сравнению с процессами одним из самых больших преимуществ потоков является совместное использование данных. Каждый процесс использует сегмент данных, унаследованный от родительского процесса, и может легко получать и изменять данные. Но это также создает множество проблем для многопоточного программирования. Мы должны быть осторожны Есть несколько разных процессов, обращающихся к одной и той же переменной . Многие функции Без повторного входа, то есть несколько копий функции не могут быть запущены одновременно (если не используются разные сегменты данных) . Статические переменные, объявленные в функции, часто вызывают проблемы, и возвращаемое значение функции также имеет проблемы. Поскольку, если возврат является адресом статически объявленного пространства внутри функции, когда один поток использует данные, на которые указывает адрес после вызова функции для получения адреса, другие потоки могут вызывать эту функцию и изменять этот фрагмент данных ( Возникающая двусмысленность ). Переменные, используемые в процессе, должны быть определены с помощью ключевого слова volatile (извлекать данные только из памяти). Это необходимо для предотвращения изменения компилятором способа их использования во время оптимизации (например, использования параметра -OX в gcc). Чтобы защитить переменные (критические ресурсы и т. Д.), Мы должны использовать Семафор (для синхронизации) 、 Доступ к мьютексу И другие методы для обеспечения правильного использования переменных (т.е. Обеспечьте безопасность ниток )。Раньше мы также говорили о концепциях реентерабельных функций, условий гонки, уникальности многопоточности и совместного использования, изменчивых ключевых слов и атомарных операций, поэтому я не буду повторять их здесь.В этой статье в основном объясняется взаимное исключение для обеспечения безопасности доступа к критически важным ресурсам (например, вопросы безопасности потоков).
Обе концепции
Потокобезопасный: Когда несколько потоков одновременно выполняют один и тот же фрагмент кода, разные результаты не будут отображаться (однозначно). Распространенная проблема: если вы работаете с глобальными или статическими переменными без защиты от блокировки, потоки небезопасны.
Возвращение: Одна и та же функция вызывается разными потоками выполнения (потоками), и текущий процесс еще не был выполнен (временной интервал процессора истек, счетчик программ, контекстная информация и информация о данных должны быть сохранены до отказа от ресурсов процессора), там другие исполнения Поток (получение ресурса процессора) снова входит в эту функцию, мы называем ее реентерабельной. Когда функция является реентерабельной, результат (операция с данными) не будет показывать никаких различий или каких-либо проблем, тогда функция называется реентерабельной функцией, в противном случае это нереентерабельная функция.Общие небезопасные ситуации потока
- Функции, не защищающие общие переменные
- Функция, состояние которой изменяется вместе с состоянием функции, называется
- Функции, возвращающие указатели на статические переменные
- Функции, вызывающие нереентерабельные функции
Распространенные потокобезопасные ситуации
- У каждого потока есть разрешение только на чтение для общих глобальных переменных потока или статических переменных, но нет разрешения на запись. В общем, эти потоки безопасны.
- Классы или интерфейсы - это атомарные операции для потоков
- Переключение между несколькими потоками не вызовет неоднозначности в результате выполнения интерфейса.
Распространенные ситуации без повторного входа
- Вызывается функцией malloc / free, потому что функция malloc использует глобальный связанный список для управления кучей
- Вызываются стандартные функции библиотеки ввода-вывода, и многие реализации стандартной библиотеки ввода-вывода используют глобальные структуры данных без повторного входа.
- В теле повторно входимой функции используется статическая структура данных.
Общие ситуации повторного входа
- Не используйте глобальные переменные или статические переменные
- Не используйте пространство, созданное malloc или new
- Не вызывайте нереентерабельные функции
- Не возвращает статические или глобальные данные, все данные предоставляются вызывающей функцией.
- Используйте локальные данные или защищайте глобальные данные, создавая локальные копии глобальных данных
Повторный вход и безопасность потоков
- Функция реентерабельна, т.е. потокобезопасна
- Функция не реентерабельна, поэтому ее нельзя использовать несколькими потоками, что может вызвать проблемы с безопасностью потоков.
- Если в функции есть глобальные переменные, то функция не является ни поточно-ориентированной, ни реентерабельной.
Разница между реентерабельным и потокобезопасным
- Реентерабельная функция - это своего рода потокобезопасная функция
- Безопасность потока не обязательно является реентерабельной, а функции с возможностью повторного входа должны быть потокобезопасными.
- Если доступ к критическим ресурсам заблокирован, эта функция является потокобезопасной, но если повторно входимая функция не сняла блокировку, она зайдет в тупик, поэтому повторная входимость не будет.
。
Взаимоисключающий: Убедитесь, что только один поток выполнения получает доступ к критическим ресурсам одновременно, то есть в любое время взаимное исключение гарантирует, что один и только один (поток) поток выполнения входит в критическую область, обращается к критическому ресурсу и реализует защиту критический ресурс.
Синхронизировать: Убедитесь, что программа имеет разумный доступ к критическим ресурсам (то есть после того, как один поток выполнения завершает логику, ресурсы процессора должны быть освобождены вовремя, чтобы другие потоки выполнения по-прежнему оставались их логикой задачи).7.2 Блокировка и разблокировка должна происходить парами
Блокировка и разблокировка предпочтительно должны быть на одном уровне блока кода, например, в одной и той же функции.
Повторная разблокировка может вызвать панику, и следует избегать возможности этой операции.
Пожертвуйте розы, чтобы оставить аромат, если вам хорошо, пожалуйста, нравится ~
Эта статья была заархивирована в проект GitHub в поисках звезд ~Нажмите меня
3.4 Разблокировать и разбудить сопрограмму
Предположим, что при разблокировке одна или несколько сопрограмм блокируются, и процесс разблокировки показан на следующем рисунке:
Процесс разблокировки сопрограммы A делится на два этапа: один - установить бит Locked равным 0, а другой - увидеть, что Waiter> 0, поэтому семафор освобождается для пробуждения заблокированной сопрограммы. Сопрограмма B затем получает блокировку.
При блокировке, если текущий бит Locked равен 1, это означает, что блокировка в настоящий момент удерживается другими сопрограммами. Сопрограмма, которая пытается заблокировать, не сразу переключается на блокировку, но постоянно обнаруживает, становится ли бит Locked равным 0. Этот процесс Это процесс вращения.
Время отжима мало, но если во время отжима обнаруживается, что блокировка снята, сопрограмма может сразу же получить блокировку. В это время, даже если сопрограмма пробуждена, она не может получить блокировку и может только блокировать снова.
Преимущество вращения состоит в том, что при отказе блокировки нет необходимости немедленно переключаться на блокировку, и существует определенная возможность получить блокировку, которая может избежать переключения сопрограмм.
7.1 Использование defer, чтобы избежать тупиков
Используйте отсрочку, чтобы разблокировать его сразу после блокировки, что может эффективно избежать тупика.
Использование интерфейса Mutex
1. Определите мьютекс
2. Инициализируйте мьютекс.
3. Блокировка
4. Разблокировать
5. Уничтожьте мьютекс.
Кроме того, нужно обратить внимание на уничтожение мьютекса:
- Мьютекс, инициализированный с помощью PTHREAD_ MUTEX_ INITIALIZER, не требует уничтожения
- Не уничтожать заблокированный мьютекс
- Уничтоженный мьютекс, убедитесь, что никакие потоки не попытаются снова заблокировать
Таким образом, блокировка и разблокировка могут обеспечить взаимное исключение доступа к критическим ресурсам и решить неопределенность доступа к ресурсам для нескольких потоков выполнения.
Таким образом, мы здесь, чтобы добавить блокировку взаимного исключения для завершения процедуры захвата заявки, но мы также должны прояснить следующие моменты:
1. Где определить в коде, где инициализировать, а где уничтожить.
Определение: определяется как глобальная переменная
Инициализация: инициализация перед созданием потока
Уничтожение: уничтожить после выхода из потока
2. Где заблокировать
Выполните операцию блокировки перед доступом к критическим ресурсам
3. Где разблокировать
Вам нужно заранее разблокировать при выходе, где можно выйти (иначе при выходе никто не сможет разблокировать блокировку, программа может зависнуть (тупик))
4. Если блокировка заблокирована, но не разблокирована, все потоки выполнения, которые хотят добавить блокировку мьютекса, попадут в режим ожидания блокировки (тупик).Почему 80% фермеров кода не могут быть архитекторами? >>>
Mutex - это основной метод управления доступом к разделяемым ресурсам в параллельных программах. Go предоставляет очень простой и легкий в использовании Mutex. Mutex является структурным типом. Два метода, Lock () и Unlock (), доступны для внешних пользователей. Используется для блокировки и разблокировки.
Mutex очень удобен в использовании, но его внутренняя реализация намного сложнее, включая несколько состояний Mutex. Кроме того, мы также хотим изучить причину паники, вызванной повторной разблокировкой Mutex.
По соглашению этот раздел начинается с исходного кода и извлекает принципы реализации, не слишком запутываясь в деталях реализации.
Читайте также:
- Соответствует трем инструкциям по сборке: