Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

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

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

Лабораторните работи по темата можете да намерите тук:

Други части:

Можете също да разгледате канала ми на телеграма =)

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

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

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

Абстракция: процес

Абстракцията на работеща програма, изпълнявана от операционната система, е това, което наричаме процес. Както бе споменато по-рано, процесът е просто работеща програма във всеки моментен период от време. Програма, с която можем да получим обобщена информация от различни системни ресурси, до които тази програма има достъп или върху които влияе по време на нейното изпълнение.
За да разберете компонентите на процеса, трябва да разберете състоянията на системата: какво програмата може да чете или променя по време на своята работа. Във всеки един момент трябва да разберете кои елементи от системата са важни за изпълнението на програмата.
Един от очевидните елементи на състоянието на системата, който процесът включва, е память. Инструкциите се намират в паметта. Данните, които програмата чете или записва, също се намират в паметта. По този начин паметта, която процесът може да адресира (наречена адресно пространство), е част от процеса.
Също така част от състоянието на системата са регистрите. Много инструкции са насочени към промяна на стойността на регистрите или четене на тяхната стойност и по този начин регистрите също стават важна част от работата на процеса.
Трябва да се отбележи, че състоянието на машината също се формира от някои специални регистри. Например, IP - указател на инструкция — указател към инструкцията, която програмата изпълнява в момента. Има и указател на стека и свързани с него указател на рамката, които се използват за управление на: функционални параметри, локални променливи и адреси за връщане.
И накрая, програмите често имат достъп до ROM (памет само за четене). Тази информация за „I/O“ (вход/изход) трябва да включва списък с файлове, отворени в момента от процеса.

API за процеси

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

Създаване на (създаване): ОС трябва да включва някакъв метод, който ви позволява да създавате нови процеси. Когато въведете команда в терминала или стартирате приложение чрез двукратно щракване върху икона, се изпраща извикване към операционната система за създаване на нов процес и след това стартиране на определената програма.
Отстраняване: Тъй като има интерфейс за създаване на процес, операционната система също трябва да предоставя възможност за принудително премахване на процес. Повечето програми естествено ще стартират и завършват сами, докато работят. В противен случай потребителят би искал да може да ги убие и по този начин би бил полезен интерфейс за спиране на процеса.
Чакам (изчакване): Понякога е полезно да изчакате даден процес да завърши, така че са предоставени някои интерфейси, които предоставят възможност за изчакване.
Разни контроли (различен контрол): В допълнение към убиването и изчакването на процеса, има и други различни методи за контрол. Например повечето операционни системи предоставят възможност за замразяване на процес (спиране на изпълнението му за определен период) и след това възобновяване (продължаване на изпълнението)
Статус (състояние): Има различни интерфейси за получаване на информация за състоянието на даден процес, като например колко време работи или в какво състояние се намира в момента.

Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

Създаване на процес: Подробности

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

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

След като кодът и статичните данни се заредят в паметта на ОС, има още няколко неща, които трябва да се направят, преди процесът да може да се изпълнява. Трябва да се разпредели известно количество памет за стека. Програмите използват стека за локални променливи, функционални параметри и адреси за връщане. ОС разпределя тази памет и я предоставя на процеса. Стекът може също да бъде разпределен с някои аргументи, по-специално той запълва параметрите на функцията main(), например с масив от argc и argv.

Операционната система може също така да разпредели малко памет към стека на програмата. Купчината се използва от програми за изрично изискване на динамично разпределени данни. Програмите изискват това пространство чрез извикване на функцията malloc () и го изчиства изрично чрез извикване на функцията Безплатно(). Купчината е необходима за структури от данни като свързани листове, хеш таблици, дървета и други. Първоначално малко количество памет се разпределя за купчината, но с течение на времето, докато програмата работи, купчината може да поиска повече памет чрез извикването на API на библиотеката malloc(). Операционната система участва в процеса на разпределяне на повече памет, за да удовлетвори тези повиквания.

Операционната система също ще изпълнява задачи за инициализация, особено тези, свързани с I/O. Например в UNIX системи всеки процес по подразбиране има 3 отворени файлови дескриптора за стандартен вход, изход и грешка. Тези манипулатори позволяват на програмите да четат вход от терминала, както и да показват информация на екрана.

