Իրական ժամանակի օպերացիոն համակարգեր

Վիքիպեդիայից՝ ազատ հանրագիտարանից

Իրական ժամանակի օպերացիոն համակարգ (անգլ.՝ Real-Time Operating System), օպերացիոն համակարգի տեսակ է։ Գոյություն ունեն այս եզրի տարբեր սահմանումներ։

Դրանցից ամենատարածվածներն են.

  • Օպերացիոն համակարգ, որում յուրաքանչյուր ծրագրի կատարման հաջողությունը կախված է ոչ միայն դրա՝ տրամաբանորեն ճիշտ լինելուց, այլ նաև այդ արդյունքի ստացման համար պահանջվող ժամանակից։ Եթե համակարգը չի կարող բավարարել ժամանակային սահմանափակումներին, ապա պետք արձանագրվի աշխատանքի խափանում[1]։
  • POSIX 1003.1 ստանդարտը տալիս է բնորոշում. «Իրական ժամանակը օպերացիոն համակարգերում դա օպերացիոն համակարգի` որոշակի ժամանակահատվածում սպասարկման պահանջված մակարդակ ապահովելու ունակությունն է»[2]։
  • Ինտերակտիվ համակարգեր։ Դրանք իրական ժամանակի օպերացիոն համակարգերի կատեգորիայի մեջ են մտցվել մարքեթինգային նկատառումներից ելնելով, և եթե ինտերակտիվ ծրագիրն անվանում են «իրական ժամանակում աշխատող, ապա դա ընդամենը նշանակում է , որ կիրառողի կողնից կատարված հարցումները մշակվում են մարդու կողմից աննկատելի ուշացումով[3]։

Խիստ և մեղմ իրական ժամանակի համակարգեր[խմբագրել | խմբագրել կոդը]

Իրական ժամանակի օպերացիոն համակարգերը հաճախ բաժանում են երկու տեսակի` իրական ժամանակի խիստ համակարգեր և իրական ժամանակի մեղմ համակարգեր[4]։ Այն օպերացիոն համակարգը, որը կարող է ապահովել իրական ժամանակի խնդրի կատարումը պահանջվող ժամանակահատվածում նույնիսկ վատագույն դեպքերում, կոչվում են խիստ իրական ժամանակի համակարգեր։

Այն օպերացիոն համակարգը, որը ոչ կարող է ապահովել իրական ժամանակի խնդրի կատարումը պահանջվող ժամանակահատվածում, կոչվում են մեղմ իրական ժամանակի օպերացիոն համակարգեր։

Խիստ իրական ժամանակի օպերացիոն համակարգերում համակարգի արձագանքները չեն ուշացվում, քանզի այդ ուշացումները կարող են բերել.

  • արդյունքների արդիականության կորստի
  • մեծ ֆինասական կորուստների
  • վթարների և աղետների

Եթե կրիտիկական իրավիճակների մշակում չի իրականացվում կամ դա ոչ բավարար արագությամբ է տեղի ունենում Խիստ իրական ժամանակի համակարգը կանգնեցնում է գործողությունը և արգելափակում է այն, որպեսզի չտուժի համակարգի մյուս մասերի հուսալիությունը։ Կտրուկ իրական ժամանակի համակարգերի օրինակ կարող են լինել վթարային անվտանգության համակարգերը, ինքնաթիռի ավտոմատ կառավարման համակարգերը և այլն[5]։

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

Խիստ և մեղմ իրական ժամանակի համակարգերի հիմնական տարբերությունը կարելի է բնութագրել հետևյալ կերպ. խիստ իրական ժամանակի համակարգերը երբեք ուշ չեն արձագանքում պատահարին, մեղմ համակարգերը չպետք է ուշացնեն արձագանքը[6]։

Ծրագրային ապահովվածության մեծամասնությունը հիմնված է «մեղմ» համակարգերի վրա։ Նմանատիպ համակարգերի համար բնութագրական են.

  • արտաքին պատահարներին արձագանքման երաշխավորվաժ ժամանակ
  • պրոցեսների պլանավորման խիստ ենթահամակարգ

Իրական ժամանանակի օպերացիոն համակարգի կիրառության դասական օրինակ կարող է ծառայել հոսքագծում աշխատող ռոբոտի կառավարումը, որը ժապավենից վերցնում է ինչ-որ մասեր։ Մասերը հաստատուն արագությամբ շարժվում են, իսկ ռոբոտի տրամադրության տակ շատ քիչ ժամանակ կա դրանք վերցնելու համար։ Եթե նա ուշանա, ապա այդ մասն արդեն հոսքագծի անհրաժեշտ հատվածում չի լինի, և հետևաբար աշխատանքը չի կատարվի, չնայած այն բանի որ ռոբոտը գտնվում է իր ճիշտ տեղում։ Եթե նա գործի ավելի արագ քան պետք է ապա մասը չի հասցնի մոտենալ և այն կարգելապակի դրա ճանապարհը։

