Глава 1: Въведение и Архитектурни Модели

1.1 Дефиниция, архитектурни модели и ролята на Операционната система (ОС) като абстракция

Какво е операционна система? Това е главният диригент на вашия компютър, който управлява всичките му части (хардуера) и позволява на програмите (софтуера) да работят.

Представете си, че вашият компютър или лаптоп с операционна система е като една много голяма, модерна сграда. А операционната система (ОС) е главният управител, който контролира всичко вътре. Без този управител, сградата е просто купчина тухли и жици (хардуер).

Операционната система е най-важният софтуер, който кара компютъра да работи. Тя е тази, която посредничи между вас (потребителя) и сложните електронни части.

Какво точно прави Операционната Система?

Операционните системи имат четири основни задачи, които ги превръщат в мозъка на машината:

1. Управител на Ресурсите

Компютърът има ограничен брой скъпи ресурси. ОС решава как да ги раздаде на програмите:

2. Преводач

Хардуерът на компютъра работи с електрически сигнали, нули и единици. За да може един човек да работи с компютъра, той трябва да бъде „опитомен“.

Операционната система действа като преводач и дизайнер на потребителско изживяване:

3. Пазач (Следи за Ред и Сигурност)

Една от най-важните функции на операционната система е да предпазва компютъра от повреди, които могат да бъдат причинени от лоши програми или от други потребители.

4. Арбитър (Решава споровете)

Тъй като операционната система управлява всички ресурси (като принтер, уебкамера или място на диска), често се случва две или повече програми да искат да ги използват по едно и също време.

По този начин ОС гарантира, че работата се върши последователно и без грешки, вместо да се объркат данните, опитвайки се да печатат едновременно.

Тази функция поддържа реда и гарантира, че всяка програма получава нужния ѝ ресурс, когато ѝ дойде редът.

Как е Устроена Операционната Система (Архитектурата)

Това е начинът, по който е изграден „Управителният екип“ на сградата:

  1. Монолитна Архитектура (Един Голям Екип): Представете си, че всички от управителния екип (охрана, чистачи, счетоводители, технически персонал) работят в една стая, под един покрив. Това е Монолитна архитектура (като операционна система Linux).
    • Плюс: Много са бързи, защото си говорят директно.
    • Минус: Ако един човек направи грешка, цялата сграда спира (системата забива).
  2. Микроядро (Малък Основен Екип): Тук само най-важните хора остават в основната стая (Ядрото). Всички други (драйвери) работят като външни изпълнители.
    • Плюс: Ако външен изпълнител (драйвер) сбърка, това не спира основния екип. Системата е много по-стабилна.
    • Минус: Отнема повече време да се изпрати съобщение от основния екип до външния изпълнител, така че е малко по-бавно.
  3. Хибридна (Смесен Екип): Повечето съвременни операционни системи (като операционна система Windows 11 и операционна система macOS) използват този модел. Те слагат най-важните и бързи задачи в основната стая, а по-рисковите – извън нея. Това е опит да се комбинира бързината на монолитния модел с надеждността на микроядрото.

Защитен Режим: Защо не можете да счупите всичко

За да се гарантира, че една счупена програма не може да повреди самата операционна система, процесорът работи в два режима:

  1. Потребителски Режим: Всички ваши програми (Word, игри) работят тук. Те имат ограничени права. Ако Word забие, той не може да повреди системните файлове.
  2. Ядрен Режим (Привилегирован): Само операционната система работи тук. Тя има пълни права да прави всичко.

Преминаването от Потребителски към Ядрен режим е строго контролирано (нарича се Системно повикване). Това е като да вдигнете слушалката и да се обадите на „Управителя“ с молба. Само той може да изпълни опасните команди.

Видове Операционни Системи

Управителите са различни според сградата:

Разбирането на тези основни понятия ни помага да видим, че всяка компютърна операционна система е сложен, но брилянтен диригент на хардуера.

1.2 Историческа еволюция: От пакетна обработка до съвременни разпределени системи

За да разберем защо съвременни операционни системи като операционна система Windows 11 или операционна система iOS са толкова умни, трябва да видим как са се развивали през годините. Всяко поколение операционни системи е отговаряло на нуждите на своето време.

Поколение 1: Ерата на Вакуумните Лампи (1945 – 1955)

В началото на компютрите, операционна система на практика е нямало.

Ерата на Вакуумните Лампи - Наръчник за Операционни системи от Advance Academy

Поколение 2: Ерата на Транзисторите и Пакетната Обработка (1955 – 1965)

Появяват се транзисторите, които правят компютрите по-малки и по-надеждни. Тук се ражда първата операционна система в истинския смисъл на думата.

Ерата на Транзисторите и Пакетната Обработка - Наръчник за Операционни системи от Advance Academy

Поколение 3: Ерата на Интегралните Схеми и Мултипрограмирането (1965 – 1980)

