Развитие на ос. Основни типове



страница1/8
Дата17.10.2018
Размер2.7 Mb.
#90651
  1   2   3   4   5   6   7   8
Развитие на ОС. Основни типове.

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

1.1. Ранни системи- Първите компютри не са имали ОС и потребителите са програмирали на машинен език, като са разполагали с цялата машина, управлявайки я от операторската конзола. Установява се, че е удобно комп. да се снабди с прости програмни средства с помощта, на които да се улесни въвеждането на програмата, а по-късно с развитието на асемблерните езици, да се изпълнява програма за: четене на асемблера, транслация на програмата, запис в/у перфокарти, четене и зареждане на изпълнимата програма в паметта и накрая изпълнение.Режим на работа, при който потребителя получава на разположение комп. с-ма и има пряк достъп до нея, се нарича открит режим (режим на “отворения магазин”).

Следващият етап на автоматизацията на програмирането е появяването на сложни асемблерни езици и езици от високо ниво като FORTRAN. Най-важни са били процедурите по организиране на входа и изхода, т.нар. драйвери за устройства. За припокриване на работата на процесора и входа/изхода се използва буфериране.

Възниква нужда от използване на общи подпрограми в обектна форма.

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

Изпълнението на една програма включва изпълнението на много стъпки и всяка от тях се управлява ръчно, като се поставят или свалят перфоленти и магнитни карти. Това е и основният недостатък – твърде малкото използване на процесора (около 7%).

Пакетни системи. При пакетната обработка потребителите се отделят от комп. чрез оператор. Потребителят предоставя задание, състоящо се от програма и данни, предшествано от описание. Описанието включва една или няколко управляващи карти. Така възникват езиците за управление на заданията. Заданията се събират в “пакети”, образувайки т.нар. поток от задания. За да се осигури последователната обработка, с автоматичен преход от едно към друго задание се създават управляващи програми наречени монитори. Мониторите са резидентни. Мониторът чете управляващите карти, определящи каква програма да бъде изпълнена ( компилатор, асемблер), зарежда я и й предава управлението, след нейното изпълнение управлението се връща към монитора.

Мониторът се състои от : интерпретатор на управляващите карти, който използва зареждащата програма за зареждане на системни и приложни програми. Интерпретаторът и зареждащата програма имат нужда от входно-изходни операции и за това мониторът включа драйвери за устройства.

Основните функции на ОС от първо поколение са били автоматизация на операторската дейност. Работата на оператора се е свеждала до стандартни манипулации. Времето на използване на процесора е нараснало до 55%.

Поради бавните периферни устройства, процесорът принудително е стоял. За това започва да се прилага автономна работа на четеца на перфокарти, разработват се устройства които директно извеждат/въвеждат от/на магнитна лента, която е била по бърза от перфокартите. Така загубите се намаляват и използването на процесора достига 90%.



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

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

Спулинг За да се съгласува бързодействието на процесора с бавната работа на периферните у-ва, започва да се използва т.нар спулинг. От SPOOL- (Simultaneous Peripheral Operation On Line). При спулинга се използва междинен носител, върху който предварително се записват подлежащите за обработка задания, но с помощта на процесора. Докато буферирането позволява припокриване на входно/изходните операции с изчисленията в заданието, то спулинга позволява припокриването на входа/изхода на едно задание с изчислението на други. Така се осигурява много по-голямо натоварване на процесора, което увеличава производителността.

Системи с пряка връзка.Друг подход е физическото свързване на две машини – основна и сателитна, чрез дисково у-во. Такава система е предшественик на присъединения процесор.

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

Мултипрограмиране нов метод за пакетна обработка на потребителските задания

и времеделене начин за предоставяне на изчислителните средства на потребителя

М
ултипрограмни пакетни системи.
Идеята е да се подържат в активно състояние няколко рограми в оперативната памет.