Իրական Ժամանակի Օպերացիոն Համակարգերի Տարբերակիչ Գծերը[խմբագրել | խմբագրել կոդը]

Իրական Ժամանակի և սովորական ՕՀ-ների համեմատման աղյուսակ[5]

ОС իրական Ժամանակի ОС ընդհանուր նշանակության
Հիմնական խնդիրը Հասցնել արձագանքել սարքի վրա տեղի ունեցող պատահարին Օպտիմալ բաշխել համակարգչի ռեսուրները օգտվողների ու առաջադրանքների միջև
Ինչ ուղղությամբ է կողմնորոշված Արտաքին պատահարների արձագանքում Օգտվողի գործողությունների արձագանքում
Ում համար է նախատեսված Որակավորում ունեցող աշխատողի Միջին որակավորում ունեցող օգտվողի

Հիմնական սերվիսները[խմբագրել | խմբագրել կոդը]

Վերը նշված աբստրակտ մակարդակը ներկայացնում է Կիրառական ծրագրային ապահովվածության ծառայությունների հինգ հիմնական կատեգորիաները[7][8]։

  • Առաջադրանքների կառավարումը. Ծառայությունների ամենագլխավոր խումբն է։ Թույլ է տալիս հավելվածներ մշակողներին նախագծել ծրագրային արտադրանքները առանձին ծրագրային կտորների տեսքով, որոնցից յուրաքանչյուրը կարող է վերաբերել իր թեմատիկ ոլորտին, կատարել առանձին գործառույթ և ունենալ իր աշխատանքի համար իրեն հատկացված սեփական ժամանակային քվանտը։ Ծրագրի ամեն այդպիսի կտորը կոչվում է առաջադրանք։ Այս կատեգորիայի սերվիսները ընդունակ են գործի դնել ծրագրերը և դրանց տալ համապատասխան առաջնայնություն։ Այստեղ հիմնական սերվիսը առաջադրանքների պլանավորումն է։ Այն հսկում է ընթացիկ առաջադրանքների իրականացումը, գործի է դնում նորերը և հետևում է դրանց աշխատանքին ռեժիմին։
  • Հիշողության դինամիկ բաշխում. Իրական ժամանակի ՕՀ-ներից շատերի միջուկները (բայց ոչ բոլորինը) սատարում են սերվիսների այս կատեգորիային։ Այն թույլ է տալիս առաջադրանքներին "պարտք վերցնել" օպերատիվ հիշողության որոշակի հատվածներ ժամանակավոր օգտագործման համար։ Հաճախ այդ հատվածները հետագայում մի առաջադրանքից մյուսին են անցնում և դրա իրականացման հետևանքը միմյանց միջև մեծ քանակի տվյալների փոխանակումն է։
  • Ժամանակի Կառավարում. Քանի որ այս համակարգերը ունեն առաջադրանքների կատարման խիստ ժամանակային սահմանափակումներ, օպերացիոն համակարգերի միջուկի մեջ մտնում են սերվիսների մի խումբ, որոնք ապահովում են թայմերների կառավարումը ժամանակի սահմանափակումներին (որոնց ընթացքում պետք է կատարվի առաջադրանքը) հետևելու նպատակով։ Այս սերվիսները չափում և սահմանում են ժամանակի տարբեր ընդմիջումներ, և ստեղծում են միանգամյա և ցիկլիկ ժամացույցներ։
  • Առաջադրանքների միջը փոխհամագործակցություն և սինխրոնիզացիա։. Տվյալ խնբի սերվիսները թույլ են տալիս առաջադրանքներին իրար միջև ինֆորմացիա փոխանակել և ապահովում են դրանց անվտանգությունը։ Ինչպես նաև դրանք հնարավորություն են տալիս ծրագրի տարբեր սեկտորներին համաձայնեցնել իրենց աշխատանքը միմյանց միջև, որպեսզի մեծանա արդյունավետությունը։ Եթե բացառենք այս սերվիսները, ապա առաջադրանքները կսկսեն փոխանակավել աղավաղված ինֆորմացիայով և խոչընդոտ կդառնան հարևան առաջադրանքների կատարման համար։
  • Մուտքի և ելքի սարքերի հսկում. Այս խմբի սերվիսներն ապահովում են միասնական ծրագրային ինտերֆեյսի աշխատանքը, փոխհամագործելով բոլոր սարքերի դրայվերների հետ։

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

