предисловие
Существует множество компьютерных систем.独占性
ресурсы, каждый ресурс может использоваться только одним процессом одновременно, мы часто упоминали принтер раньше, это эксклюзивный ресурс,При этом два принтера не могут выводить результаты одновременно, иначе это вызовет паралич файловой системы. Таким образом, операционная система может разрешить процессу доступ к ресурсам в одиночку.
Два процесса получают монопольный доступ к ресурсу и ждут результата выполнения другого ресурса, что приведет к блокировке обоих процессов, и ни один из процессов не освободит свои соответствующие ресурсы.死锁(deadlock)
.
Взаимоблокировки могут возникать на любом уровне. Взаимоблокировки могут возникать между разными машинами. Взаимоблокировки также могут возникать в системах баз данных. Например, процесс A блокирует запись R1, процесс B блокирует запись R2, а затем процесс A блокирует запись R2. И B, и B пытаются чтобы заблокировать запись объекта, и в этом случае произойдет взаимоблокировка.
Давайте обсудим, что такое взаимоблокировка, каковы условия взаимоблокировки, как предотвратить взаимоблокировку, что такое живая блокировка и т. д.
В первую очередь нужно понять понятие, то есть что такое ресурс
ресурс
Большинство взаимоблокировок связано с ресурсами.Взаимоблокировки возникают, когда процесс имеет монопольный (монопольный) доступ к устройствам и файлам. Такие объекты, которые требуют исключительного использования, мы называем资源(resource)
. Ресурсы в основном делятся наВыгружаемые и невыгружаемые ресурсы
###Выгружаемые и невыгружаемые ресурсы
Ресурсы в основном включают вытесняемые ресурсы и невыгружаемые ресурсы.可抢占资源(preemptable resource)
Его можно вытеснить из процесса, которому он принадлежит, без каких-либо других последствий.Память является вытесняемым ресурсом, и любой процесс может вытеснить использование памяти.
不可抢占资源(nonpreemtable resource)
Это означает, что если не возникает ошибка или исключение, процесс не может вытеснять указанный ресурс.Этот невыгружаемый ресурс, такой как компакт-диск, не может быть получен другими процессами в процессе планирования.
Взаимоблокировки связаны с невыгружаемыми ресурсами.Хотя вытесняемые ресурсы также могут вызывать взаимоблокировки, решение этой ситуации обычно заключается в перераспределении ресурсов между процессами для разрешения. Поэтому наше внимание, естественно, будет сосредоточено на невыгружаемых ресурсах.
Абстрактная последовательность событий, необходимых для использования ресурса, приведена ниже.
Если ресурс не существует во время запроса, запрашивающий процесс вынужден ждать. В некоторых операционных системах процесс автоматически блокируется при сбое запрошенного ресурса и автоматически просыпается, когда собственный ресурс становится доступным. В других операционных системах при запросе ресурсов возникает ошибка с кодом ошибки, после чего процесс ожидает некоторое время, прежде чем продолжить повторную попытку.
Процесс, который не может запросить ресурс, попадает вЗапросить ресурс, заснуть, снова запросить ресурсв цикле. Хотя такие процессы не блокируются, по целям и результатам такие процессы аналогичны блокировке, поскольку такие процессы не выполняют никакой полезной работы.
Процесс запроса ресурсов очень зависит от операционной системы. В некоторых системахrequest
Системные вызовы используются для предоставления процессам доступа к ресурсам. В некоторых системах операционная система воспринимает ресурс как файл особого типа, который может быть открыт и занят только одним процессом в любой момент времени. ресурс черезopen
команда открыть. Если файл уже используется, вызывающий блокируется до тех пор, пока текущий удерживающий процесс не закроет файл.
Приобретение ресурсов
Для таких ресурсов, как записи в некоторых системах баз данных, ими должен управлять пользовательский процесс. Одним из способов управления является использование信号量(semaphore)
. Эти семафоры инициализируются значением 1 . Мьютексы также могут делать то же самое.
Вот что
互斥锁(Mutexes)
:В компьютерной программе,
互斥对象(mutex)
— это программный объект, который позволяет нескольким программам совместно использовать один и тот же ресурс, например доступ к файлу, но не одновременно. Потоки, которым необходимо заблокировать ресурсы, должны привязать (заблокировать) мьютекс к другим потокам при использовании ресурса. Мьютекс настроен на разблокировку, когда данные больше не нужны или поток завершается.
Ниже приведен псевдокод, эта часть кода иллюстрирует операцию получения ресурса семафора, освобождения ресурса и т. д., как показано ниже.
typedef int semaphore;
semaphore aResource;
void processA(void){
down(&aResource);
useResource();
up(&aResource);
}
Выше показан процесс захвата и освобождения ресурса процесса, но в целом возможны ситуации, когда несколько ресурсов получают блокировки одновременно, как с этим бороться? Следующее
typedef int semaphore;
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useAResource();
useBResource();
up(&aResource);
up(&bResource);
}
Для одного процесса нет необходимости в блокировке, потому что в этом процессе нет состояния гонки. Таким образом, программа может отлично работать в условиях однократной записи.
Теперь давайте рассмотрим случай двух процессов, A и B, и двух ресурсов. Следующее
typedef int semaphore;
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
void processB(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
В приведенном выше коде оба процесса обращаются к ресурсам в одном и том же порядке. В этом коде один процесс получает ресурс раньше другого процесса, и если другой процесс хочет получить ресурс до того, как первый процесс освободит его, он будет заблокирован из-за блокировки ресурса до тех пор, пока ресурс не будет доступен.
В приведенном ниже коде есть некоторые изменения
typedef int semaphore;
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
void processB(void){
down(&bResource); // 变化的代码
down(&aResource); // 变化的代码
useBothResource();
up(&aResource); // 变化的代码
up(&bResource); // 变化的代码
}
Это другой случай, когда оба ресурса могут быть получены одновременно и эффективно блокировать другой процесс до его завершения. То есть может случиться, что процесс А получает ресурс А одновременно с процессом В, приобретающим ресурс В. Затем каждый процесс блокируется при попытке получить другой ресурс.
Здесь мы обнаружим, что простая проблема получения порядка ресурсов вызовет死锁
, так что взаимоблокировка может возникнуть легко, поэтому давайте подробно разберемся и познакомимся с взаимоблокировкой.
тупик
Если вы хотите определить взаимоблокировку, более подходящим будет следующее определение.
Если каждый процесс в группе процессов ожидает события, которое может быть вызвано только другим процессом в группе, эта ситуация может привести к взаимоблокировке..
Проще говоря, каждый процесс ожидает, пока другие процессы высвободят ресурсы, а другие ресурсы также ждут, пока каждый процесс освободит ресурсы, так что ни один процесс не освобождает свои собственные ресурсы упреждающе, эта ситуация вызовет взаимоблокировку, и все процессы будут ждать. на неопределенный срок.
Другими словами, каждый процесс в заблокированном объединении процессов ожидает ресурса, уже занятого другим заблокированным процессом. Но так как все процессы не могут быть запущены, ни один из них не может высвобождать ресурсы, поэтому ни один процесс нельзя разбудить. Этот тупик также известен как资源死锁(resource deadlock)
. Взаимоблокировка ресурсов является наиболее распространенным типом, но не всеми типами. Мы представим другие типы позже. Давайте сначала представим взаимоблокировку ресурсов.
Условия взаимоблокировки ресурсов
Согласно нашему описанию выше, возможные ситуации взаимоблокировки ресурсов в основном включают:
- Условие взаимного исключения: каждый ресурс закреплен за процессом или ресурс доступен
- Условия удержания и ожидания: считается, что процесс, который уже получил ресурс, может получить новый ресурс.
- Условие отсутствия вытеснения: ресурс, выделенный процессу, не может быть принудительно вытеснен ресурсами других процессов, он может быть освобожден только процессом, которому он принадлежит.
- Циклическое ожидание: когда возникает взаимоблокировка, в системе должно быть два или более процессов, чтобы сформировать цикл, и каждый процесс в цикле ожидает ресурсов, освобожденных следующим процессом.
При возникновении взаимоблокировки вышеуказанные условия должны выполняться одновременно. Если какое-либо из этих условий не выполняется, взаимоблокировка не возникает. Тупик можно разблокировать, нарушив любое из этих условий. Следующие условия останова находятся в центре нашего обсуждения.
тупиковая модель
Холт предложил моделировать тупик в 1972 году, и критерии моделирования следующие:
- Круг представляет собой процесс
- Квадраты представляют ресурсы
От узла ресурса до узла процесса ресурс занят процессом, как показано на следующем рисунке.
На приведенном выше рисунке это означает, что текущий ресурс R занят процессом A.
Направленный граф от узла процесса к узлу ресурса указывает на то, что текущий процесс запрашивает ресурсы, а процесс заблокирован и находится в состоянии ожидания этого ресурса
На диаграмме выше смысл представления в том, что процесс B запрашивает ресурс S. Согласно Холту, описание взаимоблокировки должно быть следующим.
Это тупиковый процесс Процесс C ожидает освобождения ресурса T, но ресурс T уже занят процессом D Процесс D ожидает запроса на занятие ресурса U, но ресурс U занят потоком C, таким образом образуя кольцо.
Обобщить:Есть из тарелки и смотреть на кастрюлю легко зайти в тупик
Итак, как избежать взаимоблокировки? Поговорим о тупиковой модели
Предположим, есть три процесса (A, B, C) и три ресурса (R, S, T). Последовательность запроса и освобождения трех процессов для ресурсов показана на следующем рисунке.
Операционная система может произвольно выбрать неблокирующую программу для запуска, поэтому она может решить запускать A до тех пор, пока A не выполнит свою работу, она может запустить B, пока B не выполнит свою работу, и, наконец, запустить C.
Такой порядок не приведет к тупикам (поскольку нет борьбы за ресурсы), но и совсем не并行性
. Помимо запроса и высвобождения ресурсов, процессы также выполняют вычисления и операции ввода/вывода. Когда процессы выполняются последовательно, другой процесс не может использовать ЦП, ожидая ввода-вывода. Таким образом, строго последовательное исполнение ордеров не является оптимальным. С другой стороны, если ни один процесс не выполняет какие-либо операции ввода-вывода, то первые задания по кратчайшему пути предпочтительнее циклического планирования, поэтому в этом случае последовательный процесс, вероятно, является наиболее предпочтительным.
Теперь мы предполагаем, что процессы будут выполнять вычисления и операции ввода-вывода, поэтому циклическое планирование является разумным.调度算法
. Запросы ресурсов могут быть сделаны в следующем порядке
На следующем рисунке представлена диаграмма распределения ресурсов для шести вышеуказанных шагов.
Здесь возникает вопрос, на что обратить внимание, почему ориентированный граф от ресурса указывает на процесс, но выражаетОбработка запросов ресурсовШерстяная ткань? У автора тоже был этот вопрос в начале, но поразмыслив, правильнее интерпретировать это значение как процесс, занимающий ресурсы, а ориентированный граф процесса указывает на ресурс, а значит, процесс заблокирован.
На четвертом шаге выше процесс A ожидает ресурс S, на пятом этапе процесс B ожидает ресурс T, на шестом этапе процесс C ожидает ресурс R, таким образом создавая петлю и вызывая блокировку смерти.
Однако операционная система не требует, чтобы эти процессы выполнялись в определенном порядке. Обнаружив поток, который может вызвать взаимоблокировку, операционная система может просто отклонить запрос и приостановить процесс, пока он не станет безопасным. Например, на приведенном выше рисунке, если операционная система считает, что существует вероятность взаимоблокировки, она может решить не выделять ресурс S для B, чтобы ресурс B был приостановлен. В этом случае операционная система будет запускать только A и C, тогда запрос и освобождение ресурсов будут следующими шагами
На следующем рисунке представлена диаграмма распределения ресурсов для шести вышеуказанных шагов.
После завершения шестого шага можно обнаружить, что взаимоблокировки нет.В это время ресурс S может быть выделен B, поскольку процесс A завершил выполнение, а процесс C получил требуемые ресурсы. Процесс B может напрямую получить ресурс S или подождать, пока процесс C освободит ресурс T.
Существует четыре стратегии работы с взаимоблокировками:
- Игнорировать влияние тупика (ошеломлен)
- Обнаружение взаимоблокировок и восстановление после взаимоблокировок, обнаружение взаимоблокировок при их возникновении и принятие мер по устранению проблем после возникновения взаимоблокировок
- Избегайте взаимоблокировок, тщательно распределяя ресурсы
- Избегайте взаимоблокировки, нарушая одно из четырех условий, которые создает взаимоблокировка.
Далее мы представим эти четыре метода по отдельности.
Алгоритм страуса
Самое простое решение — использовать鸵鸟算法(ostrich algorithm)
, пряча голову в песок и делая вид, что проблемы вообще не было. Реакция на этот вопрос у всех разная. Математики считают тупиковые ситуации неприемлемыми, и их необходимо предотвращать с помощью эффективных стратегий. Инженеры хотят знать, как часто возникают проблемы, сколько раз происходит сбой системы по другим причинам и каковы серьезные последствия взаимоблокировок. Большинство инженеров не будут устранять тупиковые ситуации, если они случаются нечасто и часто из-за аппаратных сбоев, ошибок компилятора и других проблем ОС, вызывающих сбой системы.
Обнаружение взаимоблокировки и восстановление
Второй метод — обнаружение взаимоблокировок и восстановление. Это решение не пытается предотвратить возникновение взаимоблокировок. Вместо этого это решение требует, чтобы взаимоблокировки возникали как можно чаще и восстанавливались после их обнаружения. Давайте обсудим несколько способов обнаружения взаимоблокировок и выхода из них.
Метод обнаружения взаимоблокировок для одного ресурса каждого типа
Что значит иметь один ресурс для каждого типа ресурсов? Принтеры, о которых мы часто упоминаем, таковы: ресурсы — это только принтеры, но устройств будет не более одного.
Эта ошибка может быть обнаружена путем построения таблицы распределения ресурсов, такой как та, которую мы упоминали выше.
алгоритм обнаружения взаимоблокировок в n процессах от P1 до Pn. Предполагая, что тип ресурса равен m, E1 представляет ресурс типа 1, E2 представляет ресурс типа 2, а Ei представляет ресурс типа i (1 现有资源向量(existing resource vector), представляющее общее количество существующих ресурсов каждого типа.
Теперь нам нужно построить два массива: C означает当前分配矩阵(current allocation matrix)
, R означает, что请求矩阵(request matrix)
. Ci представляет количество ресурсов каждого типа, принадлежащих Pi. Таким образом, Cij представляет количество ресурсов j, которыми владеет Pi. Rij представляет количество ресурса j, которое Pi необходимо получить.
В общем случае количество выделенных ресурсов j складывается вместе с количеством всех доступных ресурсов = общему количеству ресурсов этого типа.
Обнаружение взаимоблокировок основано на сравнении векторов. Каждый процесс изначально не помечен, и алгоритм начнет отмечать процесс. После того, как процесс помечен, это означает, что процесс был выполнен и не войдет в тупик. Когда алгоритм завершится, любой процесс, который не был помечен, будет отмечен как процесс, зашедший в тупик.
Выше мы обсудили два способа обнаружения взаимоблокировок, так что теперь, когда вы знаете, как их обнаруживать, когда вы выполняете обнаружение взаимоблокировок? Вообще говоря, есть два критерия для рассмотрения:
- Проверка всякий раз, когда есть запрос на ресурс, потребляет дорогое процессорное время.
- Проверять каждые k минут или когда загрузка ЦП падает ниже определенного порога. Из соображений эффективности ЦП, если заблокированный процесс достигает определенного числа, не многие процессы могут работать, поэтому ЦП будет часто простаивать.
выйти из тупика
Выше мы обсудили, как обнаружить взаимоблокировки процессов.Наша конечная цель должна состоять в том, чтобы программа работала нормально.Поэтому нам необходимо восстановить обнаруженные взаимоблокировки.Далее мы обсудим восстановление нескольких взаимоблокировок.Путь
Восстановление путем вытеснения
В некоторых случаях ресурс может быть временно передан от его держателя другому процессу. Например, без уведомления исходного процесса ресурс принудительно отбирается у процесса для использования другими процессами и возвращается после использования. Этот способ восстановления в целом более сложный и несколько простой и грубый, что нежелательно.
Восстановление путем отката
Если проектировщики системы и операторы машин знают, что возможны тупиковые ситуации, процесс можно регулярно проверять. Контрольная точка процесса означает, что состояние процесса может быть записано в файл для последующего восстановления. Точка обнаружения содержит не только存储映像(memory image)
, также содержит资源状态(resource state)
. Более эффективное решение — не перезаписывать исходную контрольную точку, а записывать ее в файл каждый раз, когда возникает контрольная точка, чтобы при выполнении процесса накапливалась серия файлов контрольных точек.
Для восстановления необходимо начать с последней ранее контрольной точки, чтобы процесс, которому требуются ресурсы, был отброшен к предыдущему моменту времени.В этот момент времени заблокированный процесс не получил требуемых ресурсов, что можно сделать в этот момент на него выделяются ресурсы.
убить процесс восстановления
Самое простое и наиболее эффективное решение — убить зашедший в тупик процесс напрямую. Но убийство процесса может все равно не сработать, и вам нужно убить другие ресурсы для восстановления.
Другой способ — выбрать внешний процесс в качестве жертвы для освобождения ресурсов процесса.
предотвращение взаимоблокировок
Выше мы обсуждали, как обнаруживать взаимоблокировки и как выходить из них.Давайте обсудим несколько способов избежать взаимоблокировок.
Алгоритм банкира для одного ресурса
Алгоритм Бэнкера — это алгоритм планирования, предложенный Дейкстрой в 1965 году, который сам по себе является алгоритмом планирования взаимоблокировок. Его модель основана на банкире в городе, который обещает определенное количество кредитных линий клиентам в городе. Все, что нужно сделать алгоритму, — это определить, перейдет ли запрос в небезопасное состояние. Если это так, отклоните запрос и примите запрос, если система после запроса находится в безопасности.
Например, в приведенном ниже примере банкир предоставляет в общей сложности 15 единиц кредитных линий для всех городских жителей, и одна единица представляет собой 1000 долларов США, как показано ниже.
Городские жители любят заниматься бизнесом, поэтому будут привлекать кредиты.Максимальная сумма кредита, которую может занять каждый человек, разная.В определенный момент сумма кредита A/B/C/D выглядит следующим образом
Сумма общей суммы кредита каждого вышеперечисленного человека составляет 13, и она сразу же будет близка к 15. Банкир может ссудить только A и C и может перетащить B и D. Следовательно, A и C могут быть завершены первыми, и сумма кредита может быть выпущена.Познакомьтесь с кредитами других жителей. Это安全
статус.
Если результат всех запросов превышает или даже приближается к 15 , он находится в небезопасном состоянии, как показано ниже.
Таким образом, каждый человек по-прежнему может одолжить не менее 2 единиц, и если один из них инициирует запрос на кредит с максимальной суммой, система окажется в тупиковом состоянии.
Здесь следует отметить одну вещь: небезопасное состояние не обязательно вызывает тупик, поскольку клиенту не обязательно нужна его максимальная сумма кредита, но банкир не решается на такую случайность.
Алгоритм банкира заключается в проверке каждого запроса, чтобы увидеть, не приведет ли запрос к небезопасному состоянию, если нет, то принять запрос; если да, то отложить запрос.
Точно так же есть несколько источников алгоритма банкира, которые читатели могут понять сами.
выйти из тупика
Взаимная блокировка по своей сути неизбежна, поскольку она требует получения неизвестных ресурсов и запросов, но взаимоблокировка возникает после выполнения четырех условий, которые
- взаимоисключающий
- держи и жди
- Не вытесняемый
- циклическое ожидание
Мы обсудим эти четыре условия отдельно, само собой разумеющееся, что нарушение любого из них может выйти из тупика.
нарушить взаимоисключающее условие
Наше первое соображениенарушить взаимоисключающее условие использования. Если ресурс не монополизирован процессом, то взаимной блокировки точно не будет. Если два принтера используют ресурс одновременно, это может вызвать путаницу, решение для принтеров — использовать假脱机打印机(spooling printer)
, метод, который позволяет нескольким процессам производить вывод одновременно, в этой модели единственным процессом, который фактически запрашивает принтер, является демон принтера, также известный как фоновый процесс. Фоновые процессы не запрашивают другие ресурсы. Мы можем устранить взаимоблокировку принтера.
Фоновые процессы обычно записываются для вывода полного файла перед печатью, что может привести к взаимоблокировке, если оба процесса занимают половину буферного пространства и ни один из процессов не завершает полный вывод.
Поэтому старайтесь, чтобы как можно меньше процессов запрашивали ресурсы.
сломать условие, которое заставляет ждать
Второй способ заключается в том, что если мы можем запретить процессу, удерживающему ресурс, запрашивать другие ресурсы, мы можем устранить взаимоблокировку. Один из способов сделать это — заставить все процессы запрашивать все ресурсы перед началом выполнения. Если требуемые ресурсы доступны, процесс завершает выделение ресурсов и выполняется до завершения. Если какой-либо из ресурсов часто выделяется, процессы, которым ресурс не выделяется, будут ждать.
много процессовНевозможно точно узнать, сколько ресурсов потребуется до завершения выполнения., если вы его знаете, то можете воспользоваться алгоритмом банкира, с этим тоже есть проблемаНеспособность разумно и эффективно использовать ресурсы.
Другой способ заключается в том, что когда процесс запрашивает другие ресурсы, он сначала освобождает занятые ресурсы, а затем пытается получить все ресурсы сразу.
нарушить неупреждающее условие
Также возможно нарушить невытесняющее условие. Этого можно избежать с помощью виртуализации.
Разорвать условие ожидания цикла
Теперь осталось последнее условие, и условие циклического ожидания можно нарушить несколькими способами. Один из способов — установить стандарт, согласно которому процесс может использовать только один ресурс в любой момент времени. Если требуется другой ресурс, текущий ресурс должен быть освобожден. Это ограничение неприемлемо для процессов, требующих копирования больших файлов с ленты на принтер.
Другой способ — единообразно пронумеровать все ресурсы, как показано на следующем рисунке.
Процессы могут делать запросы в любое время, но все запросы должны выполняться в порядке ресурсов. Если следовать этому правилу выделения, между выделениями ресурсов не будет циклов.
Хотя тупиковые ситуации устраняются таким образом, последовательность нумерации не может быть принята каждым процессом.
другие проблемы
Ниже рассмотрим другие вопросы, в том числеКоммуникационный тупик, что такое livelock, проблема голодания и двухфазная блокировка
двухступенчатая блокировка
Несмотря на то, что во многих случаях можно справиться с предотвращением тупиковых ситуаций, эффект не очень хороший. Со временем было предложено много отличных алгоритмов для работы с взаимоблокировками. Например, в системах баз данных обычной операцией является запрос на блокировку некоторых записей, а затем обновление всех заблокированных записей. Когда несколько процессов выполняются одновременно, существует риск взаимоблокировки.
Одним из решений является использование两阶段提交(two-phase locking)
. Как следует из названия, существует две фазы, на одной из которых процесс пытается заблокировать сразу все необходимые записи. В случае успеха начнется вторая фаза, а вторая фаза — выполнить обновление и снять блокировку. Первый этап не делает действительно значимой работы.
Если запись, необходимая процессу, уже заблокирована на первом этапе, процесс освобождает все заблокированные записи и снова запускает первый этап. В некотором смысле этот подход похож на предварительный запрос всех необходимых ресурсов или запрос всех ресурсов перед выполнением какой-либо необратимой операции.
Однако в общих сценариях применения стратегия двухэтапной блокировки не является универсальной. Недопустимо, чтобы процесс был прерван на полпути и перезапущен, если ему не хватает ресурсов.
коммуникационный тупик
То, что мы обсуждали выше, — это взаимоблокировка ресурсов.Взаимная блокировка ресурсов — это тип взаимоблокировки, но не единственный.Существует также взаимоблокировка связи, которая возникает, когда два или более процессов отправляют сообщения. Процесс A отправляет сообщение процессу B, затем процесс A блокируется до тех пор, пока процесс B не вернет ответ. Если предположить, что сообщение с запросом потеряно, то процесс A ожидает ответа, а процесс B также заблокируется в ожидании прибытия сообщения с запросом.死锁
.
Несмотря на то, что тупик возникает, это не тупик ресурсов, потому что A не занимает ресурсы B. На самом деле полностью видимых ресурсов для коммуникационных взаимоблокировок не существует. Согласно определению взаимоблокировки: каждый процесс блокируется, поскольку он ожидает событий, вызванных другими процессами, что является своего рода взаимоблокировкой. По сравнению с наиболее распространенным коммуникационным тупиком мы называем описанную выше ситуацию通信死锁(communication deadlock)
.
Коммуникационный тупик нельзя избежать с помощью планирования, но его можно избежать, используя очень важную концепцию коммуникации:超时(timeout)
. В процессе связи, пока сообщение отправлено, отправитель запускает таймер, и таймер будет записывать период ожидания сообщения.Если период ожидания истекает, но сообщение не было возвращено, сообщение будет считаться теряется и возмущается.Таким образом можно избежать тупиковых ситуаций в общении.
Однако не все тупиковые ситуации в сетевой связи являются коммуникационными тупиковыми ситуациями, и взаимоблокировки ресурсов также существуют.Ниже приведена типичная тупиковая ситуация ресурсов.
Когда пакет входит в маршрутизатор от хоста, он помещается в буфер, затем передается другому маршрутизатору, еще одному и так далее до пункта назначения. Буферы — это ресурсы, и их количество ограничено. Как показано на изображении ниже, каждый маршрутизатор имеет 10 буферов (на самом деле их много).
Предположим, что все данные от маршрутизатора A должны быть отправлены в B, все пакеты данных от B должны быть отправлены в D, а затем все пакеты данных от D должны быть отправлены в A. Нет пакетов для перемещения, потому что на другом конце нет доступных буферов, что является классической взаимоблокировкой ресурсов.
живой замок
Вас ждет очень интересная вещь, тупик как голова вяза, не повернется. Я читал древнюю историю:
Если тупик очень痴情
, тогда活锁
выразить в предложении弄巧成拙
.
В некоторых случаях, когда процесс понимает, что он не может получить следующую необходимую ему блокировку, он попытается вежливо снять уже полученную блокировку, а затем подождет очень короткое время, чтобы попытаться снова ее получить. Представьте себе такую сцену: когда два человека встречаются на узкой дороге, они оба хотят уступить друг другу дорогу, и одинаковый темп будет мешать обеим сторонам двигаться вперед.
Теперь представьте себе пару параллельных процессов, использующих два ресурса. После того, как их соответствующие попытки получить другую блокировку потерпят неудачу, оба процесса снимут удерживаемые ими блокировки, попытаются снова, и процесс повторится. Очевидно, что в этом процессе нет блокировки процесса, но процесс все равно не выполняется вниз, такую ситуацию мы называем活锁(livelock)
.
голод
Очень похожая проблема с deadlock и livelock饥饿(starvvation)
. Представьте, когда вы будете голодны? Чувствуете ли вы голод, если не едите какое-то время? Для процессов самое главное — это ресурсы.Если ресурсы не будут получены в течение определенного периода времени, процессы будут голодать, и эти процессы никогда не будут обслуживаться.
Мы предполагаем, что схема распределения принтера такова, что он каждый раз будет выделяться процессу с наименьшим файлом, тогда процесс, который хочет напечатать большой файл, никогда не будет обслуживаться, что приведет к голоданию процесса, и процесс будет будет отодвигаться на неопределенный срок, хотя и не блокируется.
Суммировать
Взаимоблокировки — это общий класс проблем, которые могут возникнуть в любой операционной системе. Взаимная блокировка возникает, когда каждый процесс в каждой группе процессов блокируется в ожидании ресурса, занятого другими процессами в группе. Эта ситуация поставит все процессы в бесконечное состояние ожидания.
Об обнаружении и предотвращении тупика можно судить по безопасному и небезопасному состоянию.Одним из методов обнаружения является алгоритм банкира, конечно можно использовать и алгоритм страуса для игнорирования тупика, но он вас точно атакует.
Также возможно избежать тупика с точки зрения структуры системы во время проектирования, что может предотвратить тупик; он также может разрушить четыре условия тупика, чтобы разрушить тупик. Взаимоблокировки ресурсов — это не уникальные взаимоблокировки, а также взаимоблокировки взаимодействия, которые можно устранить, установив соответствующий тайм-аут.
Проблемы livelock и deadlock в чем-то похожи, они оба представляют собой состояние, в котором процесс не может продолжать выполняться вниз. Голодание процесса происходит, когда сторона, пытающаяся получить процесс, никогда не может получить ресурс из-за политики планирования процесса.
конец
Обнаружена ошибка, о которой было сообщено издателю.
обо мне
Я сам написал три PDF-файла, и отзывы читателей очень хорошие. Теперь я делюсь ими бесплатно. Подпишитесь на мой официальный аккаунт, чтобы получить их.