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

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

Здраво, Хабр! Би сакал да ви претставам низа написи-преводи на една според мене интересна литература - ОСТЕП. Овој материјал прилично длабоко ја испитува работата на оперативните системи слични на Unix, имено, работата со процеси, различни распоредувачи, меморија и други слични компоненти кои го сочинуваат модерен оперативен систем. Оригиналот на сите материјали можете да го видите овде тука. Имајте предвид дека преводот е направен непрофесионално (сосема слободно), но се надевам дека го задржав општото значење.

Лабораториска работа на оваа тема може да се најде овде:

Други делови:

Можете исто така да го проверите мојот канал на телеграма =)

Ајде да ја погледнеме најфундаменталната апстракција што ОС им ја обезбедува на корисниците: процесот. Дефиницијата на процесот е прилично едноставна - тоа е работи програма. Самата програма е безживотно нешто што се наоѓа на дискот - тоа е збир на инструкции и можеби некои статични податоци кои чекаат да бидат лансирани. ОС е тој што ги зема тие бајти и ги извршува, трансформирајќи ја програмата во нешто корисно.
Најчесто, корисниците сакаат да работат повеќе од една програма во исто време, на пример, можете да стартувате прелистувач, игра, медиа плеер, уредувач на текст и слично на вашиот лаптоп. Всушност, типичен систем може да извршува десетици или стотици процеси истовремено. Овој факт го прави системот полесен за користење, никогаш не треба да се грижите дали процесорот е бесплатен, туку само стартувате програми.

Ова го покренува проблемот: како да се обезбеди илузијата на многу процесори? Како може ОС да создаде илузија за речиси бесконечен број процесори, дури и ако имате само еден физички процесор?

ОС ја создава оваа илузија преку виртуелизација на процесорот. Со започнување на еден процес, потоа негово запирање, започнување друг процес и така натаму, ОС може да ја одржи илузијата дека има многу виртуелни процесори, а всушност ќе има еден или повеќе физички процесори. Оваа техника се нарекува поделба на ресурсите на процесорот по време. Оваа техника им овозможува на корисниците да извршуваат истовремени процеси колку што сакаат. Цената на ова решение е перформанси - бидејќи ако процесорот е споделен со неколку процеси, секој процес ќе се обработува побавно.
За да се имплементира виртуелизација на процесорот, а особено да се направи тоа добро, на ОС му треба поддршка и на ниско и на високо ниво. Поддршката на ниско ниво се нарекува механизми се методи или протоколи на ниско ниво кои го имплементираат потребниот дел од функционалноста. Пример за таква функционалност е префрлувањето на контекстот, што му дава можност на ОС да запре една програма и да стартува друга програма на процесорот. Оваа временска поделба е имплементирана во сите современи оперативни системи.
На врвот на овие механизми е вградена некоја логика во ОС, во форма на „политики“. Политика е одреден алгоритам за одлучување за оперативниот систем. Таквите политики, на пример, одлучуваат која програма прво треба да се стартува (од список на команди). Така, на пример, овој проблем ќе се реши со политика наречена распоредувач (политика за распоред) и при изборот на решение, ќе се води од такви податоци како што се: историја на стартување (која програма е најдолго стартувана во последните минути), какво оптоварување носи овој процес (какви видови програми се лансирани), метрика на перформанси (дали системот е оптимизиран за интерактивна интеракција или за пропусната моќ ) и така натаму.

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

Апстракција на програма која работи, извршена од оперативниот систем е она што ние го нарекуваме процес. Како што споменавме порано, процесот е едноставно програма која работи, во секој моментален временски период. Програма со која можеме да добиеме збирни информации од различни системски ресурси до кои оваа програма пристапува или влијае при нејзиното извршување.
За да ги разберете компонентите на процесот, треба да ги разберете состојбите на системот: што програмата може да чита или промени за време на нејзината работа. Во секое време, треба да разберете кои елементи на системот се важни за извршување на програмата.
Еден од очигледните елементи на системот дека процесот вклучува е на меморија. Инструкциите се наоѓаат во меморијата. Податоците што програмата ги чита или запишува исто така се наоѓаат во меморијата. Така, меморијата што може да ја адресира процесот (наречен простор за адреси) е дел од процесот.
Исто така, дел од состојбата на системот се и регистрите. Многу инструкции се насочени кон промена на вредноста на регистрите или читање на нивната вредност, а со тоа и регистрите стануваат важен дел од работата на процесот.
Треба да се напомене дека машинската состојба се формира и од некои посебни регистри. На пример, IP - покажувач на инструкции — покажувач на инструкцијата што програмата моментално ја извршува. Исто така постои покажувач за магацинот и поврзани со него рамка покажувач, кои се користат за управување со: параметри на функции, локални променливи и повратни адреси.
Конечно, програмите често пристапуваат до ROM (меморија само за читање). Оваа „I/O“ (влез/излез) информација треба да содржи листа на датотеки што моментално се отворени од процесот.

