Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковДоступ к разделяемой памяти надо синхронизировать, да Анатолий Широкова для этого надо нечто уровня ядра. нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:12 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий Широкова для этого надо нечто уровня ядра. нет не верю (c) Станиславский ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:18 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Вот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой. (В терминах существующего АПИ) Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг). При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена. Если не удается, то юзер вызывает WaitForSO для ивента. При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент. Все. Когда нет конкурентов юзер вообще не переключается в ядро. Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:22 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Да, забыл написать - в спинлоке хранится еще кол-во ждущих, чтобы избежать ненужных сигналов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:24 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API . Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. С таким же эффектом можно сказать, для свободного полета человека нет никаких преград кроме законов физики. Слишком общо. Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе? А именно обеспечение равных шансов захвата всеми конкурирующими потоками (при многократном захвате), таймауты, сигнализация, да и вообще все что отличает его от спин-блокировки? Кто будет сообщать другим потокам\процессам о том что мьютекс освободился? Кто будет принимать решение какой из ждущих потоков будить? Как вообще планировать задачи (потоки, процессы) из юзерспейс кода? Поток\процесс пытается захватить мьютекс. Вызывается какой-нибудб interlocked_exchange и поток понимает что - облом мьютекс уже захвачен. Вопрос что он должен делать? Видится три варианта 1. Дико exch-ить пока не получится захватить. 2. Делать №1 с какой-либо периодичностью с засыпаниями (что неизбежно приводит к вызову контекста ядра, так как идет вызов планировщика). Тем не менее 1, 2 - это варианты спин блокировки, и речь не о них, речь ведь о конкретном объекте ядра винды - Mutex Object. 3. Нужно как-то попросить ядро чтобы она сообщила когда потоку можно будет попробовать захватить мьютекс еще раз и тут же заснуть. Заметили словосочетание попросить ядро? А там таких молящих о помощи еще с десяток. Их надо где-то держать. Их надо планировать. Равномерно давать подержать мьютекс. Пинать по таймауту. А если еще учесть что мьютексом владеет захвативший поток, следить за ним, чтобы он не помер вместе с мьютексом, а если он все таки умудрится это сделать, пометить мьютекс как свободный. Будет интересно послушать ктО это все будет делать как не ядро и причем тут безопасность.. Говорю без сарказма, потому-что есть много док которые надо прочитать, где предпринимаются попытки найти ктО, поэтому будет действительно интересно и полезно послушать развернутые ответы на эти вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:35 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой. (В терминах существующего АПИ) Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг). При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена. Если не удается, то юзер вызывает WaitForSO для ивента. При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент. Все. Когда нет конкурентов юзер вообще не переключается в ядро. Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок. Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:38 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе? А кто сказал что надо весь функционал реализовывать в юзерспейсе? Мы с чего начали? С того что крит.секция быстрее мьютекса. Что - секция прямо вся в юзерспейсе выполняется? Нет. Там где это требуется она переключается в ядро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:40 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться. А то что я привел - это именно межпроцессный мьютекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:42 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:49 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskysherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться. А то что я привел - это именно межпроцессный мьютекс. Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. ЕМНИП подобный функцонал приводится у Рихтера в качестве примера, класс Optex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:55 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
?Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть. В таком случае это еще одно подтвердение, что только безопасность мешает реализовать межпроцессный мьютекс в юзерспейсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 16:01 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. В той реализации что я привел соблюдаются все эти требования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 16:04 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskysherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. В той реализации что я привел соблюдаются все эти требования. А как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 19:54 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? Так сам спинлок и обеспечивает это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:17 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? Так сам спинлок и обеспечивает это. Это утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:33 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах. http://ru.wikipedia.org/wiki/Spinlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:47 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах. http://ru.wikipedia.org/wiki/Spinlock Хорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:21 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен? Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?". Для работы спинлока нет разницы разделяемая это память, или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:31 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен? Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?". Для работы спинлока нет разницы разделяемая это память, или нет. Нет, не ставлю. Просто я пытаюсь понять. Есть два процесса, каждый со своим адресным пространством. Спин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:34 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий Широковспин должен работать с неким адресом общим для двух процессов Кстати виртуальный адрес размещения спинлока необязательно совпадает в разных процессах, а физический - да, общий. Но физические адреса никого не интересуют. Есть примитив "разделяемая память" - он реализует соответствующее размещение спинлока, без заботы о физ. адресах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:37 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:45 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками. Вот это и вызываем у меня большие сомнения. Для использования разделяемой памяти для помещения туда спинлока необходимо знать детали его реализации. Если взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:51 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЕсли взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов. Вирт. адрес и не должен совпадать. А совпадение физ. адресов обеспечивается использованием разделяемой памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:55 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38329617&tid=2020097]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 284ms |
| total: | 408ms |

| 0 / 0 |
