Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вступ, ст 22-93.doc
Скачиваний:
5
Добавлен:
02.09.2019
Размер:
1.62 Mб
Скачать

Огляд апаратного забезпечення комп'ютера

Операційна система тісно пов'язана з устаткуванням комп'ютера, на якому вона повинна працювати. Апаратне забезпечення впливає на набір команд операційної системи і управління його ресурсами. Тому нам необхідний певний

обсяг знань про комп'ютер, принаймні потрібно представляти, в якому вигляді

обладнання постає перед програмістом.

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

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

персональні комп'ютери мають більш складну структуру, що включає кілька шин;

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

Рис. 1.5. Деякі компоненти персонального комп'ютера

Процесори

«Мозком» комп'ютера є центральний процесор (CPU - Central Processing

Unit). Він вибирає з пам'яті команди і виконує їх. Звичайний цикл роботи

центрального процесора виглядає так: Він читає першу команду з пам'яті,

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

в змозі виконати. Наприклад, процесор Pentium не може обробити

програми, написані для SPARC, а процесор SPARC не може виконати

програми, написані для Pentium. Оскільки доступ до пам'яті для отримання

команд або наборів даних займає набагато більше часу, ніж виконання

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

інструкцій зазвичай містить команди для завантаження слова з пам'яті в регістр і

збереження слова з регістра в пам'яті. Інші команди поєднують два операнда з

регістрів, пам'яті або і того й іншого і отримують результат. Наприклад, складають два слова і зберігають результат в регістрі або пам'яті.

Крім основних регістрів, що використовуються для зберігання змінних і тимчасових результатів, більшість комп'ютерів має кілька спеціальних регістрів, видимих ​​для програміста. Один з них називається лічильником команд (PC,

program counter), в ньому міститься адреса наступної, що стоїть в черзі на

конання команди. Після того як команда обрана з пам'яті, регістр команд

коригується і покажчик переходить до наступної команді.

Ще один регістр процесора називається покажчиком стека (SP, stack pointer).

Він містить адресу вершини стека в пам'яті. Стек містить по одному фрейму

(Області даних) для кожної процедури, яка вже почала виконуватися, але ще

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

також локальні і тимчасові змінні, не зберігаються в регістрах. Наступний регістр називається PSW (Processor Status Word - слово стану процесора). Цей реєстр містить біти коду станів, які задаються командами порівняння, пріоритетом центрального процесора, режимом (Призначений для користувача або режим ядра), та іншу службову інформацію. Зазвичай користувальницькі програми можуть читати весь регістр PSW цілком, але писати можуть тільки в деякі з його полів. Регістр PSW грає важливу роль в системних виклики та операціях введення-виведення.

Операційна система повинна знати все про всіх регістрах. При тимчасовому

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

було відновити.

З метою поліпшення характеристик центральних процесорів їх розробники

давно відмовилися від простої моделі, в якій за один такт може бути зчитана,

декодована і виконана тільки одна команда. Багато сучасних CPU володіють можливостями виконання кількох команд одночасно. Наприклад,

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

може декодувати команду з номером п 1 і зчитувати команду з номером п 2.

Подібна організація процесу називається конвеєром, три його стадії

продемонстровані на рис. 1.6, а. Часто зустрічаються і більш довгі конвеєри. У

більшості конвеєрних конструкцій зчитана команда повинна бути виконана,

навіть якщо в попередній команді був прийнятий умовний перехід. У розробників компіляторів і операційних систем це властивість конвеєрів часто викликають

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

команди, які декодуються і скидаються в буфер зберігання, де вони чекають своєї

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

Рис. 1.6. Конвеєр з трьома стадіями (а); суперскалярної процесор (б)

Більшість центральних процесорів, окрім дуже простих, використовуваних

у вбудованих системах, мають два режими роботи: режим ядра і

користувальницький режим. Зазвичай режим задається битому слова стану процесора (регістра PSW). Якщо процесор запущений в режимі ядра, він може виконувати всі команди з набору інструкцій та використовувати всі можливості апаратури. Операційна система працює в режимі ядра, надаючи доступ до всього обладнання.

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

Установка біта режиму ядра в регістрі PSW, природно, недоступна.

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

главі. Надалі для виділення системних викликів в тексті ми будемо використовувати такий же шрифт, що в цьому слові: read.

Варто зазначити, що в комп'ютерах, крім інструкцій для виконання системних викликів, є й інші переривання. Більшість цих переривань викликають

викликаються апаратно для попередження про виняткових ситуаціях, таких як

спроба поділу на нуль або переповнення при операціях з плаваючою точкою.

У всіх подібних випадках управління переходить до операційної системи, яка повинна вирішувати, що робити далі. Іноді потрібно завершити програму з

повідомленням про помилку. В інших випадках помилку можна проігнорувати

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

Пам'ять