С появата на интегралните схеми мощността на компютрите скача рязко. Този период въвежда две ключови иновации, които са в основата на днешните операционни системи:

  1. Мултипрограмиране (Multiprogramming)
    • Какво е: Идеята да се държат няколко задачи (програми) едновременно заредени в паметта (RAM).
    • Защо: Процесорът е много бърз, но I/O устройствата (като четене от диск или печат) са много бавни. Когато една програма чака за бавно I/O устройство, Операционната система веднага превключва процесора на следващата заредена програма, която е готова да работи.
    • Резултат: Процесорът работи почти 100% от времето. Това е огромно увеличение на ефективността и прави многозадачността възможна.
  2. Споделяне на Времето (Time-Sharing)
    • Въвеждане на Многопотребителски Режим: Системата се разделя на части за многопотребителски операционни системи, където множество хора могат да работят на един и същи голям компютър (т.нар. Mainframe операционни системи) едновременно, от различни терминали.
    • UNIX: През този период е създадена и операционна система UNIX, която става основа на много UNIX базирани операционни системи като Linux и macOS. UNIX въвежда концепциите за файлова система и обвивка (Shell), които ползваме и до днес.
    • Резултат: Процесорът работи почти 100% от времето. Това е огромно увеличение на ефективността и прави многозадачността възможна.
Ерата на Интегралните Схеми и Мултипрограмирането - Наръчник за Операционни системи от Advance Academy

Поколение 4: Ерата на Персоналните Компютри (PC) и Мрежите (1980 – 2000)

С изобретяването на микропроцесора компютрите стават достатъчно малки и евтини за лична употреба. Това ражда персоналните компютри (PC) и променя фокуса на операционните системи.

Ерата на Персоналните Компютри (PC) и Мрежите - Наръчник за Операционни системи от Advance Academy

Поколение 5: Ерата на Мобилността и Облака (2000 – Днес)

Това е ерата на съвременните операционни системи, в която фокусът се измества от единствено настолния компютър към свързаността и мобилността.

Ерата на Мобилността и Облака - Наръчник за Операционни системи от Advance Academy

Всяка стъпка в историята на операционните системи е била движена от желанието да се извлече повече работа от хардуера и да се направи компютърът по-лесен за употреба от повече хора. Днешните операционни системи са кулминацията на всички тези иновации, съчетавайки висока ефективност (многозадачност) с лесен графичен контрол.

1.3 Типове ОС и техните приложни сценарии

Вече разбрахме, че операционната система (ОС) е главният управител на компютъра. Но както една сграда може да бъде офис, магазин или болница, така и ОС се различават според това, какво трябва да управляват и къде се намират. Не може да сложите ОС от огромен сървър в един смартфон.

Тук ще разгледаме видовете операционни системи според тяхното предназначение и ще разберем техните основни разлики.

А. Операционни Системи за Персонални Компютри (Десктоп/Лаптоп)

Това са най-използваните операционни системи от крайния потребител. Тяхната основна цел е да осигурят лесен графичен достъп и да работят добре с широк набор от приложен софтуер (игри, офис програми).

Тип Примери Основни цели и фокус
Windows OS Windows 11, Windows 10 Максимална съвместимост с хардуер и софтуер. Фокус върху лесен графичен интерфейс (GUI) и поддръжка на игри.
macOS Mac OS (Monterey, Sonoma) Интеграция между софтуер и хардуер (само за Apple устройства). Фокус върху графичен дизайн, мултимедия и потребителско изживяване.
Linux ОС Linux (Ubuntu, Fedora) Сигурност, стабилност и отворен код. Изключително гъвкава и предпочитана от разработчици и технически потребители.

Ключови характеристики на Десктоп ОС:

  1. Графичен Интерфейс (GUI): Всички те използват GUI, което позволява работа с прозорци, икони и мишка, за разлика от старите операционни системи с текстов интерфейс.
  2. Многозадачност и Еднопотребителски Фокус: Те са силно оптимизирани за многозадачност (да работят Word, браузърът и музиката едновременно), но обикновено са проектирани за еднопотребителски режим, въпреки че могат да поддържат различни акаунти.

Б. Мобилни Операционни Системи

Те са проектирани специално за операционни системи за мобилни устройствасмартфони и таблети. Тези ОС се различават драстично от десктоп ОС поради две основни причини: ограничена батерия и сензорен екран.

Тип Примери Основни цели и фокус
Android ОС Операционна система Android Отворен код и голяма гъвкавост. Контролира най-разпространени операционни системи за мобилни устройства.
iOS ОС Операционна система на Айфон Строга сигурност, висока производителност и пълна интеграция с Apple екосистемата.
Алтернативни Операционна система Tizen Вградени системи (за Samsung телевизори/часовници) или по-малки пазарни ниши.

Специфика на Мобилните ОС:

В. Сървърни Операционни Системи

Тези операционни системи за сървъри не се фокусират върху графики и игри, а върху стабилност, сигурност и мрежови услуги. Те работят 24 часа в денонощието, 7 дни в седмицата.

Тип Примери Основни цели и фокус
Linux/UNIX Red Hat, Ubuntu Server, Debian Изключителна стабилност, висока производителност за мрежови услуги и уеб сървъри.
Windows Server Windows Server (2019, 2022) Лесна интеграция в мрежи, които вече използват Windows, и управление на домейни (Active Directory).

Ключови характеристики на Сървърни ОС:

Г. Вградени (Embedded) и Време-реални ОС

Тези видове операционни системи са скрити и работят на специализирани устройства.

  1. Вградени Операционни Системи:Те са навсякъде около нас – в автомобилите, микровълновите печки, банкоматите.
    • Примери:Операционни системи за телевизори (като VIDAA или Tizen), системи в колите.
    • Специфика:Малък размер, ниска консумация на ресурси и са тясно специализирани – правят едно-две неща, но ги правят много добре.
  2. Време-реални Операционни Системи (RTOS)Това са най-критичните ОС, използвани в медицината, индустриалното управление, роботиката и самолетите.
    • Специфика:Времето е всичко. Те трябва да изпълнят дадена задача в строго определен, кратък срок. Ако времето бъде пропуснато, това може да доведе до катастрофа (напр. спирачките в автомобил).
    • Детерминизъм:Те гарантират, че дадена операция ще отнеме точно определено време, а не приблизително време.

