
- •Урок № 61
- •Урок № 62
- •Урок № 72
- •Урок № 73
- •Створення зв'язку з файлом /dev/modem за допомогою команди lisa.
- •Настройка системи Linux для встановлення зв'язку.
- •Як створюється зв'язок з файлом /dev/modem за допомогою команди lisa?
- •Яким чином можна настроїти систему Linux для встановлення зв'язку?
- •Урок № 74
- •Урок № 75
- •Використання програми mail.
- •Урок № 76
- •Використання клієнта kpackage
- •Як використовується клієнт kpackage?
- •Урок № 77
- •Урок № 80
- •Урок № 82
- •Урок № 84
- •Урок № 85
- •Урок № 86
- •Урок № 87
- •Урок № 88
- •Урок № 89
- •Урок № 90
- •Урок № 92
- •Урок № 93
- •Урок № 95
- •Урок № 96
- •Урок № 97
- •Урок № 97
Урок № 86
(згідно навчальної робочої програми)
Тема: «Запуск програми. Сигнали»
Питання:
Запуск нових програм в UNIX відокремлений від створення процесів і реалізований за допомогою системних викликів сімейства ефес(). На практиці звичайно реалізують один виклик (у Linux це — execve()).
У Linux підтримують концепцію оброблювачів двійкових форматів (binaryformathandlers). Формати виконуваних файлів заздалегідь реєструють в ядрі, при цьому їхній набір може динамічно змінюватися. З кожним форматом пов’язаний оброблювач — спеціальна структура даних 1 і nux_binfmt, що містить покажчики на процедури завантаження виконуваного файла (1 oad_binary) і динамічної бібліотеки (1 oad_shlі Ь) для цього формату.
Тепер зупинимося на послідовності кроків виконання execve() у Linux. Вхідними параметрами цього виклику є рядок з ім’ям виконуваного файла програми, масив аргументів командного рядка (до яких у коді процесу можна буде дістати доступ за допомогою масиву argv) і масив змінних оточення (що є парами ім’я=значення). Виклик execve() відбувається так.
Відкривають виконуваний файл програми.
Використовуючи вміст цього файла, ініціалізують спеціальну структуру даних bprm, що містить інформацію, необхідну для виконання файла, зокрема відомості про його двійковий формат.
Виконують дії для забезпечення безпеки виконання коду.
На базі параметрів виклику формують командний рядок і набір змінних оточення програми (це спеціальні поля структури bprm).
Для кожного зареєстрованого оброблювача бінарного формату викликають процедуру завантаження виконуваного файла через покажчик 1 oad_biпа гу і перевіряють результат цього виклику:
а) у разі коректного завантаження оброблювач починає виконувати код нової програми;
б) якщо жоден з оброблювачів не зміг коректно завантажити код, повертають помилку.
Запуск виконуваних файлів у прикладних програмах
Розглянемо приклад запуску виконуваного файла за допомогою системного виклику execve(). Синтаксис цього виклику такий:
#іпсіude<unistd.h>
intexecvetconstchar *filename, // повне ім'я файлу
constchar *argv[], // масив аргументів командного рядка
constchar *envp[]); // масив змінних оточення
Останнім елементом argvі envpмає бути нульовий покажчик.
Повернення з виклику буде тільки тоді, коли програму не вдалося завантажити (наприклад, файл не знайдено). Тоді буде повернено -1.
Урок № 87
(згідно навчальної робочої програми)
Тема: «Керування потоками в LINUX»
Питання:
Базова підтримка багатопотоковості.
Недоліки традиційної підтримки багатопотоковості в Linux.
Особливості нової реалізації багатопотоковості в ядрі Linux.
Бібліотека підтримки потоків NPTL.
Потоки ядра Linux.
Базова підтримка багатопотоковості
Донедавна єдиним засобом підтримки багатопотоковості в ядрі Linux був системний виклик clone(), який дає можливість створити новий процес на базі наявного. Особливості:
Для нового процессу потрібно задати спеціальний набір прапорців, що визначають, як будуть розподілятися ресурси між предком і нащадком. До ресурсів, які можна розділяти, належать адресний простір, інформація про відкриті файли, оброблювачі сигналів.
Для нового процессу потрібно задати новий стек.
Підтримка clonе() означає реалізацію багатопотоковості за схемою 1:1. При цьому первинними в системі є процеси, а не потоки.
Традиційна реалізація багатопотоковості в Linux визначає, що потоки користувача відображаються на процеси в ядрі. Структури даних відображається такою ж самою структурою task_struct, як і процес.
Недоліки традиційної підтримки багатопотоковості в Linux
Основи підтримки багатопотоковості в ядрі Linux не зазнали принципових змін від появи системного виклику clone().
Таке використання системи висунуло до реалізації багатопотоковості вимоги високої надійності та масштабованості. Стало очевидно, що реалізація, заснована на системному виклику clone(), цим вимогам не відповідає. Назвемо деякі причини цієї невідповідності.
Оскільки потоки, створені за допомогою cloneO, фактично були процесами, що спільно використовують ресурси, створення кожного потоку збільшувало кількість процесів у системі.
Кожний потік у системі, будучи за своєю суттю процесом, мав власний ідентифікатор процессу (pid), що не відповідало стандарту POSIX. Крім того, якщо потік створював інший потік, між ними виникав зв’язок «предок-нащадок», тоді як всі потоки мають бути рівноправними.
Кожне багатопотокове застосування користувача обов’язково створювало додатковий потік (потік-менеджер), який відповідав за створення та знищення потоків і перенаправляв їм сигнали. Наявність такого потоку знижувала надійність і масштабованість системи ).
Особливості нової реалізації багатопотоковості в ядрі Linux
Нова реалізація багатопотоковості у ядрі системи має такі особливості.
Підвищилася продуктивність операціїстворення і завершення потоків. Знято обмеження на загальну кількість потоків у системі. Система залишається стабільною за умов одночасного створення і завершення сотень тисяч потоків.
Усі потоки процессу тепер повертають один і той самий ідентифікатор (pid), крім того, зв’язок «предок-нащадок» між ними не підтримується (у створеного потоку зберігається той самий предок, що й у потоку-творця). Як процес у системі реєструють тільки початковий потік застосування.
Реалізацію виклику clone() розширено таким чином, щоб зробити непотрібним потік-менеджер.
Бібліотека підтримки потоків NPTL
Бібліотека NPTL призначена для того, щоб, спираючись на нові можливості ядра, забезпечити повну й коректну реалізацію стандарту потоків POSIX для використання у прикладних програмах.
Основною особливістю бібліотеки NPTL є те, що в ній збереглася підтримка схеми багатопотоковості 1:1, внаслідок чого досягається простота та надійність реалізації. При цьому продуктивність і масштабованість забезпечені оновленою підтримкою багатопотоковості у ядрі. Програмний інтерфейс бібліотеки не змінився порівняно з LinuxThreads.
Потоки ядра Linux
Крім процесів і потоків користувача, Linux також підтримує спеціальний вид планованих об’єктів, які мають уже знайому назву — потоки ядра. Такі потоки планують як звичайні процеси і потоки, кожен з яких має свій ідентифікатор (pid). Відмінності потоків ядра від процесів і потоківкористувачаполягаютьутому, що:
функції потоку для них визначають у коді ядра;
вонивиконуютьсятільки в режимі ядра;
для них недоступніділянкипам’яті, виділені в режимі користувача.
Контрольні питання:
В чому суть базової підтримки багатопотоковості?
Які недоліки традиційної підтримки багатопотоковості в Linux?
Які особливості нової реалізації багатопотоковості в ядрі Linux
Яке призначення бібліотеки NPTL?
Що таке потоки ядра Linux?
Література: Шеховцов В.А. Операційні системи. – К.: Видавнича група BHV, 2005. – 576 с.: іл., стор. 70-73.