Реализация "критической секции" в Linux

Модератор: Модераторы разделов

Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Реализация "критической секции" в Linux

Сообщение Abaddon »

Имеется демон, выкидывающий в определенный каталог пары файлов, а так-же другой - который заглатывает их.
При этом, когда получает управление второй демон, необходимо, чтобы оба файла уже существовали и были заполнены.

Соответственно, каким образом можно реализовать процесс создания и записи информации в файлы в виде атомарной операции, которую никто не может прервать.

Смотрел в сторону spinlock, но смутила документация, вроде, по описанию получается, что он предоставляет не атомарную операцию, а блокировку аналогичную семафорам, что в данном случае не подходит.

Монопольный доступ к файлу не катит, второй демон при этом срывается с ошибкой.

PS: Желания копаться в исходниках второго демона желания не имеется, особенно если учесть то, что через пару месяцев будет доступна следующая версия, и повторять процедуру не охота:)
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация "критической секции" в Linux

Сообщение flook »

man 2 fcntl -> flock?
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

flook писал(а):
14.12.2005 12:46
man 2 fcntl -> flock?


Advisory locks allow cooperating processes to perform consistent opera-
tions on files, but do not guarantee consistency (i.e., processes may
still access files without using advisory locks possibly resulting in
inconsistencies)

Таким образом не катит, т.к. во втором демоне нужно производить модификации, связанные с такими-же локами.
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Реализация "критической секции" в Linux

Сообщение d_Sun »

Можно mutex разшарить между процессами.
Моя подпись сильно длинная :)
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

d_Sun писал(а):
14.12.2005 14:24
Можно mutex разшарить между процессами.

Понятно... Иными словами, в Linux нет такого понятия, как критическая секция...
Очень грустно:(, придется искать объезд через ж).
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

Abaddon писал(а):
14.12.2005 14:57
d_Sun писал(а):
14.12.2005 14:24

Можно mutex разшарить между процессами.

Понятно... Иными словами, в Linux нет такого понятия, как критическая секция...
Очень грустно:(, придется искать объезд через ж).

Тебе ж и говорят - мьютекс.
Ими и реализуются критические секции.
Только это всё-равно нужно менять код второго демона.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация "критической секции" в Linux

Сообщение flook »

Abaddon писал(а):
14.12.2005 14:57
d_Sun писал(а):
14.12.2005 14:24

Можно mutex разшарить между процессами.

Понятно... Иными словами, в Linux нет такого понятия, как критическая секция...
Очень грустно:(, придется искать объезд через ж).

Через семафор/mutex/flock это не через ж :)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

flook писал(а):
14.12.2005 15:11
Через семафор/mutex/flock это не через ж :)

Это как сказать:)
Значит один камень в огород линуха от мс имеем - там критические секции есть, причем не нужно менять другие программы...

Хорошо, а со spin_lock'ом кто-нить сталкивался? Может это все таки оно? :rolleyes: Скромно надеюсь, что это так... А то перелопачивать ~8 метров чужих исходников для поиска куда вставить семафор - грустно :unsure:
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация "критической секции" в Linux

Сообщение flook »

Abaddon писал(а):
14.12.2005 15:28
flook писал(а):
14.12.2005 15:11

Через семафор/mutex/flock это не через ж :)

Это как сказать:)
Значит один камень в огород линуха от мс имеем - там критические секции есть, причем не нужно менять другие программы...


А че в виндах можно эти секции встраивать не останавливая проги??? :blink: :blink: :blink:

Abaddon писал(а):
14.12.2005 15:28
Хорошо, а со spin_lock'ом кто-нить сталкивался? Может это все таки оно? :rolleyes: Скромно надеюсь, что это так... А то перелопачивать ~8 метров чужих исходников для поиска куда вставить семафор - грустно :unsure:
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Реализация "критической секции" в Linux

Сообщение d_Sun »

Abaddon писал(а):
14.12.2005 15:28
Значит один камень в огород линуха от мс имеем - там критические секции есть, причем не нужно менять другие программы...


:blink: :blink: :blink: Это как???
Моя подпись сильно длинная :)
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

А че в виндах можно эти секции встраивать не останавливая проги??? :blink: :blink: :blink:
[quote]