По този начин, чрез зареждане на код и статични данни в паметта, създаване и инициализиране на стека и извършване на друга работа, свързана с изпълнението на I/O задачи, ОС подготвя сцената за изпълнение на процеса. И накрая, остава една последна задача: стартиране на програмата през нейната входна точка, наречена функция main(). Чрез изпълнение на функцията main(), ОС прехвърля контрола на процесора към новосъздадения процес, като по този начин програмата започва да се изпълнява.

Състояние на процеса

Сега, след като имаме известно разбиране за това какво е процес и как се създава, нека изброим състоянията на процеса, в които може да бъде. В най-простата си форма процесът може да бъде в едно от следните състояния:
Работещи. Когато се изпълнява, процесът се изпълнява на процесора. Това означава, че инструкциите се изпълняват.
Готов. В състояние на готовност процесът е готов за изпълнение, но по някаква причина операционната система не го изпълнява в определеното време.
блокиран. В блокирано състояние процесът изпълнява някои операции, които му пречат да бъде готов за изпълнение, докато не настъпи някакво събитие. Един често срещан пример е, когато процес инициира IO операция, той се блокира, така че друг процес да може да използва процесора.

Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

Можете да си представите тези състояния под формата на графика. Както виждаме на снимката, състоянието на процеса може да се променя между РАБОТЕЩ и ГОТОВ по преценка на ОС. Когато състоянието на процес се промени от ГОТОВ на РАБОТЕЩ, това означава, че процесът е планиран. В обратната посока - премахнати от оформлението. В момента, в който даден процес стане БЛОКИРАН, например, инициирам IO операция, ОС ще го запази в това състояние, докато не настъпи някакво събитие, например завършване на IO. в този момент преминаването в състояние READY и евентуално веднага в състояние RUNNING, ако ОС реши така.
Нека да разгледаме пример за това как два процеса преминават през тези състояния. Като начало нека си представим, че и двата процеса работят и всеки използва само процесора. В този случай техните състояния ще изглеждат така.

Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

В следващия пример, първият процес, след като работи известно време, иска IO и влиза в състояние БЛОКИРАН, което позволява на друг процес да работи (ФИГУРА 1.4). ОС вижда, че процес 0 не използва процесора и стартира процес 1. Докато процес 1 работи, IO е завършен и статусът на процес 0 се променя на ГОТОВ. Накрая процес 1 е завършен и след завършване процес 0 стартира, изпълнява и завършва работата си.

Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

Структура на данни

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

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

Освен готови, блокирани, работещи състояния, има някои други състояния. Понякога по време на създаването процесът може да е в състояние INIT. И накрая, даден процес може да бъде поставен в състояние FINAL, когато вече е завършен, но информацията му все още не е изчистена. В UNIX системи това състояние се извиква процес на зомбиране. Това състояние е полезно за случаите, когато родителски процес иска да знае кода за връщане на дете, например обикновено 0 сигнализира за успех и 1 за грешка, но програмистите могат да издават допълнителни изходни кодове, за да сигнализират за различни проблеми. Когато родителският процес се прекрати, той прави последно системно извикване, като wait(), за да изчака дъщерния процес да приключи и да сигнализира на операционната система, че може да изчисти всички данни, свързани с прекратения процес.

Операционни системи: Три лесни части. Част 2: Абстракция: Процес (превод)

Ключови моменти от лекцията:

процес — основната абстракция на работеща програма в ОС. Във всеки даден момент процесът може да бъде описан чрез неговото състояние: съдържанието на паметта в неговото адресно пространство, съдържанието на регистрите на процесора, включително указател на инструкции и указател на стека, и IO информация, като отворени файлове, които се четат или записват.
API за процеси се състои от извиквания, които програмите могат да правят към процеси. Обикновено това са създаване, изтриване или други повиквания.
● Процесът е в едно от многото състояния, включително работещ, готов, блокиран. Различни събития като планиране, изключения от планиране или изчакване могат да променят състоянието на процес от едно в друго.
Списък с процеси съдържа информация за всички процеси в системата. Всеки запис в него се нарича контролен блок на процеса, който всъщност е структура, която съдържа цялата необходима информация за конкретен процес. 

Източник: www.habr.com

Добавяне на нов коментар