Д. Специализирани и Нови Концепции

Изборът на коя операционна система е най-добра зависи изцяло от задачата. Няма универсална ОС. Разбирането на тези видове операционни системи е от ключово значение, защото дизайнът на всяка (как управлява паметта, процесора и сигурността) е пряко подчинен на нейната основна цел – било то скорост за сървъра, живот на батерията за мобилни операционни системи или бърза реакция за RTOS.

Глава 2: Основни Компоненти и Интерфейси

2.1 Детайлен анализ на Ядрото (Kernel)

Ако операционната система (ОС) е главният управител на компютъра, то Ядрото (Kernel) е нейният Сърдечен ритъм и Главният мозък. Това е най-важната част от всяка компютърна операционна система – тя е единственият софтуер, който има пълен контрол върху хардуера. Ядрото се зарежда в паметта веднага след стартирането на компютъра и остава там до неговото изключване.

Основни Функции: Какво Прави Ядрото?

Ядрото е отговорно за всички основни дейности, които правят една операционна система функционална.

1. Управление на Процеси и Планиране

Ядрото контролира стартирането, изпълнението и спирането на всички програми (процеси). То е „ръководителят“, който дава работа на Процесора (CPU).

2. Управление на Паметта

Ядрото е пазачът на Паметта RAM.

3. Управление на Вход/Изход (I/O)

Ядрото е единственото, което директно общува с всички устройства.

Двойният Режим: Ключът към Защитата на Ядрото

Най-важният принцип, който защитава ядрото, е Двойният Режим на Работа на процесора, който вече споменахме.

  1. Ядрен/Привилегирован Режим (Kernel Mode):Това е режимът, в който работи само Ядрото. То има пълни права да изпълнява всяка команда на процесора и да достъпва всички ресурси (I/O, памет).
  2. Потребителски Режим (User Mode):Всички приложни програми (браузър, игри, Word) работят в този режим. Те имат ограничени права и не могат да изпълняват опасни команди, които биха спрели или повредили операционната система.

Как се преминава: Приложните програми могат да поискат услуга от ядрото (напр. „Запиши този файл“), но не могат да действат сами. Те го правят чрез Системни Повиквания (System Calls). Повикването кара процесора да превключи от Потребителски към Ядрен режим, за да може Ядрото да изпълни командата безопасно, след което веднага се връща обратно в Потребителски режим.

Архитектура на Ядрото: Монолитна срещу Микроядро

Начинът, по който Ядрото е изградено, определя колко е бърза, стабилна и сигурна цялата операционна система.

  1. Монолитно Ядро (Monolithic Kernel)
    • Устройство:Всички основни функции (управление на памет, файлове, процеси и Драйвери на устройства) са събрани в един голям код и работят в един общ защитен блок (Ядрения режим).
    • Пример: Операционна система Linux.
    • Предимства:Много бърза комуникация между компонентите (просто извикване на функция).
    • Недостатъци:Ако един драйвер вътре в ядрото сбърка, това може да срине цялата операционна система. Трудно се поддържа и актуализира.
  2. Микроядро (Microkernel)
    • Устройство:Ядрото е сведено до абсолютния минимум. То управлява само най-основните неща: комуникацията между процесите и превключването на процесора. Всички останали функции (файлови системи, драйвери) се изпълняват като обикновени програми в Потребителски режим.
    • Пример:Mach (основа на по-стари версии на операционна система macOS).
    • Предимства:Изключителна стабилност и сигурност. Ако драйверът на принтера се счупи, ядрото (и останалата част от системата) продължава да работи.
    • Недостатъци: По-бавно е, защото всяка комуникация между компонентите изисква „пътуване“ извън ядрото, което отнема време.
  3. Хибридно Ядро
    • Устройство:Това е смесица (като при операционна система Windows 11 и macOS). Критичните, но бавни функции (като мрежовия код или файловата система) се връщат в ядрото, за да ускорят работата, докато по-рисковите драйвери могат да бъдат изолирани.
    • Предимства:Предлага баланс между висока производителност и добра стабилност.

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

2.2 Обвивка (Shell), потребителски интерфейс и комуникация

Обвивката (Shell) е ключовият софтуерен компонент на всяка операционна система (ОС), който позволява на потребителя да комуникира с нея. Обвивката стои като външен слой над Ядрото и служи като преводач, като взема командите от потребителя и ги предава на Ядрото за изпълнение.

Без Обвивката, единственият начин да се работи с операционната система би бил чрез писане на сложен код.

1. Потребителски Интерфейс: два основни вида

Потребителският интерфейс е това, което определя начина, по който изглежда и се управлява операционната система. Различаваме два основни вида операционни системи според интерфейса:

А. Графичен Потребителски Интерфейс (GUI)

Б. Интерфейс с Команден Ред (CLI)

2. Обвишката (Shell) като Изпълнител на Команди

Независимо от вида на интерфейса, Обвивката изпълнява ролята на изпълнител на потребителските заявки:

И в двата случая, Обвивката превежда потребителското желание в език, който Ядрото разбира. Тя не изпълнява сама задачите, а посредничи.

3. Механизъм на Комуникация: Системни Повиквания

Цялата комуникация между софтуера (Обвивката или всяко приложно приложение) и Ядрото се осъществява чрез Системни Повиквания (System Calls).

Системното повикване е единственият стандартизиран и безопасен начин програмите да поискат услуга от Ядрото. Тази услуга може да бъде:

Значението на Контролирания Достъп

Това е ключова функция за сигурност в операционните системи. Всяка програма работи в Потребителски Режим с ограничени права. Когато програмата се нуждае от достъп до хардуер, тя:

  1. Генерира Системно повикване (молба).
  2. Процесорът временно превключва в Ядрен Режим (където Ядрото има пълни права).
  3. Ядрото изпълнява командата безопасно.
  4. Процесорът връща контрола обратно на програмата в Потребителски Режим.

Този строг портал гарантира, че грешка в една приложна програма няма да може да достигне и да повреди критичната част на операционната система – нейното Ядро.

4. Връзка с Видовете ОС

Типът на Обвивката и интерфейса е пряко свързан с видовете операционни системи:

В заключение, Обвивката и потребителският интерфейс са видимата част на операционната система, която прави взаимодействието възможно, докато Системните повиквания са невидимият, но строго контролиран механизъм, който позволява на приложенията да поискат и получат услуги от Ядрото.

2.3 Проектиране и имплементация на Файловата система

Представете си, че твърдият диск на вашия компютър е огромна празна библиотека, пълна с милиони рафтове (блокове памет), но без етикети и без каталог. Файловата система (ФС) е системата за управление на тази библиотека – тя решава как да се организират и намират книгите (файловете), за да не настъпи пълен хаос.

1. Основни Концепции: Файлове, Директории и Разделяне

Файловата система има три основни елемента, които са видими за потребителя:

2. Защо е Нужна Файловата Система?

Твърдият диск (HDD, SSD) съхранява данни в блокове (малки, еднакви по размер парчета). Ядрото на операционната система може да чете или записва данни само на ниво блок. Файловата система решава два критични проблема:

3. Основни Задачи на Файловата Система (Как Работи)

Когато операционната система трябва да прочете файл, ФС изпълнява следните стъпки:

А. Управление на Пространството

ФС трябва да поддържа точна информация за свободните и заетите блокове на диска.

Б. Определяне на Структурата (Как се Намират Данните)

ФС използва различни методи, за да свърже името на файла с физическите му блокове на диска:

4. Примери за Файлови Системи

Различните видове операционни системи използват различни ФС:

5. Дефрагментация: Подреждане на Библиотеката

Когато един файл се изтрие, той оставя дупка (свободни блокове) на диска. Когато запишете нов, по-голям файл, операционната система трябва да го раздели на много парчета (блокове), за да запълни всички налични дупки. Този процес се нарича фрагментация.

Файловата система е критичният мост между човешкото разбиране за „документ“ и чисто физическото, хаотично съхранение на данни върху хардуера. Тя е отговорна за реда, бързината и сигурността на всички данни на операционната система.

Глава 3: Управление на Процеси и Планиране

3.1 Концепция за процес, структура и състояния

След като разбрахме, че Ядрото е главният управител, сега ще видим какво точно управлява. Основната единица работа, която операционната система разпределя, контролира и защитава, е Процесът.

1. Концепция за Процес: Програма в Действие

Често хората бъркат Програма с Процес. Разликата е съществена:

Разширена Аналогия: Програмата е рецептата за торта, написана на хартия. Процесът е самото готвене – включва готвача (Процесора), съдовете (разпределената памет RAM), кухненските прибори (отворените файлове) и самото действие. Можете да имате една рецепта (програма), но да я стартирате два пъти, което създава два различни процеса, работещи едновременно.

Следователно, Процесът е една самостоятелна, изпълняваща се инстанция на програма, която изисква ресурси, за да работи.

Блок за Контрол на Процеса (PCB)

Ядрото на операционната система управлява всички тези процеси чрез специален запис, наречен Блок за Контрол на Процеса (PCB - Process Control Block). PCB е личната карта или досието на процеса и съдържа цялата критична информация, необходима на ОС, за да превключва между задачите:

2. Структура на Процеса: Адресно Пространство

Когато операционната система стартира една програма като процес, тя създава за него Адресно Пространство в паметта (RAM) – защитена зона, която е организирана в четири основни логически секции. Това разпределение осигурява изолация и функции за сигурност на процеса.

А. Текстова Секция (Code Segment)

Това е самата програма – статичните инструкции, които трябва да се изпълнят. Този код обикновено е само за четене (Read-Only) и не се променя по време на изпълнение на процеса.

Пример: Всяка функция или метод на програмата се намира тук.

Б. Секция Данни (Data Segment)

Тази секция съдържа глобалните променливи и статичните променливи, които са дефинирани в програмата. Данните в тази секция се зареждат заедно с процеса и се променят по време на неговото изпълнение.

В. Хийп (Heap)

Хийп-ът е частта от паметта, която се използва за динамично разпределяне на паметта (dynamic allocation). Когато една програма трябва да създаде обект или структура с данни, чийто размер не е известен предварително или е твърде голям, тя иска място в Хийп-а. Този сегмент расте нагоре (към по-високи адреси) с течение на времето.

Пример:Създаване на голям масив от данни по време на работа на програмата.

