Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Питання ректорського контролю_2012_початок_курс...doc
Скачиваний:
3
Добавлен:
20.11.2019
Размер:
1.36 Mб
Скачать

6. Кешування операцій вводу/виводу при роботі з накопичувачами на магнітних дисках.

Як відомо, накопичувачі на магнітних дисках мають вкрай низьку швидкість в порівнянні з швидкодією центральної частини комп'ютера. Різниця у швидкодії відрізняється на кілька порядків. Наприклад, сучасні процесори за один такт роботи, а вони працюють уже з частотами і 1 ГГц і більше, можуть виконувати по дві операції. Таким чином, час виконання операції (з позиції зовнішнього спостерігача, що не бачить конвеєризації при виконанні машинних команд, завдяки якій продуктивність зростає в кілька разів) може складати 0,5 нс (!). У той же час перехід магнітної голівки з доріжки на доріжку складає декілька мілісекунд. Такі ж тимчасові інтервали мають місце і при чеканні, поки під голівкою читання/запису не виявиться потрібний сектор даних. Як відомо, у сучасних приводах середня тривалість на читання випадковим чином обраного сектора даних складає близько 20 мс, що істотно повільніше, ніж вибірка команди чи операнда з оперативної пам'яті і тим більше з кешу. Правда, після цього дані читаються великим пакетом (сектор, як ми вже говорили, має розмір у 512 байтів, а при операціях з диском часто читається чи записується відразу кілька секторів). Таким чином, середня швидкість роботи процесора з оперативною пам'яттю на 2-3 порядки вище, ніж середня швидкість передачі даних із зовнішньої пам'яті на магнітних дисках в оперативну пам'ять.

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

Якщо не вдаватися в подробиці, то під кешім можна розуміти деякий пул буферів, якими ми керуємо за допомогою відповідного системного процесу. Якщо ми зчитуємо якусь безліч секторів, що містять записи того чи іншого файлу, то ці дані, пройшовши через кеш, там залишаються (до тих пір поки інші сектори не замінять ці буфери). Якщо в наслідку буде потрібне повторне читання, то дані можуть бути витягнуті безпосередньо з оперативної пам'яті без фактичного звертання до диска. Прискорити можна й операції запису: дані поміщаються в кеш, і для задачі, що запросила цю операцію, можна вважати, що вони уже фактично і записані. Задача може продовжити своє виконання, а системні зовнішні процеси через якийсь час запишуть дані на диск. Це називається операцією відкладеного запису (lazy write «ледачий запис»). Якщо відкладений запис відключений, тільки одна задача може записувати на диск свої дані. Інші додатки повинні чекати своєї черги. Це чекання піддає інформацію ризику не меншому (якщо не більшому), чим відкладений запис, що до того ж і більш ефективний по швидкості роботи з диском.

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

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

Отже, шлях інформації від диска до прикладної програми пролягає як через буфер, так і через файловий кеш. Коли додаток запитує з диска дані, програма кешування перехоплює цей запит і читає разом з необхідними секторами і ще декілька додаткових. Потім вона поміщає в буфер інформацію, яка потрібна задачі, і повідомляє про це операційну систему. Операційна система повідомляє задачі, що її запит виконаний і дані з диска знаходяться в буфері. При наступному звертанні додатка до диска програма кешування насамперед перевіряє, чи не знаходяться вже в пам'яті викликані дані. Якщо це так, то вона копіює їх у буфер; якщо ж їх у кеші немає, то запит на читання диска передається операційній системі. Коли задача змінює дані в буфері, вони копіюються в кеш. У ряді ОС є можливість вказати в явному виді параметри кешування, у той час як в інших за ці параметри відповідає сама ОС. Так, наприклад, у системі Windows NT немає можливості в явному виді керувати ні обсягом файлового кешу, ні параметрами кешування. У системах Windows 95/98 така можливість вже є, але вона представляє не дуже великий вибір. Фактично ми можемо вказати тільки обсяг пам'яті, що відводиться для кешування, і обсяг порції даних ( чи буфер chunk - шматочок), з яких набирається кеш. У файлі System.ini є можливість у секції [VCACHE] прописати, наприклад, наступні значення:

[vcache]

MinFileCache = 4096

MaxFileCache = 32768

ChunkSize = 512

Тут зазначено, що мінімально під кешування даних зарезервовано 4 Мбайт оперативної пам'яті, максимальний обсяг кешу може досягати 32 Мбайт, а розмір даних, якими маніпулює менеджер кешу, рівний одному сектору.

В інших ОС можна вквзувати більше параметрів, що визначають роботу підсистеми кешування. Приклад, що демонструє ці можливості, можна подивитися в розділі «Файлова система HPFS».

Крім описаних дій ОС може виконувати і роботу з оптимізації переміщення голівок читання/запису даних, зв'язаного з виконанням запитів від паралельно виконуємих задач. Час, необхідний на одержання даних з магнітного диска, складається з часу переміщення магнітної голівки на необхідний циліндр і часу чекання заданого сектора; часом зчитування знайденого сектора і витратами на передачу цих даних в оперативну пам'ять ми можемо зневажити. Таким чином, основні витрати часу ідуть на пошук даних. У мультипрограмних ОС при виконанні багатьох задач запити на читання і запис даних можуть йти таким потоком, що при їхньому обслуговуванні утвориться черга. Якщо виконувати ці запити у порядку надходження їх у чергу, то внаслідок випадкового характеру звертань до того чи іншого сектора магнітного диска ми можемо мати значні втрати часу на пошук даних. Напрошується очевидне рішення: оскільки виконані перевпорядкування запитів з метою мінімізації витрат часу на пошук даних можна виконати дуже швидко (практично цим часом можна зневажити, з огляду на різницю у швидкодії центральної частини і пристроїв вводу/виводу), то необхідно знайти метод, що дозволяє перебудовувати чергу запитів оптимальним чином. Вивчення цієї проблеми дозволило знайти найбільш ефективні дисципліни планування. Перелічимо відомі дисципліни, відповідно до яких можна перебудовувати чергу запитів на операції читання/запису даних:

  • SSTF (shortest seek time — first) — з найменшим часом пошуку — першим. Відповідно до цієї дисципліни при позиціюванні магнітних голівок наступним вибирається запит, для якого необхідно мінімальне переміщення з циліндра на циліндр, навіть якщо цей запит не був першим у черзі на ввід/вивід. Однак для цієї дисципліни характерна різка дискримінація визначених запитів, але ж вони можуть йти від високопріоритетних задач. Звертання до диска виявляють тенденцію концентруватися, у результаті чого запити на звертання до самих зовнішніх і самих внутрішніх доріжок можуть обслуговуватися істотно довше і немає ніякої гарантії обслуговування. Достоїнством такої дисципліни є максимально можлива пропускна здатність дискової підсистеми.

  • Scan (сканування). По цій дисципліні голівки переміщаються то в одному то в іншому «привілейованому» напрямку, обслуговуючи «по шляху» придатні запити. Якщо при переміщенні голівок читання/запису більш немає побіжних запитів, то рух починається в зворотному напрямку.

  • Next-Step Scan — відрізняється від попередньої дисципліни тим, що на кожнім проході обслуговуються тільки запити, що вже існували на момент початку проходу. Нові запити, що з'являються в процесі переміщення голівок читання/запису, формують нову чергу запитів, причому таким чином, щоб їх можна було оптимально обслужити на зворотному ходу.

  • C-Scan (циклічне сканування). По цій дисципліні голівки переміщаються циклічно із самої зовнішньої доріжки до внутрішніх, але по шляху обслуговуючи наявні запити, після чого знову переносяться до зовнішніх циліндрів. Цю дисципліну іноді реалізують таким чином, щоб запити, що надходять під час поточного прямого ходу голівок, обслуговувалися не попутно, а при наступному ході, що дозволяє виключити дискримінацію запитів до самих крайніх циліндрів; вона характеризується дуже малою дисперсією часу чекання обслуговування. Цю дисципліну обслуговування часто називають «елеваторною».

Функції файлової системи ОС і ієрархія даних.

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

