
- •"Програмне забезпечення автоматизованих систем"
- •1. Оперативна пам'ять
- •2. Регістри
- •3. Прапори
- •1. Переходи
- •2. Безумовні переходи
- •3. Умовні переходи
- •4. Команди керування циклом
- •1. Подання даних арифметичні операції
- •2. Цілі числа без знака
- •3. Цілі числа зі знаком
- •4. Особливості виконання арифметичних операцій
- •5. Подання символів і рядків
- •6. Подання адрес
- •7. Директиви визначення даних
- •1. Структура команд. Виконавчі адреси
- •2. Формати команд
- •3. Запис команд в masm
- •1. Сегменти пам’яті, сегментні регістри
- •2. Сегментні регістри по домовленості
- •3. Сегментування, базування й індексування адрес
- •4. Програмні сегменти. Директива assume
- •5. Початкове завантаження сегментних регістрів
- •6. Посилання вперед
- •1. Строкові операції
- •1. Стек
- •2. Основні стекові команди
- •1. Організація процедур та переривань
- •2. Передача параметрів процедурам через регістри, через стек, через таблиці, через глобальні області
- •3. Передача параметрів по ссылке
- •4. Передача параметрів по повернутому значенню
- •5. Передача параметрів в стеку
- •6. Локальні змінні
- •1. Процеси і потоки
- •1.1 Розподіл часу між потоками
- •1.2 Динамічна зміна рівня пріоритету потоку
- •2. Робота із процесами й потоками в Win32 api
- •1. Адресний простір процесу
- •2. Керування віртуальною пам'яттю. Vmm
- •3. Файли даних, що проектуються на згадку
- •4. Взаємодія процесів через загальну область даних. Когерентність
- •5. Купи
- •1. Визначення вікна. Компоненти й параметри вікон
- •2. Клас вікна
- •3. Ієрархія вікон
- •1. Обмін даними між процесами
- •2. Вилучений виклик процедур (rpc - Remote Procedure Call)
- •3. Синхронізація потоків
- •1. Загальний порядок обробки виключень
- •2. Фільтри й оброблювачі виключень
- •1. Загальна структура системного реєстру
- •2. Робота додатків із системним реєстром
- •1. Файлові структури
- •2. Робота з томами й каталогами
- •3. Синхронна робота з файлами
- •4. Асинхронна робота з файлами
- •1. Системні файли ntfs
- •2. Master File Table (mft)
- •3. Цілісність даних і здатність до самовідновлення.
- •4. Організація й керування дисками
3. Синхронізація потоків
У середовищі, що дозволяє виконувати одночасно кілька потоків, дуже важливо синхронізувати їхня діяльність. Інакше потоки не зможуть коректно працювати з поділюваними областями даних.
Критичні секції. В Win32 API реалізований класичний механізм критичної секції. Для роботи із критичною секцією необхідно завести структуру CRITICAL_SECTION й ініціалізувати її викликом функції InitializeCriticalSection. Тепер всі потоки можуть використати функції EnterCriticalSection й LeaveCriticalSection для огородження критичного розділу коду. Істотно, що механізм критичних секцій може використатися тільки в рамках одного процесу.
Синхронізація потоків різних процесів. У кожному разі, синхронізація полягає в тому, що потік переводить себе в стан блокованого до настання якого або події. Для перекладу процесу в стан блокування використаються функції:
WaitForMultipteObjects
WaitForMultipleObjectsEx
WaitForSingleObject
WaitForSingleObjectEx
Вихід процесу зі стану блокування відбувається при настанні очікуваної події. Подія складається в зміні стану якого-небудь об'єкта. Практично будь-які об'єкти ядра (процеси, файли, транспортери й т.д.) можуть виступати в ролі синхронізуючих. Але існують об'єкти, призначені саме для синхронізації потоків: Mutex (mutually exclusive - взаємне виключення)
Семафори
Події
Об'єкти Mutex. Mutex - глобальний іменований об'єкт, що може належати тільки одному потоку. Якщо об'єкт Mutex належить якому-небудь потоку, то інші потоки не можуть захопити його. За допомогою об'єктів Mutex так само реалізується класичний алгоритм критичної секції. Загальна схема така: один з потоків породжує об'єкт Mutex і привласнює йому глобальне ім'я за допомогою функції CreateMutex. Інші потоки можуть використати функцію OpenMutex для одержання описувача об'єкта. Перед входом у критичну секцію потік викликає одну з функцій очікування, передаючи їй як параметр описувач об'єкта Mutex. Якщо об'єкт Mutex уже захоплений, то потік блокується до звільнення об'єкта. Якщо не захоплений, то виконання потоку триває, а об'єкт Mutex захоплюється. Для звільнення об'єкта Mutex використається функція ReteaseMutex.
Семафори. За допомогою об'єктів типу семафор реалізується класичний механізм семафорів1. При цьому як примітив P(S) виступає одна з функцій очікування, а як примітив V(S) - функція ReleaseSemaphore. При створенні семафора функцією CreateSemaphore можна визначити максимально припустиме значення змінної S.
Події. Події - самий примітивний різновид синхронізуючих об'єктів. Вони породжуються функцією CreateEvetnt і бувають двох типів «зі скиданням вручну» й «з автоматичним скиданням». Об'єкт подія може перебувати у двох станах: «зайнятий» (non-signaled) і «вільний» (signaled). Для перекладу об'єкта подія у вільний стан використається функція SetEvent, а для перекладу в зайняте - ResetEvent. За допомогою кожної з функцій очікування можна перевести потік, що викликав, у стан блокування до звільнення об'єкта подія. Якщо об'єкт подія є об'єктом «з автоматичним скиданням» то функція очікування автоматично переведе його в стан зайнятого.
Лекція 14
Тема: Структурна обробка виключень