Г. Стек (Stack)

Стек-ът се използва за временно съхранение на данни, свързани с изпълнението на функциите – това включва локални променливи и адреси за връщане от функциите. Всеки път, когато една функция се извика, тя добавя информация в Стека; когато функцията приключи, информацията се премахва. Този сегмент расте надолу (към по-ниски адреси).

Ключово Разграничение: Разграничението между Стек и Хийп е ключово. Те растат от противоположни краища на адресното пространство и се срещат по средата. Ако се срещнат, това означава, че процесът е изчерпал наличната си Виртуална памет (Stack Overflow или Heap Exhaustion).

3. Състояния на Процеса: Жизненият Цикъл

Един процес не работи непрекъснато, тъй като операционната система трябва да обслужва хиляди процеси. Той преминава през различни състояния в зависимост от това, какво прави и как Ядрото управлява Планирането му. Всеки процес може да бъде в едно от следните пет основни състояния:

А. Състояние „Нов“ (New)

Процесът е във фаза на създаване. Операционната система проверява необходимите ресурси, зарежда кода му от твърдия диск в паметта и му разпределя необходимите структури, включително PCB.

Б. Състояние „Готов“ (Ready)

Процесът е зареден в паметта, има всички необходими ресурси (памет, отворени файлове) и е готов да бъде изпълнен. Той чака единствено своя ред, за да получи достъп до Процесора (CPU). Всяка операционна система поддържа опашка (queue) от всички процеси, които са в състояние „Готов“.

В. Състояние „Изпълнява се“ (Running)

Това е единственото състояние, в което инструкциите на процеса реално се изпълняват от Процесора. В мултипроцесорна система може да има толкова процеси в това състояние, колкото логически ядра има процесорът (едно на ядро).

Г. Състояние „Изчакване/Блокиран“ (Waiting/Blocked)

Процесът е спрял временно, защото чака да се случи нещо външно (което не е свързано с CPU), обикновено бавна I/O операция. Примери:

Д. Състояние „Приключил“(Terminated)

Процесът е завършил изпълнението си (нормално или с грешка/убийство). Ядрото на операционната система извършва почистване, освобождавайки всички ресурси (памет, файлови дескриптори и др.), които са били разпределени за него.

Преходите между състоянията (Управлението на Ядрото):

  1. Нов → Готов:Приемане на процеса в системата.
  2. Готов → Изпълнява се:Планировчикът на Ядрото го избира за изпълнение (Dispatch).
  3. Изпълнява се → Готов:Изтича му времевият „квант“ (отрязък от време, определен от ОС) и трябва да отстъпи място на друг процес. Това е в основата на многозадачността.
  4. Изпълнява се → Блокиран:Процесът започва да чака I/O операция (само по негово желание).
  5. Блокиран → Готов:I/O операцията приключва и той е готов да продължи (вече не чака).
  6. Изпълнява се → Приключил:Процесът завършва своята работа.

Разбирането на тези състояния е в основата на Управлението на процеси – основната задача на всяка операционна система – да жонглира с хиляди процеси, за да създаде илюзията, че всички работят едновременно без забавяне. Това гарантира справедливост и ефективно използване на CPU.

3.2 Алгоритми за планиране на процесора (CPU Scheduling)

След като разбрахме, че процесът е основната работна единица и той преминава през различни състояния („Готов“, „Изпълнява се“), сега трябва да видим как Ядрото решава кой процес да изпълни следващ. Тази задача се нарича Планиране на Процесора (CPU Scheduling).

Планировчикът (Scheduler) е част от Ядрото на операционната система, която действа като пътен полицай. Той контролира кой процес да влезе в Процесора и за колко време, за да се постигне ефективна многозадачност.

1. Критерии за Добро Планиране: Целите на ОС

Целта на Планирането не е просто да се изпълняват процеси, а да се оптимизира работата на цялата операционна система. Добрият алгоритъм трябва да балансира следните критерии:

Критерий Описание Защо е важен?
Използване на CPU (CPU Utilization) Максимизиране на времето, през което Процесорът работи. Да не стои Процесорът без работа.
Пропускателна Способност (Throughput) Броят на процесите, които завършват за единица време. По-голям брой завършени задачи.
Време за Обръщане (Turnaround Time) Общото време от стартирането до завършването на процеса (включва I/O и чакане). Минимизиране на времето, което потребителят чака за резултат.
Време за Чакане (Waiting Time) Времето, през което процесът е бил в опашката „Готов“. Минимизиране на „загубеното“ време на процеса.
Време за Отговор (Response Time) Времето от заявката до първия отговор (първата реакция) на ОС. Критично за интерактивни операционни системи (например, кликване с мишката).

2. Видове Планиране: Прекъсване или Изчакване

Планиращите алгоритми се делят на два основни типа според това дали могат да прекъснат текущия процес:

А. Не-прекъсващо Планиране (Non-Preemptive)

Веднъж щом един процес започне да работи на Процесора, той не може да бъде прекъснат, докато сам не приключи или не влезе в състояние „Изчакване“ (поради I/O заявка).

Б. Прекъсващо Планиране (Preemptive)

Ядрото може принудително да спре (прекъсне) текущо изпълняващия се процес и да даде Процесора на друг, по-важен или по-дълго чакащ процес.

3. Основни Алгоритми за Планиране на Процесора

Различните видове операционни системи използват различни алгоритми, за да постигнат конкретните си цели.

