Реализация функциональности снимка для программы, требующей задержки - PullRequest
2 голосов
/ 18 ноября 2011

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

В случае сбоя программы мы должны вернуться к последнему рабочему состоянию БЫСТРО.

Одним из способов является чтение и обработка данных из журнала транзакций, который содержит транзакции с начала дня. Но это совсем не быстро, учитывая размер журнала транзакций (сотни гигабайт).

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

Если бы мы использовали локальную память для хранения данных вместо общей памяти, решение будет простым:

  1. вилка ()
  2. запись данных на диск

Из-за копирования при записи в Linux будут копироваться только измененные данные, поэтому это очень быстро.

Но мы используем общую память posix.

Есть ли способ сделать это с учетом скорости и последовательности?

1 Ответ

0 голосов
/ 18 ноября 2011

Если вы можете сэкономить достаточно циклов ЦП для memcpy (), вы можете:

  1. fork ()
  2. заблокировать разделяемую память
  3. memcpy (shared_mem -> some_buffer)
  4. разблокировать разделяемую память
  5. записывать данные на диск, занимая время, которое вам нравится
...