Зачем нужна защита

Зачем нужна защита

Для лучшего понимания того, к чему может привести состояние конкуренции, давайте рассмотрим примеры повсеместно встречающихся критических участков.

В качестве первого примера рассмотрим ситуацию из реальной жизни; банкомат (который еще называют ATM, Automated Teller Machine, или кэш-машиной).

Одно из наиболее часто встречающихся действий, которые приходится выполнять с помощью банкомата — это снятие денег с персонального банковского счета физического лица. Человек подходит к банкомату, вставляет карточку, вводит PIN-код, проходит аутентификацию, выбирает пункт меню Снятие наличных, вводит необходимую сумму, нажимает OK, забирает деньги и отправляет их автору этой книги.

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

int total = get_total_from_account(); /* общее количество денег на счету */

int withdrawal = get_withdrawal_amount(); /* количество денег,

                                             которые хотят снять */

/* проверить, есть ли у пользователя деньги на счету */

if (total < withdrawal)

 error("У Вас нет таких денег!");

/* Да, у пользователя достаточно денег: вычесть снимаемую сумму из

   общего количества денег на счету */

total -= withdrawal;

update_total_funds(total);

/* Выдать пользователю деньги */

spit_out_money(withdrawal);

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

Обе системы, которые снимают деньги со счета, выполняют код, аналогичный только что рассмотренному: проверяется, что снятие денег возможно, после этого вычисляется новая сумма денег на счету и, наконец, деньги снимаются физически. Теперь рассмотрим некоторые численные значения. Допустим, что первая снимаемая сумма равна $100, а вторая — $10, например, за то, что пользователь зашел в банк (что не приветствуется: необходимо использовать банкомат, так как в банках людей не хотят видеть). Допустим также, что у пользователя на счету есть сумма, равная $105. Очевидно, что одна из этих двух транзакций не может завершиться успешно без получения минусов на счету.

Можно ожидать, что получится что-нибудь вроде следующего: первой завершится транзакция по снятию платы за вход в банк. Десять долларов — это меньше чем $105, поэтому, если от $105 отнять $10, на счету останется $95, а $10 заработает банк. Далее начнет выполняться снятие денег через банкомат, но оно завершится неудачно, так как $95 — это меньше чем $100.

Тем не менее жизнь может оказаться значительно интереснее, чем ожидалось. Допустим, что две указанные выше транзакции начинаются почти в один и тот же момент времени. Обе транзакции убеждаются, что на счету достаточно денег: $105 — это больше $100 и больше $10. После этого процесс снятия денег с банкомата вычтет $100 из $105 и получится $5. В это же время процесс снятия платы за вход сделает то же самое и вычтет $10 из $105, и получится $95. Далее процесс снятия денег обновит состояние счета пользователя: на счету окажется сумма $5. В конце транзакция снятия платы за вход также обновит состояние счета, и на счету окажется $95. Получаем деньги в подарок!

Ясно, что финансовые учреждения считают своим долгом гарантировать, чтобы такой ситуации не могло возникнуть никогда. Необходимо блокировать счет во время выполнения некоторых операций, чтобы гарантировать атомарность транзакций по отношению к другим транзакциям. Такие транзакции должны полностью выполняться не прерываясь или не выполняться совсем.

Общая переменная

Теперь рассмотрим пример, связанный с компьютерами. Пусть у нас есть очень простой совместно используемый ресурс: одна глобальная целочисленная переменная и очень простой критический участок — операция инкремента значения этой переменной:

i++

Это выражение можно перевести в инструкции процессора следующим образом.

Загрузить текущее значение переменной i из памяти в регистр.

Добавить единицу к значению, которое находится в регистре.

Записать новое значение переменной i обратно в память.

Теперь предположим, что есть два потока, которые одновременно выполняют этот критический участок, и начальное значение переменной i равно 7. Результат выполнения будет примерно следующим (каждая строка соответствует одному интервалу времени ).

Поток 1                                                                 Поток 2

получить значение i из памяти (7) -

увеличить i на 1 (7->8)           -

записать значение i в память (8)  -

-                                 получить значение i из памяти (8)

-                                 увеличить i на 1 (8->9)

-                                 записать значение i в память (9)

Как и ожидалось, значение переменной i, равное 7, было увеличено на единицу два раза и стало равно 9. Однако возможен и другой вариант.

Поток 1                                                                      Поток 2

получить значение i из памяти (7) -

-                                 получить значение i из памяти (7)

увеличить i на 1 (7->8)           -

-                                 увеличить i на 1 (7->8)

записать значение i в память (8)  -

-                                 записать значение i в память (8)

Если оба потока выполнения прочитают первоначальное значение переменной i перед тем, как оно было увеличено на 1, то оба потока увеличат его на единицу и запишут в память одно и то же значение. В результате переменная i будет содержать значение 8, тогда как она должна содержать значение 9. Это один из самых простых примеров критических участков. К счастью, решение этой проблемы простое — необходимо просто обеспечить возможность выполнения всех рассмотренных операций за один неделимый шаг. Для большинства процессоров есть машинная инструкция, которая позволяет атомарно считать данные из памяти, увеличить их значение на 1 и записать обратно в память, выделенную для переменной. Использование такой инструкции позволяет решить проблему. Возможно только два варианта правильного выполнения этого кода — следующий.

Поток 1                                                Поток 2