А. FCFS (First-Come, First-Served) – Първият Обслужен

Ядрото може принудително да спре (прекъсне) текущо изпълняващия се процес и да даде Процесора на друг, по-важен или по-дълго чакащ процес.

Б. SJF (Shortest Job First) – Най-късата Задача Първа

Ядрото може принудително да спре (прекъсне) текущо изпълняващия се процес и да даде Процесора на друг, по-важен или по-дълго чакащ процес.

В. Приоритетно Планиране (Priority Scheduling)

Г. Round Robin (RR) – Кръгово Обслужване

Д. Многостепенна Опашка за Обратна Връзка (Multilevel Feedback Queue - MLFQ)

3.3 Многозадачност, Нишки (Threads) и Синхронизация

За да бъде една операционна система ефективна и да поддържа интерактивна работа (например, да слушате музика, докато пишете в Word), тя трябва да използва Многозадачност. Това е ключът към съвременни операционни системи.

1. Концепция за Многозадачност

Многозадачността (Multitasking) е способността на операционната система да изпълнява привидно едновременно множество процеси (задачи) на един Процесор (CPU).

Два Вида Многозадачност:

  1. Кооперативна Многозадачност (Cooperative Multitasking):По-стара концепция (използвана в ранните версии на macOS и Windows 3.x). Процесът сам решава кога да освободи Процесора.
    • Проблем:Един бъгав или „заял“ процес може да откаже да освободи CPU и да блокира цялата операционна система.
  2. Принудителна Многозадачност (Preemptive Multitasking):Това е стандартът в съвременни операционни системи (Windows, Linux, macOS). Ядрото е това, което принудително прекъсва процеса, когато му изтече времевият квант. Това гарантира, че никой процес не може да монополизира Процесора, като осигурява стабилност и справедливост.

2. Нишки (Threads): Леки Процеси

Докато Процесът е напълно независима програма със собствено Адресно Пространство (памет), Нишката (Thread) е единица изпълнение в рамките на един процес.

Характеристика Процес (Process) Нишка (Thread)
Същност Независима програма. Единица изпълнение в рамките на процес.
Адресно Пространство Не споделя (Има собствено). Споделяс другите нишки в същия процес.
Комуникация Бавна (чрез съобщения или I/O). Бърза (директен достъп до споделена памет).
Създаване / Превключване Бавно (Изисква повече Контекстно Превключване). Бързо (По-малко разходи, защото паметта не се сменя).

Защо се Използват Нишки?

Нишките са жизненоважни за модерните приложения и операционни системи:

  1. По-добра Отзивчивост (Responsiveness): Ако в браузъра една нишка е заета да зарежда голямо изображение, друга нишка може да обработва кликванията на потребителя, като предотвратява „замръзване“ на програмата.
  2. Използване на Многоядрени Процесори: На многоядрени системи (паралелно изпълнение), различни нишки от един и същи процес могат да работят едновременно на различни ядра на Процесора, като драматично увеличават производителността.

3. Синхронизация: Проблемът с Споделянето

Тъй като нишките (или процесите) могат да споделят едни и същи данни в паметта, възниква огромен проблем: Състезателно Условие (Race Condition).

Аналогия: Две нишки се опитват да увеличат една променлива (брояч) от 10 на 11. Ако и двете нишки прочетат стойност 10 едновременно, увеличат я (до 11) и запишат 11, крайният резултат е 11, вместо очакваното 12. Една от операциите е загубена. За да се предотврати това, операционната система предоставя Механизми за Синхронизация.

Критична Секция и Мутекст

Основната цел на синхронизацията е да се защити Критичната Секция (Critical Section) – частта от кода, която достъпва споделените данни. Трябва да се гарантира, че само една нишка (или процес) може да бъде в тази секция по всяко време.

  1. Мутекст (Mutex - Mutual Exclusion):Мутекстът е най-често използваният инструмент. Той действа като ключ.
    • Преди да влезе в Критичната Секция, нишката трябва да „заключи“ (Lock) мутекса.
    • Ако мутексът вече е заключен, другата нишка трябва да изчака.
    • След като приключи работата със споделените данни, нишката „отключва“ (Unlock) мутекса, освобождавайки пътя за следващата.
  2. Семифор (Semaphore):Семифорът е по-общ инструмент. Вместо да е просто ключ (мутекстът е семифор със стойност 1), семифорът е брояч. Той позволява даден ресурс да бъде използван едновременно от ограничен брой нишки (напр. 5).
    • Когато нишка иска ресурс, тя намалява брояча (операция wait).
    • Когато освобождава ресурса, тя увеличава брояча (операция signal).
    • Ако броячът е нула, нишката трябва да изчака.

Синхронизацията е задължителна за стабилността и надеждността на всяка операционна система и всяко мултитрединг приложение. Тя гарантира, че данните остават в коректно състояние, дори когато се обработват едновременно.

Глава 4: Управление на Паметта

4.1 Разпределяне на физическата памет

Управлението на паметта е втората най-важна задача на Ядрото след управлението на Процесора. Основната цел е ефективно да се използва физическата памет (RAM), като същевременно се гарантира, че всеки процес е изолиран и защитен от другите.

1. Какво Управлява ОС в Паметта?