Докато “А”, чака изпълнението на входно-изходна операция, “Б” се изпълнява. След завършване на входно-изходната операция управлението отново се предава на А. Мултипрограмирането се базира на разделяне на времето на процесора и разделяне на пространството на паметта. Реализирането на вътрешната опашка на заданията е важен етап към прехода към ОС с мултипрограмиране. Заданията се въвеждат и записват, след това се планира реда на изпълнението им. Избира се задание с най-висок приоритет – въвежда се параметър определящ приоритета. Някои ОС подържат няколко опашки. За програмите които се намират едновременно в паметта при мултипрограмен режим, може предварително да бъде фиксирана памет или да се определя динамично. Повишеното бързодействие изисква и по голяма памет, но тъй като паметта не може да нараства неограничено, създава се виртуална памет.



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

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

Диалогово (интерактивно) въвеждане на заданията. Заявките за обслужване се формират динамично и отделно от програмирането. Чрез терминал потребителя осъществява диалог с елементите на системата. Има средства за управление на архива и съответната библиотека. След оформяне на заданието, изпраща се заявка и то става част от общия входен поток на системата. Подсистемата осигуряваща диалогова работа с терминала, предава заданието на ОС в пакетен режим и от този момент потребителя няма достъп до него.

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

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



ОС за реално време –действията им се управляват от външни събития, постъпващи в предварително неизвестни моменти. Обработката на всяко събитие трябва да е бърза – в рамките на точно определен интервал от време. Външните събития са заявки от асинхронно работещи устройства. Поради това се наричат ОС за управление на процеси. Обикновено се предвижда вмешателство на оператор само при непредвидени операции или грешки. Тъй като този тип ОС са за изпълнение на паралелни процеси, много често те се означават с “многозадачен процес”

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

ОС за мултипроцесорни системи – в тях едновременно могат да се изпълнят няколко програми на различни физически процесори. Обикновено включват повече от един процесори с приблизително еднаква производителност, които имат обща памет и периферни устройства, и се управляват от една ОС. Съществуват три най-общи организации за мултипроцесорни системи: 1.главен-подчинен - ОС се изпълнява само на главния процесор, докато подчинените изпълняват потребителски програми; 2.отделни монитори-всеки процесор изпълнява своя ОС, която управлява собствените му ресурси. Всяка програма се изпълнява само на един от процесорите, който й е определен; 3.симетрична организация-ОС управлява група идентични процесори и се премества от един процесор на друг. Потребителска програма може да се изпълни от различни процесори в различните моменти от врмето.

Съвременни ОС. ОС в настоящия момент е от “четвърто поколение”. Известност

придобива концепцията “виртуална машина”. Мрежа от компютри: свързани чрез комуникационни линии. Разделят се по географски признак на глобални мрежи (WAN) и локални мрежи (LAN). При отдалечения достъп възникват проблеми с осведомеността на потребителя относно мястото на изпълнение на програмата му, кога данните се прехвърлят към програмите и обратно, и как се организира общуването между различните ОС.

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

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



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

2.1. Процес: последователен процес (задача, действие) е изходна точка в теорията на ОС-това е работа, извършена от последователен процесор при изпълнение на програмата с нейните данни. Всеки процес има свои процесор и програма. Няколко процеса могат да делят един процесор (виртуален процесор) или една програма (при различни последователност на изпълнение). Програмата е пасивна, процесът е активен. Процесът е двойката “процесор-програма” при изпълнение. Процесът за разлика от програмата, включва още стек, текущите стойности на брояча на команди и другите регистри на процесора, структури от данни, поддърйани от ОС за управление на изпълнението му.

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



