Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С_Р 2 частина.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.3 Mб
Скачать

Урок № 86

(згідно навчальної робочої програми)

Тема: «Запуск програми. Сигнали»

Питання:

Запуск нових програм в UNIX відокремлений від створення процесів і реалізова­ний за допомогою системних викликів сімейства ефес(). На практиці звичайно реалізують один виклик (у Linux це — execve()).

У Linux підтримують концепцію оброблювачів двійкових форматів (binaryfor­mathandlers). Формати виконуваних файлів заздалегідь реєструють в ядрі, при цьому їхній набір може динамічно змінюватися. З кожним форматом пов’язаний оброблювач — спеціальна структура даних 1 і nux_binfmt, що містить покажчики на процедури завантаження виконуваного файла (1 oad_binary) і динамічної бібліоте­ки (1 oad_shlі Ь) для цього формату.

Тепер зупинимося на послідовності кроків виконання execve() у Linux. Вхід­ними параметрами цього виклику є рядок з ім’ям виконуваного файла програми, масив аргументів командного рядка (до яких у коді процесу можна буде діс­тати доступ за допомогою масиву argv) і масив змінних оточення (що є парами ім’я=значення). Виклик execve() відбувається так.

  1. Відкривають виконуваний файл програми.

  2. Використовуючи вміст цього файла, ініціалізують спеціальну структуру даних bprm, що містить інформацію, необхідну для виконання файла, зокрема відомо­сті про його двійковий формат.

  3. Виконують дії для забезпечення безпеки виконання коду.

  4. На базі параметрів виклику формують командний рядок і набір змінних ото­чення програми (це спеціальні поля структури bprm).

  5. Для кожного зареєстрованого оброблювача бінарного формату викликають процедуру завантаження виконуваного файла через покажчик 1 oad_biпа гу і пе­ревіряють результат цього виклику:

а) у разі коректного завантаження оброблювач починає виконувати код нової програми;

б) якщо жоден з оброблювачів не зміг коректно завантажити код, поверта­ють помилку.

Запуск виконуваних файлів у прикладних програмах

Розглянемо приклад запуску виконуваного файла за допомогою системного ви­клику execve(). Синтаксис цього виклику такий:

#іпсіude<unistd.h>

intexecvetconstchar *filename, // повне ім'я файлу

constchar *argv[], // масив аргументів командного рядка

constchar *envp[]); // масив змінних оточення

Останнім елементом argvі envpмає бути нульовий покажчик.

Повернення з виклику буде тільки тоді, коли програму не вдалося завантажи­ти (наприклад, файл не знайдено). Тоді буде повернено -1.

Урок № 87

(згідно навчальної робочої програми)

Тема: «Керування потоками в LINUX»

Питання:

  1. Базова підтримка багатопотоковості.

  2. Недоліки традиційної підтримки багатопотоковості в Linux.

  3. Особливості нової реалізації багатопотоковості в ядрі Linux.

  4. Бібліотека підтримки потоків NPTL.

  5. Потоки ядра 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). Відмінності потоків ядра від процесів і потоківкористувачаполягаютьутому, що:

  • функції потоку для них визначають у коді ядра;

  • вонивиконуютьсятільки в режимі ядра;

  • для них недоступніділянкипам’яті, виділені в режимі користувача.

Контрольні питання:

  1. В чому суть базової підтримки багатопотоковості?

  2. Які недоліки традиційної підтримки багатопотоковості в Linux?

  3. Які особливості нової реалізації багатопотоковості в ядрі Linux

  4. Яке призначення бібліотеки NPTL?

  5. Що таке потоки ядра Linux?

Література: Шеховцов В.А. Операційні системи. – К.: Видавнича група BHV, 2005. – 576 с.: іл., стор. 70-73.