Բազմախնդրություն

Հաշվողական համակարգերում **բազմախնդրությունը** մեթոդ է, որի ժամանակ բազմաթիվ առաջադրանքներ, նաև հայտնի որպես պրոցեսներ, համատեղ օգտագործում են մշակման համար անհրաժեշտ բոլոր ընդհանուր ռեսուրսները, ինչպես օրինակ CPU. Այն դեպքում, երբ համակարգիչն ունի մեկ պրոցեսոր, համարվում է, որ ընդամենը 1 խնդիր է *կատարվում* ժամանակի ցանկացած պահին, այսինքն պրոցեսորը ակտիվորեն կատարում է հրահանգներ այդ առաջադրանքի իրականացման համար։
 
Բազմախնդրությունը ծրագրավորման մեջ լուծում է նաև պլանավորման խնդիրները, այսինքն, երբ տվյալ առաջադրանքները կարող են կատարվել ժամանակի ցանկացած պահին, իսկ մնացած սպասման վիճակում գտնվող խնդիրները սպասում են իրենց հերթին։ Պրոցեսորի ակտը, ըստ նշանակության փոփոխության, մի առաջադրանքից մյուսին կոչվում է կոնտեքստի փոխանջատում։
Երբ կոնտեքստային փոխանջատումները հաճախ են տեղի ունենում, ապա զուգահեռության հետ կապված շփոթություն է առաջանում։
 
Նույնիսկ մեկից ավելի պրոցեսորներ ունեցող համակարգիչների դեպքում, (հայտնի մուլտպրոցեսորային մեխանիզմներ)անվանումով, բազմախնդրությունը թույլ է տալիս ավելի մեծ թվով առաջադրանքներ գործարկել, քան պրոցեսորների քանակն է։
Օպերացիոն համակարգերը կարող են ընդունել տարբեր պլանավորման ստրատեգիաներ, որոնք սովորաբար բաժանվում են հետևյալ կատեգորիաների՝

* *[[Բազմածրագրային]]* համակարգերում, կատարվող առաջադրանքը միշտ աշխատում է այնքան ժամանակ, քանի դեռ այն իրագործում է գործողություններ, որոնք պահանջում են արտաքին իրադարձության սպասում (օրինակ ժապավենից ընթերցանություն) կամ այնքան ժամանակ, քանի դեռ համակարգչի պլանավորման համակարգը հարկադրաբար բաժանում է կատարվող առաջադրանքը կենտրոնական պրոցեսորից։ Բազմածրագրային համակարգերը ստեղծված են, որպեսզի առավելագույնի հասցնեն պրոցեսորի օգտագործումը։
* *[[Ժամանակի բաշխիչ]]* համակարգերում, կատարվող առաջադրանքից պահանջվում է հրաժարվել պրոցեսորից, կամավոր կամ արտաքին իրադարձության միջոցով, ինչպես օրինակ սարքավորումների ընդհատումը. Ժամանակի բաշխիչ համակարգերը նախատեսված են, որպեսզի թույլատրեն մի քանի ծրագրերի միաժամանակյա կատարում։ 'Ժամանակի բաշխում'արտահայտությունը սովորաբար օգտագործվում է, որպեսզի նկարագրի այն համակարգիչները, որոնք բաժանում են տեղեկատվության ներածման և արտածման սարքերը տերմինալների առումով, ըստ ինտերակտիվ օգտվողների, ինչպես օրինակ IBM-ի TSO, և VM/CMS տարբերակները։
* *[[Իրական ժամանակի հաշվողական|Իրական ժամանակի]]* համակարգերում, որոշ առաջադրանքներ, որոնք սպասման վիճակում են գտնվում, երաշխավորված են, որ կընդունվեն պրոցեսորի կողմից, երբ տեղի է ունենում տվյալ արտաքին իրադարձությունը։ Իրական ժամանակի համակարգերը նախատեսված են ղեկավարելու մեխանիկական սարքերը, այնպիսիք, ինչպիսիք են արդյունաբերական ռոբոտները, որոնք պահանջում են ճիշտ ժամանակին մշակում։

*Ժամանակի բաշխիչ* տերմինը շատ չի օգտագործվում, քանի որ փոխարինվել է *բազմախնդրություն* տերմինով, որն էլ կապված է անհատական համակարգիչների ի հայտ գալով։ Վերջիններիս թիվը ավելին է, քան բաժանող ինտերակտիվ համակարգերինը։