В СВОЕЙ проге ставишь вызов EnterCriticalSection()....критическая секция...LeaveCriticalSection(), при этом, пока выполняется эта секция НИКТО и НИКОГДА у тебя не отнимет управление, разве что сама ось. На этот момент приостанавливается планировщик задач, соответственно, блок команд, находящихся в критической секции является "атомарным", кстати, вплоть до линейки NT - забытие выполнить LeaveCriticalSection приводило к мертвому зависанию системы до завершения программы:), начиная с ХР ось мониторит срок задержки программы в таком режиме.

Правда многие "программисты" используют эту весчь вместо мутексов, чем очччень сильно тормозят работу своей (и не только своей) программы.

Ну, и в кратце цели критических секций:
1. Обеспечить жесткую отработку некоего протокола от устройства. Например, устройство передает информацию пачками без буфферизации, соответственно, в момент прихода "пилота", программа должна проснуться, уйти в критическую секцию, отработать пакет, выйти.
2. Ситуация схожая с моей, имеются две программы, работающие в параллели, при этом одна из них, для простоты - чужая и без исходников:) - обеспечить взаимодейсвие между программами, с гарантированным завершением приема/передачи информации, при этом передатчик инициирует критическую секцию, выкладывает данные, отпускает секцию.

Таким образом, используя критические секции, можно синхронизировать две разные софтины, даже не имея представления о том, как устроена одна из них (чужая).

Рекомендована к использованию только в крайних случаях, причины, думаю объяснять не нужно (ресурсоемкость инициализации, блокировки, ошибки....)

Да, чуть не забыл, в не SMP конфигурации, этого эффекта можно добиться используя банальный cli()

Код: Выделить всё

unsigned long flags;

save_flags(flags);
cli();
/* критичный код */
restore_flags(flags);


, при этом полностью запрещаются прерывания, и, соответственно, планировщик задач, а как результат - это и есть EnterCriticalSection... Другая беда, что при SMP конфигурации - это не лекарство, в доках говориться про spin_lock, но так как там это все описано, создается впечатление, что это ни что иное, как расшареный семафор, и, все-равно изменению подлежат обе программы... Или я чего не понял...

Цитата:
"Смысл механизма спин-блокировки состоит в том, чтобы предоставить процессу возможность монопольно захватить какой-либо объект памяти. При этом получить доступ на чтение объекта могут несколько процессов одновременно, но запись может происходить только в том случае, когда нет других читающих и пишущих процессов. Чтобы воспользоваться механизмом спин-блокировки достаточно, чтобы объект имел тип spinlock_t. По сути своей спин-блокировка является частным случаем семафора, однако для всех платформ, поддерживающих SMP, ее реализуют с помощью специального кода"
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Реализация "критической секции" в Linux

Сообщение d_Sun »

Abaddon - по-моему, то что вы написали выше и есть синхронизация через Ж :D
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация "критической секции" в Linux

Сообщение flook »

Е маё а я-то думал ;) Есть способ и в линухе! Шлешь ВСЕМ SIGSTOP и делаешь свое черное дело. Потом всем - SIGCONT...
:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :ph34r:
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

d_Sun писал(а):
14.12.2005 16:25
Abaddon - по-моему, то что вы написали выше и есть синхронизация через Ж :D

Все зависит от целей и задач:). Ну не вдохнавляет меня копаться в чужом коде:)
В своей программе, естественно, что использую семафоры, и для синхронизации дочерних потоков и для синхронизации с другими своими программами...

А так, задача решилась, нашел-таки толковую доку, в которой русским по белому сказано, что spin_lock и есть вход в критическую секцию:), причем независимо от архитектуры, как SMP, так и не SMP.

Всем спасибо за участие в дискуссии:)
Удачи, и побольше подвигов в работе и развлечении :D
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

В СВОЕЙ проге ставишь вызов EnterCriticalSection()....критическая секция...LeaveCriticalSection(), при этом, пока выполняется эта секция НИКТО и НИКОГДА у тебя не отнимет управление, разве что сама ось. На этот момент приостанавливается планировщик задач

А как у тебя тогда "ось" отберёт управление, если приостанавливается планировщик? :)
Сдаётся мне, что вытесняющая многозадачность никуда не девается.
Надо будет посмотреть дома что скажет товарисч Дж.Рихтер по этому поводу...

вплоть до линейки NT - забытие выполнить LeaveCriticalSection приводило к мертвому зависанию системы до завершения программы:)

