Գործընթաց (ինֆորմատիկա)

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Ժամանակակից օպերացիոն համակարգերում պրոցեսների կարգավիճակները։

Գործընթաց, համակարգչային ծրագրի պասիվ հրահանգների կատարում համակարգչային պրոցեսորի վրա։ Ստանդարտ ISO 9000:2000 Definitions֊ը սահմանում է գործընթացը որպես փոխկապակցված և փոխազդող գործողությունների մի շարք, որոնք փոխակերպում են մուտքային տվյալները ելքային տվյալների։

Համակարգչային ծրագիրն ինքնին հրահանգների պասիվ հաջորդականություն է։ Մինչդեռ գործընթացը այս հրահանգների ուղղակի կատարումն է։

Նաև գործընթաց է կոչվում գործող ծրագիրը և նրա բոլոր տարրերը՝ հասցեների տարածք, գլոբալ փոփոխականներ, ռեգիստրներ, ստեկ, բաց ֆայլեր եւ այլն։

Գործընթացի ներկայացում[խմբագրել | խմբագրել կոդը]

Սովորաբար, համակարգչային համակարգում գործընթացը ներկայացված է (նաեւ ասում են, որ այն "տիրապետում է") հետեւյալ ռեսուրսներով.

Ներկայիս գործընթացի համատեքստը ներբեռնվում է հիշողության մեջ, երբ անցում է կատարվում մեկ այլ գործընթացի[1]։

Օպերացիոն համակարգը պահում է գործընթացների մասին տեղեկատվության մեծ մասը գործընթացների աղյուսակում։

Օպերացիոն համակարգերում, որոնք ապահովվում են կատարման հոսքեր, հոսքերը նույնպես ունեն իրենց սեփական ռեսուրսները։ Սովորաբար դա միայն պրոցեսորի վիճակն է, թեև հոսքերը կարող են օգտագործել նաև այլ ռեսուրսներ։

Որպեսզի նվազեցվի գործընթացների ազդեցության հավանականությունը միմյանց վրա և համակարգի (օրինակ՝ փոխադարձ արգելափակումներ կամ խափանումներ) Օպերացիոն համակարգը ապահովում է գործընթացի մեկուսացում և հատկացնում է նրանց անհրաժեշտ ռեսուրսները։ Օպերացիոն համակարգը նաև ապահովում է գործընթացների փոխգործակցության անվտանգ և կանխատեսելի եղանակներով հաղորդակցվելու մեխանիզմներ։

Գործընթացի ներկայացում հիշողության մեջ[խմբագրել | խմբագրել կոդը]

Ծրագրի ներկայացումը հիշողության մեջ օգտագործողի տարածքում

Այս բաժնում ներկայացված է Linux օպերացիոն համակարգի և x86 ճարտարապետության հիշողության գործընթացը։ Այս տեսակետը քիչ է տարբերվում բազմաթիվ այլ բազմաֆունկցիոնալ օպերացիոն համակարգերից և կառուցվածքներից(արխիտեկտուրա)։ Օրինակ, amd64-ում, որը x86-ի ժառանգն է, զանգերի շարքը նույն կերպ աճում է վերևից ներքև, բայց հասցեային տարածքի չափը մեծացել է մինչեւ 248 բայթ[2]:Linux-ը հիշողության հարթ մոդել է օգտագործում, և այդ պատճառով այս կառուցվածքի մեջ յուրաքանչյուր գործընթաց ունի 232 բայթ հիշողություն։ Ամբողջ վիրտուալ հիշողությունը բաժանված է օգտագործողի տարածության և միջուկի տարածության։ Միջուկի տարածքը զբաղեցնում է մեկ գիգաբայթ հիշողություն՝ սկսած ամենաբարձր հասցեից։ Մնացած տարածքը, այսինքն՝ երեք գիգաբայթ, հատկացված է օգտատերի տարածքին։

