критичного сегмента
V( OUT_BUF );
ind_in_buf = ( ind_in_buf + 1 ) % N; }}
void споживач (void) {
int ind_out_buf = 0;
while (1) { P( OUT_BUF );
// обробка даних з буферного пула
. . .
// кінець
V( IN_BUF );
ind_out_buf = ( ind_out_buf + 1 ) % N; }}
main () { parbegin
постачальник ();
споживая();
parend; }
Недоліки семафору Дейкстра:
Оскільки семафори є даними, що належать головній задачі, їх можна несанкціоновано змінити.
Реально семафорів не існує.
Монітори ресурсів
Інкапсуляція даних – технологія, коли дані відмежовуються від користувача, а йому предоставляється тільки інтерфейс.
Монітор ресурсу – структури даних та методи їх обробки, які знаходяться в ядрі операційної системи. Доступ до методів монітора надається через апарат переривань.
Переривання – перехід від виконання прикладної задачі до функцій ядра ОС.
Переривання бувають апаратні – на рівні сигналів,
та програмні – через команду interrupt.
Умови виконання моніторe співпадають з умовами виконання критичного сегменту.
Для роботи з моніторами ресурсів запропоновано дві функції:
WAIT (<ім’я_черги_ресурса>)
SIGNAL (<ім’я_черги_ресурса >)
Ці операції допустимі в моніторах.
Семантика WAIT: задача, котра видала WAIT призупиняється. Управління отримує ядро операційної системи, яке відповідає за планування задач для CPU.
Семантика SIGNAL: по цій команді з черги задач, затриманих відносно даного ресурсу одна задача переходить в чергу готових до виконання. Та задача, що видала SIGNAL продовжує працювати.
@ лекція 3 ( 28.02.03 )
Задача “Читачі – письменники”
Модельна задача в теорії керування файловою системою. Розглянемо підхід, який передбачає наявність двох черг, окремо для читачів та письменників.
Існує інша модель, коли черга для читачів та письменників одна.
Правила роботи :
якщо “читач в залі” маємо вільний вхід для інших читачів;
якщо “письменник в залі” – обидві черги блокуються;
письменник запрошує до зали читача після завершення своєї роботи.
Опишемо програмну реалізацію цієї схеми.
class Reader_Writer {Queue Q_Reader;
Queue Q_Writer;
int R_count;
bool W_count;}
Reader_Writer(){Q_Reader(NULL);Q_Writer(NULL);R_count = 0;W_count = false}
begin_Reader(){ if (W_count) wait (Q_Reader); R_count++; signal(Q_Reader);}
end_Reader(){ R_count--; if (!R_count) signal(Q_Reader); else signal(Q_Writer);}
begin_Writer(){if (R_count)!!W_count wait(Q_Writer); W_count = true;}
end_Writer(){ W_count = false; if (Q_Reader != NULL) signal(Q_Reader);
else signal(Q_Writer);}
Реалізація монітора
В більшості ОС монітори реалізовані через апарат програмних переривань (машинна команда INT).
Код переривання це індекс в таблиці векторів програмних переривань. Значення вектора – адреса монітору ресурсу. Згідно з системними узгодженнями в момент виникнення переривання в регістрі функцій знаходиться код функції (її імя), а в регістрі даних – дані, що передаються монітору. Ядро ОС при цьому інтерпретується як системна задача, котру не можливо знищити та створити іншу таку задачу.
wait – передає керування ядру ОС, яке активізує нову задачу, змінює контекст, (wait – функція ядра ), та зберігає існуючий контекст.
signal – не завжди продовження роботи задачі, що викликала цю функцію, бо враховується приорітет тієї задачі, що переноситься до черги готових до виконання.
Тупики в середовищі ОС
Семафори для принтера та модема – двійкові.
Тупик – deadlock – це така ситуація, коли одна або більше задач не можуть далі природно розвиватися.
Умови виникнення тупиків :
динамічний захват ресурсів (що є властивістю ОС);
наявність циклічних ланцюгів очікування.
( на малюнку: Пр – принтер, Мо – модель ).
Алгоритм банкіра. (спроба подолання проблеми тупиків)
Стабільним називається такий стан ОС, коли в найближчому майбутньому система не потрапить в тупик (може задовольнити певним ресурсом хоча б одну задачу)
Нехай в системі наявні одиниць ресурсу А, та - потреба -ї задачі в ресурсі А , - кількість одиниць ресурсу А, що надані -й задачі. Таким чином вільного ресурсу А : . Перспективні потреби -ї задачі- в майбутньому. Припускається, що та . За таких умов маємо наступну умову стабільності стану : , якщо ж умова порушується, то стан є нестійким. Якщо умова (1) в часі істина, то тупик не можливий, інакше існує потенційна можливість виникнення тупика.
Обмеженням алгоритму банкіра є те, що - величина постійна, що не відповідає реальним умовам роботи, скажімо з накопичувачем.
Способи боротьби з тупиками
прогнозування;
наявність моніторів контролю над завантаженням ресурсів;
дії оператора (адміністратора)
а) примусове динамічне керування ресурсами;
б) перезавантаження ОС.
@лекція 4 ( 7.03.03 )
Ресурси:
Пам’ять ЕОМ – менеджер( супервізор ) пам’яті.
Файли – логічна система вводу-виводу.
Процесор – диспетчер( супервізор ) задач.
Алгоритми управління ОП
а) однозадачні ОС ( наприклад MS-DOS )
LINK вільна ОП LOAD
апаратура ядро ОС – пам’ять для прикладної задачі динамічні
ЕОМ це частина ОС, компо-
яка завжди ненти ОС
присутня в ОП.
В більшості архітектур ЕОМ передбачаються дві стратегії завантаження модулів:–
LINK – завантаження модулів по принципу stek–
LOAD – завантаження модулів по принципу КУПА, тобто модулі завантажуються і
розвантажуються в будь-якій послідовності.
Вільна ОП використовується під завантаження модулів та при динамічних запитах щодо даних( malloc free ).
Поглянемо на ситуацію з точки зору вільної пам’яті:
20k 20k 10k 10k 5k 5k 5k =75k
ядро ОС – сегменти вільної ОП
Сегменти вільної ОП перемежовуються з програмами та даними.
Вільна пам’ять збирається в список вільної пам’яті.
Існує комірка, яка є головою списку вільної пам’яті. В залежності від архітектури ЕОМ зручними для адресації є сегменти пам’яті, адрес котрих кратний певному числу.
Приклад
В архітектурі Intel адрес кратний 16-ти.
Адрес даних формується як: БАЗА + ЗМІЩЕННЯ.
Регістр бази мав 16 біт: 16 4
– реальний адрес
20біт
В цій архітектурі взяти пам’яті менше 16-ти байт неможливо.
Проблема сегментації – поділ вільної пам’яті на сегменти, які перемежовуються програмним кодом та даними, – основна проблема управління ОП.
Приклад
В MS-DOS:
300k 20k 200k
ядро ОС драйвер BIOS
клавіатури
Завантажити >350k не можемо.
Оверлейна структура *.ехе – модуля
*.ехе
10k 50k