Instruction Fetch — protsessorning navbatda bajarilishi kutilayotgan buyruq baytlarini xotira iyerarxiyasidan olib kelish jarayoni. U dastur hisoblagichi ko‘rsatgan manzilni tanlash, buyruq keshiga murojaat qilish, baytlarni tekislash va dekoderga yetkazishni qamrab oladi. Zamonaviy protsessorda fetch bajarish quvurlarini uzluksiz oziqlantiruvchi old qismning asosiy vazifasidir.
Manzilni tanlash
Ketma-ket kodda keyingi manzil joriy buyruq uzunligiga qo‘shish orqali olinadi. Tarmoq, sakrash, chaqiruv yoki qaytish bu oqimni o‘zgartiradi. Nishon manzili hali hisoblanmagan paytda protsessor branch predictor yordamida taxminiy yo‘lni tanlaydi. Taxmin to‘g‘ri bo‘lsa vaqt tejaladi; noto‘g‘ri bo‘lsa olib kelingan noto‘g‘ri yo‘l buyruqlari bekor qilinadi.
Qaytish manzillari odatda maxsus kichik stek bilan bashoratlanadi, bilvosita sakrashlar uchun esa manzil tarixi ishlatilishi mumkin. Bu tuzilmalar me’moriy dastur holati emas: xato bashorat dastur natijasini o‘zgartirmasligi, faqat unumdorlikka ta’sir qilishi kerak.
Kesh va tarjima
Virtual manzil avval ko‘rsatma uchun ruxsat tekshiriladigan sahifa tarjimasidan o‘tadi. Instruction TLB yaqinda ishlatilgan virtual-fizik mosliklarni saqlaydi. So‘ng buyruq keshi kerakli satrni qidiradi. Kesh topilmasa quyi darajadan blok olib kelinadi; sahifa mavjud bo‘lmasa yoki bajarish taqiqlangan bo‘lsa, istisno tayyorlanadi.
Ma’lumot yoziladigan sahifani bajarishni taqiqlash kod kiritish hujumlarini qiyinlashtiradi. JIT tizimi kod yaratgach yozish va bajarish ruxsatlarini tartibli almashtiradi hamda arxitektura talab qilsa instruction keshini sinxronlaydi. Aks holda fetch eski baytlarni ko‘rishi mumkin.
Kenglik va tekislash
Fetch bir siklda dekoder iste’molidan ko‘proq bayt olib, navbatga joylashi mumkin. Buyruq kesh satri yoki sahifa chegarasidan kesib o‘tsa, ikki manbadan bayt yig‘ish kerak bo‘ladi. O‘zgaruvchan uzunlikdagi ISAda bayt oqimini buyruq chegaralariga ajratish alohida murakkablik yaratadi.
Oldindan olib kelish ketma-ket yoki bashoratlangan yo‘l keshga yaqinlashganda kechikishni yashiradi. Haddan tashqari prefetch foydali kesh satrlarini siqib chiqarishi va xotira tarmog‘ini band qilishi mumkin. Shu sabab apparat algoritmi aniqlik va qamrovni muvozanatlashtiradi.
Quvurdagi uzilishlar
Instruction cache miss, TLB miss, noto‘g‘ri tarmoq bashorati yoki front-end navbatining to‘lishi fetchni to‘xtatishi mumkin. Bajarish bloklari bo‘sh qolsa, umumiy throughput pasayadi. Unumdorlik hisoblagichlari front-end bound sikllarni, kesh xatolarini va branch misslarni ajratishga yordam beradi.
Fetch buyruqni hali bajarmaydi. U hatto keyinchalik bekor qilinadigan spekulyativ yo‘ldan bayt olishi mumkin. Shunga qaramay, spekulyativ murojaat kesh holatini o‘zgartirishi sabab xavfsizlik dizayni yon kanal oqibatlarini hisobga oladi.
O‘zini o‘zgartiruvchi kodda data yo‘li bilan yozilgan yangi baytlar instruction fetch yo‘liga qachon ko‘rinishi ISA tomonidan belgilanadi. Ba’zi arxitektura maxsus kesh tozalash va sinxronizatsiya buyruqlarini talab qiladi. Ko‘p yadroli tizimda boshqa yadro yangi kodni bajarishidan oldin ham tegishli tartib va ko‘rsatma-kesh uyg‘unligi ta’minlanadi. Oddiy ma’lumot yozuvi tugaganini ko‘rish, buyruq fetch aynan yangi kodni ko‘rishini har doim anglatmaydi.
Fetch navbati qisqa uzilishlarni yutib, dekoderga bir tekis oqim beradi. Navbat juda kichik bo‘lsa keshdagi mayda kechikish darhol bajarish tezligiga ta’sir qiladi; juda katta bo‘lsa noto‘g‘ri branchdan keyin ko‘proq energiya behuda sarflanadi.
Fetch manzili apparat kuzatuvida qayd etilganda spekulyativ va commit qilingan oqim alohida belgilanishi lozim.
Bog‘liq tushunchalar
program counter, instruction cache, branch prediction, TLB, pipeline front-end, instruction decoder