Աջ կողմում պատկերված է ցանկացած գործընթացի օգտագործողի տարածքը։ Միջուկի տարածությունը նույնն է բոլոր գործընթացների համար, քանի որ օպերացիոն համակարգում կարող է գոյություն ունենալ միջուկի միայն մեկ օրինակ։ Ծրագիրը գործարկելուց հետո օպերատիվ հիշողության մեջ ներմուծվում են պրոցեսորի հրամանները (մեքենային կոդը) և նախապատրաստած տվյալները։ Միևնույն ժամանակ, ավելի բարձր հասցեները ներմուծում են գործարկման փաստարկները(առգումենտները), ինչպես նաև միջավայրի փոփոխականները։ Տվյալների նախապատրաստման տարածքում պահպանվում են միայն ընթերցման համար հասանելի տվյալներ։ Դրանք կարող են լինել, օրինակ, տողային տառեր։

Ոչ նախապատրաստված տվյալների տարածքում, որպես կանոն, պահպանվում են գլոբալ փոփոխականներ։

Կույտը օգտագործվում է ծրագրի գործարկման ընթացքում հիշողություն հատկացնելու համար։ Linux-ում դրա համար կա համակարգային կանչ mmap.

Սթեքի տարածքը օգտագործվում է ընթացակարգեր կանչելու համար։

Կարևոր մանրամասնություն է նաև այն, որ ստեկի և վերին շրջանի միջև, ինչպես նաև նախաձեռնված տվյալների շրջանի և կույտի միջև պատահական հետընթաց կա։ Դա արվում է անվտանգության նպատակներով, օրինակ՝ կանխելու համար այլ գործառույթների տեղադրումը։

Դինամիկ կապի գրադարանները և ֆայլերի քարտեզագրումները գտնվում են ստեկի և կույտի միջև։

Գործընթացների դասակարգումը[խմբագրել | խմբագրել կոդը]

Բազմաֆունկցիոնալ օպերացիոն համակարգերում հնարավոր դարձավ աշխատել միաժամանակ մի քանի գործընթացների հետ։ Կանխարգելիչ բազմաֆունկցիոնալությամբ օպերացիոն համակարգերը հնարավորություն տվեցին հասնել միաժամանակ մի քանի գործընթացների աշխատանքի:Դա պահանջում էր բազմաթիվ գործընթացներ կառավարելու միջոցներ։

Unix[խմբագրել | խմբագրել կոդը]