Състояния на процеса. Възможни са няколко състояния през които може да премине процеса по време на съществуването си: 1. Изпълняван – процесорът е предоставен на процеса; 2. Готов – процесът би могъл да се изпълни, ако му се разпредели процесор; 3. Блокиран – процесът не може да се изпълни, докато не получи сигнал, съобщение или ресурс. Възможно е няколко процеса да са в състояние на готовност или блокирани – поради това се поддътжат опашка на готовите процеси и опашка на блокираните процеси. Поддържа се опашка с готовите процеси и опашка с блокираните процеси. Новосъздадения процес се записва в опашката на готовите процеси, откъдето диспечера(системна програма) избира процес за изпълнение. След като определеното процесорно време изтече, управление получава диспечера, който избира нов процес, а изпълнявания става готов. Желателно е да се включат и други състояния на модела. Процесорът ще бездейства ако всички процеси са блокирани за да се изчака завършването на входно-изходна операция. Това може да се избегне ако някой от блокираните порцеси се изхвеърли на диска и в паметта да се въведе процес от диска или да се създаде нов процес. Това става с въвеждането на състовние на преустановяване и изхвърлените процеси да се включат в опашката на преустановените процеси. Тъй като не е желателно да се въведе отново в паметта все още блокиран процес, възможно е процес да се блокира за неопре-делено време, очаквайки настъпване на събитие или вход/изход(устройството обаче е повредено) и да заема излишно памет. Това може да се реши с въвеждането на две състояния на преустановяване: блокиран-преустановен и готов-преустановен.

1. Избран е процес за изпълнение. 2. Изтекъл е квантът, отделен на процеса. 3. Чакане на събитие или завършване на вход/изход. 4. Настъпило е събитие или е завършил вхид/изход. 5. Преъстоновяване. 6. Възобновяване. 7. Включване. 8. Унищожаване.

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

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

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

Управление на преходите между състоянията се извършва чрез извикване на съответни примитиви (основни, примитивни операции).


2.2. Паралелни процеси

Когато два или повече процеса се припокриват във времето, те са за паралелни. Биват: 1.Независими – работят с независими променливи и не оказват влияние на други процеси; 2.Взаимодействащи си–имат достъп до общи променливи и си влияят.



2.3. Взаимно изключване на процеси. В даден момент от времето ресурсите могат да са достъпни само за един процес. Такива ресурси се наричат критични. Ако няколко процеса трябва да получат достъп до критични ресурси, те съгласуват действията си, така, че само единия да има достъп до ресурса. Това е същността на взаимно изключване на процеси. При това трябва да се спазват следните критерии : 1.Само един процес може да използва ресурса в даден момент; 2.Ако няколко процеса едновременно искат да получат дад. ресурс, само един от тях ще го получи в крайно време; 3.Ако процес получи ресурс, той трябва да го освободи в крайно време.

Има и решение, при което процесите си сътрудничат- възможна е появата на времезависими грешки. Решението на проблема се решава с определяне на критична секция (област на процеса, в която той работи с критичния ресурс). Необходимо е: 1.Само един процес може да се намира в критичната си секция в даден момент; 2.Процес може да остане в критичната си секция крайно време; 3.Ако процес иска да влезе в критичната си секция, трябва да му се даде такава възможност в крайно време. Решения:

Използва се управляващата конструкция parbegin/parend (cobegin/coend). Ако имаме: S0;parbegin s1;s2;..;sn;parend;S(n+1). Операторите заключени между скобите parbegin/parend, се изпълняват паралелно и S(n+1) се преминава, когато се изпълнят всички оператори в тези скоби.

2.3.1 Програмно решение: операциите за запис и четене на данни в паметта взаимно се изключват във времето- т. нар. блокировка на паметта. Операциите запис и четене представляват критични секции за кратки интервали от време, реализирани на апаратно ниво.

Първи вариант: използва се една променлива. При влизане в критична секция се зацикля и се проверява променливата. Когато единият процес е в критична секция, то другият процес цикли, а след като излезе от критичната секция- другият влиза. Проблем:хаби се процесорно време, тъй като имаме стриктно редуване на процесите, а не паралелно.Освен това ако единият процес е блокиран, а другият излезе от критичната секция, то другият няма да завърши:
Program взаимно_изключване;

Var ред_на:integer;

Procedure процес_1;

Begin


Repeat

Begin


While ред_на<>1 do;

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

Ред_на:=2;

……………………

End;

Until false;



End;

Procedure процес_2;

Begin

Repeat


Begin

While ред_на<>2 do;

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

Ред_на:=1;

……………………

End;


Until false;

End;


Begin

Ред_на:=1;

Parbegin процес_1; процес_2; Parend;

