Дәнекер мен жіп арасындағы айырмашылық?

Сопротин мен жіптің арасындағы айырмашылық қандай?

63
20 дек. jldupont 20 желтоқсанда белгіленген 2009-12-20 06:05 '09 6:05 2009-12-20 06:05
@ 5 жауаптар

Coroutines дәйекті өңдеудің бір түрі болып табылады: тек біреуі кез-келген уақытта орындалады (AKA-кіші бағдарламалары AKA-функциялары сияқты - олар жай ғана аралардың арасындағы аралықты өте оңай өткізеді).

Тақырыптар (кем дегенде тұжырымдамалық) параллельді өңдеудің бір түрі болып табылады: көптеген ағындар кез келген уақытта жұмыс істей алады. (Дәстүрлі түрде, көптеген процессорлар мульти процессорлар және / немесе көп ядролы болғандықтан, бір уақытта ғана «тұжырымдамалық» емес, сонымен бірге дефакторлар бір уақытта жұмыс істейтін болады).

55
20 дек. Жауап берген Алекс Мартелли 20 желтоқсан. 2009-12-20 06:10 '09 6:10 PM 2009-12-20 06:10

Алдымен оқыңыз: Параллелизм - параллелизм - айырмашылық неде?

Орындалу - орындаудың ауысуын қамтамасыз ету үшін міндеттерді бөлу. Параллелизм - бұл жылдамдықты арттыру үшін бірнеше жұмыстарды бір мезгілде орындау. - https://github.com/servo/servo/servo/wiki/Design

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

Ұзақ жауап: Амалдық жүйе алдын-ала жоспарланған ағындардан айырмашылығы, сопроводы қосқыштар бірлесіп жұмыс істейді, яғни бағдарламашы (және, мүмкін, бағдарламалау тілі мен оның орындалу уақыты) коммутатор болған кезде басқарады дегенді білдіреді.

Артықшылығы бар ағындардан айырмашылығы, сопроводитные қосқыштар кооператив болып табылады (бағдарламашы басқарады кезде көшу орын алады). Ядро схемалық қосқыштарға қатыспайды. - http://www.boost.org/doc/libs/1_55_0/libs/coroutine/doc/html/coroutine/overview.html

Өз ілмектерін қолдайтын тіл операциялық жүйе ағындарында ( ядросы ) жіптерді (пайдаланушылық жақтарын) орындай алады. Әрбір процесте кем дегенде бір ядро ​​жіп бар. Жасуша ағындары процестерге ұқсайды, сонымен қатар процестегі барлық басқа жіптермен иелік ету процесінде жад кеңістігін бөліседі. Процесті жады, файл дескрипторлары, сокеттер, құрылғы дескрипторлары және т.с.с. сияқты барлық берілген ресурстары «иеленеді» және бұл ресурстар оның ядросының ағындары арасында бөлінеді.

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

Бір процессор машинасында жіптер жылдам және тез түсіріледі (олардың арасында ауысу) (Linux жүйесінде әдепкі уақыт аралығы - 100 мс), бұл оларды параллельді етеді. Алайда, олар бір мезгілде бір уақытта іске қосыла алмайды, себебі бір ядро ​​процессоры бір уақытта тек бір нәрсе істей алады.

border=0