Unix` առաջին բազմաֆունկցիոնալ ՕՀ-երից մեկը։ Յուրաքանչյուր գործընթաց ունի եզակի թվային PID: Գործընթացները դրա մեջ ունեն ծառի նման հիերարխիա, որտեղ արմատը PID 1-ով սկզբնական գործընթացն է։ Նոր պրոցեսը կարող է ստեղծվել fork համակարգային կանչով, դա կլինի ծնող գործընթացի ճշգրիտ պատճենը։ Ցանկացած պրոցես, բացի init-ից, միշտ ունի ծնողական պրոցես (PPID ատրիբուտ (անգլ.՝ Parent PID)); այն գործընթացները, որոնց ծնողը ավարտել է իր աշխատանքը, դառնում են init-ի դուստր գործընթացներ։

Գործընթացները իրենց հերթին միավորվում են խմբերի. Խմբի նույնականացման համար (PGID) պատասխանել համակարգային կանչեր setpgid և getpgid. PGID-ը հավասար է խմբի առաջնորդի PID-ին։ Դուստր գործընթացը ժառանգում է խումբն իր ծնողից։ Խմբերը օգտագործվում են առաջադրանքների կառավարման համար։

Գործընթացի խմբերը միավորվում են սեսսիաների մեջ։ Նոր սեսսիայի ստեղծման համար պատասխանատու է setsid համակարգային կանչը։ Միևնույն խմբի գործընթացները չեն կարող պատկանել տարբեր սեսսիաների։ Հետևաբար, խմբի ղեկավարը չի կարող դառնալ սեսսիայի ղեկավար։ Երբ ստեղծվում է սեսսիա, դուստր գործընթացը ինքնաբերաբար դառնում է սեսսիայի ղեկավար և նոր խմբի ղեկավար։ Սեսսիաները օգտագործվում են օգտատիրոջ մուտք գործելուց հետո սկսված բոլոր գործընթացները հետևելու համար։

Յուրաքանչյուր սեսսիա կարող է ունենալ ոչ ավելի, քան մեկ թերմինալի կառավարիչ. Թերմինալի էմուլյատորն ունի հրամանի վահանակ (սովորաբար bash կամ sh) որպես դուստր գործընթաց, որը, նախքան սկսելը, դառնում է նոր սեսսիայի առաջատարը և սահմանում իրեն տերմինալի դեկավար։

Գործընթացի ստեղծում[խմբագրել | խմբագրել կոդը]

Պարզ օպերացիոն համակարգերը չեն պահանջում նոր պրոցեսների ստեղծում, քանի որ դրանց ներսում աշխատում է մեկ ծրագիր, որը գործարկվում է սարքը միացնելու պահին։ Ավելի բարդ համակարգերի համար անհրաժեշտ է նոր գործընթացներ ստեղծել։ Սովորաբար դրանք ստեղծվում են՝

Գործընթացի վիճակները[խմբագրել | խմբագրել կոդը]

Գործընթացը, բացի իր հիմնական աշխատանքային վիճակից, կարող է լինել նաեւ այլ վիճակներում, օրինակ՝ սպասում։

Անցումային գրաֆիկ

Linux[խմբագրել | խմբագրել կոդը]

Linux - ում գործընթացը կարող է գտնվել հետեւյալ վիճակներից մեկում.

  • R (running/runnable)՝ գործընթացն իրականացվում է կամ սպասում է իր հերթին,
  • D՝ անխախտ քուն՝ գործընթացը սպասում է որոշակի իրադարձության,
  • S՝ ընդհատվող քուն՝ գործընթացը սպասում է որոշակի իրադարձության կամ ազդանշանի,
  • T՝ ընդհատում՝ գործընթացը դադարեցված է,
  • Z (zombie) — գործընթացը ավարտվել է, բայց դեռեւս չի փոխանցել իր վերադարձման կոդը ծնողական

գործընթացին։

Գործընթացի ավարտ[խմբագրել | խմբագրել կոդը]

Կատարման առնվազն 2 փուլ.

  1. Գործընթացը հեռացվում է պլանավորման բոլոր հերթերից, այսինքն, օպերացիոն համակարգը այլևս չի պլանավորում որևէ ռեսուրսներ հատկացնել գործընթացին,
  2. Գործընթացի կողմից սպառված ռեսուրսների վիճակագրության հավաքագրում, այնուհետև հիշողությունից հեռացնելով։

Գործընթացի ավարտման պատճառները.

  • Կանոնավոր ելք,
  • Արտահերթ կամ սխալ ելք,
  • Հիշողության պակաս,
  • Ծրագրի ժամկետի գերազանցում,
  • Հիշողության հատկացված տարածքի գերազանցում,
  • Անվավեր հրաման (ծրագրի տվյալները մեկնաբանվում են որպես պրոցեսորի հրահանգներ),
  • Պաշտպանության սխալ (ոչ արտոնված հրամանի կատարում),
  • Ծնողական գործընթացի դադարեցում
  • Մուտքագրման եւ ելքի սխալ,
  • Օպերատորի միջամտությունը։

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. Э. Танненбаум Современные операционные системы = Modern Operating Systems. — 2-е изд. — СПб.: Питер, 2002. — С. 59, 97. — 1040 с. — ISBN 5-318-00299-4
  2. AMD Corporation (December 2016). "Volume 2: System Programming" (PDF). AMD64 Architecture Programmer's Manual. AMD Corporation. Retrieved 2017 թ․ մարտի 25.

Գրականություն[խմբագրել | խմբագրել կոդը]