End.


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

Втори вариант: въвеждат се 2 променливи- за всички процеси по една. Те имат стойност true когато съответният процес е в критияната си секция, а false когато не е. Навалната им стойност е false Алгоритъмът е критично зависим от точното съгласуване във времето.

Procedure процес_1; procedure proces_2;

Begin begin

Repeat repeat

While red_na_2 do; while red_na_1 do;

Red_na_1:=true; red_na_2:=true;

Kriti4na sekciq kriti4na sekciq

Red_na_1:=false; red_na_2:=false;

Until false; until false;

End; end;

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

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

Procedure процес_1; procedure proces_2;

Begin begin

Repeat repeat

Red_na_1:=true; red_na_2:=true;

While red_na_2 do; while red_na_1 do;

Kriti4na sekciq kriti4na sekciq

Red_na_1:=false; red_na_2:=false;

…………………. …………………..

Until false; until false;

End; end;

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



Четвърти вариант:

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

Procedure процес_1; procedure proces_2;

Begin begin

Repeat repeat

Red_na_1:=true; red_na_2:=true;

While red_na_2 do; while red_na_1 do;

Begin begin

Red_na_1:=false; red_na_2:=flase;

Случайна задръжка Случайна задръжка

Red_na_1:=true; red_na_2:=true;

Kriti4na sekciq kriti4na sekciq

End; end;

Red_na_1:=false; red_na_2:=false;

…………………. …………………..

Until false; until false;

End; end;

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



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

Взаимното изключване е осигурено от условието в while. Ако и двата процеса искат да влязат в критична секция, то rad_na_1=red_na_2=true, a proces_nomer може да бъде равен на 1 или на 2( но не и на двете)

Program vzaimno_izklju4vane;

Var red_na_1, red_na_2: boolean;

Proces_nomer: integer;

Procedure процес_1;

Begin

Repeat


Red_na_1:=true;

Proces_nomer:=2;

While (red_na_2 and proces_nomer=2) do;

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

Ред_на_1:=false;

……………………

Until false;

End;


Procedure процес_2;

Begin


Repeat

Red_na_2:=true;

Proces_nomer:=1;

While (red_na_1 and proces_nomer=1) do;

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

Ред_на_2:=false;

……………………

Until false;

End;

Begin


Red_na_1:=false; red_na_2:=false;

Parbegin proces_1; proces_2; parend;

End.
Нека например proces_1 да може да бъде спрян пред влизане в критична секция, само ако цикли в while при изпълнено условие. Ако proces_2 не желае да влезе в критичната секция, то red_na_2=false и proces_1 влиза. . Ако proces_2 иска да влезе в критичната секция, то се изпълнява оператор while и кой ще влезе зависи от стойността на porces_nomer. Влезлият процес нека да е proces_n2 при напускане на критичната секция ще направи red_na_2:=falseи ще разредши на prces_1 да влезе. Така, тъй като proces_1 не променя процес_номер (докато изпълнявава while) a процес_2, устано-вявайки red_na_2=true, ще се устонови и proces_nomer=1, proces_1 ще влезе в критичната си секция най-много след едно влизане на proces_2 в критичната му секция. Или, изпълнени са и останалите изисквания за критични секции и няма да възникне мъртва хватка или безкрайно отлагане.
Взаимно изключване на N процеса
Обслужва се процес с най-малък номер, но алгоритъмът не гарантира, че два процесса не получават еднакъв номер. В случай на конфликт, пурви се обслужва процесът с най-малък идентификатор.

Декларация на общите данни:


Var izbor : array[0..,n-1] of boolean;

Nomer : array[0..n-1] of integer;

Тези данни првоначално се инициализират с false, респ. с 0. За ъдобство се дефинира следната нотация

(a,b)<(c,d), ако a

max(a(0), ….., a(n-1)) има число К ,така че К>=а(i) za i=0, …, n-1.

Тогава процес I може да се организира по следния начин:

Repeat

izbor[i]:=true;



nomer[i]:= max(nomer[0],…,nomer[n-1])+1;

