Вступ

Більшість книжок з операційних систем для студентів включаюсть в себе частину з Семофорів. Зазвичай вона описує набір примітивів (м'ютекси, семофори, монітори, та деякі умовні змінні), та набір класичних задач накшталт читачів-письменників (readers-writers та постачальників-користувачів (producers-consumers).

Коли я взяв курс Операційних Систем з Берклі, та виклав його в колледжі Колбі, мені здалося що здебільшого студенти могли зрозуміти розв'язки цих задач, але мало був здатен самосійно до них дійти, або розв'язувати подібні задачі.

Однією з причин того що студенти мають змоги глибоко зрозміти матеріаль полягає в тому що він вимагає більше часу та практики ніж будьякий предмет може виділити. Крім того, частина Синхронізації є лише однією з багатьох що складають предмет Операційних Систем, і наврядчи можна ставити на те що вона найважливіша. Але всеж, я вважаю її однією з найскладніший, найцікавіших і (якщо правильно вживати) веселіших.

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

Однак, в розв'язках які я бачив, я знаходив шаблони та навіть деякі систематичні підходи до конструювання розв'язків, які демонстативно вірні.

Я мав змогу перевірити такий підхід на практиці коли викладав Операційні Системи в колледжі Веслі. Я скористався моїм першим випуском Маленької Книжки Семофорів разом зі стандартними підручниками, і я викладав Синхронізацію паралельно на протязі всього курсу. Що тижня я давав студентам кілька сторінок з книжки, які закінчувалися задачкою, та іноді підказку. Я просив користатися підказкою лише в крайньому випадку.

Також я видав їм інструменти для перевірки їхніх ров'язків: маленьку магнітну дошку де вони могли писати свій код, та купку магнітів, щоб вони моделювали роботу потоків, які виконують той код.

Результати були драматичними. Маючи більше часу для обмірковування матеріалу, студенти продемонстрували глибину розуміння, яку раніше я ще не бачив. Що найважливіше - більшість з них могли розв'язати більшість задач. В деяких випадках вони пере-винаходи класичні розв'язки; а в інших - вони знаходили нові, іноваційні підходи.

Коли я перейшов в коледж Оліна, я піднявся на вищий щабель та створив пів-курс під назвою Синхронізація, який покривав Маленьку Книжку Семофорів а також імплементацію примітивів синхронізації в мові ассемблера для x86, POSIX, та Python.

Студенти які відвідували курс допомогли мені знайти декілька помилок в першому виданні, а декілька з них дали розв'язки що були кращими за мої. Наприкінці семестру, я попросив їх написати нові, авторські задачі (бажано з розв'язками). Їх внесок я додав в друге видання книги.

Також, відколи з'явилось перше видання, Кеннет Рік (Kenneth Reek) видав статтю "Архітектурні шаблони для Семафорів" (Design Patterns for Semaphores) в ACM Special Interest Group for Computer Science Education. (перекладач не впевнений щодо правельності наданого посилання). Він розглядає задачу, яку я назвав Задача Суші Бара, та два розв'язання які демонструють шаблони названі ним "Передай Батон" та "Я зроблю це для тебе". Коли я розібрався з цими шаблонами, я зміг використати їх для декількох задач з першого виданя та отримав розв'язки, які на мою думку є кращими.

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

Сподіваюсь що читачі, незнайомі з Python, легко в ньому розберуться. У випадках коли я буду використовувати специфічні для Python особливості, я поясню синтаксис та його значення. Сподіваюсь, ці зміни зроблять книжку доступнішою для розуміння.

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

Ця книга - вільна, що означає що будь хто може читати, копіювати, змінювати, та розповсюджувати її, обмеження накладає ліцензія GNU Free Documentation License. Сподіваюсь ця книга буде вам корисна, а також я сподіваюсь що люди допоможуть мені продовжувати розвиток цієї книги надсилаючи свої виправлення, пропозиції, та додатковий матеріал. Дякую!

Allen B. Downey
Needham, MA
June 1, 2005

Частина Перша - Вступний Курс
Частина Друга - Семафори