Java үшін қолданбаларды әзірлеу: 1 бөлім: Java нақты уақыттағы мүмкіндіктерін ажырату

Новости мира

Java үшін нақты уақыттағы кеңейтімдер дәстүрлі Java орындалу орталарында қол жетімді емес нақты уақыттағы мүмкіндіктері бар қолданбаларды қамтамасыз етеді. Нақты уақыттағы өнімділік стандартты өнімділіктен ерекшеленеді, ол әдетте өткізу қабілетімен сипатталады, яғни. уақыт бірлігінде орындалатын тапсырмалар немесе нұсқаулар саны. Нақты уақыттағы өнімділік көрсетілген уақыт шектеулерін бұзбай, қолданбаның сыртқы ынталандыруға жауап беруі үшін қажет уақыт мөлшеріне негізделеді. Қиын нақты уақыт жағдайында бұл шектеулер барлық жағдайларда ерекшеліксіз қанағаттандырылуы керек, ал жұмсақ нақты уақытта оларда бұзушылықтың жоғары құны бар. Нақты уақыттағы жұмыс қосымшадан процессорды сыртқы әсерлерге уақытында әрекет ете алатындай басқаруды, сондай-ақ виртуалды машинаның ішіндегі басқа параллель процесс арқылы сыртқы оқиғаны өңдейтін қолданба кодын блоктау иммунитетін талап етеді. Java үшін нақты уақыттағы кеңейтімдер қолданбаларға Java жүйелері үшін бұрын-соңды болмаған төмен жауап беру уақытына қол жеткізуге мүмкіндік береді.

Осы кеңейтімдерді қолдайтын Java виртуалды машиналары (JVM) нақты уақыт режимін қамтамасыз ету үшін нақты уақыттағы операциялық жүйе (RTOS) қызметтерін пайдалана алады. Сонымен бірге олар нақты уақыт режимін қажет ететін қолданбаларды іске қосу үшін кәдімгі операциялық жүйелерде жұмыс істей алады. Кеңейтімдер пайдаланатын кейбір технологиялар қолданба оларды қолдайтын JVM жүйесіне тасымалданған кезде автоматты түрде қолжетімді болады. Басқа технологияларды пайдалану үшін қолданба кодын өзгерту керек. Олар осы мақалада егжей-тегжейлі талқыланады.

Бақыланатын қызмет көрсету процестері

Қолданбаның жұмыс істеуі кезінде JVM қолданбаның өзі, әдетте, тікелей басқара алмайтын әртүрлі сервистік функцияларды орындайды. Бұл функцияларды JVM еншілес процестерінің қатары орындайды, соның ішінде:
Қоқыс жинау. Бұл қызмет қосымша қажет етпейтін бөлінген жад блоктарын босатудан тұрады. Мұндай блоктарды жинау процесі қосымшаның кешігуіне әкелуі мүмкін.

Сыныптар жүктелуде. Бұл процесс Java қолданбалары сыныптар жиынтығы ретінде жүктелетіндіктен, жергілікті файлдық жүйеде немесе қашықтағы хосттарда орналасқан деректер құрылымдарын, нұсқауларды және басқа ресурстарды жүктеуді қамтиды. Әдетте, қолданбалар әрбір сыныпқа бірінші рет қол жеткізген кезде жүктейді (бұл принцип жалқау жүктеу деп аталады).

Орындалу уақытында құрастыру (дәл уақытында). Көптеген виртуалды машиналар Java әдісінің байт кодын қолданба іске қосылған кезде машиналық нұсқаулар жиындарына динамикалық түрде құрастырады. Жалпы алғанда, бұл процесс өнімділікті жақсартады, бірақ компиляция уақытша кешігулерге әкелуі мүмкін, қолданбаның орындалуын блоктайды.

Орындауды жоспарлау. Әдетте, стандартты JVM-лер қосымшаларды олардың ағындарын жоспарлау опцияларының ең аз жиынтығымен, сондай-ақ бір операциялық жүйеде параллель орындалатын басқа процестер контекстіндегі жаһандық жоспарлауды қамтамасыз етеді.

Жоғарыда аталған барлық шаруашылық процестері қолданбаның өзгеретін сыртқы жағдайларға жауабына теріс әсер етуі мүмкін, өйткені олар пайдалы кодтың орындалуын кешіктіруі мүмкін. Мысалы, желіден, радардан, пернетақтадан немесе кез келген басқа құрылғыдан сигналды өңдеу үшін кейбір нұсқаулар тізбегі орындалуын күтуі мүмкін. Нақты уақыттағы қолданбаларда қоқыс жинаушы сияқты үйді тазалау процесі осындай пайдалы кодты орындауға тыйым салуға болатын уақыт ұзақтығына қатысты қатаң талаптар бар.

Java нақты уақыттағы кеңейтімдері осындай шаруашылық процестерін қолдануға әсер етуді азайтуға бағытталған бірқатар технологияларды ұсынады. Кейбір мүмкіндіктер осы кеңейтімдерді қолдайтын JVM жүйесіне көшкен кезде автоматты түрде қолжетімді болады. Оларға мыналар жатады: жадты бөлу үзілістерінің ұзақтығын шектейтін мамандандырылған қоқыс жинағыш, жалқау класты жүктеуден гөрі күшті пайдаланатын мамандандырылған класс жүктеушісі, арнайы құлыптау және синхрондау іске асырулары және басымды инверсия әсерін болдырмайтын арнайы ағынды жоспарлаушы. Дегенмен, бұл қолданба кодының өзіне кейбір өзгерістерді қажет етеді, атап айтқанда Java (RTSJ) үшін нақты уақыттағы спецификациямен қамтамасыз етілген функцияларды пайдалану үшін.

RTSJ JVM ішінде көптеген нақты уақыттағы қолдау мүмкіндіктерін қамтитын API ұсынады. Олардың кейбіреулері орындау үшін міндетті, басқалары жоқ. Олар төменде көрсетілген нақты уақыттағы қолдаудың бірнеше негізгі аспектілеріне қатысты:
нақты уақыт режимінде орындауды жоспарлау;
мамандандырылған жадты басқару;
жоғары ажыратымдылықтағы таймерлер;
асинхронды оқиғаларды өңдеу;
асинхронды ағынды орындау үзілістері.

Басында

Нақты уақыттағы ағындар

RTSJ стандартты java.lang.Thread сыныбынан мұраланған және спецификацияның өзінде сипатталған кейбір функционалдылықты жүзеге асыратын javax.realtime.RealtimeThread сыныбын анықтайды. Мысалы, осы сыныптың даналық ағындарының орындалуын нақты уақыттағы жоспарлаушы басқарады. Ол ең жоғары басымдықты ағындардың үзіліссіз жұмыс істеуін қамтамасыз ететін бірінші кірген, бірінші шыққан (FIFO) нақты уақыттағы жоспарлауды қоса, бірқатар бірегей басымдықты басқару мүмкіндіктерін қамтамасыз етеді. Жоспарлаушы басымдықтарды мұралау мүмкіндігін де қолдайды (басымдық мұрагерлік) – басымдығы төмен ағындар алатын жағдайды болдырмайтын және басқаша кедергісіз жұмыс істеуі мүмкін жоғары басымдықты процесс талап ететін ресурста құлыпты шексіз босатпайтын алгоритм ( бұл жағдай басым инверсия деп аталады) .

RealtimeThread сыныбын нақты жасай алатын болсаңыз да, төмендегі мысалдарда көрсетілгендей, нақты уақыттағы ағындарды пайдалану үшін қолданбаңызға өзгертулерді ең аз деңгейде сақтауға болады (барлық мысалдар үшін бастапқы кодты Жүктеулер бөліміндегі сілтемеден жүктеп алуға болады). Бұл әзірлеу құнын айтарлықтай жеңілдетеді және азайтады. Осылайша, сіз аз күш жұмсай отырып, қолданбаның нақты уақыттағы ағынын жүзеге асыра аласыз және қолданбаның өзі стандартты JVM-мен үйлесімді болып қалады.

Басымдылыққа байланысты ағындар түрін таңдау

1-ші тізімде басымдыққа негізделген қалыпты ағындар мен нақты уақыттағы ағындар арасында таңдайтын код үзіндісі көрсетілген. Егер қолданба кеңейтілген JVM-ді іске қосса, кейбір ағындар нақты уақытта іске қосыла алады.