"До линейски NT" много чего могло привести к "мёртвому зависанию".

Ну, и в кратце цели критических секций:

Это понимание критических секций "от MS".
В более общем программёжном плане КС - это часть кода, выполнение которой не должно быть прервано КОНКУРИРУЮЩИМ кодом. В чём именно конкурентность - решать программисту (ресурсы, разумеется, делят - что же ещё).
При этом никто не мешает прерывать его выполнение другими потоками-процессами.

1. Обеспечить жесткую отработку некоего протокола от устройства. Например, устройство передает информацию пачками без буфферизации, соответственно, в момент прихода "пилота", программа должна проснуться, уйти в критическую секцию, отработать пакет, выйти.

Для этого драйвер есть.

2. Ситуация схожая с моей, имеются две программы, работающие в параллели, при этом одна из них, для простоты - чужая и без исходников:) - обеспечить взаимодейсвие между программами, с гарантированным завершением приема/передачи информации, при этом передатчик инициирует критическую секцию, выкладывает данные, отпускает секцию.
Таким образом, используя критические секции, можно синхронизировать две разные софтины, даже не имея представления о том, как устроена одна из них (чужая).

Обёртку написать "вокруг" той проги в код которой нет доступа.

Да, чуть не забыл, в не SMP конфигурации, этого эффекта можно добиться используя банальный cli()

"Банальный cli()" тебе не дадут выполнить в юзерском (не привилегированном) режиме.
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

Zeus писал(а):
14.12.2005 17:03
А как у тебя тогда "ось" отберёт управление, если приостанавливается планировщик? :)
Сдаётся мне, что вытесняющая многозадачность никуда не девается.
Надо будет посмотреть дома что скажет товарисч Дж.Рихтер по этому поводу...

Начнем с того, что ось при этом может принимать прерывания (неблокирующая остановка планировщика), при этом, ось может контролировать жизнь всей системы, но не передавая управления другому потоку.
Zeus писал(а):
14.12.2005 17:03
"До линейски NT" много чего могло привести к "мёртвому зависанию".

:)
Zeus писал(а):
14.12.2005 17:03
Это понимание критических секций "от MS".
В более общем программёжном плане КС - это часть кода, выполнение которой не должно быть прервано КОНКУРИРУЮЩИМ кодом. В чём именно конкурентность - решать программисту (ресурсы, разумеется, делят - что же ещё).
При этом никто не мешает прерывать его выполнение другими потоками-процессами.

В таком случае, это уже не критическая секция... С этим запросто справятся мутексы и семафоры:). Критическая секция определяется критичностью ее монолитного выполнения за минимальный квант времени, а не защита данных от параллельного доступа к данным. При этом, если потоку не хватило отведенного кванта времени он не прервется, и ось не отдаст управление другому потоку. Посему это можно (но не нужно) использовать и как средства защиты данных.
Zeus писал(а):
14.12.2005 17:03
Для этого драйвер есть.

Угу, замечательно, только драйвер и есть программный поток... не более, не менее... Как же ему это обеспечить...
Zeus писал(а):
14.12.2005 17:03
Обёртку написать "вокруг" той проги в код которой нет доступа.

Над этим демоном уже висит две обертки, вешать еще одну... извините... Весь залатаный и на ладан дышащий демон получится:). Правда остальные они простенькие, и не мешают системе работать:)
Zeus писал(а):
14.12.2005 17:03
"Банальный cli()" тебе не дадут выполнить в юзерском (не привилегированном) режиме.

Вот для этого есть объезды, причем примитивные... Догадайся, либо посмотри иксовые либы:)... И прочее управление потоками.
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

Начнем с того, что ось при этом может принимать прерывания (неблокирующая остановка планировщика), при этом, ось может контролировать жизнь всей системы, но не передавая управления другому потоку.

Т.е. всё-таки твоя критическая секция прервётся обработчиком прерываний?
Не такая уж она "монопольная" :)
Уже что-то.


Это понимание критических секций "от MS".
В более общем программёжном плане КС - это часть кода, выполнение которой не должно быть прервано КОНКУРИРУЮЩИМ кодом. В чём именно конкурентность - решать программисту (ресурсы, разумеется, делят - что же ещё).
При этом никто не мешает прерывать его выполнение другими потоками-процессами.

В таком случае, это уже не критическая секция... С этим запросто справятся мутексы и семафоры:).

