Как реализовать атомарную операцию на C в G-WAN

Я хочу подсчитывать просмотры для веб-страницы, пока использую G-WAN и C. Я не так хорошо с ними знаком. Я использую 64-битный процессор Intel. Я искал тему и до сих пор не знаю, может ли кто-нибудь мне помочь? Спасибо.


person Thang    schedule 15.01.2014    source источник
comment
stackoverflow.com/a/13338474/1741361 это может быть ответом, который вы ищете. G-WAN использует gcc, а gcc имеет некоторую поддержку атомарных операций. Для сохраняемости в памяти используйте указатель сохраняемости G-WAN (см. API).   -  person Nagi    schedule 15.01.2014


Ответы (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 миллион раз? и т. д.).

person Gil    schedule 15.01.2014

Я очень мало знаю о G-WAN. Я просматривал их веб-сайт, и, насколько я могу судить, он запускает один поток на процессор; и ваш код C загружается один раз, а затем выполняется в контексте потока G-WAN каждый раз, когда это необходимо. В этом случае вы должны иметь возможность использовать обычные атомарные объекты (например, подходящую библиотеку для атомарных операций для C или встроенную сборку, если вы не можете найти подходящую библиотеку для C).

Проблема будет заключаться в хранении вашего счетчика на диске (например, чтобы он не сбрасывался на ноль при перезапуске сервера). Теоретически вам нужно только один раз прочитать предыдущее значение с диска при запуске веб-сервера и записать новое значение на диск один раз при остановке сервера (или, возможно, каждые 30 минут или что-то в этом случае в случае сбоя сервера). Это не что-то на критическом пути (например, не то, что нужно сохранять/извлекать каждый раз, когда обслуживается страница). На практике я понятия не имею, поддерживает ли G-WAN это вообще (или работает ли что-то вроде функции atexit()).

Если G_WAN не поддерживает его, вы можете обойти его, используя (например) глобальную переменную «время последнего сохранения состояния», защищенную каким-либо мьютексом; где (если он не установлен) вы загружаете старое состояние с диска и устанавливаете глобальную переменную, а если она установлена, вы используете ее, чтобы определить, прошло ли «X минут» с момента последнего сохранения. Конечно, получение мьютекса и проверка глобальной переменной будут иметь более высокие накладные расходы, чем увеличение вашего счетчика; но это все равно будет в несколько тысяч раз быстрее, чем (например) использование механизма базы данных.

person Brendan    schedule 15.01.2014
comment
G-WAN не позволит вам этого сделать. Код НЕ является постоянным. G-WAN предлагает механизмы для хранения данных между соединениями, но они находятся вне вашего контроля. Ваш код действительно выполняется в потоке-оболочке, но как только запрос выполнен, поток завершается. Он не будет сидеть сложа руки в ожидании другого соединения. Концептуально это имело бы не больше смысла, чем бесконечный цикл программы PHP, ожидающий обработки следующего соединения (которое, скорее всего, даже не будет обслуживаться на том же ПК, в зависимости от того, где система балансировки нагрузки решит его обработать). - person kuroi neko; 15.01.2014
comment
@kuroi, вы ошибаетесь: код ПОСТОЯНЕН. Потоки не завершаются после выполнения запроса. Кроме того, постоянные указатели G-WAN также являются постоянными. - person Gil; 15.01.2014

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

Хорошо, мой плохой. Я слишком быстро прочитал вопрос и зациклился на HTTP-запросах, забыв о сервлетах. Я подумал о простом счетчике посещений на странице, поэтому и задумался об использовании атомарной переменной.

Пожалуйста, примите мои извинения.

Тем не менее, я не вижу смысла в оптимизации счетчика страниц, поскольку обслуживание самой страницы, вероятно, будет потреблять бесконечно больше ЦП и ресурсов, чем чтение/изменение/запись одной переменной.

В системе KV уже предусмотрен запорный механизм. Что касается эффективности, использование примитива kv_do должно обрабатывать одновременные доступы и выполнять работу за незначительное количество времени.

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