Физическата памет (RAM) е голям, линеен масив от байтове, всеки от които има свой физически адрес. Когато стартирате операционна система като Windows 11, тя разделя RAM на три основни зони:

  1. Памет за Ядрото (Kernel Space):Тази зона е постоянно заета и съдържа кода на Ядрото и всички критични структури (като PCB). Тя е защитена и достъпът до нея е възможен само в Ядрен Режим.
  2. Памет за Приложенията (User Space): Останалата част от паметта, която операционната система разпределя на приложните процеси (браузъри, игри, офис пакети). Достъпна е само в Потребителски Режим.
  3. Свободна Памет:Блокове, които в момента не се използват и могат да бъдат разпределени.

2. Защита на Паметта: Изолация на Процесите

Защитата на паметта е задължителна функция за сигурност. Ако един процес може да прочете или промени паметта на друг процес или на Ядрото, системата бързо би се сринала или би станала уязвима.

Механизми за Защита:

3. Методи за Разпределяне: Къде да Сложим Процеса?

Когато един процес трябва да се зареди, Ядрото трябва да реши къде в свободната памет да го настани. Основните техники за последователно (contiguous) разпределяне (при които целият процес трябва да е на едно място в RAM) включват:

А. Разпределяне с Фиксирани Дялове (Fixed Partitioning)

Паметта е разделена на фиксиран брой дялове с предварително определен размер.

Б. Разпределяне с Динамични Дялове (Dynamic Partitioning)

Размерът на дяловете се определя динамично според нуждите на процеса.

В. Алгоритми за Избор на Дупка (Hole Allocation)

Когато има повече от една свободна „дупка“ (блокове) в паметта, в която може да се побере процес, Ядрото трябва да избере една:

4. Непоследователно Разпределяне: Сегментация и Страниране

За да се преодолеят проблемите с фрагментацията и да се позволи на програмите да са по-големи от физическата RAM, съвременни операционни системи използват техники за непоследователно (non-contiguous) разпределяне на паметта.

А. Сегментация (Segmentation)

Процесът е разделен на логически части (сегменти), които потребителят вижда (напр. код, данни, стек, подпрограма А). Всеки сегмент може да бъде зареден на различно място в RAM.

Б. Страниране (Paging)

Това е най-важният метод, използван в операционните системи Linux, Windows и macOS. Процесът и физическата памет се разделят на еднакви по размер блокове.

Чрез Страниране един процес може да бъде разпръснат на много непоследователни рамки в RAM, като едновременно с това се поддържа илюзията, че е зареден последователно. Този механизъм е основата на Виртуалната памет, която ще разгледаме по-нататък.

Докато Сегментацията разделя логически (по функции), Странирането разделя физически (на блокове с еднакъв размер), за да избегне фрагментацията. Съвременните операционни системи често комбинират и двете.

4.2 Детайлен механизъм на Виртуалната памет

Виртуалната памет (Virtual Memory) е един от най-големите пробиви в операционните системи. Тя е механизъм, който позволява на програмиста да работи с памет, която изглежда по-голяма от физическата памет (RAM) на компютъра, и която е последователна, въпреки че физически може да е разпръсната.

Виртуалната памет е в основата на съвременните операционни системи като Windows 11, Linux и macOS.

1. Какво е Виртуална Памет и Защо е Нужна?

Виртуалната памет не е допълнителна физическа памет; това е софтуерна илюзия, създадена от Ядрото и поддържана от специален хардуер (MMU).

Основни Цели:

  1. Повече Памет от RAM:Позволява на програмите да използват повече памет, отколкото физически има RAM, като временно прехвърля неактивни части от паметта на твърдия диск (Swap File/Paging File).
  2. Изолация и Защита:Дава на всеки процес собствено, изолирано виртуално адресно пространство (V-RAM), започващо от адрес 0. Това гарантира, че процесът не може да навреди на друг процес или на Ядрото.
  3. Елиминиране на Фрагментацията:Чрез механизма на Страниране (Paging), виртуалната памет елиминира външната фрагментация.

2. Адресно Пространство: Виртуално срещу Физическо

Механизмът се основава на преобразуването на два вида адреси:

Вид Адрес Къде се Използва? Какво Представлява?
Виртуален Адрес (VA) Използва се от програмиста и процеса. Адресът, който програмата смята, че използва. Всеки процес има свой виртуален адрес 0.
Физически Адрес (PA) Използва се от Ядрото и хардуера (RAM). Реалният адрес, на който се намират данните във физическата памет.

Процесът на Преобразуване: Когато един процес се опита да достъпи някакъв виртуален адрес, той задължително трябва да бъде преобразуван във физически адрес, преди Ядрото да може да чете от RAM.

3. Основен Механизъм: Страниране (Paging)

Виртуалната памет работи, като разделя паметта на еднакви, фиксирани по размер части:

Таблица на Страниците (Page Table)

Таблицата на страниците е критична структура, която съхранява Ядрото за всеки процес.

Преобразуване на Адреса (Address Translation)

Преобразуването се извършва от специализиран хардуер – Устройството за Управление на Паметта (MMU – Memory Management Unit).

Виртуален Адрес → MMU → Физически Адрес

  1. Разделяне: MMU разделя виртуалния адрес на две части: Номер на Страницата (Page Number) и Отместване/Офсет (Offset) в рамките на страницата.
  2. Търсене:Използвайки Номер на Страницата, MMU търси в Таблицата на Страниците (която се намира в RAM), Номера на Физическата Рамка.
  3. Комбиниране:MMU замества Номера на Страницата с Номера на Физическата Рамка и комбинира резултата с Отместването. Полученият адрес е Физическият Адрес в RAM.

