МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
КОНСПЕКТ ЛЕКЦІЙ 1 страницаElse Select Begin Begin ресурс_зайнято := неправда; signal(ресурс_звільнено); end;
ресурс_зайнято := неправда; end;
Перевага такого монітору в тому, що він може працювати за аналогією до двійкового семафору: „захопити ресурс” = P – оператор; „звільнити ресурс” = V – оператор. Тому монітори, як мінімум, мають таку ж логічну потужність, як і семафори. Сучасні операційні системи будуються, як правило у вигляді множини асинхронних паралельних процесів, які працюють під керуванням ядра. Процеси, що організовують паралельні роботи, виконуються незалежно, але вимагають періодичної взаємодії. Тому необхідні засоби для обміну даними між процесами. Одним із таких засобів є кільцевий буфер. Він застосовується в тих випадках, коли процес-виконавець повинен передати дані процесу-споживачу.
Кільцевий буфер
Кільцевий буфер це структура даних для буферизації обміну інформацією між процесами. Виконавцю іноді потрібно передати дані в той час як споживач ще неготовий їх прийняти. Споживач іноді намагається отримати дані які виконавець ще не передав. Тому необхідно мати відповідні засоби синхронізації процесу-виконавця та процесу-споживача. За допомогою монітору процес виконавець, виявивши, що буфер заповнено очікує спорожнення буфера, викликавши функцію Wait(буфер_не_заповнений), процес-споживач виявивши, що буфер порожній викликає функцію очікування Wait(буфер_не_порожній). Виконавець після розміщення даних в буфері видає повідомлення Signal(буфер_не_порожній), а споживач вибравши дані з буферу встановлює сигнал Signal(буфер_не_заповнений). В ОС часто передбачається виділення деякої фіксованої кількості комірок пам’яті дляристання в ролі буферу. Цей буфер можна представити у вигляді масиву заданого розміру. Процес-виконавець розміщує дані, що передаються в послідовні елементи цього масиву. Процес споживач читає дані в тому порядку, в якому вони розміщувалися. З часом коли заповниться останній елемент ділянки пам’яті, то буфер продовжується заповнятися з перших елементів масиву. При цьому приймається до уваги, що споживач уже вибрав дані з цих елементів. Такий процес утворює замкнуте кільце, тому і називається кільцевим буфером. Виконавець може випереджати споживача, тоді з часом він заповнить увесь буфер. У такому випадку процесу-виконавцю необхідно зачекати доки процес-споживач звільнить хоча б один або декілька елементів масиву. Для очікування можна використати монітор. Механізм кільцевого буферу зручний для реалізації керування спулінгом в ОС. Спулінг – буферизація вхідних та вихідних потоків. Перший процес записує дані в буфер-спулер. Другий процес, який читає дані з кільцевого буферу і видає їх, наприклад, на друк, називається деспулером. Він може працювати зі значно меншою швидкістю. Тому кільцевий буфер повинен бути достатньо великого розміру, щоб узгодити швидкості спулера та деспулера. Кільцевий буфер може розміщатися в основній пам’яті, але частіше його розміщують у зовнішній пам’яті.
Конвеєр (програмний канал)
Конвеєр (pipe – програмний канал, транспортер) є засобом, за допомогою якого можна виконувати обмін даними між процесами. Тобто конвеєр це потік даних між двома або більше процесами. Задачі (процеси), що передають/приймають дані в конвеєр, діють так ніби обмін інформацією здійснюється через файл. Конвеєри це не файли на диску, а буферна пам’ять, яка працює за принципом FIFO, тобто за принципом звичайної черги. Конвеєр має певний розмір і працює як циклічний кільцевий) буфер. Він складається з ділянки пам’яті та двох покажчиків head – вказує на перший елемент даних, tail – на останній.
Рис. __
В початковий момент часу покажчики рівні нулю. Коли в конвеєр додається елемент, то він записується в масив за зміщенням на яке вказує покажчик tail, а сам покажчик збільшується на 1. Кожне додавання елементу к конвеєр приводить до збільшення цього покажчика. Коли з конвеєра вичитуються інформація, то дані беруться з позиції на яку вказує покажчик head, після він також збільшується на 1. В результаті виконання операцій запису (додавання) та читання (вилучення) елементів, покажчики будуть прямувати до кінця масиву. Після досягнення кожним з покажчиків кінця масиву він перевстановлюється на початковий елемент. Тобто масив замикається у кільце шляхом відслідковування покажчиків голови (head) та хвоста (tail) черги. Канал описується ідентифікатором, розміром та двома покажчиками. Конвеєр – це системний ресурс. Щоб почати роботу з конвеєром, процес повинен на нього в ОС і отримати у своє розпорядження його ідентифікатор. Тільки процеси, що знають ідентифікатор конвеєра можуть обмінюватися через нього даними.
Черги повідомлень (Queue)
Це складніший, в порівнянні з каналами, метод зв’язку між процесами. За допомогою черг можна організувати такий обмін, коли декілька процесів поставляють повідомлення деякій задачі-приймачу. При цьому тільки процес-приймач може читати та вилучати повідомлення з черги, а процеси-клієнти мають право тільки розміщати в чергу свої повідомлення. Таким чином черга працює тільки в одному напрямку. Якщо необхідний двосторонній зв’язок, то потрібно створити дві черги. Черга та конвеєр мають наступні відмінності: 1) Черги повідомлень дають можливість реалізувати декілька дисциплін обробки: FIFO – записано першим, прочитано першим; LIFO – записано останнім, прочитано першим; пріоритетний – повідомлення вичитуються з врахуванням їх пріоритетів; довільний – повідомлення можна вичитувати в довільному порядку. Канал забезпечує тільки дисципліну FIFO. 2) Прочитане з конвеєра повідомлення, вилучається з нього. При читанні з черги, повідомлення автоматично не вилучається з неї, тому при необхідності, може бути прочитане декілька разів. 3) У чергах знаходяться не самі повідомлення, тільки їх адреси в пам’яті та розмір. Ця інформація розміщується в загальному сегменті пам’яті доступній всім задачам, що спілкуються за допомогою черги. Кожний процес, який використовує чергу, повинен попередньо отримати дозвіл на використання спільного сегменту пам’яті. Черга – це також системний ресурс. Під час читання з черги задача-приймач користується наступною інформацією: - ідентифікатором процесу (PID) передавача повідомлення; - адресою та довжиною повідомлення; - ознакою очікування, коли черга порожня; - пріоритетом повідомлення; - номером семафору, який звільняється коли повідомлення поміщається в чергу.
Рандеву
Механізм „рандеву” – є одним із нових методів синхронізації та обміну даними між процесами (Ада). Задача, що ініціює передачу даних, може звернутися до довільного входу задачі, якій ці дані передаються. Для цього задача адресат виконує команду Accert(задача_адресат), таким чином дає зрозуміти, що готова прийняти виклик по одному із своїх входів. Коли виклик приймається, то відбувається „рандеву”. Процес, що викликає, передає дані пресові адресату як параметр виклику. Результати обробки також повертаються як параметр виклику. Доки програма адресат опрацьовує дані, програму, що ініціювала передачу перебуває в режимі очікування. В „Аді” реалізовано спеціальний механізм для забезпечення гнучкого керування порядком обробки викликів. Він має наступний формат:
when умова_1 => acceptвхід_1 послідовність операторів; … or when умова_2 => acceptвхід_2 послідовність операторів; … or … … послідовність операторів; … end select;
Відповідно до цього оператора, відбувається перевірка кожної з умов. Якщо умова задовольняється, то послідовність команд, що слідує за нею вважається відкритою. Якщо, перед послідовністю команд умови нема, то вони вважаються завжди відкритими. Серед відкритих та вибраних входів вибирається один та відбувається „рандеву”. Якщо, жоден з відкритих входів не готовий до рандеву, виконується розділ else. Якщо такого розділу нема, то задача чекає нових викликів. Особливість „рандеву” полягає в тому, що задача яка викликає на „рандеву” повинна знати про існування задачі, що викликається та кількість її входів. У той же час задача, що викликається, можу приймати виклики від довільної задачі. Причому таких задач може бути багато. Таким чином механізм „рандеву” несиметричний. Синхронізація задач в процесі „рандеву” відбувається неявно. Після завершення „рандеву”, задачі, що чекають своєї черги обслуговуються за принципом FIFO.
Тупики
У багатопрограмній системі процес знаходиться в стані тупику, дідлоку (deadlock) або клінчу (clinch), якщо він очікує деякої події, яка ніколи не відбудеться. Системна тупикова ситуація, чи „зависання” системи – це ситуація, коли один чи кілька процесів знаходяться у стані тупику (клінчу). Одна із основних функцій ОС – розподілення ресурсів. Коли ресурси розподіляються поміж багатьма користувачами, кожному з яких надається право виключного керування виділеними йому ресурсами, можливе виникнення тупиків, які не дають процесам деяких користувачів хоч коли-небудь завершитися. У більшості випадків в ОС тупики виникають у результаті звичайної конкуренції за право мати в розпорядженні певні ресурси (як правило, це ресурси послідовного використання).
Розглянемо таку ситуацію. Двом процесам, що працюють в багато-задачній системі, для виконання своєї роботи потрібні два ресурси, наприклад Друкарка та Диск. Нехай після того як процес А захопив Друкарку (встановив блокуючи змінну) він був перерваний. Керування отримав процес В, який спочатку захопив Диск, але при виконанні наступної команди (захоплення Друкарки) був заблокований, так як Друкарка вже захоплена процесом А. Керування знову повертається процесу А, який пробує захопити Диск та блокується, оскільки Диск вже виділений процесу В. І в такому стані процеси А та В можуть знаходитися безмежно довго.
Можливі такі варіанти уникнення тупику:
Тупикові ситуації треба відрізняти від звичайних черг, хоча і ті і інші виникають при сумісному використанні ресурсів і зовні виглядають подібно: процес призупиняється та очікує звільнення ресурсу. Але черга – це нормальне явище, ознака високого коефіцієнту використання ресурсів при випадковому надходженні запитів. Вона виникає тоді, коли ресурс є недоступним у біжучий момент, але через деякий час він звільниться і процес продовжить своє виконання. Тупик, навпаки, в деякому розумінні є ситуацією, що не розв’язується. Звичайна тупикова ситуація. Кожен з процесів утримує ресурс, якого потребує інший процес. Причому ні один з процесів не хоче звільнити ресурс, що належить йому. Кожен з процесів очікує звільнення ресурсу іншим процесом. Для виникнення тупику необхідні наступні умови: 1) процеси вимагають надання їм права монопольного керування ресурсами, що їм виділяються (умова взаємо-виключення); 2) процеси утримують за собою ресурси, які їм виділені, очікуючи в той же час виділення додаткових ресурсів (умова очікування ресурсів); 3) ресурси неможливо відібрати у процесів (які їх утримують) доки ці ресурси не будуть використані для завершення роботи (умова неможливості перерозподілу); 4) існує кільцевий ланцюг процесів, у якому кожен процес утримує за собою один чи декілька ресурсів, що погрібні наступному процесові з ланцюжка (умова кільцевого очікування); Виникнення тупику неможливе, коли не виконується хоча б одна із перелічених чотирьох умов. Стратегія боротьби з тупиками полягає в тому, щоб усунути хоча б одну із зазначених умов існування тупику.
Алгоритми планування процесів
Планування процесів включає в себе розв’язок наступних задач: 1) Вибір моменту часу для заміни процесу, що виконується. 2) Вибір процесу на виконання з черги готових процесів. 3) Переключення контекстів „старих” і „нових” процесів. 1) та 2) розв’язуються програмними засобами, а 3) в значній мірі апаратно. Існує багато різних алгоритмів планування процесів, які по різному розв’язують ці три задачі. Найчастіше зустрічаються такі дві групи алгоритмів: - побудовані на принципі квантування; - побудовані на принципі пріоритетів. В першому випадку зміна активного процесу відбувається, якщо: - процес закінчився і покинув систему; - процес перейшов в стан Очікування; - закінчився квант процесорного часу, відведений даному процесові. Процес, для якого закінчився його квант, переводиться в стан Готовність і очікує, коли йому буде надано новий квант процесорного часу, а на виконання у відповідності з певним правилом вибирається новий процес з черги готових. Жодний процес не захоплює процесор надовго, тому квантування широко використовується в системах розподілу часу. Кванти, що виділяються процесам, можуть бути однаковими для всіх процесів, або різними. Кванти для одного процесу можуть бути фіксованої величини або змінюватись в різні періоди життя процесу. Процеси, які не повністю використали виділений їм квант (наприклад через переривання на ввід/вивід), можуть отримати або не отримати компенсацію у вигляді привілеїв при наступному обслуговуванні. По-різному може бути організована черга готових процесів: - циклічно; - FIFO (перший прийшов — перший обслуговується); - LIFO (останній прийшов — перший обслуговується ).
В другому випадку використовується поняття ”пріоритет”. Пріоритет — це число, яке характеризує ступінь привілейованості процесу при використанні ресурсів комп’ютеру, зокрема, процесорного часу. Чим вище пріоритет, тим вище привілеї, тим менше часу він буде проводити в чергах. Пріоритетами можуть призначатьсь адміністратором системи в залежності від важливості роботи, або внесеної плати, або обчислюватись самою ОС за певними правилами. Він може залишатись фіксованим на протязі всього життя процесу або мінятись в часі у відповідності з деяким законом. В останньому випадку пріоритети називають динамічними. Є алгоритми які використовують: - відносні пріоритети; - абсолютні пріоритети. Але вибір процесу на виконання з черги готових виконується однаково: вибирається процес, що має найвищий пріоритет. Інакше розв’язується проблема визначення моменту зміни активного процесу. У системах з відносними пріоритетами активний процес виконується доти, доки він сам не покине процесор, виконавши перехід в стан Очікування (або ж виникне помилка, або процес завершиться).
У системах з абсолютними пріоритетами виконання активного процесу переривається ще й при умові: якщо в черзі готових процесів з’явився процес, пріоритет якого вище пріоритету активного процесу. В цьому випадку перерваний процес переходить в стан готовності.
У багатьох ОС алгоритми планування побудовані з використанням як квантування, так і пріоритетів. Наприклад, в основі планування лежить квантування, але величина кванту так/або порядок вибору процесу з черги готових визначається пріоритетами процесів.
Витісняючі та невитісняючі алгоритми планування
Існує два основні типи процедур планування процесів — витісняючі (preemptive) та невитісняючі (non-preemptive — cooperative). Non-preemptive multitasking — невитісняюча багатозадачність — це спосіб планування процесів, при якому активний процес виконується до того часу, доки він сам, за власною ініціативою, не віддасть керування планувальнику ОС для того, щоби той вибрав з черги інший, готовий до виконання процес. Preemptive multitasking — витісняючи багатозадачність — це такий спосіб, при якому рішення про переключання процесора з виконання одного процесу на виконання іншого процесу приймається планувальником ОС, а не самою активною задачею. Типи багатозадачності — це більш широкі поняття ніж типи пріоритетності. Пріоритети задач можуть використовуватись або не використовуватись, як при витісняючих так і невитісняючих способах планування. Основна відмінність між preemptive та non-preemptive — це ступінь централізації механізму планування задач. У першому випадку механізм планування задач повністю зосереджено в ОС і програміст пише прикладну програму, не піклуючись про те, що вона буде виконуватись паралельно з іншими задачами. У цьому випадку ОС виконує такі функції: 1. Визначає час, коли знімається з виконання активна задача. 2. Запам’ятовує її контекст. 3. Вибирає з черги готових задач наступну. 4. Запускає вибрану задачу на виконання, завантажуючи її контекст. У другому випадку механізм планування розподілено між ОС і прикладними програмами. Прикладна програма, отримавши керування від ОС сама визначає момент завершення своєї чергової ітерації і передає керування ОС за допомогою системного виклику. ОС формує черги задач і вибирає у відповідності з деяким алгоритмом (наприклад, із врахуванням пріоритетів) наступну задачу на виконання. Такий механізм досить складний як для користувачів, так і для розробників. Програміст повинен забезпечити „дружнє” відношення своєї програми до інших, що виконуються одночасно. Тобто досить часто віддаючи їм керування. Але такий підхід дає можливість розробнику прикладних програм самому проектувати алгоритм планування, який найбільш підходить для даного фіксованого набору задач. Також суттєва перевага — більш висока швидкість переключення з задачі на задачу. Файл-сервер NetWare — висока швидкість виконання файлових операцій. Менш ефективно в ОС Windows 3.ХХ Але зараз практично в усіх ОС-preemptive — (UNIX Windows NT/95/98, OS/2). Можливо, саме тому витісняючу багатозадачність часто називають істинною, справжньою багатозадачністю.
Нитки, потоки (Thread)
Багатозадачність — найважливіша властивість ОС. Для підтримки цієї властивості ОС визначає і створює для себе ті внутрішні одиниці роботи, між якими і буде розділятись процесор і інші ресурси комп’ютера. ОС підтримує відокремленість процесів. У кожного процесу є свій віртуальний адресний простір, кожному процесу призначаються свої ресурси: файли, вікна, семафори і т.ін. це для того, щоби захистити один процес від іншого. При мультипрограмуванні підвищується пропускна здатність системи в цілому, але окремий процес ніколи не може бути виконаний швидше, ніж у випадку його виконання в одно програмному режимі (йде час на очікування ресурсу, що розділяється). Але задачі, яка розв’язується в рамках одного процесу, може бути притаманний внутрішній паралелізм, який в принципі дозволяє прискорити її розв’язок. Наприклад, в ході виконання задачі відбувається звертання до зовнішнього пристрою і на час цієї операції можна не блокувати повністю виконання процесу, а продовжити виконання іншої „гілки” процесу. Для цього пропонується механізм багато-ниткової обробки (multithreading). Вводиться нове поняття „нитка” (thread). Мультипрограмування тепер реалізується на рівні ниток. Наприклад: якщо електронна таблиця була розроблена з врахуванням можливостей багато-ниткової обробки, то користувач може запросити перерахунок своєї таблиці і одночасно продовжувати її заповнювати. Багато-нитковий сервер може паралельно виконувати запити одразу декількох клієнтів. Оскільки всі нитки одного процесу завжди належать одній прикладній програмі, між ними досить легко організувати тісну взаємодію. Програміст може завчасно продумати роботу множини ниток процесу таким чином, щоби вони могли взаємодіяти, а не боротись за ресурси. Нитки в багатьох відношеннях потрібні процесам, але в рамках одного процесу не є такими незалежними, як процедури: - всі нитки мають один адресний простір; - вони розділяють одні і ті самі глобальні змінні; - кожна нитка має доступ до довільної віртуальної адреси, але одна нитка може використовувати стек іншої; - між нитками немає повного захисту, всі нитки розділяють один набір відкритих файлів, таймерів, сигналів і т. ін. Таким чином нитки мають власні: - програмний лічильник; - стек; - регістри; - нитки-нащадки; - стани. Нитки розділяють: - адресний простір; - глобальні змінні; - відкриті файли; - таймери; - семафори; - статистичну інформацію. Приклад. Керування сигналами, наприклад, переривання з клавіатури (delete або break). Замість обробки сигналу переривання одна нитка призначається для постійного очікування надходження сигналів. Таким чином, нитки можуть скоротити необхідність в перериваннях рівня користувача.
Висновки. Головне, що забезпечують нитки, це можливість паралельно виконувати декілька видів операцій в одній прикладній програмі. Паралельні обчислення, а значить і більш ефективне використання ресурсів CPU та менший сумарний час виконання задач, тепер вже реалізується на рівні ниток. Програма, побудована у вигляді ниток в рамках одного процесу, може бути виконана швидше. Наприклад: Текстовий процесор з врахуванням багато-ниткової (багато-потокової) обробки. Користувач може запросити об’єднання двох документів і одночасно відкривати для редагування наступний документ. Об’єкт „процес” припускає, що при диспетчеризації треба враховувати всі ресурси, що закріплені за процесом. А при роботі з нитками можна міняти тільки контекст задачі, якщо ми переключаємось з однієї нитки на іншу в рамках одного процесу. Всі інші обчислювальні ресурси при цьому не торкаються. Кожний процес складається, як мінімум, з однієї нитки і тільки якщо є внутрішній паралелізм, програміст може розщепити його на декілька паралельних ниток. В багатопроцесорних системах зі спільною пам’яттю нитки вже просто необхідні, оскільки вони дозволяють завантажити всі процесорні елементи роботою. Але зауважимо, що бажано зменшити взаємодію ниток між собою, оскільки прискорення від одночасного виконання паралельних потоків може бути зведено до мінімуму через затримки синхронізації і обмін даними. Для того, щоби можна було ефективно організувати паралельне виконання як процесів, так і ниток, в архітектуру сучасних процесорів включається можливість працювати із спеціальною інформаційною структурою, яка описує або процес або нитку. Для цього на рівні архітектури мікропроцесора використовується поняття „задача” — task. Воно об’єднує в собі як процес, так і нитку. Це поняття і інформаційна структура, яка підтримується для нього на рівні апаратури, дозволяє в подальшому побудувати відповідні дескриптори. Вони будуть відрізнятись перш за все тим, що: - дескриптор нитки може зберігати тільки контекст призупиненого обчислювального процесу; - дескриптор процесу повинен вміщувати поля, які описують всі ресурси, які виділені цьому процесові.
Лекція 5
Керування ресурсами
Найважливіші ресурси — це пам’ять та процесор (тобто процесорний час).
Керування пам’яттю
Організація та керування основною, або первинною, або фізичною (реальною) пам’яттю комп’ютера — один з найважливіших факторів, що визначає побудову операційних систем. Для безпосереднього виконання програм або звертання до даних необхідно, щоб вони розміщались в основній пам’яті. Вторинна, або зовнішня пам’ять — це, як правило, накопичувачі на магнітних дисках, магнітних стрічках — мають значно більшу ємність, і дозволяють зберігати велику кількість програм і даних, готових до обробки.
Ієрархія пам’яті Поки що розглядаємо фізичну або реальну пам’ять, а далі — віртуальну пам’ять. Під організацією пам’яті ми розуміємо те яким чином представляється та використовується основна пам’ять. При цьому виникають такі питання: 1) розміщаємо в основній пам’яті тільки одну програму користувача або декілька програм одночасно; 2) при розміщенні в основній пам’яті декількох програм користувачів відразу, їм надається однакова кількість комірок, чи вона розбивається на розділи різних розмірів. 3) пам’ять розбивається на розділи жорстко певним чином на досить довгий період часу, або передбачено більш динамічне розбиття, яке дозволяє комп’ютеру швидко реагувати на зміну потреб програм у ресурсах; 4) програми користувачів будуть будуватися таким чином, щоб вони виконувались тільки в конкретному розділі, або буде передбачатись можливість виконання програми в довільних розділах; 5) програма користувача буде розміщатися в одному неперервному, суцільному блоці пам’яті, або є можливість розбиття програм на окремі блоки, які розміщаються в яких завгодно вільних ділянках (дірках) основної пам’яті. При цьому виникають такі можливості: 1) одно-програмні (одно-абонентні) системи; 2) багатопрограмні системи з фіксованими розділами, з трансляцією та завантаженням модулів в абсолютних адресах; 3) багатопрограмні системи з фіксованими розділами пам’яті, з трансляцією та завантаженням модулів, що переміщаються; 4) багатопрограмні системи із змінними розділами; 5) система із свопінгом (підкачкою, сторінковим обміном).
Існують системи, побудовані з орієнтацією на кожну з таких схем. Незалежно від того, яку схему організації пам’яті ми приймемо для конкретної системи, необхідно вирішити, які стратегії треба застосувати для досягнення оптимальних характеристик використання пам’яті. Стратегії керування пам’яттю визначають яким чином буде працювати пам’ять конкретної системи при різних підходах до вирішення таких питань: 1) коли треба розміщувати нову програму в пам’яті; 2) будемо ми розміщувати нову програму в пам’яті тоді, коли система буде сама про це просити, чи будемо намагатись випередити запити системи; 3) в яке місце основної пам’яті ми будемо розміщати чергову програму для виконання; 4) чи будемо ми розміщати програми як можна більш щільно, щоб звести до мінімуму втрати пам’яті, чи будемо прагнути до найшвидшого розміщення програм, щоб звести до мінімуму втрати машинного часу; 5) якщо в основну пам’ять необхідно розмістити нову програму, а основна пам’ять в біжучий момент вже заповнена, то яку з інших програм треба вивести з пам’яті (ті, що знаходились в пам’яті довше, ніж інші, або ті, що використовувались найменш часто, або ті, які довше всіх не використовувались). Існують системи, що орієнтовані на використання кожної з таких стратегій керування пам’яттю.
Як було вже сказано, стратегії керування пам’яттю направлені на те, щоб забезпечити найкраще можливе використання ресурсів основної пам’яті. Стратегії керування пам’яттю поділяються на такі категорії: 1. Стратегії вибірки: а) вибірка за запитом; б) випереджуюча вибірка; 2. Стратегії розміщення. 3. Стратегії заміщення.
Перші. Мають своїм призначенням визначати, коли треба „вштовхнути” черговий блок програми або даних в основну пам’ять: - при вибірці за запитом черговий блок програми або даних завантажується в основну пам’ять, коли є на неї запит від працюючої програми; - при випереджуючій вибірці виникають додаткові затримки, зв’язані з приготуванням подальшого ходу програми. Другі. Визначають, в яке місце основної пам’яті треба розмістити програму, яка надходить. Треті. Визначають, який блок програми, або даних треба вивести „виштовхнути” з основної пам’яті, щоб звільнити місце для запиту поступаючи програм або даних.
Розподіл пам’яті В перших комп’ютерах було реалізовано зв’язний розподіл пам’яті — в одному неперервному блоці комірок пам’яті. Тільки після того, як з’явилось мультипрограмування з розділами змінного розміру стало зрозумілим, що значно більш ефективним може бути незв’язний розподіл. При незв’язаному розподілі пам’яті, програми розбиваються на декілька блоків або сегментів, які розміщуються в основній пам’яті в ділянках які не обов’язково розташовані поряд. Читайте також:
|
||||||||
|