Grand Central Dispatch

Grand Central Dispatch (GCD), Apple-дың көпядролы процессорлар және басқа да SMP-жүйелердің артықшылықтарын пайдаланатын қосымшаларды құру үшін арналған технологиясы, Нью-Йорктегі Grand Central Terminal орталық вокзал атауын тұспалдайды. Бұл технология міндеттердің параллелизмін іске асырылуына және "Ағымдар пулы" жобалау үлгісіне негізделген. GCD алғаш рет Mac OS X 10.6-да ұсынылды. GCD сервистерін іске асыратын libdispatch кітапханасының бастапқы кодтары Apache лицензиясы астында 10 қыркүйекте 2009 ж[http://libdispatch.macosforge.org/]. шығарылды. Кейіннен кітапхана басқа FreeBSD операциялық жүйесіне портталды. GCD қосымшада міндеттердің параллель орындалуы мүмкіндерін анықтауға мүмкіндік береді, және оларды бос есептеуіш ресурстар (процессорлық ядролар) болғанда іске қосады. Міндет функция немесе "блок" ретінде айқындалуы мүмкін. Блок — бұл стандартты емес C/C++/Objective-C бағдарламалау тілдерінің синтаксисінің кеңейтілуі, бұл кодтарды және деректерді бір объектіге инкапсуляциялауға мүмкіндік береді, тұйықталу аналогы.. Асинхронды шақыру Бастапқыда, бізде құжаттағы сөздер мен параграфтардың санауды жүзеге асыратын analyzeDocument әдісімен қосымша бар. Әдетте, сөздер мен параграфтарды санау процессі жеткілікті түрде тез және басты ағында орындалуы мүмкін, бұл дегеніңіз, қолданушы түймені басқан және нәтижесін алған арасындағы орын алған кідірісті байқайды: Егер құжат өте үлкен болса, талдау үшін айтарлықтай көп уақыт кетуі мүмкін. онда қолданушы "іркілуді" байқайды. Келесі мысал бұл мәселені оңай шешеді: Мұнда [myDoc analyze] шақыру блокқа орналастырылуы мүмкін, содан кейін жаһандық кезектердің біріне орналастырылады. [myDoc analyze] жұмысын аяқтағаннан кейін, жаңа блок басты кезекке орналастырылады, ол пайдаланушы интерфейсін жаңартады. Осы күрделі емес өзгерістерді өткізе отырып, бағдарламашы үлкен құжаттарды талдау кезінде әлеуетті "" құтылады. Цикл паралельденуі Екінші мысал циклдың паралельденуін көрсетеді: Мұнда do_work функциясы count рет шақырылады, оның нәтижесі i-ші орындалуы results массивінің i-ші элементіне беріледі, содан кейін нәтижелері қосылады. do_works алдыңғы шақыруларының нәтижелеріне арқа сүйейді деп пайымдауға негіз жоқ, сондықтан бірнеше қоңырауларды do_works параллель шақыруға еш кедергі жоқ. Келесі листинг, осы идеяның GCD көмегімен іске асырылуын көрсетеді: Бұл мысалда dispatch_apply count рет блокты іске қосады, оған әрбір қоңырауды жаһандық кезекке бере отырып, блоктарға 0-ден count-1 санын береді. Бұл ОЖ-ге неғұрлым қол жетімді аппараттық ресурстарды толық пайдалану үшін ағындардың оңтайлы санын таңдауға мүмкіндік береді. dispatch_apply, оның барлық блоктары жұмыстарын аяқтамайынша, басқаруды қайтармайды, бұл summarize шақырылуы алдында бастапқы циклдың барлық жұмысы орындалғанына кепілдік беруге мүмкіндік береді. Құру тізбекті кезек Әзірлеуші бірінен соң бірі орындалуы тиіс дәйекті міндеттер үшін жеке дәйекті кезек құра алады, бірақ жеке ағында жұмыс істей алады. Жаңа кезек осылайша құрылуы мүмкін: Мұндай міндеттерді, басқа міндетті дәл сол кезекке салатын дәйекті кезекке орналастырудан аулақ болыңыз. Бұл міндетті түрде тұйыққа (deadlock) әкеледі. Келесі листингіде осындай жағдайдағы тұйық көрсетілген: Сондай-ақ, қараңыз * Блоктар (Си тілі үшін кеңейтілім) * OpenMP — C, C++, Fortran үшін ашық стандарт. * Intel TBB — Intel-ден ашық бастамалармен C++кітапхана. * Task Parallel Library — Microsoft әзірлеген .NET-технологиясы. * Java Concurrency — Java-технология (сондай-ақ JSR 166 ретінде белгілі). Сілтемелер