Кіріспе
Нақты уақыт операциялық жүйесі (RTOS) – уақыт шектеулері қатаң белгіленген деректер мен оқиғаларды өңдейтін операциялық жүйе (ОЖ). RTOS, Unix сияқты уақытты бөлісе пайдаланатын операциялық жүйелерден өзгеше, жүйе ресурстарын жоспарлаушы, деректер буферлері немесе көп тапсырмалы немесе көп бағдарламалау орталарында міндеттерге белгілі басымдықтар тағайындау арқылы басқарады. Өңдеу уақытының талаптарын толыққанды түсініп, оларды тек ең төменгі шек ретінде емес, нақтылай білу қажет. Барлық өңдеу белгіленген шектеулер ішінде орындалуы керек. Нақты уақыт операциялық жүйелері оқиғаларға ден қойып жұмыс істейді және үзіліске сезімтал, яғни ОЖ бәсекелес міндеттердің басымдығын қадағалай алады және міндеттердің басымдығын өзгерте алады. Оқиғаларға ден қойып жұмыс істейтін жүйелер міндеттерді олардың басымдығына қарай ауыстырады, ал уақытты бөлісе пайдаланатын жүйелер міндеттерді сағаттан келетін сигналдарға қарай ауыстырады.
A real time operating system (RTOS) is an operating system (OS) for real time computing applications that processes data and events that have critically defined time constraints. An RTOS is distinct from a time sharing operating system, such as Unix, which manages the sharing of system resources with a scheduler, data buffers, or fixed task prioritization in a multitasking or multiprogramming environments. Processing time requirements need to be fully understood and bound rather than just kept as a minimum. All processing must occur within the defined constraints. Real time operating systems are event driven and preemptive, meaning the OS can monitor the relevant priority of competing tasks, and make changes to the task priority. Event driven systems switch between tasks based on their priorities, while time sharing systems switch the task based on clock interrupts.
Сипаттамалары
RTOS-тің маңызды ерекшелігі – қолданбаның тапсырмасын қабылдау және орындауға кеткен уақыт тұрақтылығының деңгейі; осы тұрақтылықтың өзгеруі "қалбырлау" деп аталады. "Қатты" уақыт режимінде жұмыс істейтін операциялық жүйеде (қатты RTOS) "жұмсақ" уақыт режимінде жұмыс істейтін операциялық жүйеге (жұмсақ RTOS) қарағанда қалбырлау аз болады. Қатты RTOS-та кешіккен жауап – қате жауап, ал жұмсақ RTOS-та кешіккен жауапқа рұқсат етіледі. Басты жобалау мақсаты – жоғары өнімділік емес, керісінше, жұмсақ немесе қатты өнімділік деңгейіне кепілдік беру. Көбінесе немесе жалпы алғанда мерзімді орындай алатын RTOS – жұмсақ уақыт режиміндегі операциялық жүйе, бірақ егер ол мерзімді анық түрде орындай алса, онда ол қатты уақыт режиміндегі операциялық жүйе болып табылады. RTOS-та тапсырмаларды жоспарлау үшін жетілдірілген алгоритм бар. Жоспарлаушының икемділігі процестердің басымдықтарын компьютерлік жүйеде кең ауқымда реттеуге мүмкіндік береді, бірақ уақыт режимінде жұмыс істейтін операциялық жүйе көбінесе тар мақсаттағы қолданбаларға арналады. Уақыт режимінде жұмыс істейтін операциялық жүйенің маңызды факторлары – ең аз үзіліс кешігуі және ең аз тақырып алмасу кешігуі; уақыт режимінде жұмыс істейтін операциялық жүйе берілген уақыт ішінде атқаратын жұмыстың мөлшеріне қарағанда, қаншалықты жылдам немесе қаншалықты болжамды жауап бере алатыны үшін бағалы.
Тапсырмааралық байланыс және ресурстарды ортақтастыру
Unix сияқты көп тапсырмалы операциялық жүйелер нақты уақыт міндеттерінде нашар жұмыс істейді. Жоспарлаушы компьютерде ең төмен сұранысқа ие жұмыстарға ең жоғары басымдық береді, сондықтан уақытқа сезімтал міндеттің жеткілікті ресурстарға қол жеткізілуін қамтамасыз етудің ешқандай жолы жоқ. Көп тапсырмалы жүйелер деректерді және аппараттық ресурстарды бірнеше міндет арасында бөлісуді басқаруы тиіс. Екі міндеттің бір уақытта нақты деректерге немесе аппараттық ресурсқа қол жеткізуі әдетте қауіпсіз емес. Бұл мәселені шешудің үш кең таралған тәсілі бар:
Уақытша жасыру/бұзу үзілістері
Жалпы мақсаттағы операциялық жүйелер әдетте пайдаланушы бағдарламаларына үзілістерді жасыруға (тоқтатуға) рұқсат бермейді, себебі пайдаланушы бағдарламасы CPU-ны қажетті уақытқа дейін басқара алады. Кейбір заманауи процессорлар пайдаланушы режиміндегі кодтың үзілістерді тоқтатуына жол бермейді, өйткені мұндай басқару операциялық жүйенің маңызды ресурсы саналады. Дегенмен, көптеген кіріктірілген жүйелер мен RTOS жүйелері қосымшаға ядролық режимде жұмыс істеуге мүмкіндік береді, бұл жүйелік шақырулардың тиімділігін арттырады және қосымшаға операциялық ортаны операциялық жүйе араласуынсыз бақылауға мүмкіндік береді. Бір процессорлы жүйелерде ядролық режимде жұмыс істейтін және үзілістерді жасыратын қосымша, ортақ ресурсқа бір мезгілде қол жеткізуді болдырмаудың ең тиімді тәсілі болып табылады. Үзілістер жасырылғанда және ағымдағы тапсырма тоқтату шақыруын жасамаса, ағымдағы тапсырма CPU-ны толығымен пайдалана алады, себебі ешқандай басқа тапсырма немесе үзіліс басқаруды қолға алмайды, сондықтан маңызды бөлім қорғалған болады. Тапсырма маңызды бөлімінен шыққан кезде, ол үзілістерді ашуы керек; кез келген күтіліп тұрған үзілістер сол кезде орындалады. Үзілістерді уақытша жасыру тек қана маңызды бөлім арқылы ең ұзақ жолдың өтуі қажетті ең жоғары үзіліс күту уақытынан қысқа болған жағдайда ғана жасалуы керек. Әдетте, бұл қорғау әдісі тек маңызды бөлімде бірнеше нұсқаулар болғанда және циклдар болмағанда қолданылады. Бұл әдіс әртүрлі тапсырмалар биттерді басқаратын кезде аппараттық биттік тіркелгілерді қорғау үшін өте қолайлы.
Мутекстер
Ортақ ресурсты басқа барлық тапсырмаларды тоқтатып қоймай (мысалы, Flash жадына жазу күтіліп тұрғанда), жалпы мақсаттағы операциялық жүйелерде де қолжетімді механизмдерді пайдалану орынды, мысалы, mutex және ОС бақылайтын процестер аралық хабар алмасу. Мұндай механизмдер жүйелік шақыруларды қамтиды және әдетте шығу кезінде ОС диспетчерлік кодын шақырады, сондықтан олар әдетте жүздеген CPU нұсқауларын орындауға кетеді, ал үзілістерді маскалау кейбір процессорларда бір ғана нұсқауды қажет етеді. (Қайталамайтын) mutex құлыпталған немесе ашық болады. Егер тапсырма mutex-ты құлыптаса, басқа барлық тапсырмалар оның бастапқы жібі арқылы mutex-тың иесі оны ашқанша күтуі керек. Тапсырма mutex күтуіне белгілі бір уақыт мөлшерін қоюы мүмкін. Mutex негізіндегі жобаларда басымдық инверсиясы және өлі тұйықталу сияқты бірнеше мәлім проблемалар бар. Басымдық инверсиясында жоғары басымды тапсырма төмен басымды тапсырма mutex-ты ұстап тұрғандықтан күтеді, бірақ төмен басымды тапсырмаға жұмысын аяқтау үшін CPU уақыты берілмейді. Типик шешім – mutex-ты иеленген тапсырманың ең жоғары күтіп тұрған тапсырманың басымдығын "мұралауы". Бірақ бұл қарапайым тәсіл күтудің бірнеше деңгейі болғанда күрделенеді: A тапсырмасы B тапсырмасы құлыптаған mutex-ты күтеді, ал B тапсырмасы C тапсырмасы құлыптаған mutex-ты күтеді. Көп деңгейлі мұрагерлікті басқару басқа кодтың жоғары басымды контексте жұмыс істеуіне себеп болып, орташа басымды жіптердің ашығуын тудыруы мүмкін. Өлі тұйықталуда екі немесе одан көп тапсырмалар уақыт шегінсіз mutex-тарды құлыптап, содан кейін бір-бірінің mutex-тарын мәңгі күтеді, осылайша циклдық тәуелділік жасайды. Ең қарапайым өлі тұйықталу сценарийі екі тапсырма екі mutex-ты кезекпен құлыптағанда, бірақ кері ретпен болады. Өлі тұйықталуды сақты жобалау арқылы болдырмауға болады.
Хабарды жіберу
Ресурстарды бөлісудің тағы бір тәсілі – тапсырмалардың ұйымдастырылған хабар алмасу схемасында хабарламалар жіберуі. Осы үлгіде, ресурс тек бір тапсырмамен тікелей басқарылады. Егер басқа тапсырма ресурс туралы ақпарат алғысы келсе немесе оны өзгерту қажет болса, басқарушы тапсырмаға хабарлама жібереді. Олардың нақты уақыттағы жұмысы семафорлық жүйелерге қарағанда дәл болмаса да, қарапайым хабарға негізделген жүйелер көптеген протоколдық тұйықталу қауіптерін болдырмайды және, әдетте, семафорлық жүйелерден жақсы жұмыс істейді. Дегенмен, семафорлардағы сияқты мәселелер туындауы мүмкін. Басымдық инверсиясы, егер тапсырма төмен басымдылықтағы хабармен жұмыс істеп жатса және кіріс хабарлар тізімінде жоғары басымдылықтағы хабарды (немесе жоғары басымдылықтағы тапсырмадан тікелей немесе жанама түрде келген хабарды) назардан тыс қалдырса, пайда болуы мүмкін. Протоколдық тұйықталулар екі немесе одан көп тапсырмалар бір-бірінен жауап хабарламаларын күткен кезде туындауы мүмкін.
Тоқтатуларды басқарушылар мен жоспарлаушы
Тоқтатуды басқарушы ең жоғары басымдылыққа ие тапсырманың орындалуын тоқтатар еді, ал нақты уақыт операциялық жүйелер желілік кешігуді ең төмен деңгейде ұстауға бағытталғандықтан, тоқтатуды басқарушылар мүмкіндігінше қысқа болады. Тоқтатуды басқарушы, мүмкін болса, аппараттық құралдармен өзара әрекеттесуді кейінге жылдырады; әдетте, тоқтатуды мойындау немесе оны өшіру (сонда тоқтатуды басқарушы қайтқанда ол қайта орын алмасын) және жұмыс жасау қажеттігін тапсырмаға хабарлау ғана қажет. Бұл драйвер тапсырмасын семафорды босату, флагты орнату немесе хабарлама жіберу арқылы бұғаттан босату арқылы жүзеге асырылады. Жоспарлаушы көбінесе тоқтатуды басқарушы контекстінен тапсырманы бұғаттан босату мүмкіндігін ұсынады. Операциялық жүйе өзі басқаратын тақырыптар, мютекстер, жад және т.б. сияқты объектілердің тізімін сақтайды. Бұл тізімді жаңарту қатаң түрде бақыланылуы керек. Сондықтан, тоқтатуды басқарушы операциялық жүйе функциясын шақырғанда, ал қосымша да осы функцияны орындауға тырысса, қиындықтар туындауы мүмкін. Тоқтатуды басқарушыдан шақырылған операциялық жүйе функциясы, қосымшаның жаңартуы салдарынан объектілер базасы дұрыс емес күйде болуы мүмкін. Бұл мәселені шешудің екі негізгі тәсілі бар: бірыңғай архитектура және сегменттелген архитектура. Бірыңғай архитектураны қолданатын RTOS жүйелері ішкі тізім жаңартылып жатқанда тоқтатуларды толығымен өшіру арқылы мәселені шешеді. Бұл әділдемедегі кемшілік – тоқтатудың күту уақыты ұзарады, нәтижесінде тоқтатулар жоғалуы мүмкін. Сегменттелген архитектура тікелей операциялық жүйе шақыруларын жасамайды, бірақ операциялық жүйеге қатысты жұмысты жеке басқарушыға жүктейді. Бұл басқарушы кез келген желіден жоғарырақ, бірақ тоқтатуды басқарушылардан төмен басымдықпен жұмыс істейді. Бұл архитектураның артықшылығы – ол тоқтату кешігуіне өте аз циклдар қосады. Нәтижесінде, сегменттелген архитектураны қолданатын операциялық жүйелер көбірек болжамды және бірыңғай архитектураға қарағанда жоғары тоқтату жиілігін өңдей алады. Сол сияқты, x86 үйлесімді жабдықтағы Жүйелік басқару режимі операциялық жүйеге басқаруды қайтару үшін көп уақыт жұмсауы мүмкін.
Жадыны бөлу
Жадты бөлу нақты уақыт операциялық жүйесінде басқа операциялық жүйелерге қарағанда маңыздырақ. Біріншіден, тұрақтылық үшін жад ақауларына жол болмайды (жад бөлінген, бірақ пайдаланғаннан кейін босатылмайды). Құрылғы қайта іске қосылмай, шексіз жұмыс істеуі керек. Сондықтан динамикалық жадты бөлуге қарсы тұрылады. Мүмкін болған жағдайда, қажетті жадтың барлығы компиляция кезінде статикалық түрде көрсетілуі тиіс. Динамикалық жадты бөлуден қашудың тағы бір себебі – жадтың фрагментациялануы. Жадтың кішкентай бөліктерін жиі бөліп, босату нәтижесінде қолжетімді жад бірнеше бөлікке бөлініп, RTOS жеткілікті бос жад болғанымен, үлкен үздіксіз жад блогын бөле алмайды. Екіншіден, бөлу жылдамдығы маңызды. Стандартты жадты бөлу схемасы қолайлы бос жад блогын табу үшін белгісіз ұзындықтағы тізімді қарап шығады, бұл RTOS үшін қабылдауға болмайды, себебі жадты бөлу белгілі бір уақыт ішінде жүзеге асуы керек. Механикалық дискілердің жауап беру уақыты ұзақ және болжаусыз болғандықтан, дискілік файлдарға ауысу RAM бөлуде талқыланған себептермен қолданылмайды. Қарапайым, тұрақты өлшемді блоктар алгоритмі қарапайым кіріктірілген жүйелер үшін жақсы жұмыс істейді, себебі оның жүктемесі төмен.