Իրական ժամանակի օպերացիոն համակարգերը իրենց զարգացման ընթացքում ստեղծվել են հետևյալ ճարտարապետությունների հիման վրա[1]։

  • Մոնոլիտ ճարտարապետություն. Օպերացիոն համակարգն իրենից ներկայացնում է մոդուլների համախումբ, որոնք փոխազդում են իրար հետ համակարգի միջուկի մեջ և կիրառական ծրագրային ապահովվածությանը ներկայացնում են ինտերֆեյս սարքերի դիմումների համար։ Այս սկզբունքի հիմնական թերությունը կայանում է դրա վարքի վատ կանխատեսելիության մեջ մոդուլների՝ իրար միջև փոխազդեցության դժվար լինելու պատճառով։
  • Բազմամակարդակ (շերտավոր) ճարտարապետություն. Կիրառական ծրագրային ապահովումը ունի մուտք դեպի սարքեր ոչ միայն համակարգի միջուկի և նրա սերվիսների միջոցով, այլև ուղղակիորեն։ Մոնոլիտ ճարտարապետության հետ համեմատած այսպիսի ճարտարապետությունը ապահովում է համակարգի արձագանքների կանխատեսելիության զգալի մակարդակ, ինչպես նաև տույլ են տալիս արագ դիմել ԿԾՓ-ին և սարքերին։ Գլխավոր թերությունը համարվում է բազմախնդրության բացակայությունը։
  • «Կլիենտ-սերվեր» ճարտարապետություն. Հիմնական սկզբունքը կայանում է նրանում, որ ՕՀ-ի սերվիսները ներկայացումը մակարդակի սերվերների տեսքով և կիրառական ծրագրերի ու սերվերների միջև հաղորդագրությունների դիսպետչերի ֆունկցիաների միջուկով կարատարումը։ Այս ճարտարապետության առավելություններն են.
  1. Բարձր հուսալիություն, քանի որ ամեն սերվիս առանձին հավելված է և ավելի հեշտ է դրանք գորցի դնել և գտնել սխալները,
  2. Ավելի լավ մասշտաբայնացում, քանի որ անպետք սերվիսները կարող են համակարգից հեռացվել առանց համակարգի աշխատանքին վնասելու,
  3. Ձախողումներն ավելի քիչ են տեղի ունենում։ Քանի որ ձախողված սերվիսներն նորից չեն գործի դրվում առանց համակարգի վերբեռնման։


Իրական ժամանակի օպերացիոն համակարգերի ճարտարապետության տեսակները
Монолитная архитектура
Уровневая (слоевая) архитектура
Архитектура «клиент–сервер»
Монолитная архитектура
Уровневая (слоевая) архитектура
Архитектура «клиент–сервер»

Առաջադրանքների պլանավորումը[խմբագրել | խմբագրել կոդը]

Իրական ժամանակի օպերացիոն համակարգերի մեծ մասը իրականացնում են առաջադրանքների պլանավորում հետևյալ սխեմայով[7]։ Ամեն առաջադրանքին տրվում է իրեն համապատասխան առաջնայնությունը։ Եթե երկու առաջադրանքներ պատրաստ են կատարվելու, բայց առաջինը տիրապետում է բարձր առայնայնությամբ իսկ երկրորդը՝ ցածր, ապա նախապատվությունը տրվում է առաջինին։ Երկրորդ առաջադրանքը կսկսի գործել առայինի ավարտվելուց հետո միայն։ Հնարավոր է մի իրավիճակ, երբ ցածր առաջնայնույամբ առաջադրանքն արդեն ընթացքի մեջ է, և հաղորդագրություն է ստացվում այլ, ավելի բարձր առաջնայնությամբ առաջադրանք պետք է կատարվի։ Դրա պատճառ կարող է լինել որոևե արտաքին ազդեցություն, օրինակ՝ կառավարվող ՕՀ-ի սարքի անջատիչի վիճակի փոփոխություն։ Այդ դեպքում ՕՀ-ն կգործի հետևյալ կերպ. ցածր առաջնայնությամբ առաջադրանքին թույլատրվում է, որ կատարվի մինչև ընթացիկ ասեմբլերային հրամանի վերջը։ Այնուհետև գործի է դրվում ավելի մեծ առաջնայնություն ունեցող առաջադրանքը, որի ավարտից հետո էլ սարունակվում է կիսատբ մնացածը։ Ամեն անգամ երբ համակարգը ինչ որ արտաքին պատահարի (դա կարող է լինել և ծրագրային և ապարատային) ազդանշան է ստանում, գործում է հատևյալ ալգորիթմով.

  1. Որոշում է, թե արդյոք ընթացիկ կատարվող առայադրանքը պետք է շարունակի աշխատել.
  2. Հաստատում է, թե որ առաջադրանքը պետք է հաջորդը գործի դրվի.
  3. Պահպանում է կանգնեցված առաջադրանքի կոնտեքստը (որպեսզի այն հետագայում շարունակի կատարվել կանգնեցված տեղից)
  4. Հաստատում է հաջորդ առաջադրանքի կոնտեքստը.
  5. Գործի է դնում այդ առաջադրանքը.

Ալգորիթմի այս հինգ քայլերը նաև անվանում են "առաջադրանքների փոխանջատիչ"։

Առաջադրանքների կատարումը[խմբագրել | խմբագրել կոդը]

Սովորական իրական ժամանակի ՕՀ-ներում առաջադրանքը կարող է գտնվել երեք հնարավոր վիճակներում.[9]

  1. առաջադրանքը կատարվում է;
  2. առաջադրանքը պատրաստ է կատարվելուն;
  3. առաջադրանքը արգելափակված է։

Ժամանակի մեծ մասում առաւջադրանքների հիմնական զանգվածը արգելափակված է։ Միայն մեկ առաջադրանք կարող է կատարվել կենտրոնական պրոցեսորի վրա ժամանակի ընթացիկ պահին։ Պարզագույն համակարգերում կատարվելու պատրաստ առաջադրանքների ցուցակը ինչպես կանոն շատ կարճ է այն կարող է բաղկացած լինել ոչ ավել քան երկու-երեք առաջադրանքներից։

Իրական ժամանակի օպերացիոն համակարգի ադմինիստրատորի հիմնական գործառույթը կայանում է առաջադրանքներ պլանավորող ծրագրերի կառուցումը։

Եթե կատարվելու պատրաստ առաջադրանքների ցուցակում վերջինից առկա է ոչ ավել քան երկու-երեք հատ, ապա ենթադրվում է որ բոլոր առաջադրանքները դասավորված են օպտիմալ հերթականությամբ։ Իսկ եթե լինում են այնպիսի իրավիճակներ, երբ ցուցակում առաջադրանքների քանակը գերազանցում է թույլատրված սահմանը, ապա առաջադրանքները տեսակավորվում են ըստ իրենց առաջնայնությունների[9]։

Պլանավորման ալգորիթմներ[խմբագրել | խմբագրել կոդը]

Ներկայումս էֆեկտիվ պլանավորման խնդրի լուծման համար առավել ինտենսիվ զարգանում են երկու մոտեցումներ[10]։

  • Պլանավորման ստատիկ ալգորիթմներ (RMS, Rate Monotonic Scheduling). Առաջնայնությունը առաջադրանքին է տրվում մինչ դրա կատարվելը։ Գերակայաությունը տրվում է ամենակարճ կատարման ժամանակ պահանջող առաջադրանքներին։
  • Դինամիկ պլանավորման ալգորիթմներ (EDF, Earliest Deadline First Scheduling). Առաջադրանքներին առաջնայնությունը տրվում է դինամիկ կերպով։ Առաջնայնությունը տրվում է առաջադրանքներին ըստ իրեն կատարման երկարությամբ։

Մեծ բեռնումների ծամանակ EDF համակարգն ավելի արդյունավետ է քան RMS-ը։

Ռեսոուրսների բաշխվածության և առաջադրանքների միջև փոխազդեցություն[խմբագրել | խմբագրել կոդը]

Բազմախնդիր համակարգերում անհրաժեշտություն է առաջանում բաշխել համակարգչի ռեսուրսները։ Երկու և ավել պրոցեսների միաժամանակյա դիմումը հիշողության ինչ-որ հատվածին կամ այլ ռեսուրսին իրենից որոշակի վտանգ է ներկայացնում։ Գոյություն ունի այս խնդրի լուծման երեք եղանակ[9]։

  • Ընդհատումների ժամանակավոր արգելափակում
  • Կրկնակի սեմաֆորներ
  • Ազդանշանների ուղարկում

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

