Что представляет собой эффективный способ конвертировать общую карту памяти в другую модель доступа к данным?

У меня есть база кода, созданная вокруг общей памяти. Каждый процесс, который должен получить доступ к памяти, отображает его в собственное адресное пространство. Структуры данных в общей памяти напрямую доступны, то есть нет API. Например:

Предположим следующее:

typedef struct {
  int x;
  int y;
  struct {
    int a;
    int b;
  } z;
} myStruct;

myStruct s;

Затем процесс может получить доступ к этой структуре как:

myStruct *s = mapGlobalMem();

И используйте его как:

int tmpX = s->x;

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

Я изучил использование ANTLR для создания парсера, который будет идентифицировать ссылки на небольшой набор структур и ввести их в пользовательская таблица символов. Затем я мог бы использовать эту таблицу символов, чтобы определить, какие исходные файлы необходимо реорганизовать. Это похоже на перспективный подход.

Какие существуют другие подходы? Конечно, я ищу программный подход. Существует слишком много исходных файлов для визуального изучения каждого из них.

Это все обычные ANSI C. Ничего другого.

7 голосов | спросил Rob Jones 14 PM00000090000000731 2011, 21:41:07

4 ответа


1

Я предполагаю, что это часть большого проекта, потому что вы упомянули «слишком много исходных файлов». Я не знаю окончательной цели. Вы можете поместить конфигурацию в базу данных и изменить mapGlobalMem () для заполнения & вернуть ячейку памяти, содержащую конфигурацию. Таким образом, вы не нарушаете свой контракт с текущим кодом, но вы переместили конфигурацию «вне» процесса. Я предполагаю, что вы не хотите звонить в базу данных каждый раз, когда кто-то пытается получить доступ к информации о конфигурации.

Теперь, если вы беспокоитесь о свежести и, следовательно, вам нужно реорганизовать это в API, я бы предложил искать все события mapGlobalMem () и myStruct. Это должно дать вам оценку парка шаров.

В конечном счете, если вы пытаетесь автоматизировать это изменение, я бы предположил, что вы потратили бы больше времени на автоматизацию, чем на простое sed /find-replace.

ответил void_ptr 21 12011vEurope/Moscow11bEurope/MoscowMon, 21 Nov 2011 03:08:24 +0400 2011, 03:08:24
0

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

ответил Lasse 18 AM00000010000000331 2011, 01:21:03
0

Несколько меньше всего или ничего не может быть, чтобы заполнить глобальную структуру и вернуть только указатели «const». Пусть снова будут предупреждения для компилятора, но вы только «должны» обновить писателей . Инициализировать структуру один раз (добавьте флаг is_configured, возможно, как статический файл, скопированный в файл), по первому запросу, и если вызывается функция «writer», обновите структуру и базу данных поддержки. @Lasse имеет «правильный» ответ, но это может быть «целесообразным» для краткосрочного воздуховода.

Даунсайд: вам нужно обработать какой-то асинхронный сигнал, если другой процесс изменит настройку. В Unix /Linux SIGWINCH - хороший кандидат, а SIGHUP - несколько традиционный. (SIGWINCH получает побочные удары, если вы работаете с xterm, который изменяется, но для фонового демона он никогда не вызывается и по умолчанию является IGNored. SIGHUP по умолчанию убивает вас.)

ответил BRPocock 28 WedEurope/Moscow2011-12-28T07:38:46+04:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2011 07:38:46 +0400 2011, 07:38:46
0

Основываясь на вашем описании, вот как я бы поставил цель.

  1. Механизм использования для конечного приложения должен оставаться таким же; то есть.

    myStruct *s = mapGlobalMem(); int tmpX = s->x; не должен меняться. Это означает, что приложение, которое использует этот GlobalMap, не должно знать, что такая карта действительно из базы данных.

  2. Оба механизма должны продолжать функционировать - то есть существующее приложение должно работать так, как оно есть, когда оно в настоящее время получает карту или дополнительно , теперь она может ее получить из БД.

  3. Система должна быть потокобезопасной и способна работать с несколькими экземплярами. Подумайте об этом, как Malloc (). Он управляет внутренними структурами данных разных вещей. Однако, если одновременно задействовано несколько потоков, это не испортит структуру, а разные потоки /объекты могут запрашивать память и назначаются разные блоки.

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

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

Я предполагаю, что DATA, который представлен в *s, теперь извлекается из БД, а не из текущего источника. (Если я ошибаюсь здесь - большинство ответов ниже, возможно, нужно будет переписать.)

Вот что я буду делать.

  1. Существует расширение основной функциональности с новым API: что-то вроде setGlobalMem (информация);

info - это то, где я решаю, какой источник использовать - будь то текущая методология или db, а если в БД - какой запрос будет по существу перераспределите его. В качестве альтернативы можно также представить, что config может проходить через .conf-файл или через какую-либо другую форму ввода.

  1. Перегруппируйте основной API для поддержки обоих параметров. В основном у меня был бы охраняемый указатель вроде *currentValidMap. Всякий раз, когда происходит обновление до /из любого источника данных, последний s обновляется как один из этих; возможно, что-то вроде этого может существовать.

  2. У меня может быть дополнительная функция, например updateMap(section,source), которая используется для ограничения некоторых вариантов конфигурации локально, например. Здесь я бы использовал часть информации через какой-то другой источник. Более того, я мог бы также иметь lockMap, чтобы закрыть любые дальнейшие изменения Карты. Все эти API используются централизованно для создания Карты по мере необходимости.

Я принимаю вещи - поэтому в некоторых случаях это может быть неточно.

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

ответил Dipan Mehta 2 Jpm1000000pmMon, 02 Jan 2012 12:03:09 +040012 2012, 12:03:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132