Я хочу написать функцию computeWriteSet
, которая принимает произвольную функцию f
в качестве аргумента и (1) выполняет функцию f
, а (2) возвращает набор мест , измененных илизаписано (адреса / страницы / объекты) во время выполнения f
.
writeset computeWriteSet(function f) {
writeset ws = createEmptyWriteset();
// prepare to execute f
startRecordingWrites(&ws);
f();
stopRecordingWrites(&ws);
// post-process the write-set
return ws;
}
- Какие существуют варианты его реализации?
- Каковы их компромиссы (в каком случаекакая реализация более эффективна и каковы ограничения?)
Примечания
Функция указана во время выполнения и может делать все что угодно (т.е. может содержать любой набор инструкций, включая циклы,ветвление и системные / функциональные вызовы.
Все записи с момента вызова f
и до его возвращения должны быть записаны (сюда входят функции, вызываемые из самого f
). Для простоты, давайте предположим, computeWriteSet
не вызывается изнутри.
Специфичные для ОС трюки разрешены (и, вероятно, необходимы). Меня особенно интересует Linux , в идеале в пользовательском пространстве.
Пример
static int x = 0;
static int y = 0;
static int z = 0;
void a() {
if (y) z++;
if (x) y++;
x = (x + 1) % 2;
}
int main() {
computeWriteSet(a); // returns { &x } => {x,y,z} = {1, 0, 0}
computeWriteSet(a); // returns { &x, &y } => {x,y,z} = {0, 1, 0}
computeWriteSet(a); // returns { &x, &z } => {x,y,z} = {1, 1, 1}
return 0;
}
Ожидаемый результат
Выход должен быть набором изменений .Это может быть либо набор страниц:
{ <address of x>, <address of y>, …}
, либо набор адресов памяти:
{<page of x and y>, <page of z>, …}
, либо набор объектов ((на основе взаимного расположения функций выделения)
x = malloc(100) // returns address 0xAAA
y = malloc(200) // returns address 0xBBB
…
{ {address, size}, {0xAAA, 100}, {0xBBB, 200}, … }
Возвращаемое значение специально указано произвольно - разные методы будут иметь разное пространственное разрешение и разные накладные расходы.
Обратите внимание:
Это оченьнеобычный вопрос программирования, поэтому, если вы считаете, что он должен быть закрыт, дайте мне знать, почему и, в идеале, как сформулировать / разместить его так, чтобы он соответствовал рекомендациям.: -)