Ծրագրավորողը և օպերացիոն համակարգը։ Մաս I

Շատ ծրագրավորողներ չգիտեն, թե ինչի համար է օպերացիոն համակարգը, ինչ դեր ունի այն ծրագրի աշխատանքում և ինչպես են իրենք օգտագործում օպերացիոն համակարգի տրամադրած ռեսուրսներն ու ֆունկցիոնալությունը՝ իրենք էլ դա չգիտակցելով։ Այսօր մենք մի մանրակրկիտ էքսկուրս կկատարենք օպերացիոն համակարգերի աշխարհ, որի ընթացքում ընթերցողը կստանա վերը բերված հարցերի բավական լիարժեք պատասխաններ։

Որպես օրինակ կդիտարկենք հետևյալ ծրագրի հատվածը։

int fd = open(“/home/me/file1", O_RDONLY);

read(fd, buf, 10);

Բերված կոդը գրված է POSIX ստանդարտով։ Բացվում է /home/me/file1 ֆայլը և կարդացվում է առաջին 10 բայթը։

Սկսենք նրանից, որ այս օրինակում օգտագործված ֆունկցիաները հայտարարված և իրականացված են C լեզվի ստանդարտ գրադարանում, և դրանցից օգտվելու համար հարկավոր է այդ գրադարանի համապատասխան ֆայլը ավելացնել ձեր ծրագրին ՝ #include դիրեկտիվայի միջոցով, այնուհետ պետք է գրադարանը կցել ձեր ծրագրի օբյեկտային ֆայլին՝ linker-ի համապատասխան պարամետրերի միջոցով։ Սակայն այդ գործողությունների կարիքը հաճախ չի լինում, քանի որ կոմպիլյատորն ինքն է անում դրանք։ Լավ ծրագրավորողը պետք է ամենայն մանրամասնությամբ պատկերացնի, թե ինչ է կատարվում իր գրած կոդի հետ կոմպիլյացիայի ժամանակ, իսկ այնուհետև՝ ծրագրի բեռնման և աշխատանքի ընթացքում։

Անդրադառնանք վերը բերված օրինակում օգտագործված ֆունկցիաների էությանը։ Դրանք իրենցից ներկայացնում են համակարգային ֆունկցիաներ (system calls), այսինքն դրանք օպերացիոն համակարգի կողմից ծրագրին և ծրագրավորողին տրամադրվող ինտերֆեյսի մաս են կազմում։ Գրեթե անհնար է մշակել որևէ իմաստալից ծրագիր, որը չի օգտվում այդպիսի ինտերֆեյսային ֆունկցիաներից։ Ամեն մի օպերացիոն համակարգ տրամադրում է այդպիսի մի քանի հարյուրից մինչև հազարավոր ֆունկցիաներ, որոնց միջոցով իրականացվում է վիրտուալ մեքենան։

Այսպիսով՝ կանչվեց ֆայլ բացելու ֆունկցիան։ Այն պետք է դիմի օպերացիոն համակարգին՝ օգտվելով պրոցեսորի կողմից տրամադրվող գործիքներից։ Intel IA32 ճարտարապետության մեջ այդ գործիքը կոչվում է կանչի դարպաս (call gate)։ Այն, ըստ էության, հանդիսանում է ծրագրային ընդհատումից (software interrupt) և դրա մշակող ֆունկցիայից բաղկացած մի համախումբ։ Մշակող ֆունկցիան գտնվում է օպերացիոն համակարգի միջուկում և համակարգի բեռնման առաջին քայլերից մեկը հենց այդպիսի մշակող ֆունկցիաների գրանցումն է պրոցեսորի համապատասխան ռեգիստրներում։ Այս ամենի մասին առվել հիմնարար գիտելիք կարելի է ձեռք բերել ԷՀՄ ճարտարապետության մասին գրքերից, կամ՝ մասնակցելով այդպիսի դասընթացների։

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

Այդ կանչվող ֆունկցիան հանդիսանում է վիրտուալ ֆայլային համակարգի մաս։ Վիրտուալությունը կայանում է նրանում, որ այս մակարդակում տեղի ունեցող գործընթացները կախված չեն ֆայլային համակարգի կոնկրետ իրականացումից։ Ինչ է դա նշանակում։ Ամեն մի լուրջ օպերացիոն համակարգ ունենում է մի քանի ֆայլային համակարգերի հետ աշխատելու հնարավորություն։ Օրինակ՝ Windows համակարգը կարող է աշխատել FAT32, NTFS, ExFAT և էլի մի քանի ֆայլային համակարգերի հետ։

Այս մակարդակում պետք է լուծել այն հարցը, թե կոնկրետ ո՞ր ֆայլային համակարգի մոդուլին է պետք ուղղել ֆայլ բացելու այս հարցումը։ Այդ նպատակով պետք է վերլուծել բացելու ենթակա ֆայլի ճանապարհը։ Պետք է վերջից կտրատելով գալ սկիզբ և ամեն քայլում ստուգել, թե արդյո՞ք այդ պանակը հանդիսանում է ֆայլային համակարգի միացման հանգույց (mount point)։ Ենթադրենք, որ այս դեպքում /home պանակը հանդիսանում է հենց այդպիսին։ Ունենալով դա, կարելի է գտնել այն կրիչը և նրա վրա գտնվող բաժնի (partition) համարը, որը պարունակում է անհրաժեշտ ֆայլային համակարգը։ Այդ բաժանումները հիմնականում արվում են օպերոցիոն համակարգի տեղադրման ընթացքում։ Կրիչը բաժանվում է մի քանի մասերի, որոնք ստանում են կոնկրետ նշանակություն՝ /boot, /home, swap area և այլն։ Պարզելու համար, թե կոնկրետ ինչ ֆայլային համակարգ է այդ հատվածի վրա, պետք է կարդալ դրա սուպերբլոքը (superblock)։ Այն միշտ հանդիսանում է 1 համարով բլոքը։ Այս ամենի մասին առավել մանրամասն ինֆորմացիա կարելի է ստանալ ուսումնասիրելով ֆայլային համակարգերի մասին համապատասխան գրականութուն, կամ օպերացիոն համակարգերի մասին գրքեր կամ դասընթացների նյութեր։

Բլոքը կարդալու համար հարկավոր է դիմել համապատասխան սարքի դրայվերին․․․

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

Շարունակելի․․․