Другий основною складовою будь-якого комп'ютера є пам'ять. В ідеалі

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

інший підхід. Системи пам'яті конструюються у вигляді ієрархії шарів, як

показано на рис. 1.7. Верхній шар складається з внутрішніх регістрів центрального процесора. Вони зроблені з того ж матеріалу, що і процесор, і так само швидко, як і сам процесор. Тому при доступі до них зазвичай не виникає затримок. Внутрішні регістри надають можливість для зберігання 32 х 32 біт на 32-розрядному процесорі і 64 х 64 біт на 64-розрядному процесорі. Це складає менше одного кілобайти в обох випадках. Програми самі можуть керувати регістрами (тобто вирішувати, що в них зберігати) без втручання апаратури.

У наступному шарі знаходиться кеш-пам'ять, в основному контрольована обладнанням. Оперативна пам'ять розділена на кеш-рядки, зазвичай по 64 байт,

з адресацією від 0 до 63 в нульовий рядку, від 64 до 127 в першому рядку і т. д.

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

Рис. 1.7. Типова ієрархічна структура пам'яті. Числа приблизні

Далі слід оперативна пам'ять. Це головна робоча область запам'ятовуючого пристрою машини. Оперативну пам'ять часто називають ОЗУ (Оперативне запам'ятовуючий пристрій, в англомовній літературі RAM, Random Access

Memory - пам'ять з довільним доступом). Раніше іноді її називали core

memory - запам'ятовуючий пристрій на магнітних сердечниках, оскільки в 50-е

і 60-і роки в комп'ютерах для оперативної пам'яті використовували крихітні

намагнічується ферритові сердечники. Зараз пам'ять становить десятки

і сотні мегабайт і зростає з неймовірною швидкістю. Всі запити центрального

процесора, які не можуть бути виконані кеш-пам'яттю, надходять для

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

Рис. 1.8. Пристрій жорсткого диска

Жорсткий диск складається з однієї або декількох металевих пластин,

обертаються зі швидкістю 5400, 7200 або 10 800 оборотів в хвилину. Механічна вилка повертається над дисками подібно звукознімачу на старих грамофона для програвання вінілових платівок на швидкості 33 обороту в хвилину. Інформація записується на пластини у вигляді концентричних кіл. Головки в кожній заданій позиції вилки можуть прочитати кільце на пластині, зване доріжкою. Всі разом доріжки для заданої позиції вилки формують циліндр.

Кожна доріжка розділена на кілька секторів, звичайно по 512 байт на сектор. На сучасних дисках зовнішні циліндри містять більшу кількість секторів, ніж внутрішні. Переміщення головки від одного циліндра до іншого займає близько 1 мс, а переміщення до довільного циліндру вимагає від 5 до 10 мс, залежно від диска. Коли головка розташовується над правильною доріжкою, потрібно чекати, поки двигун поверне диск так, щоб під головкою встав потрібний сектор. Це займає додатково від 5 до 10 мс, залежно від швидкості обертання диска. Далі, коли сектор вже знаходиться під головкою, процес читання або запису відбувається зі швидкістю від 5 Мбайт / с для низькошвидкісних дисків до 160 Мбайт / с для самих високошвидкісних. Останній шар в піраміді пам'яті займає магнітна стрічка. Цей носій часто використовується для створення резервних копій простору жорсткого диска або для зберігання дуже великих наборів даних. Для доступу до інформації на стрічці її спочатку потрібно помістити в пристрій для читання магнітних стрічок – це може робити людина чи робот (автоматичне керування стрічками зазвичай використовується при роботі з величезними базами). Потім стрічка перемотується до запитуваної блоку з інформацією. Весь процес може тривати хвилини. Великий плюс стрічок полягає в тому, що вони вкрай дешеві і мобільні. Це дуже важливо для резервних копій, які потрібно тримати окремо, щоб вони збереглися після стихійних лих, наприклад пожеж, повеней, землетрусів і т. д.

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

Крім описаних вище видів в багатьох комп'ютерах є невелике кількість постійної пам'яті з довільним доступом - на відміну від оперативної пам'яті, вона не втрачає свій вміст при вимиканні енергії машини. ПЗУ (Постійний запам'ятовуючий пристрій, ROM, Read Only Memory - пам'ять тільки для читання) програмується в процесі виробництва і після цього його вміст не можна змінити. Така пам'ять досить швидка і дешева. На деяких комп'ютерах програми початкового завантаження, що використовуються при запуску комп'ютерах

комп'ютера, знаходяться в ПЗУ. Крім того, деякі карти введення-виведення містять ПЗУ для управління низькорівневими пристроями.

Електрично стирані ПЗУ (EEPROM, Electrically Erasable ROM) і флеш-

ОЗУ (flash RAM) також незалежну, але на відміну від ПЗУ їх вміст

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

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