Мьютексы - это лишь инструменты реализации в т.ч. и критических секций.
А "критическая секция" - это термин многопоточного и многозадачного программирования.
Причём он ближе к тому определению, которое я "вспомнулировал", чем к определению "by MS".

Критическая секция определяется критичностью ее монолитного выполнения за минимальный квант времени, а не защита данных от параллельного доступа к данным.

А кто говорит про данные? Я говорил про данные?
Я говорил о РЕСУРСАХ - разные вещи.
А про "кванты времени" в настоящих критических секциях речи вроде вообще не идёт.


Для этого драйвер есть.

Угу, замечательно, только драйвер и есть программный поток... не более, не менее...

Есть отличия: драйвер выполняется в привилегированном режиме.
Соответственно он, если ему нужно будет, может запретить прерывания, может работать с железом как хочет. Т.е. наиболее естественное решение: отдать такие функции которые ты описываешь - ему.


"Банальный cli()" тебе не дадут выполнить в юзерском (не привилегированном) режиме.

Вот для этого есть объезды, причем примитивные... Догадайся, либо посмотри иксовые либы:)... И прочее управление потоками.

Фигасе! А мелкомягкие знают об этих объездах? :)
Ну и что ж там такого в управлении потоками из ПОЛЬЗОВАТЕЛЬСКОГО режима, что можно выполнить привилегированную команду (проверяемую на аппаратном уровне, заметь!).
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

С квотированием глюка, а переформатировать в падлу:), посему италиком отмечены мои ответы.

Т.е. всё-таки твоя критическая секция прервётся обработчиком прерываний?
Не такая уж она "монопольная" :)
Уже что-то.
Только в линейке НТ, до этого просто блокировались прерывания...Как результат - малейшая ошибка,и система встает колом не реагируя ни на что. В НТ - просто блокируется планировщик задач, таким образом система отавляет контроль за системой себе. В линуксе - это присходит по другому - задача реально становится монополисткой, и пока она не отпустит систему, никто управления не получит, даже ядро...

Мьютексы - это лишь инструменты реализации в т.ч. и критических секций.
А "критическая секция" - это термин многопоточного и многозадачного программирования.
Причём он ближе к тому определению, которое я "вспомнулировал", чем к определению "by MS".
Да, но на практике их понимание более удобное... Кстати, как выяснилось и не только их, но и господина Торвальдса:). И не нужно иметь 3 инструмента для решения одной задачи, и ниодного для решения другой... Там как-раз каждый из инструментов для своих целей... только умей использовать (что случается редко:( ).

Критическая секция определяется критичностью ее монолитного выполнения за минимальный квант времени, а не защита данных от параллельного доступа к данным.

А кто говорит про данные? Я говорил про данные?
Я говорил о РЕСУРСАХ - разные вещи.
В таком случае ВСЕ ресурсы ты под себя выделить не можешь... Или по твоему, как только ты активировал мутекс или семафор ты получишь полностью (максимально возможное) время ЦПУ? В этом случае мало того, что как только твой квант времени пройдет система переключится на первую же не заблокированную систему, так еще и наоборот, после освобождения блокированной задачи с большой вероятностью твоя задача заснет, и на долго.
А мутексы кроме ресурсов, называемых данными ничего тебе блокирнуть не дадут:)
Данные - это память, файлы, порты и прочее, кроме времени:).


А про "кванты времени" в настоящих критических секциях речи вроде вообще не идёт.
О квантах времени речь идет ВСЕГДА, если конечно ось многозадачная:)

Есть отличия: драйвер выполняется в привилегированном режиме.
Соответственно он, если ему нужно будет, может запретить прерывания, может работать с железом как хочет. Т.е. наиболее естественное решение: отдать такие функции которые ты описываешь - ему.
Не все функции ты можешь отдать ему... И в привелигированный уровень ты можешь столкнуть любой поток (для примера возьми асмовую програмку, которая получает количество тиков с последнего перезапуска проца (естественно, берущая информацию из него самого, а не из других источников), к сожалениюпод рукой инструкции нет, но могу сказать точно, что ее можно без проблем толкнуть от рута, через uid и тому подобное, хотя инструкция относится к привелигированным:)...
Дело в том, что Линукс использует двухслойную систему защиты,как и винда, более того, рут выполняется на уровне ядра, и поэтому через него легко "прибить" систему любыми доступным средствами:)