Процес API

Со цел да го подобриме нашето разбирање за тоа како функционира процесот, ајде да проучиме примери на системски повици кои треба да бидат вклучени во кој било интерфејс на оперативниот систем. Овие API се достапни во една или друга форма на кој било ОС.

Креирај (создавање): ОС мора да вклучува некој метод што ви овозможува да креирате нови процеси. Кога внесувате команда во терминалот или стартувате апликација со двојно кликнување на иконата, се испраќа повик до ОС за да се создаде нов процес и потоа да се стартува наведената програма.
Бришење: Бидејќи постои интерфејс за креирање процес, ОС треба исто така да обезбеди можност за принудно отстранување на процес. Повеќето програми природно ќе започнат и ќе завршат сами додека работат. Во спротивно, корисникот би сакал да може да ги убие и на тој начин би бил корисен интерфејсот за запирање на процесот.
Почекајте (чекање): Понекогаш е корисно да се чека процесот да заврши, па се обезбедуваат некои интерфејси кои обезбедуваат можност за чекање.
Различни контроли (различна контрола): Покрај убивањето и чекањето на процесот, постојат и други различни методи на контрола. На пример, повеќето оперативни системи обезбедуваат можност да се замрзне процес (запирање на неговото извршување на одреден период) и потоа да се продолжи (продолжи со извршување)
Статус (состојба): Постојат различни интерфејси за добивање на некои информации за статусот на процесот, како на пример колку долго работи или во каква состојба е моментално.

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

Процес на создавање: детали

Една од интересните работи е како точно програмите се трансформираат во процеси. Особено како ОС ја зема и ја извршува програмата. Како точно се создава процесот.
Прво, оперативниот систем мора да го вчита програмскиот код и статичките податоци во меморијата (во просторот за адреси на процесот). Програмите обично се наоѓаат на диск или погон со цврста состојба во некој извршен формат. Така, процесот на вчитување програма и статички податоци во меморијата бара ОС да може да ги чита тие бајти од дискот и да ги смести некаде во меморијата.

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

Откако кодот и статичките податоци ќе се вчитаат во меморијата на ОС, има уште неколку работи што треба да се направат пред да може да се изврши процесот. Мора да се одвои одредена количина на меморија за стекот. Програмите го користат стекот за локални променливи, параметри на функции и адреси за враќање. ОС ја распределува оваа меморија и ја дава на процесот. Стекот може да се распредели и со некои аргументи, конкретно ги пополнува параметрите на функцијата main(), на пример со низа од argc и argv.

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

Оперативниот систем исто така ќе извршува задачи за иницијализација, особено оние поврзани со I/O. На пример, на UNIX системите, секој процес по дифолт има 3 отворени дескриптори на датотеки, за стандарден влез, излез и грешка. Овие рачки им овозможуваат на програмите да читаат влез од терминалот, како и да прикажуваат информации на екранот.

Така, со вчитување на код и статички податоци во меморијата, креирање и иницијализирање на стекот и вршење други работи поврзани со извршување на I/O задачи, ОС ја подготвува сцената за извршување на процесот. Конечно, останува уште една последна задача: водење на програмата низ нејзината влезна точка, наречена функцијата main(). Со извршување на функцијата main(), ОС ја пренесува контролата на процесорот на новосоздадениот процес, со што програмата започнува да се извршува.

Процесна состојба

Сега кога имаме малку разбирање за тоа што е процес и како се создава, ајде да ги наведеме состојбите на процесот во кои може да биде. Во својата наједноставна форма, процесот може да биде во една од овие состојби:
Вклучување на. Кога работи, процесот работи на процесорот. Ова значи дека инструкциите се извршуваат.
Подготвен. Во состојба на подготвеност, процесот е подготвен да работи, но поради некоја причина ОС не го извршува во наведеното време.
Пристап. Во блокирана состојба, процесот извршува некои операции што го спречуваат да биде подготвен за извршување додека не се случи некој настан. Еден вообичаен пример е кога процесот иницира операција на IO, тој станува блокиран така што некој друг процес може да го користи процесорот.

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