## Բազմածրագրավորում

Հաշվողական համակարգի վաղ ժամանակաշրջանում պրոցեսորի ժամանակը շատ թանկ արժեր, իսկ արտաքին սարքերը շատ դանդաղագործ էին։ Երբ համակարգիչը մի որևէ ծրագիր էր աշխատեցնում, որը պահանջում էր մուտք դեպի արտաքին սարքեր, կենտրոնական վերամշակման միավորը (CPU) պետք է դադարեցներ ծրագրային սարքավորումների աշխատանքը, մինչև արտաքին սարքերը կմշակեին տվյալները։

Առաջին համակարգիչը, որն օգտագործեց բազմածրագրային համակարգեր, բրիտանական *[[LEO (համակարգիչ)#Ծրագրեր և Իրավահաջորդներ|ԼԵՈ III]]* համակարգիչներն էին, որ պատկանում էին Ջ. Լեոնսին և Ընկերությանը. Մի քանի տարբեր ծրագրային փաթեթներ բեռնված էին համակարգչի հիշողության մեջ և նրանցից առաջինը սկսում է աշխատել։ Երբ առաջին ծրագիրը հասանելի է դառնում արտաքին սարքերին, այս ծրագրի համատեքստը արդեն հետ է պահպանվում և հիշողությունում գտնվող հաջորդ ծրագիրը հնարավորություն է ստանում կատարվելու։ Այս պրոցեսը շարունակվում է այնքան ժամանակ, մինչև բոլոր ծրագրերի աշխատանքներն ավարտվում են։

Բազմածրագրավորումը ոչ մի երաշխիք չի տալիս, որ ծրագիրը կաշխատի ճիշտ ժամանակին։ Իսկապես, ամեն առաջին ծրագիր կարող է ժամերով շատ լավ աշխատել, առանց մուտքի դեպի արտաքին սարքեր։ Որքան էլ, որ չլինեն օգտվողներ, որոնք սպասում են ինտերակտիվ տերմինալի, ոչ մի խնդիր չի առաջանում։ Օգտվողները քարտերի մի փունջ են հանձնում օպերատորին և ժամեր անց հետ են վերադառնում տպագրված արդյունքների համար։
Բազմածրագրավորումը մեծապես կրճատում է սպասման ժամանակը, երբ բազմաթիվ տվյալների փաթեթներ են մշակվում։

## Համատեղ բազմախնդրություն/ժամանակի բաշխիչ
Երբ համակարգչի օգտագործումը փաթեթային ռեժիմից փոխվել է ինտերակտիվ ՝ փոխադարձ ռեժիմի, բազմածրագրավորումը արդեն հարմար մոտեցում չէ։ Յուրաքանչյուր օգտվող կցանկանար տեսնել իր ծրագրի աշխատանքը համակարգչում այնպես, կարծես դա միակն է համակարգչում։ Ժամանակի բաշխման օգտագործումը սա հնարավոր դարձրեց այն որակավորմամբ, որ համակարգիչը այնքան արագագործ չի լինի ամեն մի օգտվողի համար, որքան, որ այն իսկապես կլիներ, եթե կատարեր միայն մեկ օգտվողի ծրագիրը։
 
Վաղ բազմախնդրային համակարգերը օգտագործում էին այնպիսի դիմումներ, որոնք ինքնակամ զիջում էին ժամանակը միմյանց։ Այս մոտեցումը, որն օժանդակում էին բազմաթիվ համակարգչային օպերացիոն համակարգեր, այսօր հայտնի է որպես համատեղ բազմախնդրություն։ Չնայած այն հիմա հազվադեպ է օգտագործվում ավելի մեծամասշտաբ համակարգերում, այդուհանդերձ համատեղ բազմախնդրությունը սխեմաների պլանավորում էր իրենից ներկայացնում, որն օգտագործվում էր Microsoft Windowsում (մինչև Windows 95 և Windows NT) և Mac OSում (մինչև Mac OS X) և այսպիսով հնարավոր էր լինում միաժամանակ գործարկելու բազմակի դիմումներ։ Windows 9xը նույնպես օգտագործում էր համատեղ բազմախնդրությունը, բայց միայն 16 կարգանի դիմումների համար, այնպես, ինչպես Mac OS X-ի pre-Leopard PowerPC տարբերակները օգտագործեցին դրանք Classic դիմումների համար։ NetWare ցանցային օպերացիոն համակարգերը օգտագործում էին համատեղ բազմախնդրությունը մինչև NetWare 6.5: Համատեղ բազմախնդրությունը այսօր էլ դեռ օգտագործվում է RISC OS համակարգերում։
 
Քանի որ համատեղ բազմախնդրային համակարգը հիմնված է ամեն մի պրոցեսի վրա, որը կանոնավոր կերպով ապահովում է ժամանակ համակարգում գտնվող այլ պրոցեսների համար, այդ դեպքում մի որևէ թույլ կազմակերպված պրոցես կարող է ծախսել պրոցեսորի ամբողջ ժամանակը իր վրա կամ բերել նրան, որ ամբողջ համակարգը դադարի աշխատել:Սերվերային միջավայրում սա վտանգավոր է, քանի որ ողջ ցանցը դառնում է փխրուն և խոցելի։ Բոլոր ծրագրերը պետք է գնահատված և հստակեցված լինեն թեստային միջավայրում օգտագործվելու համար, նախքան տեղադրվելը գլխավոր սերվերի վրա, հակառակ դեպքում սերվերի ձախողված ծրագիրը դանդաղ է աշխատում, կամ էլ ամբողջ ցանցը ձախողվում է։
Չնայած համատեղ բազմախնդրային համակարգերի նախագծման և իրականացման բարդություններին, հարկադրված ժամանակի, իրական ժամանակի ներդրված համակարգերը ( ինչպես օրինակ տիեզերական ապարատները ) հաճախ են իրագործվում ` օգտագործելով այս նմուշը։ Սա թույլ է տալիս շատ հուսալի, դետերմինացված հսկողություն սահմանել բարդ իրական ժամանակի արդյունքների վրա, օրինակ շարժիչների հրդեհվելը անսահման տիեզերքում դասընթացի ուղղումների համար։

## Առաջնահերթ բազմախնդրություն/ժամանակի բաշխիչ

Առաջնահերթ բազմախնդրությունը թույլ է տալիս համակարգչային համակարգերին ավելի հուսալի երաշխավորել, թե յուրաքանչյուր պրոցեսի հերթական որ"կտորն" է տվյալ պահին աշխատում։ Այն նաև թույլ է տալիս համակարգին արագ որոշել կարևոր արտաքին իրադարձությունները, ինչպիսիք են օրինակ մուտքային տվյալները, որոնք կարող են պահանջել տվյալ կամ մեկ ուրիշ պրոցեսի անհապաղ ուշադրություն։

Օպերացիոն համակարգերը մշակվեցին ` օգտվելու ապարատային այս հնարավորություններից և աշխատեցնել մի քանի պրոցեսներ ըստ առաջնայնության։ Օրինակ, առաջնահերթ բազմախնդրությունը իրականացվել էUnixի վաղ տարբերակներում 1969 թվականին, և դարձել է ստանդարտ Unix and Unix-ի նմանությամբ օպերացիոն համակարգերում, ներառյալ Linuxը, Solarisը և BSD-ն իր ածանցյալների հետ։

Ցանկացած ժամանակ պրոցեսները խմբավորվում են 2 կատեգորիաներում։ Նրանք, որոնք սպասում են մուտքի կամ ելքի (հայտնի որպես "I/O սահման"), և նրանք, որոնք ամբողջությամբ օգտագործում են պրոցեսորը։("CPU սահման"): Պարզ համակարգերում ծրագրային ապահովումը հաճախ լինում է հարցումային "poll", կամ "busywait", հարցված մուտքի սպասման ժամանակ (ինչպես օրինակ սկավառակը, ստեղնաշարը կամ ցանցային մուտքերը)։ Այս ընթացքում համակարգը չի իրականացնում օգտակար աշխատանք։ Ընդհատումների և առաջնահերթ բազմախնդրության ի հայտ գալով I/O սահմանափակ պրոցեսները կարող են "արգելափակվել", կամ սպասման մեջ դրվել, մինչև անհրաժեշտ տվյալների ի հայտ գալը, թույլ տալով մնացած պրոցեսներին օգտագործել պրոցեսորը։ Երբ պահանջվող տվյալները հայտնվում են, առաջանում է ընդհատում և արգելափակված պրոցեսները կարող են ժամանակին վերադառնալ կատարման։

Վաղ առաջնահերթ բազմախնդրային օպերացիոն համակարգը, որը մատչելի էր դարձել սովորական օգտվողների համար Sinclair QDOS-ն է Sinclair QL-ի հիման վրա, որը լույս տեսավ 1984 թվականին, բայց շատ քչերը կարողացան գնել այդ մեքենան։ Commodore-ի հզոր Amiga տեխնոլոգիան, որը հրապարակվեց հաջորդ տարի, առաջին ֆինանսական առումով հաջողակ համակարգիչն էր, որն օգտագործեց այդ տեխնոլոգիան և նրա մուլտիմեդիա հնարավորությունները դարձնում էին նրան անհատական համակարգիչների ժամանակակից բազմախնդրության հստակ նախահայրը։ 1990-ական թվականների սկզբին Microsoftը առաջնահերթ բազմախնդրությունը դարձրեց իր օպերացիոն համակարգերի հիմնական բնութագրիչը, այն ժամանակ, երբ զարգանում էին Windows NT 3.1-ը և հետո Windows 95-ը։ Ավելի ուշ այն ընդունվեց Apple Macintosh Mac OS 9.x-ի կողմից որպես լրացուցիչ API, այսինքն դիմումները կարող էին ծրագրավորվել՝ օգտագործելով առաջնահերթ կամ կոոպերատիվ մոդելները և ավելի վաղ դիմումները դառնում էին կոոպերատիվ բազմախնդրային միակ պրոցեսի շրջանակներում։ Mac OS X-ը, լինելով Unix-ին նման համակարգ, օգտագործում է առաջնահերթ բազմախնդրությունը, բոլոր առաջնային դիմումների համար, չնայած Classic դիմումները համատեղ բազմախնդրային են Mac OS 9 միջավայրում, որն աշխատում է ինչպես OS X պրոցեսը (և ենթակա է առաջնայնության, ինչպես մյուս OS X պրոցեսները)։

Նման մոդելները օգտագործվում են Windows 9x և Windows NT ընտանիքի համակարգերում, որտեղ առաջնային 32-բիտանի դիմումները առաջնահերթ բազմախնդրային են, իսկ ավելի վաղ 16-բիտանի դիմումները Windows 3.x համատեղ բազմախնդրային են միակ գործընթացի շրջանակներում, չնայած NT ընտանիքում հնարավոր է ստիպել 16 բիտանի դիմումներին աշխատել որպես առանձին առաջնահերթ բազմախնդրային պրոցես։ Windows-ի 64-բիտանի հրատարակությունները, և x86-64, և Itanium տարբերակների համար, այլևս չեն օժանդակում ավելի հին 16 կարգանի դիմումներին և այսպիսով ապահովում են առաջնահերթ բազմախնդրություն բոլոր օժանդակ դիմումների համար։

## Իրական ժամանակ
Բազմախնդրության պատճառներից է համարվում իրական ժամանակի հաշվողական համակարգերի նախագծումը, որտեղ կան մի շարք հնարավոր իրար հետ կապ չունեցող արտաքին գործողություններ, որոնց անհրաժեշտ է վերահսկել միակ պրոցեսորային համակարգի միջոցով։
Նման համակարգերում հիերարխիկ ընդհատման համակարգը զուգակցվում է առաջնահերթ պրոցեսի հետ, որպեսզի հիմնական գործողություններին տրվեն առկա պրոցեսի ժամանակի ավելի մեծ հատված։

## Բազմահոսքայնություն
Քանի որ բազմախնդրությունը մեծապես բարելավեց համակարգիչների արտադրողականությունը, ծրագրավորողները սկսեցին աշխատեցնել ծրագրերը որպես համատեղ պրոցեսների հավաքածուներ (օրինակ մի պրոցեսը հավաքագրում է մուտքային տվյալները, մեկ այլ պրոցես մշակում է մուտքային տվյալները, մյուսը դուրս է գրում արդյունքները սկավառակի վրա)։ Ինչևիցե, պահանջվում են որոշակի սարքեր, որպեսզի թույլատրեն պրոցեսներին արդյունավետ փոխանակել տվյալները։

Հոսքերի հիմնական գաղափարն այն է, որ պրոցեսների համատեղման ամենաարդյունավետ ճանապարհը տվյալների փոխանակման համար, դրանց ողջ հիշողության տարածքի բաժանումն է։ Այսպիսով, հոսքերը հիմնականում պրոցեսներ են, որոնք իրականանում են հիշողության նույն կոնտեքստում։ Հոսքերը բնութագրվում են որպես *թեթևքաշային*, քանի որ հոսքերի միջև փոփոխությունները չեն բերում հիշողության կոնտեքստի փոփոխությանը։

Մինչ հոսքերը պլանավորվում էին ըստ առաջնահերթության, որոշ օպերացիոն համակարգեր ապահովում էին հոսքերի մի տարբերակ, *[[Fiber (համակարգչային գիտություն)|fiber]]* անունով, որոնք պլանավորվում էին կոոպերատիվ օպերացիոն համակարգերում։ Նրանք, որոնք չէին ապահովում հոսքերի Fiber տեսակը, ծրագրային դիմումները կարող էին իրականացնել իրենց սեփական fiber հոսքերը՝ օգտագործելով կրկնակի կանչերը, աշխատողի գործառույթներից ելնելով։Fiber-ները ավելի թեթևքաշային են, քան հոսքերը և մի փոքր ավելի հեշտ է աշխատել դրանց հետ, չնայած դրանք հակված են կորցնելու բազմաթիվ պրոցեսորներով մեքենաների հոսքերի որոշ կամ բոլոր առավելությունները։

Որոշ համակարգեր ուղղակիորեն աջակցում են բազմահոսքայնությանը համակարգչային տեխնիկայում։

## Հիշողության պաշտպանություն

Երբ հիշողությունում առկա են բազմաթիվ ծրագրեր, մի որևէ վատ ձևակերպված ծրագիր կարող է (պատահական կամ միտումնավոր) վերագրանցել հիշողությունը, որը պատկանում է մեկ այլ ծրագրի, կամ նույնիսկ օպերացիոն համակարգի։

Ուստի օպերացիոն համակարգը սահմանափակում է կատարվող ծրագրի հիշողության մատչելիությունը։ Ծրագիրը, որը փորձում է մատչելի դարձնել հիշողությունը իր թույլատրելի սահմաններից դուրս, անմիջապես կդադարեցվի նախքան կկարողանա փոխել մեկ այլ պրոցեսի պատկանող հիշողությունը։

Մեկ այլ կարևոր նորամուծություն էր արտոնության մակարդակների գաղափարը։ Ստորին արտոնությամբ առաջադրանքներին չի թույլատրվում հիշողության մատչելիության որոշակի տեսակներ և չի թույլատրվում կատարել որոշակի հրահանգներ։ Երբ առաջադրանքը փորձում է կատարել մի որևէ արտոնյալ գործողություն, առաջանում է ծուղակ և մի որևէ վերահսկիչ ծրագրի, որը կատարվում է ավելի բարձր մակարդակում, թույլատրվում է որոշել, թե ինչպես գործել այդ դեպքում։

## Հիշողության փոխանակում
Փոխանակման ֆայլերի կամ փոխանակման բաժանմունքների օգտագործումը օպերացիոն համակարգի համար մի ճանապարհ են՝ տրամադրելու ավելի մեծ հիշողություն, քան ֆիզիկապես կարող է հասանելի լինել պահելով հիմնական հիշողությունից մասնաբաժիններ երկրորդական պահեստում։ Մինչ բազմախնդրությունը և հիշողության փոխանակումը 2 ամբողջովին իրար հետ կապ չունեցող տեխնիկաներ են, սակայն դրանք շատ հաճախ օգտագործվում են միասին, քանի որ հիշողության փոխանակումը թույլատրում է ավելի շատ առաջադրանքներ բեռնել միաժամանակ։ Սովորաբար բազմախնդրային համակարգը թույլ է տալիս մեկ այլ պրոցեսի կատարվել, երբ ընթացքի մեջ գտնվող պրոցեսը հանդիպում է մի կետի, որտեղ այն ստիպված է սպասել, մինչև երկրորդական պահեստից կվերաբեռնվի հիշողության մի որոշակի մասնաբաժին։

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

Մեծամասշտաբ համակարգերը երբեմն կառուցվել են կենտրոնական պրոցեսոր(ներ)ով և մի շարք այլ I/O պրոցեսորներով, որոնք անհամաչափ բազմամշակման տեսակ են։

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

## Ծանոթագրություններ

Կատեգորիա:Օպերացիոն համակարգ
Կատեգորիա:Ծրագրավորում
Կատեգորիա:Զուգահեռ հաշվարկ