Фигасе! А мелкомягкие знают об этих объездах? :)
А причем здесь мелкомягкие??? Я про линукс говорю, с мс все понятно и уже давно:)

Ну и что ж там такого в управлении потоками из ПОЛЬЗОВАТЕЛЬСКОГО режима, что можно выполнить привилегированную команду (проверяемую на аппаратном уровне, заметь!).
Из пользовательского режима, если ты дал себе такуювозможность, а извини меня я не дурак, чтобы себе в этом отказать, можно перейти на более высокий уровень. Про это можешь почитать в книгах, относящихся к программированию железа, в т.ч. портов (уже это проходили)
Да,и что такое привелигированные команды на х86 я знаю, и как работает с ними ядро,и что позволяет делать, а что - нет - то-же. Единственный вопрос был, как блокирнуть систему на СМП архитектуре, уже выяснил. Как и ожидалось, линукс имеет те-же средства, как и винда, реализованные по аналогичному методу, за исключением отсутствия защиты от дурака (по крайней мере видимой).


Я очень рад Вашему отношению к линуксу и виндам, сам отношусь так-же, но предпочитаю трезво смотреть на мир, и не кричать это круто, а это ... Предпочитаю взвешивать и разбираться что хорошего есть в одном, а что в другом, и выбирать для подходящей задачи подходящий инструмент, как бы он не назывался. Пример для мс я привел, чтобы было понятно о чем речь, сам уже под мс не пишу года 3-4, и возвращаться не собираюсь.
Как я уже сказал, с проблемой разобрался, более того, все работает именно как хотел. Дальнейший флуд типа "кто правильнее дзенствует мс или линукс" считаю бессмысленным. Посему считаю тему закрытой.

Удачного отдыха и работы.
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

[quote name='Abaddon' post='147569' date='Dec 14 2005, в 21:04']
Т.е. всё-таки твоя критическая секция прервётся обработчиком прерываний?
Не такая уж она "монопольная" :)
Уже что-то.
Только в линейке НТ, до этого просто блокировались прерывания...Как результат - малейшая ошибка,и система встает колом не реагируя ни на что. В НТ - просто блокируется планировщик задач, таким образом система отавляет контроль за системой себе. В линуксе - это присходит по другому - задача реально становится монополисткой, и пока она не отпустит систему, никто управления не получит, даже ядро...
[quote]
Сорри, конечно, но это полный бред.
Никакая современная операционка в здравом уме не допустит, чтобы какая-то задача забрала себе комп под полный контроль.

[quote]
Мьютексы - это лишь инструменты реализации в т.ч. и критических секций.
А "критическая секция" - это термин многопоточного и многозадачного программирования.
Причём он ближе к тому определению, которое я "вспомнулировал", чем к определению "by MS".
Да, но на практике их понимание более удобное... Кстати, как выяснилось и не только их, но и господина Торвальдса:). И не нужно иметь 3 инструмента для решения одной задачи, и ниодного для решения другой... Там как-раз каждый из инструментов для своих целей... только умей использовать (что случается редко:( ).
[quote]
Лирика.
Физика будет в самом низу.

[quote]
В таком случае ВСЕ ресурсы ты под себя выделить не можешь... Или по твоему, как только ты активировал мутекс или семафор ты получишь полностью (максимально возможное) время ЦПУ?
[quote]
Есть ресурс.
Есть конкурирующие за него потоки (задачи).
Критическая секция позволяет одному из них получить монопольный доступ к ресурсу.
Какой именно ресурс - определяет программист.
Может это участок памяти, может порты ввода-вывода, может файл, да хотя бы и процессор!
Не пойму, что я не так объясняю-то? Вроде всё доступно и понятно...

[quote]
А мутексы кроме ресурсов, называемых данными ничего тебе блокирнуть не дадут:)
[quote]
Таких ресурсов вообще нет. Ещё бы сказанул: "информация"!

[quote]
Данные - это память, файлы, порты и прочее, кроме времени:)
[quote]
А Вы, батенька, философ :)
Однако, философия наука не прикладная - тут программировать нужно! :)

[quote]
А про "кванты времени" в настоящих критических секциях речи вроде вообще не идёт.
О квантах времени речь идет ВСЕГДА, если конечно ось многозадачная:)
[quote]
Ох, ё-ё...
Ну да ладно...