поточних дати і часу. CMOS-пам'ять і годинна мікросхема, що відповідає за відлік часу, отримують живлення від маленького акумулятора і комп'ютерах

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

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

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

Тепер більш уважно розглянемо основну частину оперативної пам'яті.

Найчастіше вкрай бажано тримати складні програми в пам'яті цілком.

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

час використовувати центральний процесор, що покращує показники експлуатації

експлуатації процесора. Але при одночасному знаходженні в пам'яті кількох програм виникає необхідність вирішення двох наступних проблем:

1. Як захистити програми один від одного, а ядро ​​системи від всіх них?

2. Як керувати переміщенням програм в пам'яті?

Можливі різні рішення цих питань. Але всі вони припускають постачання процесора спеціальним обладнанням.

Перша проблема досить очевидна, але друге питання вимагає пояснень.

У процесі компілювання та компонування програми компілятор і компонувальник не знають, у яку область фізичної пам'яті буде завантажена програма після завершення процесу. З цієї причини вони зазвичай припускають, що програма розпочнеться з адреси 0, і поміщають туди першу посібник. Припустимо, що перша інструкція зчитує з пам'яті слово, що має адресу 10 000, а вся програма і дані до неї були завантажені, починаючи з адреси 50 000. Тоді при

виконанні першої команди з'явиться повідомлення про помилку, оскільки вона буде посилатися на слово за адресою 10 000 замість 60 000. Для вирішення цієї проблеми нам потрібно або «релоціровать» програму під час завантаження, тобто налаштувати її, знаходячи всі адреси і змінюючи їх відповідно до реальної адресацією (це здійснимо, але дорого), або оперативно змінювати адресацію під час роботи програми.

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

Відповідно до правил орфографії мови С, а числа, що починаються з вісімковими.) Коли програма починає працювати, в базовий регістр завантажується адреса початку виконуваного модуля програми, а граничний регістр каже, про те, скільки займає виконуваний модуль програми разом з даними. При вибірці команди з пам'яті апаратура перевіряє лічильник команд, і якщо він менше, ніж граничний регістр, то додає до нього значення базового регістра, а суму передає пам'яті. Коли програма хоче прочитати слово даних (наприклад, з адреси 10 000), апаратура автоматично додає до цього адресою вміст базового регістра (наприклад, 50 000) і передає суму F0 000) пам'яті. Базовий регістр дає можливість програмі посилатися на будь-яку частину пам'яті, наступну за що зберігаються в ньому адресою. Крім того, граничний регістр забороняє програмі звернення до будь-якої частини пам'яті після програми. Таким чином, за допомогою цієї схеми вирішуються обидва завдання: захисту і переміщення програм. Вартість рішення дорівнює двом новим регістрів і незначного збільшення часу, витрачається на операцію (що йде на перевірку межі і підсумовування).

Рис. 1.9. Використовується одна пара база-межа. Програма має доступ до частини пам'яті,

знаходиться між базою і межею (а); використовуються дві пари база-межа. Код програми

знаходиться між базою 1 і межею 1, а дані до неї - між базою 2 і межею 2 (б)

В результаті перевірки та перетворення даних адресу, сформований

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

називається пристроєм управління пам'яттю або диспетчером пам'яті (MMU,

Memory Management Unit). Диспетчер пам'яті розташовується або в схемі

процесора, або близько до неї, але логічно знаходиться між процесором і пам'яттю.Більш складний диспетчер пам'яті зображений на рис. 1.9, б. Тут диспетчер пам'яті складається з двох пар базового та граничних регістрів: одна пара для тексту програми, інша - для даних. Командний регістр і всі інші посилання на текст програми працюють з парою 1, а посилання на дані використовують пару 2. З'являється можливість ділити одну й ту ж програму між кількома користувачами і при цьому зберігати в пам'яті тільки одну копію програми, що було неможливо в першій схемі. Коли працює програма 1, чотири регістри розташовані так, як показано стрілками на рис. 1.9, б зліва. При роботі програми 2 вони розташовуються так, як показано стрілками на малюнку справа. На самому справі існують набагато більш складні диспетчери пам'яті, ми вивчимо їх пізніше в цій книзі. А зараз потрібно запам'ятати, що управління диспетчером

пам'яті повинно бути функцією операційної системи, так як немає впевненості,

що користувач зробить це коректно.

На характеристики пам'яті в основному впливають два аспекти. По-перше, кеш приховує відносно низьку швидкість пам'яті. Після того як програма

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

швидкість. Однак коли операційна система перемикається від однієї програми до

інший, кеш залишається заповненим даними першої програми, а необхідні

рядки нової програми повинні завантажуватися вже з фізичної пам'яті. Така

операція може стати головною причиною зниження продуктивності, якщо вона

відбувається занадто часто.

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

Мораль цієї історії така: Переключення від однієї програми до іншої, називається

зване перемиканням контексту, дуже дорого.