Глава 2 - Процеси. Взаимодействие между процеси
| Информационни технологии | 2009-12-04 | 48 сваляния |
Процеси. Взаимодействие меж-ду процеси.
Паралелната обработка в осно-вата на мултипрограмните сис-теми. Освен апаратен паралел-изъм съществува и логически, реализиран от програмното ос-игуряване. За да се осигури си-нхронизирането на апаратната и софтуерната част, трябва да се предоставят механизми за синхронизация и комуникация
2.1.Процеси основни понят-ия.
Процес: последователен процес (задача, действие) е изходна точка в теорията на ОС. После-дователния процес е работа, извършена от последователен процесор при изпълнение на програмата с нейните данни. Всеки процес има свои процес-ор и програма. Няколко проце-са могат да делят един процес-ор (виртуален процесор) или една програма (при различни последователност на изпълнен-ие), Програмата е пасивна, пр-оцеса активен. Процеса е двой-ката процесор-програма при изпълнение. Когато пакетно за-дание постъпи в системата, се създава процес (или няколко). При интерактивните системи с времеделене също се създава процес. Системните задачи (пр. споолинг) също са процеси. В някои системи могат да се съз-дадат подпроцеси , които се изпълняват паралелно. Систем-ните и потребителските проце-си се изграждат по еднакви принципи, но системните имат по-големи права (не се състеза-ват за ресурси, тъй като те ги управляват).
Състояния на процеса. По вре-ме на съществуването на проц-еса, той преминава основно през три състояния: 1. Изпъл-няван: процесора е предостав-ен на процеса; 2.Готов: процес-ът би могъл да се изпълни, ако му се разпредели процесор; 3. Блокиран: процеса не може да се изпълни, докато не получи сигнал, съобщение или ресурс. Поддържа се опашка с готови-те процеси и опашка с блоки-раните процеси. Новосъздаден-ия процес се записва в опашк-ата на готовите процеси, откъ-дето диспечера избира процес за изпълнение. След като опре-деления квант изтече, управл-ение получава диспечера, кой-то избира нов процес, а изпъл-нявания става готов. В някои ОС има въведени и други съст-ояния на процеса: състояние на преустановяване. Процеса преустановява сам себе си, но може да бъде преустановен и от друг процес. Преустановен-ия може да продължи изпълне-нието си само, ако друг процес го възобнови. Състоянията мо-гат да се разделя и на подсъст-ояния.
Преустановяването на процес-ите се използва за да се регули-ра натоварването на мултип-рограмната система. Потребит-еля също може да преустанови процес, с цел настройка на пр-ограмата. Блокиран процес, може да чака настъпване на събитие неопределено дълго. Обикновено преустановяване се прави с цел освобождаване на ресурси. Управление между състоянията се извършва чрез извикване на съответни прим-итиви.
2.2.Паралелни процеси
Когато два или повече процеса се припокриват във времето, говорим за паралелно изпълне-ние на процеси. Те могат да бъдат 1.Зависими: работят с множества независими проме-нливи и не оказват влияние на други процеси; 2. Взаимодейст-ващи си процеси: имат достъп до общи променливи и резулта-та от един процес влияе върху друг. Общите променливи пре-дставят състоянието на ресурс-ие, разделяни от конкуриращи се процеси. Те също се изпо-лзват за комуникиране между коопериращи се процеси за об-щи задачи. Асинхронността на паралелните процеси и различ-ните скорости на изпълнение усложняват взаимодействията между процесите.
2.3.Взаимно изключване на процеси.
Въпреки, че физическите и логическите ресурси могат да бъдат разделени, обикновено в момент от времето могат да са достъпни само за един процес. Такива ресурси се наричат критични. Ако няколко проце-са трябва да получат достъп до критични ресурси, те съгласув-ат действията си, така, че само единия да има достъп до ресу-рса. Това е същността на взаи-мно изключване на процеси. При това трябва да се спазват следните критерии : 1.Само ед-ин процес може да използва ресурса в даден момент; 2.Ако няколко процеса едновременно имат нужда от ресурса, той тр-ябва да е предоставен на един от тях в крайно време; 3.Ако процес получи ресурс, той тря-бва да го освободи в крайно време. Има варианти на реш-ение на проблема, при които двата процеса използващи об-щи променливи си сътруднич-ат, двата процеса се компили-рат в един общ и ако се изпъ-лняват в непресичащи се инте-рвали от време, ще се получат верни резултати. В този вари-ант е възможна появата на вр-емезависими грешки. Решение-то на проблема с взаимното из-ключване на процеси се реша-ва с определяне на критична секция. За правилното решава-не на проблема трябва да са изпълнени: 1.Само един процес може да се намира в критична-та си секция в даден момент; 2.Процес може да остане в кр-итичната си секция крайно вр-еме; 3.Ако процес иска да влезе в критичната си секция, тряб-ва да му се даде такава възмо-жност в крайно време. (никой процес извън критичната си секция не трябва да пречи на друг да влезе в своята такава)
2.3.1. Програмно решение:
То се основава на блокировка-та на паметта, което означава че операциите за четене и зап-ис на данни в паметта се изкл-ючват взаимно във времето. Когато единпроцес се обръща към паметта а другите чакат.
Взаимно изключване на 2 процеса: Първи вариант: Про-цесите са безкраен цикъл, а вл-
зането в критична секция се управлява от While-do, който тече дотогава докато пром. ред_на стане == на номера на процеса. От критичната секц-ия се излиза когато променлив-
ата присвои номера на другия процес. Ето и сорс кода:
program взаимно_изключване
var red_na: Integer;
procedure process_1;
begin
repeat
begin
while red_na <> 1 do;
critical section {enter in critical section}
red_na := 2;{exit from critical section}
end;
until false;
end;
procedure process_2;
begin
repeat
begin
while red_na <> 2 do{enter in critical section}
critical section
red_na := 1;{exit form critical section}
end;
intil false;
end;
begin
red_na := 1;
parbegin process_1; process_2; parend;
end.
Aко единия процес се блокира след като излезе от критичната си секция, то и другият ще се блокира след излизане от крит-ичната си секция.
Втори вариант: Помни се само кой процес може да влезе в кр-итична секция, но не и състоя-нието на всеки процес. Проме-нливите ред_на_1 и ред_на_2 имат ст/ст истина когато съот-ветния им процес е в крит. си секция, и неистина когато не е.
Начанлната им ст/ст е неисти-на.
Procedure process_1;
Begin
Repeat
While red_na_2 do
Red_na_1 := true;
Critical section
Red_na_1 := false;
Until false
End;
Procedure process_2;
Begin
Repeat
While red_na_1 do
Red_na_2 := true;
Critical section
Red_na_2 := false;
Until false;
End.
Трети вариант:
Необходимо е когато един про-цес взпълнява цикъл на очакв-ане, другия да не може да изле-
зе от своя. За целта всеки про-цес ще установява флага си, преди да влезе в цикъла. Т.е. ред_на_1 = истина, само инди-цира, че процес_1 иска да вле-зе в критична секция.
Procedure Process_1;
Begin
Repeat
Red_na_1 := true;
While red_na_2 do
Critical section
Red_na_1 := false;
Until false;
End;
Procedure Process_2;
Begin
Repeat
Red_na_2 := true;
While red_na_1 do
Critical section
Red_na_2 := false;
Until false
End;
Четвърти вариант:
За избягване на мъртва хват-
да се нулира флага във false и
кратковременна задръжка на
всеки влязъл в цикъл на
очакване процес, чрез което
другия процес излиза от цикъл
на очакване, след като е устан-
овил флага си.
Procedure Process_1;
Begin
Repeat
Red_na_1 := true;
While red_na_2 do
begin
Ред_на_1 := false
Случайна задръжка
Red_na_1 := true;
End;
Critical section
Ред_на_1 := false
Until false;
End;
Procedure Process_2;
Begin
Repeat
Red_na_2 := true;
While red_na_1 do
begin
Ред_на_2 := false
Случайна задръжка
Red_na_2 := true;
End;
Critical section
Ред_на_2 := false
Until false;
End;
Чрез този метод се избягва мъ-ртвата хватка, но възниква пр-облема с безкрайното отлага-не.
Пети вариант: Правилният вариант: Всеки процес устано-вява флага сии съобщава на другия процес че може да влезе в критична секция. Ако и 2-та процеса искат да влязат в кри-тичната секция по едно и също време, това ще се реши от пос-ледната ст/ст на променливата процес_номер
Program Взаимно изключване;
Var ред_на_1; ред_на_2: boolean;
Процес_номер: integer;
Procedure Process_1;
Begin
Repeat
Red_na_1 := true;
Процес_номер := 2;
While (red_na_2 and процес_номер = 2)do
Critical section
Ред_на_1 := false
Случайна задръжка
Until false;
End;
Procedure Process_2;
Begin
Repeat
Red_na_2 := true;
Процес_номер := 1;
While (red_na_1 and процес_номер = 1)do
Critical section
Ред_на_2 := false
Случайна задръжка
Until false;
End;
Begin
Ред_на_1 := false;
Ред_на_2 := false;
Parbegin
Process_1;
Process_2;
Parend.
End.
Взаимно изключване на п процеса: Алгоритъма е нареч-ен Beakery algoritm: т.е: когато влезе в магазина копувачът по-лучав номер. Обслжва се купу-вача с най-малък номер, но ал-горитъма не гарантира че че 2 купувача (процеси) не получав-ат един и същи номер. В случ-ай на конфликт, първи се обсл-ужва процесът с най-малък ид-ентификатор. Общите данни се декларират така:
Var избор:array[0..n-1] of boolean;
Номер: array[0..n-10] of Integer;
Тези данни първоначално се инициализират с false. За удоб-ство се дефинира следната но-тация: (а,b)<(c,d), ако аили
a=c и b0,a n-1 ) има число к, та че к>=аi за i = 0..n-1
тогава процес I може да се орг-
анизира по сл. начин:
repeat
избор[i] := true;
номер[I] := max(номер[0],..,
номер[n-1])+1;
избор[I]:=false;
for j := 0 to n-1 do
begin
while избор[j]
while номер[j] <> 0 and (номер[j],j)<(номер[I],I) do;
end;
критична секция
номер[I]:=0;
until false
2.3.2.Решение с машинна ком-анда TS. В много процесо-ри съществува команда TS (Te-st & Set провери и установи). Формата е TS(a,b) с параметри от логически тип. Командата чете стойността на променлив-ата b, записва я в a (a:=b) и установява b:=true. Всеки про-цес има локална променлива, а обща е глобална променлива за всички процеси и е инициализ-ирана с false.
Тагове от реферата: имодейвие, между, процеси