[quote]
Есть отличия: драйвер выполняется в привилегированном режиме.
Соответственно он, если ему нужно будет, может запретить прерывания, может работать с железом как хочет. Т.е. наиболее естественное решение: отдать такие функции которые ты описываешь - ему.
Не все функции ты можешь отдать ему...
[quote]
Функции по работе железом, по захвату управления компом - это драйвер.

[quote]
И в привелигированный уровень ты можешь столкнуть любой поток[quote]
Детсад.
Вызываешь ЛЮБОЙ сервис ОС - переключаешься в режим ядра, в привилегированный режим.
Только выполняется-то там не твой код, а код ядра!

[quote]
Дело в том, что Линукс использует двухслойную систему защиты,как и винда, более того, рут выполняется на уровне ядра[quote]
Я сейчас заплАчу!
В привилегированном режиме работает ТОЛЬКО ядро и его модули!

[quote]
[i]Из пользовательского режима ..., можно перейти на более высокий уровень. Про это можешь почитать в книгах, относящихся к программированию железа, в т.ч. портов[quote]
Программирование портов?
А при чём тут порты?
Хоть небольшой пример, хоть не на С, а просто словесами можешь описать что и как происходит?

[quote]
Как и ожидалось, линукс имеет те-же средства, как и винда, реализованные по аналогичному методу, за исключением отсутствия защиты от дурака (по крайней мере видимой).
[quote]
Йопт. Нифига себе выводы :\
А поподробнее?

[quote]
Я очень рад Вашему отношению к линуксу и виндам
[quote]
А какое у меня отношение?
Я одинаково ровно дышу к обеим операционкам.

[quote]
Предпочитаю взвешивать и разбираться
[quote]
Вот, дошли до разбирательства, а я добрался до дома и, как и обещал, открыл талмуд, который должен быть на столе у всех win-программеров:
Джеффри Рихтер
"Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows"
Серия "Для профессионалов". Издательство "Питер".

Вот что у него написано про критические секции (стр.197):
Критическае секция (critical section) - это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один поток получал доступ к определённому ресурсу.
[Атансьён!]
Естественно, система может в любой момент вытеснить Ваш поток и подключить к процессору другой, но ни один из потоков, которым нужен занятый Вами ресурс, не получит процессорное время до тех пор, пока Ваш поток не выйдет за границы критической секции.

По-моему всё ясно и понятно. И именно так я и объяснял.
Ещё небольшой концептуальный пример (стр.198):
...
CRITICAL_SECTION g_cs;
...
EnterCriticalSection (&g_cs);
...
LeaveCiticalSection (&g_cs);

НИЧЕМ (кроме названий функций и типов) не отличается от мьютексов в Linux'е. Да и странно, если бы отличались - делают-то одно и то же.

Так что получается у мелкомягких такое же понимание критической секции, как и у всех.
У тебя только что-то расходится.
Я чуть с ума не сошёл, вдумываясь в твои опусы! :)
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

Не флейма ради а истины для...

Ресурсы - это не только данные, но и процессорное время... Это так, к слову.

Из пользовательского режима, если ты дал себе такуювозможность, а извини меня я не дурак, чтобы себе в этом отказать, можно перейти на более высокий уровень.
Пардон, всегда считал, что переход из user mode в kernel mode возможен не "если ты дал себе такуювозможность", а если система дала программе такую возможность... под названием syscalls... которые предоставляют вполне конкретные и определенные возможности. Или вы именно их и имели в виду?

рут выполняется на уровне ядра
Доказательства в студию.

Про критические секции "by MS"... Ну не знаю, не знаю... Давать приложению блокировать всю систему (ну хорошо, планировщик) - имхо плохая идея by design. Больно большая дыра в защите. Отпускать долго занятую секцию (честно, не знал такого, впрочем, я про win я вообще мало что знаю) - просто грязных хак над большой дыркой. Оно конечно большим дядькам из МС виднее, но неужели это действительно так?...

Или по твоему, как только ты активировал мутекс или семафор ты получишь полностью (максимально возможное) время ЦПУ?
А может ну ее нафик, многозадачность-то, да? Просто как-то странно эта фраза звучит... Это я больше к CSbyMS, а не к вам...

Вообще, решать задачи в Unix, применяя при этом технологии Windows... Где-то об этом кажется что-то было... Разные это системы, ой как разные...