Як правило, усі сучасні ОС мають відповідні системи керування файлами. Надалі постараємося розрізняти файлову систему і систему керування файлами.

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

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

  • робота з не дисковими периферійними пристроями як з файлами;

  • обмін даними між файлами, між пристроями, між файлом і пристроєм (і навпаки);

  • робота з файлами за допомогою звертань до програмних модулів системи керування файлами (частина API орієнтована саме на роботу з файлами);

  • захист файлів від несанкціонованого доступу.

У деяких ОС може бути кілька систем керування файлами, що забезпечує їм можливість працювати з декількома файловими системами. Очевидно, що системи керування файлами, будучи компонентом ОС, не є незалежними від цієї ОС, оскільки вони активно використовують відповідні виклики API (application program interface, прикладний програмний інтерфейс). З іншого боку, системи керування файлами самі доповнюють API новими викликами. Можна сказати, що основне призначення файлової системи і відповідної їй системи керування файлами — організація зручного доступу до даних, організованих як файли, тобто замість низькорівневого доступу до даних із вказівкою конкретних фізичних адрес потрібного нам запису використовується логічний доступ із вказівкою імені файлу і запису в ньому.

Іншими словами, термін «файлова система» визначає, насамперед, принципи доступу до даних, організованих у файли. Цей же термін часто використовують і стосовно конкретних файлів, розташованих на тім чи іншім носії даних. А термін «система керування файлами» варто вживати стосовно конкретної реалізації файлової системи, тобто це — комплекс програмних модулів, що забезпечують роботу з файлами в конкретній операційній системі.

Потрібно ще раз відмітити, що будь-яка система керування файлами не існує сама по собі — вона розроблена для роботи в конкретній ОС. Як приклад можна сказати, що усім відома файлова система FAT (file allocation table) має безліч реалізацій як система керування файлами. Так, система, що одержала цю назву і розроблена для перших персональних комп'ютерів, називалася просто FAT (зараз її називають FAT-12). Її розробляли для роботи з дискетами, і якийсь час вона використовувалася при роботі з жорсткими дисками. Потім її удосконалили для роботи з жорсткими дисками більшого об’єму, і ця нова реалізація одержала назву FAT-16. Цю назву файлової системи ми використовуємо і стосовно системи керування файлами самої MS-DOS. Реалізацію же системи керування файлами для OS/2, що використовує основні принципи системи FAT, називають super-FAT; основна відмінність — можливістъ підтримувати для кожного файлу розширені атрибути. Є версія системи керування файлами з принципами FAT і для Windows 9.1/98, для Windows NT і т.д. Іншими словами, для роботи з файлами, організованими відповідно до деякої файлової системи, для кожної ОС повинна бути розроблена відповідна система керування файлами. Ця система керування файлами буде працювати тільки в тієї ОС, для якої вона і створена; але при цьому вона дозволить працювати з файлами, створеними за допомогою системи керування файлами інший ОС, що працює по тим же основним принципам файлової системи.

Структура магнітного диска (розбивка дисків на розділи).

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

Як відомо, інформація на магнітних дисках розміщається і передається блоками. Кожен такий блок називається сектором (sector), сектори розташовані на концентричних доріжках поверхні диска. Кожна доріжка (track) утвориться при обертанні магнітного диска під зафіксованою в деякім визначеному положенні голівкою читання/запису. Накопичувач на жорстких магнітних дисках (НЖМД) містить один чи більше дисків (у сучасних розповсюджених НЖМД часто — два чи три). Однак звичайно під терміном «жорсткий диск» розуміють весь пакет магнітних дисків. Групи доріжок (треків) одного радіуса, розташованих на поверхнях магнітних дисків, утворять так звані циліндри (cylinder). Сучасні жорсткі диски можуть мати кілька десятків тисяч циліндрів, у той час як на поверхні дискети число доріжок (число циліндрів) нині, як правило, складає всього вісімдесят.

