Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект ос 2013-5.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
207.36 Кб
Скачать

2 Дескриптор і контекст процесу

З кожним процесом пов'язані його дані в основній пам'яті, що описують, необхідні ОС для підтримки виконання процесу. Усі ці дані можна розбити на дві великі структури: дескриптор процесу і контекст процесу.

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

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

Точний склад дескриптора і контексту сильно залежать від конкретної ОС.

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

3 Реєнтерабельність системних функцій

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

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

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

Функція або процедура, для якої можливе коректне виконання її повторного виклику до завершення першого виклику, називається реєнтерабельною або такою, що повторно-входить.

Проблема реєнтерабельності функцій виникає в програмуванні і з абсолютно іншого приводу, не пов'язаного з реалізацією ОС. Йдеться про рекурсивні функції, тобто функціях, які можуть прямо або побічно викликати самі себе. Давно відома і головна причина нереєнтерабельності функцій. Вона полягає у використанні одних і тих же елементів пам'яті для формальних параметрів і локальних змінних при різних викликах функції. Дійсно, якщо при першому виклику функції в осередок локальної змінної X буде занесено, наприклад, число 10, а при другому - число 20, то після відновлення виконання першого виклику значення X буде невірним.

Ліки від цієї форми нереєнтерабельності також давно відомо і вбудовано в усі мови програмування, що поважають себе, починаючи з C і Pascal. Воно полягає в тому, що пам'ять для формальних параметрів і локальних змінних повинна виділятися в стеку програми, при цьому кожен новий вкладений виклик отримує свій набір осередків для змінних.

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

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

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

При переході від невитісняючої Windows 3.x до витісняючій Windows 95 одна з серйозних проблем полягала у збереженні коду великої кількості нереєнтерабельних системних функцій. Проблему «розв'язали» шляхом введення семафора, блокуючого повторний виклик для великого числа функцій. Неприємним наслідком цього став взаємний гальмівний вплив процесів. У Windows NT цієї проблеми немає, усі функції реалізовані реєнтерабельно.