Көптеген жергілікті функцияларды іске асыру үшін вирустарды және / немесе генераторларды пайдалануға болады. Операциялық жүйе арқылы жоспарланған және ядро ​​желілерінде жұмыс істеудің орнына, олар бір ағынмен орындалмағанша немесе сәтсіз болғанша орындалады, бұл бағдарламашы анықтаған басқа функцияларға әкеледі. Python және ECMAScript 6 сияқты генераторлар бар тілдер корутинктерді жасау үшін пайдаланылуы мүмкін. Async / күте (C #, Python, ECMAscript 7, Rust) бөлімін қараңыз. Фьючерстер / уәделерді беретін генераторлық функциялардың үстіне салынған абстракция.

Кейбір жағдайларда контексттер стека функцияларына сілтеме жасай алады және генераторлар стексіз функцияларға сілтеме жасай алады.

Шаштар , жеңіл ағындар және жасыл тақырыптар еріп жүретін және сығындыларға арналған басқа да атаулар. Кейде олар бағдарламалау тіліндегі амалдық жүйе ағындарына ұқсас (әдетте, мақсатқа сәйкес) көрінуі мүмкін, бірақ олар шындыққа ұқсас параллельде жұмыс істемейді, бірақ орнына корутинктер сияқты жұмыс істейді. (Тілге немесе іске асыруға байланысты осы тұжырымдамалар арасында нақты техникалық ерекшеліктер немесе айырмашылықтар болуы мүмкін.)

Мысалы, Java-да жасыл ағындар бар ; Бұл - Java Virtual Machine (JVM) жоспарланған ағындар және бастапқыда операциялық жүйе ядросының ағындарына емес. Олар параллельде жұмыс істемеді немесе бірнеше процессорлар / ядраларды пайдаланбады, себебі бұл өз жіпін талап етеді! ОЖ-мен жоспарланбағандықтан, олар ядро ​​жіптерінен гөрі, корутиналарға ұқсас болды. Жасыл ағындар - бұл Java Java 1.2-де өз ағындары пайда болғанша қолданған нәрсе.

Ағымдар ресурстарды жұмсайды. JVM жүйесінде әрбір ағынның өз стекі бар, әдетте 1 МБ мөлшерінде. 64k - бұл JVM ішіндегі жіп үшін рұқсат етілген ең көп жинақы кеңістік. Жиектердің жақтауының өлшемі JVM үшін пәрмен жолында теңшеуге болады. Атауға қарамастан, олар әрқайсысы өз стекі, ағындарды жергілікті сақтау (егер бар болса), сондай-ақ стационарлық ағындарды / контекстік қосқышты / CPU кэшті сәтсіздікке ауыстыру шығындары сияқты пайдалану ресурстарынан бос емес. Бұл сопрограммалар жоғары сапалы миссия-сын қосымшалар үшін танымал болғандығына байланысты.

Mac OS процесіне 2000-ға жуық ағындарды бөлуге мүмкіндік береді, ал Linux-де 8 Мбайт жіпке арналған стек бөлінеді және көптеген ағындар физикалық жадқа сәйкес келеді.

Демек, жіптер ең ауыр салмақ (еске түсіру және контекстті ауыстырып қосу уақыты бойынша), содан кейін сопутиналар және, ақырында, генераторлар ең жеңіл салмақ болып табылады.

69
02 мая '14 в 23:07 2014-05-02 23:07 жауап llambda 02 мамыр 2014 23:07 2014-05-02 23:07

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

Ең алдымен, егер сопрограммалар бір мезгілде орындалса (ешқашан параллельде болмаса), неге біреу оларды ағындардан артық көреді?

Жауап мынада, бұл сопақша өте төмен деңгейде өте жоғары деңгейде қамтамасыз ете алады. Әдетте, ағынды ортаға сізде 30-50 ағыннан артық емес, бұл ағындарды жоспарлауға (жүйелік жоспарлаушыға) дейін, ағындар шынымен пайдалы болатын уақытты едәуір қысқартады.

Сонымен, жіптермен сіз параллелизмге ие бола аласыз, бірақ параллелизмге тым көп емес, бұл бір процесте орындалатын бірлескен процедурадан әлдеқайда жақсы емес пе? Міндетті емес. Бірлескен процедура жоспарлаушының үстеме ақысыз қайталануын орындауға болатындығын есте сақтаңыз - бұл мәтінмәнді өздігінен басқаруды ғана бақылайды.

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

Көптеген жұмыстарды орындайтын және өз еркімен бір-бірімен ауысатын кішігірім кісілердің көмегімен сіз жоспарлаушы ешқашан қол жеткізе алмайтын тиімділік деңгейіне қол жеткіздіңіз. Енді сіз ондаған ағындарға қарағанда мыңдаған сопрограммалар бірге жұмыс істей аласыз.

Себебі, кіші бағдарламалар қазірдің өзінде алдын-ала белгіленген нүктелерге ауысады, енді ортақ деректер құрылымдарында бұғаттаудан аулақ бола аласыз (себебі сіздің кодыңыз сыни секцияның ортасындағы басқа біреуіне ауысады деп ешқашан айтпайсыз)

Тағы бір артықшылығы - еске түсірудің әлдеқайда төмендігі Ағын үлгісінде әрбір жіп өз стекін бөлуі керек, сондықтан жадты пайдалану сізде бар ағындар санымен сызықты түрде өседі. Бірлескен кәдімгі бағдарламалармен сізде қолданылатын кіші бағдарламалар жад көлеміне тікелей байланысты емес.

Және, ақырында, жергілікті кіші бағдарламалар көп көңіл бөледі, өйткені кейбір бағдарламалау тілдерінде (мысалы, Python) ағындар параллельде жұмыс істей алмайды - олар бір мезгілде бірдей жұмыс істейді, бірақ аз еске және бос ақысыз.

39
16 янв. Жауап: Мартин Конецни 16 қаңтар 2016-01-16 07:07 '16 at 07:07 2016-01-16 07:07

Бір сөзбен айтқанда: префикс. Corotes бір-біріне жақсы жаттығу нүктелерін жалғастыра беретін жонглерлер ретінде әрекет етеді. Тақырыптар (нақты ағындар) кез келген нүктеде үзілуі мүмкін, содан кейін кейінірек жаңартылады. Бұл, әрине, ол ресурстық қақтығыстармен байланысты көптеген мәселелерді тудырады, сондықтан Python GIL - Global Interpreter Lock үшін әйгілі.

Көптеген жіптерді енгізу іс жүзінде корутиналарға ұқсас.

10
20 дек. Питер Роуэллдің берген жауабы 20 желтоқсан. 2009-12-20 06:11 '09 6:11 2009-12-20 06:11

Бұл сіз қолданатын тілге байланысты. Мысалы, Lua-да олар бірдей (сопроволокный айнымалы түрін деп аталады thread ).

Әдетте коутиндер ерікті кірісті жүзеге асырады, онда сіз (сіз) бағдарламашы шешімді қайда кіргізеді деп шешеді, яғни. басқа процедураға бақылауды береді.

Оның орнына, жіптер амалдық жүйе арқылы автоматты түрде басқарылады (тоқтатылған және іске қосылады) және олар бір мезгілде бірнеше ядролық процессорларда жұмыс істей алады.

7
20 дек. Андреон Бонинидің 20 желтоқсан күні берген жауабы . 2009-12-20 06:09 '09 6:09 2009-12-20 06:09