Միապրոցեսորաի համակարգերում լավագույն որոշումը դա միջուկի ռեժիմում աշխատող հավելվածներն են[9]։, որոնց թույլ է տրված ընդհատումների արգելափակումը։ Քանի դեռ ընդհատումն արգելափակված է հավելվածն օգտագործում է պրոցեսի ռեսուրսները միանձնորեն և ոչ մի այլ առաջադրանք կամ ընդհատում չի կարող կատարվել։ Այսպես պաշտպանվում են բոլոր կրիտիկական ռեսուրսները։ Այն բանից հետո, երբ ծրագիրը վերջացնի կրիտիկական գործողությունները, այն պետք է ապաարգելափակի ընդհատումները, եթե այդպիսիք կան։ Ընդհատումների ժամանակավոր արգելափակումը թույլատրվում է միայն այն ժամանակ, երբ կրիտիկական սեկցիայի կատարման ամենաերկար ժամանակահատվածը ավելի քիչ է քան ընդհատման արձագանքի թույլատրված ժամանակը։ Սովորաբար պաշտպանման այս մեթոդն օգտագործվում է միայն այն ժամանակ, երթ կրիտիկական կոդի երկարությունը չի գերազանցում մի քանի տողը և չի պարունակում ցիկլներ։ Այս մեթոդն իդեալական կիրառություն ունի ռեգիստրների պաշտպանության մեջ։

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

Հիշողության առանձնացում[խմբագրել | խմբագրել կոդը]

Իրական ժամանակի ՕՀ-ներում հիշողության առանձնացման խնդիրներին ավելի մեծ նշանակություն է տրվում քան ընդհանուր նշանակության ՕՀ-ներում։

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

Պարզ ալգորիթմը ֆիքսված երկարությամբ հատվածներով հիշողության հետ լավ է աշխատում ոչ բարդ համակարգերում։

Այս ալգորիթմը նաև ֆունկցիոնալ է նաև սովորական համակարգերում, հատկապես այն ժամանակ, երբ մի պրոցեսորի մի միջուկով հիշողության որևէ հատվածի մշակման ժամանակ մեկ այլ հատված մշակվում է մյուս միջուկով Այդպիսի օպտիմիզացվաց իրական ժամանակի համակարգերում ինչպիսիք ենUnison Operating System-ը կամ DSPnano RTOS-ը, ապահովում են նշված կարողությունը։

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

  • Зыль С. Операционная система реального времени QNX: от теории к практике. — 2-е изд. — СПб.: БХВ-Петербург, 2004. — 192 с. — ISBN 5-94157-486-Х
  • Зыль С. QNX Momentics. Основы применения. — СПб.: БХВ-Петербург, 2004. — 256 с. — ISBN 5-94157-430-4
  • Кёртен Р. Введение в QNX/Neutrino 2. — СПб.: Петрополис, 2001. — 512 с. — ISBN 5-94656-025-9
  • Ослэндер Д. М., Риджли Дж. Р., Рингенберг Дж. Д. Управляющие программы для механических систем: Объектно-ориентированное проектирование систем реального времени. — М.: Бином. Лаборатория знаний, 2004. — 416 с. — ISBN 5-94774-097-4

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

  1. 1,0 1,1 Е. Горошко. Операционные системы реального времени Արխիվացված 2009-04-13 Wayback Machine
  2. С. Золотарев. Операционные системы реального времени для 32-разрядных микропроцессоров Արխիվացված 2012-02-20 Wayback Machine
  3. В. Федунин. Международная стандартизация интерактивных систем в вещании
  4. И. Б. Бурдонов, А. С. Косачев, В. Н. Пономаренко. Операционные системы реального времени п. 1. Введение: Особенности операционных систем реального времени
  5. 5,0 5,1 А. А. Жданов. Операционные системы реального времени Արխիվացված 2017-11-12 Wayback Machine
  6. Е. Хухлаев. Операционные системы реального времени и Windows NT Արխիվացված 2009-12-13 Wayback Machine
  7. 7,0 7,1 D. Kalinsky. «Basic concepts of real-time operating systems». Արխիվացված է օրիգինալից 2013 թ․ հունվարի 28-ին.(անգլ.)
  8. А. А. Блискавицкий, С. В. Кабаев. Операционные системы реального времени (обзор) Արխիվացված 2007-12-15 Wayback Machine
  9. 9,0 9,1 9,2 9,3 Статья «Real-time operating system»(անգլ.)
  10. И. Б. Бурдонов, А. С. Косачев, В. Н. Пономаренко. Операционные системы реального времени п. 1.2. Планирование, приоритеты

Արտաքին հղումներ[խմբագրել | խմբագրել կոդը]