4. Липсваща Страница (Page Fault)

Ако при търсенето в Таблицата на Страниците MMU види, че страницата не е заредена в RAM (т.е. намира се на диска), възниква т.нар. Липсваща Страница (Page Fault).

  1. Прекъсване: MMU генерира прекъсване към Ядрото.
  2. Обработка: Ядрото приема контрола, намира страницата в Swap File на диска.
  3. Разтоварване (Swap Out): Ако RAM е пълна, Ядрото трябва да избере една неактивна рамка от RAM и да я запише обратно на диска (ако е променена). Това се нарича Алгоритъм за Заместване на Страници (напр. LRU – Най-отдавна Използваната).
  4. Зареждане (Swap In):Ядрото зарежда липсващата страница от диска в освободената рамка.
  5. Актуализация: Ядрото актуализира Таблицата на Страниците с новия Физически Адрес.
  6. Възобновяване:Процесът се възобновява, изпълнявайки отново инструкцията, която е предизвикала Page Fault.

5. Подобрения на Производителността: TLB

Тъй като всяко обръщение към паметта изисква две обръщения към RAM (едно за Таблицата на Страниците и едно за самите данни), производителността би била много ниска. Затова се използва Кеш памет:

Виртуалната памет е гениална комбинация от софтуер (Ядрото) и хардуер (MMU/TLB), която осигурява сигурност, изолация и възможност за изпълнение на големи програми, надхвърлящи размера на наличната RAM.

4.3 Подмяна на страници и разпределяне на страници

След като видяхме, че Виртуалната памет работи, като премества данни между бързата RAM и бавния твърд диск (чрез Страници и Рамки), трябва да разберем как операционната система взема двете най-трудни решения:

  1. Коя страница да изхвърли? (Подмяна на страници).
  2. Колко RAM да дадена всяка програма? (Разпределяне на страници).

1. Подмяна на Страници: Кой си Тръгва от RAM?

Това е ситуацията: дадена програма иска страница, която е на диска (Page Fault), но RAM е пълна. Няма как да се зареди новата страница, без да се извади една стара. Ядрото трябва да избере страница-жертва.

Целта на Избора

Целта на Ядрото е да избере страницата, която е най-малко вероятно да потрябва скоро. Така се намалява броят на Page Faults (т.е. нуждата от четене от бавния диск).

Механизъм на „Разтоварване“ (Swap Out)

Когато Ядрото избере страница-жертва, то прави две проверки преди да я изтрие:

Ключови Алгоритми за Избор на Жертва

  1. FIFO (Първи Влязъл, Първи Излязъл):
    • Аналогия:Избирате да изхвърлите най-старата книга в библиотеката.
    • Принцип:Изважда се страницата, която е била заредена в RAM най-отдавна.
    • Простота:Най-лесен за прилагане, но най-неефективен, защото може да изхвърли важна, но стара страница (напр. основния код на операционната система).
  2. LRU (Най-Отдавна Използваната - Least Recently Used):
    • Аналогия:Избирате да изхвърлите книгата, която никой не е пипал най-дълго време.
    • Принцип:Изважда се страницата, която е имала най-дълъг период без обръщение от процесора.
    • Ефективност:Това е най-логичният и най-ефективен алгоритъм, защото предполага, че миналото предсказва бъдещето.
    • Проблем:Ядрото трябва да проследява точното време на последното обръщение към всяка страница, което изисква много мощен хардуер и е скъпо.
  3. Second Chance / Clock (Втори Шанс / Часовник):
    • Аналогия:Бърз преглед. Питате най-старата книга: "Ползвана ли си скоро?". Ако отговори "Да", оставяте я и питате следващата.
    • Принцип:Модифициран FIFO, който дава „втори шанс“. Използва Референтен Бит (Reference Bit).
      • Ако старата страница има Референтен Бит 1 (използвана е наскоро), той се нулира (0), дава ѝ се втори шанс и тя се премества в края на списъка.
      • Ако битът е 0, тя се изважда веднага.
    • Извод:Това е най-популярният алгоритъм в операционните системи, тъй като е много ефективен, но не изисква скъпия хардуер на LRU.

2. Разпределяне на Страници: Колко RAM да Дадем?

Разпределянето на страници решава колко Рамки (място в RAM) трябва да получи всеки процес.

А. Защо е Важно?

Б. Методи за Разпределяне

  1. Равно Разпределяне (Equal Allocation):
    • Принцип:Всички активни процеси получават еднакъв брой рамки.
    • Пример:Ако има 100 рамки и 10 процеса, всеки получава по 10 рамки, независимо дали е Word или Калкулатор.
    • Недостатък:Неефективно и несправедливо за по-големите програми.
  2. Пропорционално Разпределяне (Proportional Allocation):
    • Принцип:Рамките се разпределят според размера на всеки процес. По-големите програми получават повече рамки.
    • Предимство:По-логичен и справедлив подход, използван в много операционни системи.

В. Глобална срещу Локална Подмяна

Тук Ядрото решава откъде да „открадне“ рамката-жертва:

3. Трашинг (Thrashing): Смъртта на Производителността

Най-големият кошмар в управлението на паметта е Трашингът. Това е процесът, при който операционната система прекарва повече време в преместване на страници между RAM и диска, отколкото в изпълнение на код на Процесора.