Можете да ги замислите овие состојби во форма на график. Како што можеме да видиме на сликата, состојбата на процесот може да се менува помеѓу RUNNING и READY по дискреција на ОС. Кога состојбата на процесот се менува од READY во RUNNING, тоа значи дека процесот е закажан. Во спротивна насока - отстранети од изгледот. Во моментот кога некој процес ќе стане БЛОКИРАН, на пример, иницирам операција на IO, ОС ќе го задржи во оваа состојба додека не се случи некој настан, на пример, завршувањето на IO. во овој момент транзицијата во состојба READY и евентуално веднаш во RUNNING состојба доколку ОС одлучи така.
Ајде да погледнеме пример за тоа како два процеси се движат низ овие состојби. За почеток, да замислиме дека двата процеса се извршуваат и секој користи само процесорот. Во овој случај нивните држави ќе изгледаат вака.

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

Во следниот пример, првиот процес, по одредено време работи, бара IO и влегува во БЛОКИРАНА состојба, дозволувајќи да се изврши друг процес (СЛИКА 1.4). ОС гледа дека процесот 0 не го користи процесорот и го започнува процесот 1. Додека процесот 1 работи, IO е завршен и статусот на процесот 0 се менува во READY. Конечно, процесот 1 заврши, а по завршувањето, процесот 0 започнува, извршува и ја завршува својата работа.

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

Структура на податоци

Самиот оперативен систем е програма, и исто како и секоја друга програма, има некои клучни структури на податоци кои следат различни релевантни информации. За да ја следи состојбата на секој процес, ОС ќе поддржува некои листа на процеси за сите процеси во состојба READY и некои дополнителни информации за следење на процесите кои моментално се извршуваат. Исто така, ОС треба да ги следи блокираните процеси. Откако ќе заврши IO, оперативниот систем мора да го разбуди потребниот процес и да го стави во состојба подготвена за работа.

На пример, ОС мора да ја зачува состојбата на регистрите на процесорот. Во моментот на запирање на процесот, состојбата на регистрите се зачувува во адресниот простор на процесот, а во моментот кога продолжува неговата работа, вредностите на регистрите се враќаат и на тој начин продолжува со извршувањето на овој процес.

Покрај спремните, блокираните, активни состојби, има и некои други состојби. Понекогаш, во моментот на создавање, некој процес може да биде во состојба INIT. Конечно, еден процес може да се стави во ФИНАЛНА состојба кога веќе е завршен, но неговите информации сè уште не се исчистени. На UNIX системите оваа состојба се нарекува процес на зомби. Оваа состојба е корисна за случаи кога родителскиот процес сака да го знае повратниот код на детето, на пример, обично 0 сигнализира успех и 1 грешка, но програмерите можат да издаваат дополнителни излезни кодови за да сигнализираат различни проблеми. Кога родителскиот процес ќе заврши, тој прави последен системски повик, како што е чекање(), за да чека да заврши процесот на дете и да му сигнализира на ОС дека може да ги избрише сите податоци поврзани со прекинатиот процес.

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

Клучни точки на предавањето:

процес — главната апстракција на програма која работи во ОС. Во секое дадено време, процесот може да се опише според неговата состојба: содржината на меморијата во неговиот адресен простор, содржината на регистрите на процесорот, вклучувајќи го покажувачот на инструкции и покажувачот на стек, и информации за IO, како што се отворените датотеки што се читаат или пишуваат.
Процес API се состои од повици што програмите можат да ги направат до процесите. Обично тоа се креирање, бришење или други повици.
● Процесот е во една од многуте состојби, вклучувајќи работи, подготвен, блокиран. Различни настани како што се закажување, исклучоци од закажување или чекање може да ја променат состојбата на процесот од еден во друг.
Список на процеси содржи информации за сите процеси во системот. Секој запис во него се нарекува блок за контрола на процеси, кој во реалноста е структура која ги содржи сите потребни информации за одреден процес. 

Извор: www.habr.com

Додадете коментар