izbor[i]:=false;

for j:=0 to n-1 do

begin


while izbor[j] do;

while nomer[j] <>0;

and(nomer[j], j) < (nomer[i], I) do;

end;


критична секция

nomer[i]:=0;

until false;

За да се провери дали алгоритъмът е верен, първо трябва да се покаже, че ако процес i e в критичната си секция и процес (k<>i) вече е избрал неговия номер[k]<>0, тогава (номер[i], i) < (номер[k], k).

Взаимното изключване е осигурено. Нека процес i е в критичната си секция и процес к се опитва да влезе. Когато процес к изпълнява втория цикъл while за j=i той ще открие че номер[i]<>0 и (номер[i], i) < (номер[k], k). Процесът че повтаря цикъла, докато процес i не напусне критичната секция.

За да се докаже, и че другите условия са изпълнени, достатъчно е да се опкаже, че процесите влизат в критичните си секции в ред “първи дошъл – първи обслужен” (FCFS).


2.3.2 Решение с машинна команда TS

Програмното решение е неудобно,затова всички процесори имат машинни команди

-решение с машинна команда TS. (Test & Set – провери и установи). TS(a,b) има 2 логически параметъра. Командата чете стойността на променливата b, записва я в a (a:=b) и установява b:=true. Всеки процес има локална променлива, но  и обща глобална променлива за всички процеси, конкуриращи се за някакъв ресурс обща =false в началото. Процес (пр. proces_1) влиза в критичната си секция в зависимост от състоянието на локалната си променлива. Ако няма друг процес в критична секция, то обща= false. При изпълнение на ТS в цикъла while, локалната= false, обща=true. proces_1 влиза в критичната си секция, а другите са в процес на очакване.При излизане от критичната секция proces_1 указва обща= false, с което се разрешава на друг чакащ процес да влезе в критичната си секция..
Program vzaimno_izklju4vane;

Var обща: boolean;

Proces_nomer: integer;

Procedure процес_1;

Var локална_1:boolean;

Begin


Repeat

локална_1:=true;

while локална_1 do;

TS(локална_1, обща)

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

Обща:= false;

……………………

Until false;

End;

Procedure процес_2;



Var локална_2:boolean;

Begin


Repeat

локална_2:=true;

while локална_2 do;

TS(локална_2, обща)

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

Обща:= false;

……………………

Until false;

End;

Begin


Обща:=false;

Parbegin proces_1; proces_2; parend;

End.

Решението осигурява взаимно изключване, но е възможно попадане в “безкрайно отлагане”. Когато процес излезе от критичната си секция, правейки обща:=false, команда ТS на друг процес най-вероятно ще направи обща:=true до времето, когато първият процес успее да мине през цикъла, за да установи обща:=true. За да се избегне тази опасност, може да се въведе допълнителна променлива.



TS в някои машини се реализа и по друг начин – TS(b) използва се машинен признак като локална променлива.
2.3.3 Семафори
С въвеждането на семафори се избягва сложното и неефективно действие на командата TS. Въвеждат се две примитивни операции P и V, които оперират на цели променливи, наречени семафори. Различават се двоични семафори (приемат ст-ст само 0 и 1) и общи ( приемат цели, неотрицателни ст-сти).

Класическата дефиниция на P и V

1.P(s): while s=0 do skip ; s=s-1;Извиквайки P(s), процесът чака про стойност на семафора s=0, докато друг процес не го освободи чрез V(s). Тогава стойността на S се намалява и процесът продължава.

2. V(s): s=s+1 ;Стойността на семафора s се увеличава и процесът продължава.

В началото има инизиализация s=<цяла константа>.

Тъй като S е обща променлива, операциите P и V над нея трябва да са хеделими, т.е те са критични секции спрямо S. Когато един процес променя стойността на S (или прави проверка), никой друг процес не може в същото време да модифицира същия семафор. Единствено по време на празната операция skip може да се направи модификация.




Сподели с приятели:
  1   2   3   4   5   6   7   8




©obuch.info 2024
отнасят до администрацията

    Начална страница