Ох ну нифигасе;) У меня с момента нажатия кнопки "Быстрый Ответ" до нажатия кнопки "Отправить" целый час прошел) Да, разработчики аськи, чая и телека явно пользуются критичискими секциями "by MS":D
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

Еще раз добавил
[жестокий оффтопик]
Функции по работе железом, по захвату управления компом - это драйвер.
Почему-то вспомнилось:
From bash.org.ru
<Dodik> какая програма мне понадобится, чтобы я мог управлять компом по локальной сети но чтобы не устанавливать на обоих компах а только на моём?
<hatarisu> Понимаешь, Додик. Управлять компьютером соседа БЕЗ ничего нельзя...
<hatarisu> В результате это ХАК.
<hatarisu> Это сложный и утомительный процес, требующий скрупулезности, безопасности и понимания всего, что делаешь.
<Dodik> да я нечего непонимаю я ламер но шкодить люблю надо писать так заходи туда нажимай левой кнопкой туда и т п
<Dodik> я хочу упровлять его компомм
<hatarisu> ТАК ОТБЕРИ КОМП У СВОЕГО ДРУГА И УПРАВЛЯЙ!
<Dodik> я щас заплачу
<Aafemt> плати!

[/жестокий оффтопик]
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Реализация "критической секции" в Linux

Сообщение Abaddon »

nercus писал(а):
15.12.2005 01:23
рут выполняется на уровне ядра
Доказательства в студию.

Не совсем правильно выразился. Он выполняется на уровне привелегий - 0, так же, как и ядро системы. Иными словами, от рута ты можешь пробиться к любому порту и выполнить любую привелигированную команду. Проверка - вставь такую команду на асме в код сишника, и компильни, под любым юзверем прога осыпется, а под рутом - проглотит не задумываясь

to zeus: Практика и теория - разные вещи. На практике, то, что я описывал происходит и под виндами, и такой-же, но более опасный функционал есть у линукс. По сему дискуссия пустая абсолютно. Можно долго с пеной у рта доказывать как должно быть, но покопавшись в реализации выяснить как сделано на самом деле. По поводу spin_lock'a почитай документацию, посмотри его реализацию... И поймешь, что это значит. Честно скажу, что как это реализовано в 2000 и ХР я не знаю, поскольку не дожил до программирования под них, возможно они поменяли реализацию... но совершенно определенно знаю реакцию 98-х и НТ, а теперь и линукса:).

В который раз говорю, что тема исчерпана... Пустой спор уже надоел, посему, звиняте, но больше отвечать не буду. Проблема решена, причем полностью. Всем спасибо за помощь.
Удачи
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

рут выполняется на уровне ядра
Доказательства в студию.

Пока одни слова.

Про критические секции "by MS"... Ну не знаю, не знаю...

То что написал Абадонна - это ЕГО понимание критических секций.
Как выяснилось (см.мой ночной пост) - у MS вполне человеческое, а не потустороннее :) восприятие критических секций.

Да, разработчики аськи, чая и телека явно пользуются критичискими секциями "by MS":D

:D


Abaddon писал(а):
15.12.2005 10:13
nercus писал(а):
15.12.2005 01:23

рут выполняется на уровне ядра
Доказательства в студию.

Не совсем правильно выразился. Он выполняется на уровне привелегий - 0, так же, как и ядро системы.

Те же яйца - вид сбоку.
Когда же процесс переключается в режим ядра?
В нём должен быть какой-то код для этого, причём который выполняется ТОЛЬКО когда процесс выполняется под root'ом. Сомневаюсь, что сишные либы это делают. Да и не знает компилятор ничего о режимах защиты.
Имхо, бред какой-то.

вставь такую команду на асме в код сишника

Какая вера в асм!
А просто в сишнике нельзя?

под любым юзверем прога осыпется, а под рутом - проглотит не задумываясь

Идиотизм, конечно, но придётся попробовать.

to zeus: Практика и теория - разные вещи.

Опя-ять демагогия какая-то началась! Не отступай от темы!

По поводу spin_lock'a почитай документацию

Мы не про spin_lock говорим, а про критические секции, как ... ну как парадигму многопоточного программирования.

Пустой спор уже надоел

Это не "пустой спор", а попытка поправить заблуждающегося человека. Только он сопротивляется :\
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

По поводу spin_lock'a почитай документацию

Код: Выделить всё

