Төкендер сериялануда - Serializing tokens

Жылы Информатика, жетондарды сериялау параллельдік бақылаудағы тұрақты дамудан туындайтын ұғым болып табылады DragonFly BSD. Сәйкес Мэттью Диллон, олар көбіне ұқсас СПЛ, таңбалауыштан басқа бірнеше жұмыс істейді CPU ал SPL тек бір CPU доменінде жұмыс істейді.

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

Өзара алып тастаумен салыстыру (мутекс)

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

  1. Уақытты бөлу: пайдаланушы кеңістігін (АҚШ) жоспарлаушы барлық ағындардың іске қосылуына мүмкіндік беретіндігін қамтамасыз етуге тырысады, сондықтан ол әр ағынды қысқа уақыт аралығында (уақыт бөлгіш) іске қосады, содан кейін басқа ағынға ауысады.
  2. Бір уақытта орындау: мультипроцессорлы компьютерлерде ағын басқа CPU-дағы басқа ағынмен дәл бір уақытта орындалуы мүмкін.
  3. Алдын алу: ағын аппараттық үзіліс немесе сияқты төменгі басымдылықтағы жіптен бас тартуы мүмкін жеңіл ядролардың жіптері.
  4. Ерікті бұғаттау: егер ол бірдеңе күтуге тура келсе, жұмысы болмаса немесе блоктайтын функцияны шақырса, жіп ұйықтауы мүмкін. Тіпті құлыпты сатып алу туралы қоңырау бұғаттай алады.

Келесі кестеде жетондар мен мутекстердің қасиеттері жинақталған.

Mutexes-ке қарсы сериялы токендер
 Төкендер серияланудаМутекс
ТаймерлеуЖұмыс істейдіЖұмыс істейді
Бір уақытта орындауЖұмыс істейдіЖұмыс істейді
Алдын алуЖұмыс істейдіЖұмыс істейді
Ерікті бұғаттауСәтсізЖұмыс істейді
Тығырықтан сақтайдыИәЖоқ
Басымдық инверсияны болдырмайдыИәЖоқ

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

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

— Мэттью Диллон

Мысал

Келесісі псевдокод және түсініктемелер токондарды сериялаудың қалай жұмыс істейтіндігін көрсетеді.

Мысал PseudoCode серияландыру таңбалауыштарын қолдану
А жіпЖіп BӘрекет
lwkt_gettoken (T1); iter = list1.head;
... lwkt_gettoken (T1); // блоктар // T1 таңбалауышын күту
A T1 таңбалауышын алады және оны екі тізбеге ортақ тізім1-ге синхрондалған қол жеткізу үшін қолданады.
lwkt_gettoken (T2); // блоктар
// T1 таңбалауышын күту
Lwkt_gettoken (T2) қоңырауына тыйым салу функциясы жатады, сондықтан А ұйқыға кетеді және уақытша белгілерін жоғалтады. Жоспарлаушы T1 және T2 екеуінің де қол жетімді екенін көргенде оянады.
// T1 және T2 күтеді
list1.head = list1.head.next; lwkt_releasetoken (T1);
B Т1 алады және тізімді1 өзгертеді. А-ның «қайталануы» әлі де тізімнің ескі басын көрсетеді.
// бастың жаңа нұсқасын алыңыз: iter = list1.head; // жаңа тізім жасаңыз: while (iter! = null) {list2.tail = iter; iter = iter.next;} lwkt_releasetoken (T1); lwkt_releasetoken (T2);
 Жоспарлаушы T1 және T2 екеуінің де қол жетімді екенін көреді, сондықтан ол А жіпін оятады, өйткені A дұрыс кодталғандықтан, ол тізбектің жаңа басымен өз итераторын жаңартады және ол бойынша кейбір блоктан тыс операцияларды орындайды. Бастапқыда А-дан екі таңбаны да сұраған дұрыс болар еді.

Дарвин ядросындағы алдыңғы өнер

Mac OS X Келіңіздер Дарвин ядро ұқсас техниканы қолданады (а деп аталады шұңқыр ) қол жеткізуді сериялау үшін BSD ядро бөлігі.

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

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