1.2. Модель виконання програм.

Для того, щоб зрозуміти програмну синхронізацію, необхідно мати модель, за якою копьютерні програми працюють. За найпростішою моделю, комп'ютери виконують інструкції одну за одною в деякій послідовності. В такій моделі синхронізація є тривіальною; ми можемо визначити порядок подій просто глянувши на програму. Якщо Вираз А знаходиться перед Виразом Б, він буде виконаний першим.

Є два випадки за яких речі стають дещо скалднішими. В першому копьютер є паралельним, в тому розумінні що він має декілька процесорів що працюють одночасно. В такому випадку не легко стверджувати що вираз з першого процесору було виконано раніше ніж вираз з іншого процесора.

В ішному випадку може бути процесор що обробляє декілька потоків виконання. Потік - це послідовність інструкцій, що виконуються послідовно. Якщо існує декілька потоків, процесор може працювати з одним із них деякий час, потім перемкнутися на ішний, і так далі.

Зазвичай програміст не має змоги керувати тим, коли які потоки виконуються; операційна система (а саме планувальник) приймає ці рішеня. В результаті програміст, знову ж таки, не може сказати коли будуть виконаті інструкціх в різних потоках.

В проблемах синхронізації, немає великої різниці між паралельною моделю та багато-поточною. Проблема одна й та сама - в рамках одного процесора (або потоку) ми знаємо порядок виконання інструкцій, але між процесорами (або потоками) його визначити неможливо.

Практичний приклад може внести більше ясності. Уявимо що ви та ваш друг Володимир мешкаєте в різних містах, та одного разу, перед обідом, ви зацікавилися хто з вас снідав сьогодні першим - ви чи Володимир. Як вам знати ?

Вочевидячки, ви можете йому зателефонувати та спитати коли він снідав. Але що як ви почали снідати об 11:59 за вашим годинником, а Володимир - о 12:01 за його годинником ? Чи можна бути певним хто був першим ? Якщо ви обидва не відноситися дуже відповідально до своїх годинників - то не можа.

Комп'ютерні системи зтикаються з тією самою проблемою, навіть зважаюче на те що їх годинники дуже точні - у цієї точності є межа. На додачу - комп'ютер не веде щоденик з розкладом того коли що сталося. Просто стається забагато подій, занадто швидко, щоб за всім так слідкувати.

Загадка: нехай Володимир готовий виконувати прості команди, чи можна зробити так, щоб завтра ви з'їли свій сніданок раніше за Володимира ?