увеличить i на 1 (7->8) -

-                       увеличить i на 1 (8->9)

Или таким образом.

Поток 1                                                Поток 2

-                       увеличить i на 1 (7->8)

увеличить i на 1 (8->9) -

Две атомарные операции никогда не могут перекрываться. Процессор на физическом уровне гарантирует это. Использование такой инструкции решает проблему. Ядро предоставляет несколько интерфейсов, которые позволяют реализовать атомарные операции. Эти интерфейсы будут рассмотрены в следующей главе.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Зачем нужна простота?

Из книги Бизнес путь: Yahoo! Секреты самой популярной в мире интернет-компании автора Вламис Энтони


Как посетить сайт конкурента анонимно и зачем нужна такая анонимность

Из книги Интернет-разведка [Руководство к действию] автора Ющук Евгений Леонидович

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


11.1. Что такое сеть и зачем она нужна

Из книги Собираем компьютер своими руками автора Ватаманюк Александр Иванович

11.1. Что такое сеть и зачем она нужна Компьютер приобретается с определенной целью – производить необходимые вычисления. Вычисления – это различные операции, выполняемые комплектующими компьютера по желанию пользователя. Это может быть работа с офисными программами,


Что такое сеть и зачем она нужна

Из книги Домашние и офисные сети под Vista и XP автора Ватаманюк Александр Иванович

Что такое сеть и зачем она нужна Еще десяток-другой лет назад никто даже понятия не имел, что такое сеть и зачем она нужна. Люди приобретали персональные компьютеры с одной целью – автоматизировать и ускорить требуемые вычисления. Таковыми считались различные операции:


Что же такое Excel и зачем нужна эта программа

Из книги Excel. Мультимедийный курс автора Мединов Олег

Что же такое Excel и зачем нужна эта программа Excel – это мощнейший вычислительный инструмент, хранилище упорядоченных данных, средство для создания различных графиков, расписаний, диаграмм и т. д. Программа Excel может частично или даже полностью автоматизировать многие


Зачем нужна система восстановления

Из книги Очень хороший самоучитель пользователя компьютером. Как самому устранить 90% неисправностей в компьютере и увеличить его возможности автора Колисниченко Денис Николаевич

Зачем нужна система восстановления Так уж получается, что Windows «глючит» чаще, чем выходят из строя комплектующие компьютера, поэтому вы чаще будете сталкиваться с программными ошибками, нежели с аппаратными. В этой главе мы поговорим о восстановлении Windows, рассмотрим


Зачем нужна такая гибкость?

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Зачем нужна такая гибкость? Стратегия экспорта, согласно которой каждый потомок класса имеет свою политику, хотя и усложняет проверку типов, но придает необходимую гибкость действиям разработчика.Предпринимались и иные попытки. Так, отдельные объектные языки


Зачем нужна библиотека Ext Core

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Зачем нужна библиотека Ext Core Но зачем нужна эта библиотека? Почему бы нам не работать напрямую с объектами Web-обозревателя, обращаясь к их свойствам и вызывая их методы? Почему, чтобы управлять содержимым Web-страницы, нужны дополнительные инструменты и дополнительные


Зачем нужна библиотека Ext Core

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Зачем нужна библиотека Ext Core Но зачем нужна эта библиотека? Почему бы нам не работать напрямую с объектами Web-обозревателя, обращаясь к их свойствам и вызывая их методы? Почему, чтобы управлять содержимым Web-страницы, нужны дополнительные инструменты и дополнительные


Зачем Вам нужна PGP?

Из книги PGP: Кодирование и шифрование информации с открытым ключом. автора Левин Максим

Зачем Вам нужна PGP? Вы можете планировать политическую кампанию, обсуждать ваши налоги, или заниматься разными незаконными делами. Или вы можете делать что-либо, чувствуя, что это не должно быть запрещено, однако является таковым. Что бы это ни было, вы не желаете, чтобы


2.2.3. Зачем нужна контекстная реклама

Из книги Интернет-маркетинг на 100% автора Коллектив авторов

2.2.3. Зачем нужна контекстная реклама В первую очередь, контекстная реклама призвана приводить целевых покупателей на сайты рекламодателей. Это может быть и продвижение товаров, услуг, повышение продаж, вывод нового продукта, и дополнение к офлайновым рекламным


Зачем нужна фотокамера: конфликт реальности и магии на мегапиксельном поле боя Василий Щепетнёв

Из книги Цифровой журнал «Компьютерра» № 181 автора Журнал «Компьютерра»

Зачем нужна фотокамера: конфликт реальности и магии на мегапиксельном поле боя Василий Щепетнёв Опубликовано 12 июля 2013 Редкий человек обходится сегодня без фотокамеры.Обыкновенно первый фотик дарят на день рождения, реже — на свадьбу или


От составителя Зачем нужна эта книга и кому она адресована?

Из книги Информационные технологии в СССР. Создатели советской вычислительной техники автора Ревич Юрий Всеволодович

От составителя Зачем нужна эта книга и кому она адресована? История отечественной компьютерной отрасли, как и многие другие действительные и мнимые достижения советской эпохи, стала в постсоветские годы очередной площадкой для попыток переписать историю, причем сразу


Защита: кому она нужна?

Из книги Компьютерные террористы [Новейшие технологии на службе преступного мира] автора Ревяко Татьяна Ивановна