Я хочу подсчитывать просмотры для веб-страницы, пока использую G-WAN и C. Я не так хорошо с ними знаком. Я использую 64-битный процессор Intel. Я искал тему и до сих пор не знаю, может ли кто-нибудь мне помочь? Спасибо.
Как реализовать атомарную операцию на C в G-WAN
Ответы (3)
Я хочу подсчитывать просмотры веб-страницы, используя G-WAN и C
Хорошо, есть несколько вариантов:
- сервлет G-WAN
- обработчик соединения G-WAN
- обработчик типа содержимого G-WAN
... и ваш код может использовать разные способы в зависимости от ваших потребностей (перечислены в порядке скорости и эффективности памяти):
- глобальная атомарная переменная, прикрепленная к постоянному указателю G-WAN
- глобальное хранилище G-WAN KV, прикрепленное к постоянному указателю G-WAN
- системный сегмент разделяемой памяти (он переживет остановку сервера)
- база данных в памяти или на диске (SQLite и т. д.)
- хранилище или сервер БД KV (Memcached, Redis, mySQL и т. д.)
- и т.п.
Вы даже можете использовать их сочетание и использовать быстрый (в памяти) метод, который периодически сохраняется на диск.
Это действительно зависит от ваших потребностей (отслеживает ли счетчик одну страницу? она извлекается 10 000 раз в секунду, 1 миллион раз? и т. д.).
Я очень мало знаю о G-WAN. Я просматривал их веб-сайт, и, насколько я могу судить, он запускает один поток на процессор; и ваш код C загружается один раз, а затем выполняется в контексте потока G-WAN каждый раз, когда это необходимо. В этом случае вы должны иметь возможность использовать обычные атомарные объекты (например, подходящую библиотеку для атомарных операций для C или встроенную сборку, если вы не можете найти подходящую библиотеку для C).
Проблема будет заключаться в хранении вашего счетчика на диске (например, чтобы он не сбрасывался на ноль при перезапуске сервера). Теоретически вам нужно только один раз прочитать предыдущее значение с диска при запуске веб-сервера и записать новое значение на диск один раз при остановке сервера (или, возможно, каждые 30 минут или что-то в этом случае в случае сбоя сервера). Это не что-то на критическом пути (например, не то, что нужно сохранять/извлекать каждый раз, когда обслуживается страница). На практике я понятия не имею, поддерживает ли G-WAN это вообще (или работает ли что-то вроде функции atexit()
).
Если G_WAN не поддерживает его, вы можете обойти его, используя (например) глобальную переменную «время последнего сохранения состояния», защищенную каким-либо мьютексом; где (если он не установлен) вы загружаете старое состояние с диска и устанавливаете глобальную переменную, а если она установлена, вы используете ее, чтобы определить, прошло ли «X минут» с момента последнего сохранения. Конечно, получение мьютекса и проверка глобальной переменной будут иметь более высокие накладные расходы, чем увеличение вашего счетчика; но это все равно будет в несколько тысяч раз быстрее, чем (например) использование механизма базы данных.
РЕДАКТИРОВАТЬ:
Хорошо, мой плохой. Я слишком быстро прочитал вопрос и зациклился на HTTP-запросах, забыв о сервлетах. Я подумал о простом счетчике посещений на странице, поэтому и задумался об использовании атомарной переменной.
Пожалуйста, примите мои извинения.
Тем не менее, я не вижу смысла в оптимизации счетчика страниц, поскольку обслуживание самой страницы, вероятно, будет потреблять бесконечно больше ЦП и ресурсов, чем чтение/изменение/запись одной переменной.
В системе KV уже предусмотрен запорный механизм. Что касается эффективности, использование примитива kv_do
должно обрабатывать одновременные доступы и выполнять работу за незначительное количество времени.
И я остановлюсь на этом деле с атомарными переменными.
Теперь, когда многоядерная архитектура накладывает свои ограничения практически на любого программиста приложений, атомарные переменные кажутся последней модной серебряной пулей.
Потратив около дюжины лет на проектирование встроенное многозадачное программное обеспечение, где одновременный доступ и синхронизация задач являются постоянной проблемой, мой вывод: это не так.
lock add [myPageCounter],1
в ассемблере и использованием механизма базы данных для увеличения счетчика?
- person Brendan; 15.01.2014