In-Order Execution — protsessor buyruqlarni dastur tartibida issue qilib, ularning asosiy bajarish va natija bosqichlarini shu ketma-ketlikda yuritadigan mikroarxitektura usuli. Oldingi buyruq zarur resurs yoki operandni kutsa, keyingi mustaqil buyruq ham ko‘pincha oldinga o‘ta olmaydi. Tuzilma soddaligi, bashorat qilinadigan vaqt va kam quvvat sarfi bilan ajraladi.
Oddiy quvur
Klassik pipeline fetch, decode, execute, memory va write-back bosqichlariga bo‘linadi. Har siklda turli buyruq boshqa stage’da bo‘lishi mumkin, shuning uchun in-order degani bir vaqtda faqat bitta buyruq degani emas. Muhim jihat — yosh buyruq eski buyruqni chetlab executionga chiqmaydi.
Data hazard forwarding bilan hal qilinadi; qiymat hali tayyor bo‘lmasa pipeline stall va bubble kiritadi. Structural hazard’da ikki buyruq bitta portni talab qilsa dastur tartibidagi oldingisi xizmat oladi. Branch natijasi kutilishi yoki prediction bilan spekulyativ fetch qilinishi mumkin.
Afzalliklari
Issue Queue, katta Reorder Buffer va keng Physical Register file talab qilinmagani chip maydoni hamda energiyani kamaytiradi. Aniq exception tabiiyroq: buyruqlar tartibda bo‘lgani uchun oldingi holatni tiklashga kam ichki metadata kerak.
Real-time va embedded tizimlarda worst-case execution time’ni baholash nisbatan osonroq bo‘lishi mumkin. Biroq cache, branch predictor va umumiy bus baribir vaqt o‘zgaruvchanligini keltiradi; “in-order” o‘zi qat’iy deterministik degani emas.
Cheklovlari
Cache miss yoki uzoq bo‘lish quvurning boshidagi buyruqni ushlab, uning ortidagi mustaqil amallarni ham bloklaydi. Compiler Instruction Scheduling bilan mustaqil buyruqlarni kechikish oldiga joylashi mumkin, ammo runtime cache missni har doim oldindan bilmaydi.
Bir vaqtning o‘zida ko‘p apparat oqimi ishlaydigan in-order yadro boshqa thread buyruqlarini stall paytida issue qilishi mumkin. Bu murakkab out-of-order oyna o‘rniga thread-level parallelism bilan unitlarni band saqlaydi.
Taqqoslash
Out-of-Order Execution operandlari tayyor yosh buyruqlarni oldin bajarib latency’ni yashiradi, lekin commitni dastur tartibida qiladi. U ko‘proq tranzistor, wakeup-select mantiqi va spekulyativ holat talab qiladi. Bir xil ISA ikkala usulda ham bajarilishi mumkin; dastur natijasi teng, tezlik va energiya farq qiladi.
In-order yadro ham superskalyar bo‘lishi mumkin: bir siklda yonma-yon turgan mustaqil buyruqlar bir nechta unitga yuboriladi. Agar guruhdagi birinchi buyruq tayyor bo‘lmasa, keyingilarni chiqarish siyosati cheklangan bo‘ladi. Dual-issue qoidalari compilerga qaysi juftlik parallel ekanini ko‘rsatishi mumkin.
Xotira tizimi bilan ishlash
In-order yadro non-blocking cache ishlatsa, bitta miss turganda keyingi mustaqil loadni qabul qilishi mumkin, lekin natijalarni dastur tartibida qaytarish va registr hazardini boshqarish uchun qo‘shimcha tuzilma kerak. Ko‘p kichik yadro soddalik uchun blocking cache tanlaydi.
Prefetch va scratchpad sekin xotira kutishini dasturiy oldindan boshqaradi. Real-time tizim cache o‘rniga aniq latency’li lokal xotira ishlatishi mumkin. DMA keyingi blokni yuklayotganda yadro joriy blokni hisoblaydi; buffer almashinuvi interrupt yoki polling bilan muvofiqlashtiriladi. Shu usullar out-of-order oynasiz ham latency’ni yashiradi.
Precise exception in-order oqimda tabiiyroq: xato instructiondan oldingilar tugagan, keyingilar esa arxitektura holatini hali o‘zgartirmagan bo‘ladi. Shunga qaramay, ko‘p siklli unit yoki kechikkan store mavjud bo‘lsa, commit chegarasini saqlash uchun status bitlari va bekor qilish signallari talab etiladi.
Bog‘liq tushunchalar
instruction pipeline, out-of-order execution, pipeline stall, forwarding, superscalar processor, real-time system