person kuroi neko    schedule 15.01.2014
comment
Как вы думаете, может ли быть небольшая разница в производительности между (например) чем-то вроде одной инструкции lock add [myPageCounter],1 в ассемблере и использованием механизма базы данных для увеличения счетчика? - person Brendan; 15.01.2014
comment
В конечном итоге проблема заключается в том, чтобы сохранить ваш счетчик на диске, чтобы следующий экземпляр вашего кода, работающий на другой машине, мог снова прочитать его, увеличить его и записать обратно. Решающим фактором здесь будет время нахождения в облачной файловой системе. Время, потраченное на ваш реальный фрагмент кода, будет абсолютно незначительным. Кроме того, такая архитектура предназначена не для написания серверов, а просто для использования C и любых других языков для выполнения той же работы, что и PHP (плюс, может быть, немного потоковой передачи). Увеличение счетчика будет потеряно в фоновом шуме. - person kuroi neko; 15.01.2014
comment
этот ответ на самом деле добавил много неуместных вещей. Проблема записи на диск касается каждой существующей системы (которая требует сохранения данных). Существует множество баз данных в оперативной памяти, разработанных для преодоления этого барьера. И даже если нужно записать на диск, всегда есть опция периодической записи! Я также не видел, чтобы ОП упоминал в вопросе что-либо дорогое для ввода-вывода - этот ответ просто предполагал это. - person Nagi; 15.01.2014
comment
@Nagi То, что упомянул OP, - это G-WAN. Это компания, занимающаяся серверами веб-приложений. Это среда исполнения, которую они предлагают. Использование C вместо PHP для создания веб-страниц и, кроме того, немного потоковой передачи. Несмотря на то, что вы можете использовать C++ или десяток других языков, ваша среда выполнения в основном такая же, как и PHP-скрипт. Нет постоянного контекста памяти, кроме кеша, предоставляемого серверной структурой, нет базы данных в памяти, которой вы можете управлять, и нет периодической записи по вашей команде. Вы страдаете от дороговизны ввода-вывода, присущей серверам веб-страниц. - person kuroi neko; 15.01.2014
comment
@kuroi, G-WAN НЕ использует C вместо PHP для создания веб-страниц *, поскольку он поддерживает оба (и еще дюжину). Кроме того, другие ваши утверждения также неверны: * Нет постоянного контекста памяти, кроме кеша, предоставляемого серверной структурой, нет базы данных в памяти, которую вы можете контролировать. G-WAN предоставляет постоянное хранилище KV, проверьте его API: gwan.ch/api#kv, и вы вы можете использовать любую библиотеку C/C++, включая системную общую память, которая выдержит остановку и перезапуск G-WAN. - person Gil; 15.01.2014
comment
Я сказал C вместо PHP, просто чтобы прояснить контекст, в котором работала программа на C. Хранилище KV — это именно то, что я имел в виду, когда говорил о кэше сервера. Вы можете сохранить кусок памяти, связанный с ключом, и получить его обратно при следующем подключении. Тем не менее, управление этим объектом не в ваших руках, и вы не можете создать другой такой объект из необработанных примитивов операционной системы. Тем не менее, у вас нет постоянной программы, работающей в этой архитектуре. Только программы, которые могут легко распределять память между вызовами. - person kuroi neko; 15.01.2014
comment
@kuroineko есть способы избежать дискового ввода-вывода: разгрузить статический контент в CDN и кэшировать свой HTML-шаблон (для создания динамического контента). Тем не менее, у вас нет постоянной программы, работающей в этой архитектуре Redis является худшим вариантом по сравнению с KV G-WAN с точки зрения чистой скорости, автономной программы, открытого исходного кода (если это то, что вы подразумеваете под в -memory DB, которой вы можете управлять), и она поддерживает периодическую запись. У Redis также есть официальный клиент ANSI C — вы сможете использовать его в G-WAN с включением #pragma. - person Nagi; 16.01.2014