| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Critical Section http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1495 |
Страница 1 от 2 |
| Автор: | Nikola Kirov [ Сря Дек 28, 2005 11:48 pm ] |
| Заглавие: | Critical Section |
как се ползва CCriticalSection в Visual C++ ми е ясно. Но не мога да се сетя на практика как деиства това. Някой задълбочавал ли се е? Просто пиша една многонишкова програмка която обработва поток от дании от USB-to и ми се иска да я оптимизирам добре а като не знам как точно е реализирано това нещо не мога да се ориентирам какво мога да оптимизирам. |
|
| Автор: | vlado [ Сря Дек 28, 2005 11:57 pm ] |
| Заглавие: | |
CCriticalSection се ползва когато искаш дадени данни да бъдат достъпни само от една нишка в даден момент. Щото иначе може да стане, че нишка_1 ги чете точно в момента в който нишка_2 пише по тях и ги променя. И може да стане боза. Дай генерален пример какво прави многонишковата програма с данните от USB-то и ще ти помогна с каквото знам. Успех! |
|
| Автор: | Nikola Kirov [ Чет Дек 29, 2005 12:02 am ] |
| Заглавие: | |
Как се работи с това го има описано. Имам примери. Правил съм и 2-3 неща вече. Интересува ме фактически как работи това. Какъв е принципа на работа. |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 10:33 am ] | ||
| Заглавие: | |||
Ами с мутекси, семафори и т.н.т. Обекти на операционната система. Имам едно туториалче, само че за делфи, но те нещата се отнасят за всичко. Има добри примери как се организират разни там двупосочни буфери и т.н.т., как да се избягват дед-локове и други техники.
|
|||
| Автор: | Nikola Kirov [ Чет Дек 29, 2005 11:28 am ] |
| Заглавие: | |
И в това е обяснено как се ползват. Макар че само го прехвърлих набързо. Не е особенно подходящо четиво за C програмист. Интересува ме не как се ползват а принцип на работа. |
|
| Автор: | t_i_t_o [ Чет Дек 29, 2005 11:37 am ] |
| Заглавие: | |
В общия случай "влизането" в критична секция спира таск шедулера на операционната система, а с излизането тои се пуска отново, т.е. така ти се гарантира че докато си в критична секция управлението няма да се предаде на друг тред, което е и идеята на critical section. Дано съм помогнал. |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 11:55 am ] |
| Заглавие: | |
Небих казъл че диспечера се спира. Просто нишката която се иска достъп до критична секция се блокира докато критичната секция не се освободи от заелата я нишка. Като цяло Никола в примерите се ползва доста ВИН АПИ-то, така мисля ще е разбираемо и за Ц програмист. |
|
| Автор: | Nikola Kirov [ Чет Дек 29, 2005 1:08 pm ] |
| Заглавие: | |
На мен ми е странно защо е реализирана като обект. |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 1:25 pm ] |
| Заглавие: | |
Като обект в Ц++ или като обект на операционната система. Първото е ясно, второто ами нали самата операционна система(диспечера на задачи) се грижи за превключването и синхронизирането на нишките, и трябва да знае кога една нишка влиза в дадена критична секция и ако след този момент се превключи на друга нишка и тя реши да влезе в същата критична секция, то диспечера ще я блокира, ще предаде управлението на предходната, тя ще напусне критичната секция и тогава диспичера ще активира втората нишка и ще и позволи да влезе в критичната секция. Немога да разбера кое точно не ти е ясно, това помага ли като някакво обяснение? |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 1:28 pm ] |
| Заглавие: | |
По-принцип има начини да направиш такава синхронизация и без обекти на операционна система, но това е трудно и трябва да знаеш какво става на ниско ниво (разбирай ниво инструкция), т.е. да се получат атомични операции, но защо да си чупиш главата, като всичко ти е дадено на готово. |
|
| Автор: | Nikola Kirov [ Чет Дек 29, 2005 2:05 pm ] |
| Заглавие: | |
Ами по това обяснение не става ясно какво точно прави операционната система с този обект. Как става на практика. |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 2:30 pm ] |
| Заглавие: | |
Практичеки и аз незнам какво точно прави, при различни ОС ще е различно. Аз си го представям така: При влизане в критичната секция правиш обращение към ОС, като параметър подаваш обекта. Да кажем обекта съдържа флаг оказващ да ли някоя нишка е вклязла или не в критичната секция и ако да вероятно съдържа и индификатор (хендъл) на нишката, също така можеби се съдържа и списък с нишките желаещи да влязат в критичната секция. Та ако флага е свален, ОС вдига флага и отбелязва коя нишка е влязла и продължава изпълнението на нишката. Ако в този момент се превключи на друга нишка и тя направи същото, ОС блокира тази нишка отбелязва в обекта че тази нишка иска да влезе и продължава с изпълнението на нишката която вече е влязла. След като тя излезе, което отново става със системно повикване, ОС проверява има ли други кандидати (от списака на обекта) и ако да, се разрешава на следващата нишка да влезе по начина описан по-горе. Общо взето това е просто обяснение на процеса. |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 2:41 pm ] |
| Заглавие: | |
Това може и да ти ползно, за по-добро разбиране, не съм го преглеждал подробно. http://msdn.microsoft.com/msdnmag/issues/03/12/CriticalSections/default.aspx |
|
| Автор: | Bezmozachen [ Чет Дек 29, 2005 2:47 pm ] |
| Заглавие: | |
Всъщност нещата можби са по-прости в виндовса: typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control entering and exiting the critical // section for the resource // LONG LockCount; LONG RecursionCount; HANDLE OwningThread; // from the thread's ClientId->UniqueThread HANDLE LockSemaphore; DWORD SpinCount; } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; Като гледам съдържа броя блокирани нишки, хендъл към нишката която е влязла, хендъл на семафора използван за практическата и реализация, другите не са ми много ясни. |
|
| Автор: | stefan_b [ Вто Яну 03, 2006 11:27 pm ] | |||||||||
| Заглавие: | ||||||||||
Организацията на WindowsNT, 2K, XP и т.н. е обектно-базирана, т.е. критичните секции, отворените файлове, и дори входно-изходните заявки се представят като обекти. BTW, ако искаш да оптимизираш нещата наистина много, силно и докрай, опитай с non-blocking synchronization в Google въпреки че аз не бих хвърлял време за това - правил съм USB комуникация със синхронизация по най-простия начин (май беше с Mutex-и) и процесора се товареше не повече от няколко процента. |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|