Мне нужен пользовательский поставщик членства для интеграции сторонней аутентификации в ASP.NET?

Автор, похоже, обеспокоен тем, что поток 1 и поток 2 попадают в ситуацию, когда чтение-изменение-запись (не в программном обеспечении, программное обеспечение выполняет две отдельные инструкции размером в байт, где-то внизу должна выполняться логика строки). чтение-изменение-запись) вместо идеальной операции чтения-изменения-записи-чтения-изменения-записи становится записью-чтением-изменением-записью-записью или каким-либо другим моментом, так что обе считывают предварительно измененную версию и побеждает последняя из записанных версий. чтение чтение изменение изменение запись запись или чтение изменение чтение изменение запись запись или чтение изменение чтение запись изменение запись.

Задача состоит в том, чтобы начать с 0x1122, и один поток хочет сделать его 0x33XX, а другой хочет сделать его 0xXX44, но, например, с чтением-изменением-изменением-записью-записью вы в конечном итоге получите 0x1144 или 0x3322, но не 0x3344

В здравом (системном / логическом) дизайне такой проблемы просто нет, конечно, не для процессора общего назначения, подобного этому, я работал над проектами с такими проблемами синхронизации, но это не то, о чем мы здесь говорим, совершенно разные конструкции систем для разных целей. Чтение-изменение-запись не распространяется на достаточно большое расстояние в нормальном дизайне, а x86 - это нормальные проекты.

Чтение-изменение-запись должно происходить очень близко к первой задействованной SRAM (в идеале L1 при обычном запуске x86 с операционной системой, способной запускать многопоточные программы, скомпилированные в C ++) и происходить в течение нескольких тактовые циклы, поскольку оперативная память находится на скорости шины в идеале. И, как указал Питер, это считается целой строкой кеша, которая испытывает это внутри кеша, а не чтение-модификация-запись между ядром процессора и кешем.

Понятие «в одно и то же время» даже с многоядерными системами не обязательно в одно и то же время, в конце концов вы получаете сериализацию, потому что производительность не основана на их параллельности от начала до конца, она основана на держать автобусы загруженными.

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

Вы можете попробовать это, сделать многопоточную программу, которая пишет по адресу 0xnnn00000, а другая записывает по адресу 0xnnn00001, каждая выполняет запись, а затем выполняет чтение или, что лучше, несколько записей одного и того же значения, чем одна. прочитайте, проверьте, что чтение было записанным байтом, а затем повторяется с другим значением. Позвольте этому бежать некоторое время, часы / дни / недели / месяцы. Посмотрите, отключаете ли вы систему ... используйте сборку для фактических инструкций записи, чтобы убедиться, что она выполняет то, что вы просили (не C ++ или любой компилятор, который делает или утверждает, что не поместит эти элементы в одно и то же слово). Можно добавить задержки, чтобы увеличить количество кэш-памяти, но это уменьшает ваши шансы «одновременных» коллизий.

Ваш пример, если вы гарантируете, что вы не находитесь по двум сторонам границы (кеш или другое), например 0xNNNNFFFFF и 0xNNNN00000, изолируйте две байтовые записи по адресам, таким как 0xNNNN00000 и 0xNNNN00001, инструкции возвращаются назад и посмотрите, получите ли вы чтение, чтение, изменение, запись и запись. Оберните тест вокруг этого, что два значения различны в каждом цикле, вы читаете слово в целом с любой задержкой позже, когда захотите, и проверяете два значения. Повторите для дней / недель / месяцев / лет, чтобы увидеть, если это не удается. Ознакомьтесь с функциями выполнения вашего процессора и микрокода, чтобы увидеть, что он делает с этой последовательностью инструкций, и при необходимости создайте другую последовательность инструкций, которая пытается инициировать транзакции в течение нескольких или около того тактовых циклов на дальней стороне ядра процессора.

РЕДАКТИРОВАТЬ

проблема с кавычками заключается в том, что это все о языке и использовании. «Как и большинство современных аппаратных средств» ставит всю тему / текст в очень обидчивое положение, это слишком расплывчато, одна сторона может поспорить, все, что мне нужно сделать, - это найти один случай, который является правдой, чтобы сделать все остальное правдой, Точно так же одна сторона может поспорить, если я найду один случай, а все остальные не соответствуют действительности. Используя это слово, вроде путаницы с этим, можно выйти из тюрьмы бесплатно.

Реальность такова, что значительный процент наших данных хранится в памяти DRAM в 8-битной памяти, просто мы не обращаемся к ним как к 8-битной, обычно мы получаем доступ к 8 из них за раз, 64-битным широкий. Через несколько недель / месяцев / лет / десятилетий это утверждение будет неверным.

Более крупная цитата гласит «одновременно», а затем гласит: «прочитайте ... сначала, напишите ... наконец, хорошо, сначала и последнее, и в то же время не имеет смысла вместе, параллельно или последовательно? Контекст в целом связан с описанными выше вариантами чтения-чтения-изменения-записи-записи, когда у вас последняя запись и в зависимости от того, когда это чтение определяет, произошли обе модификации или нет. Не в то же самое время, когда «как большинство современных аппаратных средств» не имеет смысла, вещи, которые начинаются фактически параллельно в отдельных ядрах / модулях, в конечном счете, сериализуются, если они нацелены на один и тот же триггер / транзистор в памяти, один в конечном итоге должен ждать другого, чтобы идти первым. Основываясь на физике, я не вижу в этом неправильности в ближайшие недели / месяцы / годы.

1
задан Community 23 May 2017 в 12:30
поделиться

1 ответ

В прошлом я проделывал аналогичную работу, просто создавая новый класс провайдера, унаследованный от SqlMembershipProvider, а затем переопределив необходимые мне методы.

Вы по-прежнему можете вызвать реализацию базового метода, чтобы сначала выполнить большую часть работы, а затем выполнить любую дополнительную логику, которая вам понадобится в производном классе. Создание провайдера с нуля - это ОЧЕНЬ много работы, и это должно быть вашим последним средством.

Вы можете добавить новую таблицу в базу данных с ключевой ссылкой на aspnet_Membership - затем вы добавляете свои собственные хранимые процедуры, которые вызываете из своего методы производного поставщика, чтобы делать с этой новой таблицей все, что вам нужно. Это лучше, чем добавление столбцов в схему членства, поскольку при этом ваши пользовательские данные остаются разделенными.

Вам все равно необходимо изучить класс SqlMembershipProvider,

2
ответ дан 3 September 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: