Band kutmoqda - Busy waiting

Yilda Kompyuter fanlari va dasturiy ta'minot, band-kutish, band-looping yoki yigirish a bo'lgan texnikadir jarayon shartning to'g'riligini yoki yo'qligini bir necha bor tekshiradi klaviatura kirish yoki a qulflash mavjud. Yigirishni o'zboshimchalik bilan kechikish hosil qilish uchun ham ishlatish mumkin, bu usul ma'lum bir vaqtni kutish usuli bo'lmagan tizimlarda zarur edi. Protsessorning tezligi har bir kompyuterda juda katta farq qiladi, ayniqsa, ba'zi protsessorlar tezlikni joriy ish hajmiga qarab dinamik ravishda sozlash uchun mo'ljallangan.[1]. Binobarin, vaqtni kechiktirish texnikasi sifatida aylanish turli xil tizimlarda prognoz qilinmaydigan yoki hattoki bir-biriga mos kelmaydigan natijalarni keltirib chiqarishi mumkin, agar protsessor "hech narsa qilmaslik" ni amalga oshirish uchun qancha vaqt ketishini aniqlaydigan kod kiritilmagan bo'lsa. pastadir, yoki pastadir kodi aniq tekshiradi real vaqt soati.

Ko'p hollarda yigiruv an deb hisoblanadi naqshga qarshi va undan qochish kerak,[2] boshqasini bajarish uchun ishlatilishi mumkin bo'lgan protsessor vaqti sifatida vazifa buning o'rniga foydasiz faoliyatga sarflanadi. Yigirish muayyan sharoitlarda, xususan uni amalga oshirishda to'g'ri strategiya bo'lishi mumkin spinloklar ishlashga mo'ljallangan operatsion tizimlar ichida SMP tizimlar.

Misol C kodi

Quyidagi C kod misollari global birlashadigan ikkita mavzuni tasvirlaydi tamsayı men. Birinchi satr qiymati o'zgarishini tekshirish uchun band-kutish usulidan foydalanadi men:

# shu jumladan <pthread.h># shu jumladan <stdatomic.h># shu jumladan <stdio.h># shu jumladan <stdlib.h># shu jumladan <unistd.h>/ * i global, shuning uchun u barcha funktsiyalarga ko'rinadi. Bu maxsus narsalardan foydalanadi * atomik_int turi, bu atomik xotiraga kirish imkoniyatini beradi. */atom_int men = 0;/ * f1 men 0 ga o'zgarishini kutish uchun spinlokdan foydalanadi. * /statik bekor *f1(bekor *p){    int local_i;    / * Ning joriy qiymatini local_i-ga atomik ravishda yuklang va ushbu qiymatni tekshiring       nolga teng * /    esa ((local_i = atomik_ yuk(&men)) == 0) {        / * hech narsa qilmang - faqat qayta-qayta tekshirib turing * /    }    printf("i qiymati% d ga o'zgargan. n", local_i);    qaytish NULL;}statik bekor *f2(bekor *p){    int local_i = 99;    uxlash(10);   / * 10 soniya uxlash * /    atom_store(&men, local_i);    printf("t2 i qiymatini% d ga o'zgartirdi. n", local_i);    qaytish NULL;}int asosiy(){    int rc;    pthread_t t1, t2;    rc = pthread_create(&t1, NULL, f1, NULL);    agar (rc != 0) {        fprintf(stderr, "pthread f1 bajarilmadi n");        qaytish EXIT_FAILURE;    }    rc = pthread_create(&t2, NULL, f2, NULL);    agar (rc != 0) {        fprintf(stderr, "pthread f2 bajarilmadi n");        qaytish EXIT_FAILURE;    }    pthread_join(t1, NULL);    pthread_join(t2, NULL);    qo'yadi("Barcha preadreads tugadi.");    qaytish 0;}

Bunday foydalanish holatlarida foydalanishni o'ylash mumkin C11 "s holat o'zgaruvchilari.

Shu bilan bir qatorda

Aksariyat operatsion tizimlar va ish zarrachalari kutubxonalari turli xillarni taqdim etadi tizim qo'ng'iroqlari shunday bo'ladi blokirovka qilish voqea jarayoni, masalan qulfni olish, taymerni o'zgartirish, I / O mavjudligi yoki signallari. Bunday qo'ng'iroqlardan foydalanish odatda eng sodda, eng samarali, adolatli va poyga - bepul natija. Bitta qo'ng'iroq tekshiradi, rejalashtiruvchiga kutayotgan voqea to'g'risida xabar beradi, qo'shimchani qo'shadi xotira to'sig'i agar kerak bo'lsa va qaytib kelishdan oldin so'ralgan I / U operatsiyasini bajarishi mumkin. Qo'ng'iroq qiluvchi bloklangan paytda boshqa jarayonlar protsessordan foydalanishi mumkin. Rejalashtiruvchiga amalga oshirish uchun zarur bo'lgan ma'lumotlar beriladi ustuvor meros yoki oldini olish uchun boshqa mexanizmlar ochlik.

Kechiktirish funktsiyasidan foydalanib, band bo'lishini kutishning o'zi juda kam isrofgarchilikka olib kelishi mumkin (masalan, uxlash ()) ko'pgina operatsion tizimlarda mavjud. Bu ma'lum bir vaqt davomida ipni uxlashga qo'yadi, bu vaqt davomida protsessor vaqtini yo'qotmaydi. Agar pastadir oddiy narsani tekshirayotgan bo'lsa, u ko'p vaqtini uxlab yotgan holda o'tkazadi va protsessorning juda oz vaqtini sarflaydi.

Hech qachon tugamaydigan dasturlarda (masalan, operatsion tizimlarda) cheksiz band kutish, bu ko'rsatilgandek shartsiz sakrashlar yordamida amalga oshiriladi. NASM sintaksis: jmp $. CPU so'zsiz ishlaydi sakramoq unga o'z pozitsiyasi abadiy. Bu kabi zich kutishni quyidagilar bilan almashtirish mumkin.

uxlash:hltjmp uxlash

Qo'shimcha ma'lumot olish uchun qarang HLT (x86 ko'rsatmasi).

Tegishli foydalanish

Past darajadagi dasturlashda band-kutish aslida ma'qul bo'lishi mumkin. Har bir apparat qurilmasi, xususan kamdan-kam hollarda foydalaniladigan qurilmalar uchun uzilishga asoslangan ishlov berishni amalga oshirish maqsadga muvofiq yoki amaliy bo'lmasligi mumkin. Ba'zan biron bir nazorat ma'lumotlarini apparatga yozish kerak, so'ngra yozish operatsiyasidan kelib chiqadigan qurilma holatini olish kerak, bu holat yozishdan keyin bir qator mashina tsikllari tugamaguncha yaroqsiz bo'lib qolishi mumkin. Dasturchi operatsion tizimni kechiktirish funktsiyasini chaqirishi mumkin, ammo bu qurilmaning o'z holatini qaytarishini kutib turadigan bir necha soat davomida aylanishiga sarflanadigan vaqtdan ko'proq vaqt sarf qilishi mumkin.

Shuningdek qarang

Adabiyotlar

  1. ^ "Intel Turbo Boost texnologiyasi".
  2. ^ "Nima uchun" uchuvchan "tipdagi sinfdan foydalanmaslik kerak". Arxivlandi asl nusxasidan 2017-10-04. Olingan 2013-06-10.

Tashqi havolalar