Кожен сектор складається з поля даних і поля службової інформації, що обмежує й ідентифікує його. Розмір сектора (точніше — ємність поля даних) встановлюється контролером чи драйвером. Користувальницький інтерфейс DOS підтримує єдиний розмір сектора — 512 байт. BIOS же безпосередньо надає можливості роботи із секторами розміром 128, 256, 512 чи 1024 байт. Якщо керувати контролером безпосередньо, а не через програмний інтерфейс більш високого рівня (наприклад, рівень DOS), то можна обробляти сектори і з іншими розмірами. Однак у більшості сучасних ОС розмір сектора вибирається рівним 512 байт. Фізична адреса сектора на диску визначається за допомогою трьох «координат», тобто представляється тріадою [c-h-s], де c — номер циліндра (доріжки на поверхні диска, cylinder), h — помер робочої поверхні диска (магнітної голівки, head), а s — номер сектора на доріжці. Номер циліндра c лежить у діапазоні 0..C-1, де C — кількість циліндрів. Номер робочої поверхні диска h належить діапазону 0..Н-1, де Н — число магнітних голівок у накопичувачі. Номер сектора на доріжці s вказується в діапазоні 1..S, де S — кількість секторів на доріжці. Наприклад, тріада [1-0-2] адресує сектор 2 на доріжці 0 (звичайно верхня робоча поверхня) циліндра 1. Надалі ми теж будемо користуватися саме цими позначеннями.

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

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

Розділи диска можуть бути двох типівprimary (звичайно цей термін переводять як первинний) і extended (розширений). Максимальне число primary розділів дорівнює чотирьом. При цьому на диску обов'язково повинний бути принаймні один primary-розділ. Якщо primary-розділів декілька, то тільки один з них може бути активним. Саме завантажнику, розташованому в активному розділі, передається керування при включенні комп'ютера і завантаженню операційної системи. Інші primary-розділи в цьому випадку вважаються «невидимими, схованими» (hidden).

Відповідно до специфікацій на одному жорсткому диску може бути тільки один extended - розділ, що, у свою чергу, може бути розділений на велику кількість підрозділів — логічних дисків (logical). У цьому змісті термін «первинний» варто визнати не зовсім вдалим перекладом слова primary; можна це слово перевести і як «найпростіший, примітивний». У цьому випадку стає зрозумілим і логічним термін extended.

Один з primary-розділів повинний бути активним, саме з його повинна завантажувати програма завантаження операційної системи, чи так званий менеджер завантаження, призначення якого — завантажити програму завантаження ОС з якого-небудь іншого розділу, і вже з її допомогою завантажувати операційну систему. Оскільки до завантаження ОС система керування файлами працювати не може, то варто використовувати для вказівки згаданих завантажників винятково абсолютні адреси у форматі [c-h-s].

По фізичній адресі [0-0-1] на вінчестері розташовується головний завантажувальний запис (master hoot record, MBR), що містить позасистемний завантажник (non-system bootstrap — NSB), а також таблицю розділів (partition table, FT). Цей запис займає рівно один сектор, вона розміщується в пам'яті, починаючи з адреси 0:7C00h, після чого керування передається коду, що міститься в цьому найпершому секторі магнітного диска. Таким чином, у найпершому (стартовому) секторі фізичного жорсткого диска знаходиться не звичайний запис boot record, як на дискеті, a master boot record.

MBR є основним засобом завантаження з жорсткого диска, підтримуваним BIOS. У MBR знаходяться три важливих елементи:

  • програма початкового завантаження (non-system bootstrap). Саме вона запускається BIOS після успішного завантаження в пам'ять першого сектора з MBR. Вона, мабуть, не перевищує 512 байт і її вистачає тільки на те, щоб завантажити наступну, трохи більш складну програму, звичайно — стартовий сектор операційної системи — і передати йому керування;

  • таблиця опису розділів диска (partition table). Розташовується в MBR по зсуві Ox1BE і займає 64 байта;

  • сигнатура MBR. Останні два байти MBR повинні містити число AA55h. По наявності цієї сигнатури BIOS перевіряє, що перший блок був завантажений успішно. Сигнатура ця обрана не випадково. Її успішна перевірка дозволяє установити, що всі лінії передачі даних можуть передавати і нулі, і одиниці.