Processes & Threads #2
Поскольку основные определения и понятия уже введены перейду сразу к сути.
Взаимное исключение
Мой любимый пример с хостелом. Встали вы с утра и сильно хотите помыться и выйти уже из этой душной комнаты, набитой храпящими потными мужиками, а дверь в ванную как назло закрыта, потому что кто-то уже моется, да еще и очередь из тапочек и полотенец собралась.
Это именно то, что происходит с тредами при попытке доступа к общему ресурсу. Когда один тред захватывает его, то ставит на него блок(закрывает ванную изнутри на щеколду).
Это способ синхронизации, который использует объект mutex (от MUTual EXclusion — взаимное исключение). В этом примере это щеколда, которая блокирует доступ всем остальным участникам, когда кто-то помылся и вышел, т.е. снял защитный барьер, следующий тред начинает использовать ресурс и ставит на него защиту.
Но тут есть свое исключение, mutex скорее рекомендательное защитное средство нежели правило, так что если у вас есть сосед весом в 120 кг, занимающийся тайским боксом, он вполне может выломать дверь и войти.
Приоритеты
Интересный вопрос встает перед операционной системой или же перед разработчиком приложения, что делать когда ванная откроется? Кого пускать первым?
Было бы честным пустить того, кто следующий в очереди или того кто дольше всех ждет, а может все же пропустить того 120 килограммового парня, пока он сам не подвинул следующего. Есть много способов выбрать что же такое "честно" в данном контексте.
Например можно решить это двумя факторами: приоритетом исполнения и временем ожидания.
Допустим 2 человека сразу ожидают очереди помыться, один из них уже сильно опаздывает на назначенную встречу, а у второго нет больших планов на это утро. Логичнее было бы пропустить того, у кого встреча, но каким образом это делать? Например, назначить ему больший приоритет, а человеку без планов низкий приоритет. Возможное решение делать это простыми числами от 1 до скольки-то.
С тредами тоже самое, тред наследует от своего родителя алгоритм планирования (scheduling). Но вполне может внутри себя его и переопределить вызвав соответствующие функции операционной системы(зависит от реализации самой ОС).
Так что же происходит, когда дверь в ванную открывается? Мы даем возможность помыться тому, у кого приоритет выше остальных. В случае если остались все с одинаковым приоритетом "честно" будет отдать право воспользоваться ванной тому, кто дольше всех ждет.
На этом утренние посиделки с процессами и тредами закончены, в следующем выпуске нашей ультроразвлекательной программы поговорим о другом способе синхронизации - семафорах.