# man spin_lock
No manual entry for spin_lock

Код: Выделить всё

# readelf -a /lib/lib* 2>/dev/null |grep -wc spin_lock
0

После непродолжительного грепа в /usr/src/linux создалось впечатление, что spin_lock - чисто ядерная функция (хинт: не syscall)... Ах да, я забыл, что у нас руту все можно, стало быть наверное приложение (каким-то образом) вызовет непосредственно функцию ядра... мде...

С другой стороны, man pthread_spin_lock... тот же мьютекс, но realtime (если не ошибаюсь).

Так как проблема-то решилась?
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

nercus писал(а):
15.12.2005 11:25
стало быть наверное приложение (каким-то образом) вызовет непосредственно функцию ядра

Как оно вызовет ядрёную функцию если она в другом адресном пространстве находится? Бред это.
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

Zeus писал(а):
15.12.2005 11:36
nercus писал(а):
15.12.2005 11:25

стало быть наверное приложение (каким-то образом) вызовет непосредственно функцию ядра

Как оно вызовет ядрёную функцию если она в другом адресном пространстве находится? Бред это.

бред конечно. хых. это предложение нельзя выдирать из контекста.
Ах да, я забыл, что у нас руту все можно, стало быть наверное приложение (каким-то образом) вызовет непосредственно функцию ядра... мде...
Я думал, я ясно выразился... Это была (как оказалось, безуспешная) попытка сиронизировать;)
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

добавил:
Ладно, вхватит вокруг-да-около.
Было сказано, что задача решилась:
А так, задача решилась, нашел-таки толковую доку, в которой русским по белому сказано, что spin_lock и есть вход в критическую секциюsmile.gif, причем независимо от архитектуры, как SMP, так и не SMP.

Всем спасибо за участие в дискуссииsmile.gif
Удачи, и побольше подвигов в работе и развлечении biggrin.gif


Вопрос "в лоб":
- как данное решение сочетается с фактом, что spin_lock - чисто ядерный интерфейс?
- или что это тогда за spin_lock такой?
- какой смысл был тогда создавать эту тему?
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация "критической секции" в Linux

Сообщение flook »

Zeus писал(а):
15.12.2005 10:26

рут выполняется на уровне ядра
Доказательства в студию.

Пока одни слова.

Именно. рут выполняется на том же уровне что и все остальные юзеры. У него просто в ядерных структурахз привелегий больше.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация "критической секции" в Linux

Сообщение Zeus »

Попробовал как Абадонна говорил написать программулину с чтением портов:

Код:
------
#include <sys/io.h>

main ()
{
inb (0);
return 0;
}
------

Компилю:
gcc test.c

Падает с segmentation fault и под root'ом и под обычным юзером.
В man'е для inb написано, что эта функция вообще-то предназначена для выполнения на уровне ядра, но, типа, можете юзать и в пользовательском режиме. А вот фиг.

У меня закрадывается слабенькое такое подозрение, что Абадонна работает не под линухом, а под ОС с микроядром, например типа QNX. Там вроде дрова и вообще всё кроме ядра работает в пользовательском режиме.
Может поэтому у него такие странные представления обо всём...
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Реализация "критической секции" в Linux

Сообщение nercus »

Zeus писал(а):
15.12.2005 14:20
Компилю:
gcc test.c

Падает с segmentation fault и под root'ом и под обычным юзером.
В man'е для inb написано, что эта функция вообще-то предназначена для выполнения на уровне ядра, но, типа, можете юзать и в пользовательском режиме. А вот фиг.

Не пробовал, но (man 2 inb):
You use ioperm(2) or alternatively iopl(2) to tell the kernel to allow
the user space application to access the I/O ports in question. Failure
to do this will cause the application to receive a segmentation fault.


Вообще, имхо тема исчерпана. Автор вроде как ушел. И каким волшебным образом он решил задачу с помошью spin_lock он уже вряд ли нам поведает.

flook писал(а):
15.12.2005 14:04
Zeus писал(а):
15.12.2005 10:26


рут выполняется на уровне ядра
Доказательства в студию.

Пока одни слова.

Именно. рут выполняется на том же уровне что и все остальные юзеры. У него просто в ядерных структурахз привелегий больше.

Нее, так не интересно. Надо было чтобы Abaddon попытался найти подтверждения своим словам и в процессе поиска увидел бы свет...;)
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали: