
- •1 Дослідження структури виконуваного файлу ре - формату
- •1.1 Мета роботи
- •1.2 Основні відомості
- •1.3 Самостійна підготовка
- •1.4 Порядок виконання роботи
- •2.3 Самостійна підготовка
- •2.4 Порядок виконання роботи
- •3.3 Самостійна підготовка
- •3.4 Порядок виконання роботи
- •4 Синхронізація потоків у режимі ядра
- •4.1 Мета роботи
- •4.2 Основні відомості
- •4.3 Самостійна підготовка
- •4.4 Порядок виконання роботи
- •Перелік посилань
- •Дотаток а Текст програми read_pe.Asm
- •Дотаток б Текст програми thread1.Asm
- •Дотаток в Текст програми synchr1.Asm
- •Дотаток г Текст програми synchr3.Asm
2.3 Самостійна підготовка
Підготуйте бланк звіту. Проробіть рекомендовану літературу [1].
При підготовці зверніть увагу на такі питання:
а) в яких випадках створюються потоки;
б) побудова функції потоку;
в) функція CreateThread та її параметри;
г) завершення потоків;
д) призупинення та відновлення потоків.
Уважно проаналізуйте текст програми thread1.asm (додаток Б), в якої надано приклад створення дочірнього потоку для запису даних у файл на жорсткому диску.
2.4 Порядок виконання роботи
В будь якому текстовому редакторі наберіть текст модуля thread1.asm, який наведено у додатку Б і збережіть його на диску.
Сформуйте модуль, що виконується (файл thread1.exe).
Перевірте роботу програми thread1.exe.
Дослідіть як впливають на порядок виконання батьківського та дочірнього процесів значення параметра функції Sleep, який задається значенням змінної time_sleep в сегменті даних.
Дослідіть як впливають на порядок виконання батьківського та дочірнього процесів об’єм даних, що виводяться у файл на диску. Об’єм даних визначається числом повторень запису рядка символів. Ця величина задається останнім елементом структури типу THREAD_PARAM (numrep).
Про послідовність виконання потоків робить висновки на підставі порядку виведення на екран консолі повідомлень від батьківського та дочірнього потоків.
Опишіть у звіті результати досліджень та зробіть належні висновки.
3 Синхронізація потоків у
користувальницькому режимі
3.1 Мета роботи
Вивчення особливостей сумісного використання ресурсів різними потоками у багатозадачному операційному середовищі.
Засвоєння особливостей маніпулювання сумісними даними.
Засвоєння засобів синхронізації потоків у користувальницькому режим у середовищі Win32.
3.2 Основні відомості
Потоки повинні взаємодіяти один з одним у двох основних випадках:
при сумісному використанні ресурсу, що розділяється (щоб не зруйнувати його);
коли потрібно повідомляти інші потоки про завершення деяких операцій.
Значна частина питань синхронізації потоків пов’язана з так званим атомарним доступом (atomic access) – монопольним захватом ресурсу потоком, що звертається до нього. Атомарний доступ є необхідним у багатозадачних операційних системах тоді, коли потрібна гарантія, що під час звернення одного потоку до ресурсу, що розділяється, другий потік, якому може бути наданий процесорний час, не зможе також отримати доступ до цього ресурсу. Приклади можливих ситуацій можна знайти, наприклад у [1],[2].
Одним з засобів організації атомарного доступу до ресурсів є використання сімейства Interlocked-функций, які є у складі API Win32. Ці функції прості для розуміння і вельми корисні. Усі функції цього сімейства маніпулюють змінними на рівні атомарного доступу.
У якості приклада розглянемо функцію InterlockedExchange.
Цій функції передаються два параметри.
Параметр pTаrget є покажчиком на змінну розміром 32 біти, яка містить значення, зміна якого відбувається у режимі атомарного доступу.
Параметр lValue задає значення на яке буде змінено значення поля pTаrget.
Функція InterlockedExchange монопольно змінює значення поля, позначеного першим параметром на значення другого параметра. Початкове значення змінної pTаrget вертається в якості значення функції.
Алгоритми синхронізації з використанням функцій типу InterlockedExchange засновані на організуванні циклів, в яких перевіряються та змінюються значення змінних у режимі атомарного доступу. Такий підхід стосовно входу до критичної секції ще називають спін-блокуванням. При використанні спін-блокування слід пам’ятати, що процесорний час витрачається вхолосту лише на циклічну перевірку значення змінної, яка визначає дозвіл на отримання ресурсу. Процесору доводиться постійно порівнювати два значення, поки одне з них не буде змінено іншим потоком.
Неефективність спін-блокування, особливо на однопросесорних машинах, пов’язана з порожньою тратою процесорного часу. Більш ефективний механізм повинен заборонити потоку, що очікує доступу до ресурсу витрачати процесорний час. Поки ресурс зайнятий, або поки не відбулася “особлива подія”, система переводить потік в режим очікування, виключаючи його з числа плануємих, та бере на себе роль агента, що діє в інтересах сплячого потоку. Вона виводить його з режиму очікування, коли звільниться потрібний ресурс, або відбудеться “особлива подія”.
В складі функцій API Win32 є група функцій, яка призначена для контролю входу до критичних секції. Критична секція – це невелика ділянка коду, що потребує монопольного доступу до деяких спільних даних. Функції цієї групи дозволяють зробити так, щоб одночасно тільки один потік отримував доступ до ресурсу, що контролюється. Система може в любу мить витиснути Ваш потік і підключити до процесору другий, але ні один з потоків, яким потрібен зайнятий ресурс, не отримає процесорного часу до тих пір, поки Ваш потік не вийде за межі критичної секції.
До цієї групи належать функції: InitializeCriticalSection, DeleteCriticalSection, EnterCriticalSection, LeaveCriticalSection. В якості параметра цім функціям передається покажчик на структуру типу CRITICAL_SECTION.
Правила застосування цих функцій стають понятими з аналізу програми synchr1.asm, яку приведено у додатку С.
Більш докладну інформацію про синхронізацію потоків в режимі користувача при програмуванні під Win32 можна отримати, наприклад в [1].