Кіріспе

Компьютердегі процестер немесе тапсырмалар арасында ауысу Компьютерде тапсырмаларды ауыстыру Компьютерде контексттік ауысу – процестердің немесе жіптердің күйін сақтау процесі, осы күйді кейін қалпына келтіріп, орындауды жалғастыру үшін, содан кейін басқа, бұрын сақталған күйді қалпына келтіру. Бұл бірнеше процестің бір орталық процессорды (CPU) бөлісуіне мүмкіндік береді және көп бағдарламалау немесе көп тапсырмалы операциялық жүйенің маңызды мүмкіндігі болып табылады. Дәстүрлі CPU-да әр процесс, яғни орындалып жатқан бағдарлама, әртүрлі CPU регистрлерін деректерді сақтау және орындалып жатқан процестің ағымдағы күйін ұстап тұру үшін пайдаланады. Бірақ көп тапсырмалы операциялық жүйеде операциялық жүйе бірнеше процестің бір уақытта орындалуын қамтамасыз ету үшін процестер немесе жіптер арасында ауысады. Әр ауысу кезінде операциялық жүйе қазіргі процестің күйін сақтап, содан кейін CPU-да орындалатын келесі процестің күйін жүктейді. Орындалып жатқан процестің күйін сақтау және келесі процестің күйін жүктеу операцияларының тізбегі – контексттік ауысу деп аталады. "Контексттік ауысу" терминінің нақты мағынасы жағдайға қарай өзгереді. Көп тапсырмалы ортада бұл бір тапсырманың жүйелік күйін сақтау процесін білдіреді, соның арқасында тапсырма тоқтатылып, басқа тапсырма қайта басталуы мүмкін. Контексттік ауысу үзіліс салдарынан да болуы мүмкін, мысалы, тапсырма дискілік жадқа қол жеткізуді қажет еткенде, басқа тапсырмалар үшін CPU уақытын босату үшін. Кейбір операциялық жүйелер пайдаланушы режимі мен ядро режимі арасында ауысу үшін де контексттік ауысуды қажет етеді. Контексттік ауысу процесі жүйенің өнімділігіне кері әсер етуі мүмкін.

Құны

Контексттік ауысулар көбінесе көп есептеу ресурстарын қажет етеді, ал операциялық жүйелердің көп бөлігі контексттік ауысуларды пайдалануды оңтайландыруға бағытталған. Бір процесс екінші процесске ауысқанда, тіркелімдер мен жад карталарын сақтау және жүктеу, әртүрлі кестелер мен тізімдерді жаңарту сияқты әкімшілік жұмыстарға белгілі бір уақыт жұмсалады. Контексттік ауысудың нақты мәні архитектураға, операциялық жүйеге және ортақ ресурстардың санына байланысты (бір процеске қатысты жіптер, байланыссыз және ынтымақтаспайтын процестерге қарағанда көптеген ресурстарды бөліседі). Мысалы, Linux ядросында контексттік ауысу жаңа процестің күйі туралы ақпаратты алу үшін ядролық стектегі PCB кестесінде сақталған тиісті процесс басқару блогын (PCB) жүктеуді қамтиды. Жаңа процесс үшін PCB-ден регистрлер, стек көрсеткіші және бағдарламалық санауыш сияқты CPU күйі туралы ақпарат, сондай-ақ сегменттеу кестелері мен бет кестелері сияқты жад басқару туралы ақпарат (егер ескі процесс жаңа процесспен жадты бөліспесе) жүктеледі. Әр түрлі жадты пайдаланатын бұрынғы және ағымдағы процестердің дұрыс адрестемесін қамтамасыз ету үшін аудармалық көзбен қарау буферін (TLB) тазалау қажет. Бұл өнімділікке кері әсер етеді, өйткені көптеген контексттік ауысулардан кейін TLB бос болғандықтан, TLB-ге жасалған әрбір жад сілтемесі сәтсіз аяқталады. Сонымен қатар, пайдаланушы жіптері арасында, әсіресе жасыл жіптер арасында ұқсас контексттік ауысулар болады және олар көбінесе жеңіл, минималды контексті сақтау және қалпына келтіруді қамтиды. Go-дағы goroutine-дер арасындағы ауысу сияқты ерекше жағдайларда, контексттік ауысу coroutine-нің өнімділігіне тең, ол кішігірім бағдарламаны шақырудан аздап қымбатқа түседі.

Көп тапсырмалылық

Көбінесе, белгілі бір жоспарлау схемасында бір процесті процессордан шығарып тастау қажет, сонда басқа процесс орындала алады. Бұл контексттік ауыстыру процестің өзі жұмыс істемейтін күйге өтуімен туындауы мүмкін, мысалы, I/O немесе синхрондау операциясы аяқталуын күту арқылы. Алдын ала бағытталған көп тапсырмалы жүйеде жоспарлаушы әлі де жұмыс істеп тұрған процестерді ауыстыра алады. Басқа процестердің процессор уақытынан ұзақ уақытқа қиылуын болдырмау үшін, алдын ала бағытталған жоспарлаушылар көбінесе процесс уақыт тілімінен асып кеткенде іске қосылатын таймерлік үзілісті орналастырады. Бұл үзіліс жоспарлаушының контексттік ауыстыруды орындау үшін басқаруды алуын қамтамасыз етеді.

Қолдануды тоқтату

Қазіргі заманғы архитектуралар үзіліспен басқарылады. Бұл, мысалы, CPU дискіден деректерді сұрағанда, оқу аяқталғанша күтіп отырудың қажеті жоқ екенін білдіреді; ол сұранысты (I/O құрылғысына) жіберіп, басқа тапсырмамен айналыса береді. Оқу аяқталғаннан кейін, CPU үзіліске ұшырауы мүмкін (бұл жағдайда аппараттық құрал, ол PIC-ке үзіліс сұранысын жібереді) және оқу нәтижесімен таныстырылады. Үзілістер үшін үзіліс өңдеушісі деп аталатын бағдарлама орнатылады, және осы өңдеуші дискіден келетін үзілісті басқарады. Үзіліс орын алғанда, аппараттық құрал контекстің бір бөлігін автоматты түрде ауыстырады (кем дегенде, өңдеушінің үзілген кодқа оралуына жеткілікті). Өңдеуші нақты аппараттық және бағдарламалық қамтамасының ерекшеліктеріне байланысты қосымша контексті сақтай алады. Көбінесе үзілісті өңдеуге жұмсалатын уақытты азайту үшін контекстің минималды бөлігі ғана өзгертіледі. Ядро үзілістерді өңдеу үшін арнайы процесті жасамайды немесе жоспарламайды, керісінше, өңдеуші үзіліс өңдеуінің басында құрылған (көбінесе толық емес) контекстте орындалады. Үзіліс қызметі аяқталғаннан кейін, үзіліс орын алғанға дейін қолданылған контекст қалпына келтіріледі, осылайша үзілген процесс өз күйінде орындалуын жалғастыра алады.

Пайдаланушы мен өзек режімінің ауысуы

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

Қадамдар

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

Мысал

Жалпы арифметикалық қосу операциясы A = B+1 деп қарастырылсын. Нұсқаулар нұсқаулар тізілімінде сақталады және бағдарламалық есептегіш өсіріледі. A және B жадыдан оқылады және тиісінше R1, R2 регистрлерінде сақталады. Бұл жағдайда B+1 есептеліп, R1-ге соңғы жауап ретінде жазылады. Бұл операцияда тікелей оқу және жазу жүзеге асырылады, функция шақыруларында күту болмайды, сондықтан бұл жағдайда контексттік ауысу/күту болмайды. Дегенмен, кейбір арнайы нұсқаулар күту/тоқтату процестеріне контексттік ауысуды талап ететін жүйелік шақыруларды қажет етеді. Жүйелік шақыруды басқарушы контекстті ядролық режимге ауыстыру үшін қолданылады. Мысалы, display(data x) функциясы дискіден x деректерін және ядролық режимдегі құрылғы драйверін қажет етуі мүмкін. Сондықтан дисплей функциясы тоқтап, READ операциясының нәтижесін күтеді, дискіден x мәнін алу үшін, бағдарламаны күтуге мәжбүр етеді және функция шақыруын күтуге түсіреді, ағымдағы оператор тоқтатылып, жүйелік шақыру ояну сигналын күтеді. Бірақ, бір уақытта орындалуын қамтамасыз ету үшін бағдарлама жаңа мәнді және тоқтатылған процесті бірге қайта орындауы керек.

Өнер көрсету

Контексттік ауыстырудың өзі орындалу жылдамдығына кедергі келтіреді, себебі тапсырма жоспарлаушыны іске қосу, TLB жадты тазалау және бірнеше тапсырма арасында процессор кэшін бөлісу сияқты амалдар орындалады. Бір процестің жіптері арасындағы ауыстыру екі жеке процеске қарағанда жылдамдатылуы мүмкін, өйткені жіптер бірдей виртуалды жад картасын пайдаланады, сондықтан TLB жадты тазалау қажеттілігі тумайды. Екі жеке процестің арасындағы ауысу уақыты процестік ауысу кешігуі деп аталады. Бір процестің екі жібі арасындағы ауысу уақыты жіптік ауысу кешігуі деп аталады. Аппараттық үзіліс туған сәттен бастап, үзіліске қызмет көрсетілгенге дейінгі уақыт үзіліс кешігуі деп аталады. Бір адрес кеңістігіндегі екі процестің ауыстырылуы, әр процеске жеке адрес кеңістігі қарастырылған операциялық жүйедегі екі процестің ауыстырылуынан жылдам болуы мүмкін.

Жабдықтар мен бағдарламалық қамтамасыз ету

Контексттік ауыстыруды негізінен бағдарламалық немесе аппараттық құралдар жүзеге асырады. Intel 80386 және оның ізбасарлары сияқты кейбір процессорлар арнайы дерек сегментін (TSS) пайдалану арқылы контексттік ауыстыруды аппараттық деңгейде қолдайды. Тапсырманы ауыстыруды CALL немесе JMP нұсқауларымен, жаһандық дескрипторлар кестесіндегі TSS дескрипторына бағыттап, тікелей іске қосуға болады. Бұл үзіліс немесе қателік орын алғанда, егер үзіліс дескрипторлар кестесінде (IDT) тапсырма шлюзі болса, автоматты түрде орын алады. Тапсырма ауыстырылғанда, процессор (CPU) жаңа күйді TSS-тен автоматты түрде жүктей алады. Аппараттық деңгейде орындалатын басқа тапсырмалар сияқты, мұның жылдам болуын күтуге болады; алайда, Windows және Linux сияқты кең таралған операциялық жүйелер бұл мүмкіндікті пайдаланбайды. Бұл негізінен екі себепке байланысты: аппараттық контексттік ауыстыру барлық тіркелімдерді сақтамайды (тек жалпы мақсаттағы тіркелімдерді, қозғалатын нүктелі тіркелімдерді емес – бірақ TS биті CR0 басқару тіркелімінде автоматты түрде қосылады, нәтижесінде қозғалатын нүктелі нұсқауларды орындау кезінде қате пайда болады және операциялық жүйеге (ОЖ) қажет болған жағдайда қозғалатын нүктелі күйді сақтау және қалпына келтіру мүмкіндігі беріледі). Осыған байланысты өнімділік мәселелері туындайды, мысалы, бағдарламалық контексттік ауыстыру тек сақталуы қажет тіркелімдерді таңдап сақтаса, аппараттық контексттік ауыстыру қажет болса да, болмаса да, дерлік барлық тіркелімдерді сақтайды.