Күту бос емес - Busy waiting

Жылы Информатика және бағдарламалық жасақтама, бос күту, бос цикл немесе айналдыру бұл а процесс сияқты шарттың шындыққа сәйкестігін бірнеше рет тексереді пернетақта енгізу немесе а құлыптау қол жетімді. Айналдыруды сонымен қатар белгілі бір уақытты күту әдісі жетіспейтін жүйелерде қажет болатын техниканы ерікті түрде кідірту үшін қолдануға болады. Процессордың жылдамдығы әр компьютерде әр түрлі болады, әсіресе кейбір процессорлар жылдамдықты ағымдағы жұмыс жүктемесі негізінде динамикалық түрде реттеуге арналған[1]. Демек, уақытты кідірту әдісі ретінде айналдыру процессордың «ештеңе жасамау» уақытын анықтайтын код енгізілмейінше, әр түрлі жүйелерде болжанбайтын немесе тіпті сәйкес келмейтін нәтижелерге әкелуі мүмкін. цикл, немесе циклдік код а-ны анық тексереді нақты уақыт сағаты.

Көп жағдайда иіру деп саналады шаблонға қарсы және болдырмау керек,[2] басқасын орындау үшін қолдануға болатын процессор уақыты ретінде тапсырма оның орнына пайдасыз іс-әрекетке зая кетеді. Иіру белгілі бір жағдайларда, атап айтқанда оны жүзеге асыруда дұрыс стратегия бола алады спинлоктар жұмыс істеуге арналған операциялық жүйелерде SMP жүйелер.

Мысал коды

Келесісі C код мысалдары глобалды бөлісетін екі ағынды көрсетеді бүтін мен. Бірінші ағын мәні өзгергенін тексеру үшін бос күтуді қолданады мен:

# қосу <pthread.h># қосу <stdatomic.h># қосу <stdio.h># қосу <stdlib.h># қосу <unistd.h>/ * i ғаламдық, сондықтан ол барлық функцияларға көрінеді. Бұл арнайы құралдарды қолданады * атомдық жадыға қол жеткізуге мүмкіндік беретін atomic_int типі. */атомдық_инт мен = 0;/ * f1 спинлокты қолданып, i-нің 0-ден өзгергенін күтеді. * /статикалық жарамсыз *f1(жарамсыз *б){    int жергілікті_i;    / * I-нің ағымдағы мәнін local_i-ге автоматты түрде жүктеп, оның мәнін тексеріңіз       нөлге тең * /    уақыт ((жергілікті_i = атомдық жүктеме(&мен)) == 0) {        / * ештеңе жасамаңыз - тек қайта-қайта тексере беріңіз * /    }    printf(«i мәні% d-ге өзгерді. n", жергілікті_i);    қайту ЖОҚ;}статикалық жарамсыз *f2(жарамсыз *б){    int жергілікті_i = 99;    ұйқы(10);   / * 10 секунд ұйықтау * /    атомдық дүкен(&мен, жергілікті_i);    printf(«t2 i мәнін% d-ге өзгертті. n", жергілікті_i);    қайту ЖОҚ;}int негізгі(){    int rc;    pthread_t t1, t2;    rc = pthread_create(&t1, ЖОҚ, f1, ЖОҚ);    егер (rc != 0) {        fprintf(stderr, «pthread f1 сәтсіз аяқталды n");        қайту EXIT_FAILURE;    }    rc = pthread_create(&t2, ЖОҚ, f2, ЖОҚ);    егер (rc != 0) {        fprintf(stderr, «pthread f2 сәтсіз аяқталды n");        қайту EXIT_FAILURE;    }    pthread_join(t1, ЖОҚ);    pthread_join(t2, ЖОҚ);    қояды(«Барлық жіптер аяқталды.»);    қайту 0;}

Осындай жағдайда пайдалану туралы ойлануға болады C11 Келіңіздер шарттың айнымалылары.

Балама нұсқалар

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

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

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

ұйқы:hltjmp ұйқы

Қосымша ақпарат алу үшін қараңыз HLT (x86 нұсқауы).

Тиісті қолдану

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

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ «Intel Turbo Boost технологиясы».
  2. ^ «Неліктен» ұшпа «типті сыныпты қолдануға болмайды». Мұрағатталды түпнұсқасынан 2017-10-04. Алынған 2013-06-10.

Сыртқы сілтемелер