Изменение типа 32-битной переменной на 64-битную переменную? - PullRequest
0 голосов
/ 22 января 2009

Мое приложение работает в операционной системе pSOS. Код компилируется с помощью компилятора Diab C.

Приложение определяет количество счетчиков, которые были объявлены как

unsigned int call_count;

Поскольку есть вероятность того, что некоторые из них будут переполнены за небольшой промежуток времени, я решил объявить счетчики как

unsigned long long int call_count;

Это, я думаю, не переполнится, по крайней мере, при моей жизни.

Мой вопрос, это преобразование безопасно? Есть ли какие-либо накладные расходы, которые мне нужно беспокоиться. Когда приложение находится в состоянии стресса, call_count будет непрерывно увеличиваться. Может ли производительность принять удар? Менеджер SNMP также будет запрашивать эти счетчики каждые 15 секунд.

Ответы [ 4 ]

2 голосов
/ 23 января 2009

Ваш код предполагает, что увеличение 32-битной переменной является атомарной операцией? Увеличение 64-битной переменной на 32-битном процессоре, вероятно, не будет атомарным, если вы не сделаете все возможное, чтобы сделать это.

Пример:

  1. call_count равно 0x00000005FFFFFFFF при поступлении вызова.
  2. Увеличивается нижняя половина call_count: call_count устанавливается в 0x000000500000000, а бит переноса ЦП устанавливается в 1.
  3. Верхняя половина call_count увеличивается битом переноса: call_count устанавливается на 0x0000000600000000.

Если другой поток или обработчик прерываний читает значение call_count между шагами 2 и 3, он получит неправильный результат (0x000000500000000 вместо 0x000000600000000). Решение заключается в синхронизации доступа к call_count. Несколько возможностей:

  • Отключить прерывания (при необходимости)
  • Сериализация доступа с использованием блокировки
  • Чтение и запись с использованием атомарных / блокированных функций (пример: InterlockedIncrement() в Windows)
1 голос
/ 22 января 2009

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

1 голос
/ 22 января 2009

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

0 голосов
/ 23 января 2009

С тобой должно быть все в порядке.

Я предполагаю (из pSOS), что вы кодируете для Moto 68000, который является 32-битным процессором; работать с 64-битными числами там немного медленнее, потому что для этого нужно еще несколько инструкций (например, добавить, проверить перенос, ветвление или добавить к старшему слову), но я сомневаюсь, что вы сильно беспокоитесь о стоимости четырех циклов. Если вы используете 64-разрядный процессор, то 64-разрядные операции выполняются точно так же быстро, как и 32-разрядные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...