2009-10-17 2 views
0

Это вопрос о домашнем задании из курса проектирования компилятора. Мне просто нужно объяснить некоторые части вопроса.Подсчет блоков памяти

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

Контекст, в котором это относится, относится к связанным спискам.

Ответ от ответа листа состояний:

Как найти этот счетчик начинает из указателя на запись и как вы получаете указатель на которое возвращении блока?

Исходя из фона на основе C. Может ли кто-нибудь объяснить мне, что:

  1. блок есть?
  2. счетчик делает?
  3. Занятая запись есть?

Ссылка на документы, которые обеспечивают сквозной ход того, что происходит на этом этапе подсчета. Диаграммы были бы полезны.

Спасибо.

+0

Недостаточно контекста в вопросе, чтобы ответить на этот вопрос ... Ответы на ваш вопрос были бы частью вопроса в вашем учебнике, который вы не приводили (или в предыдущей главе). – bdonlan

+0

Извините, я обновил его в контексте связанных списков. –

+0

Вы должны спросить того, кто дал задание, что они подразумевают под этими условиями. Как вы, мы можем только догадываться. Однако, внимательно прочитав выдержку, мы можем вывести: не подсчитываются блоки памяти, а их использование, и это делается для определения того, когда блок памяти не используется и, следовательно, может быть восстановлен. – meriton

ответ

1

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

Если у вас есть страница памяти, мы можем сказать, что страница размером 8k. Это минимальный размер, выделяемый менеджером памяти.

У вас есть 10 запросов по 100 байт каждый, поэтому 1000 байтов находятся в разных местах на странице.

Счетчик будет равен 10, но как вы знаете, что фактически освобождено или уже выделено, поскольку 10 запросов могут не быть смежными, так как могут быть другие запросы, которые уже были освобождены.

Итак, у нас есть 10 занятых записей.

Теперь вам нужно будет придумать свои собственные ответы на вопрос в листе ответов, но, надеюсь, глядя на пример, это может быть проще.

0

«Блок», скорее всего, является basic block.

Я не знаком с термином «занятая запись»; скорее всего, это относится к некоторому результату анализа потока данных для переменных (т. е. переменные могут считаться «занятыми»). Несколько определений представляется правдоподобным:

  1. переменная может рассматриваться как «занято», если она имеет значение (то есть было «написано»), который также будет «читать» (что означает, что вы не можете устранить эту переменную легко)
  2. переменная может считаться «занятой», если она используется «часто» (чаще, чем другие переменные), что означает, что вы должны попытаться выделить ее в регистр.

Однако вы должны действительно узнать, как этот термин был определен в вашем курсе.

Затем счетчик будет подсчитывать за базовый блок количество переменных, которые заняты. Почему этот счетчик может стать 0 после некорректной обработки - скорее всего, «занятый» имеет еще одно значение в вашем курсе.

+0

Я читал вещи как 3 раза. Я ничего не вижу о «занятой записи». Был поиск «занят», приземлился на вопрос. Несмотря на то, что он ссылается на связанные списки, я до сих пор не знаю, как связать «занятую запись» с этим типом структуры данных. –

0
  1. блок есть? менеджер разделил пространство памяти на блоки. один или несколько блоков составляют блок области памяти, который можно использовать для непрерывного доступа пользователя. если требуется больше памяти, менеджер добавит дополнительные блоки к этой области памяти. в то время как менеджер всегда пытается предоставить пользователю непрерывные блоки.

  2. счетчик делает? для конкретного блока он может использоваться разными пользователями, то есть область памяти разделяется несколькими пользователями.

  3. Занятая запись есть? значение счетчика, которое хранится в вышеуказанном «счетчике».

, например:

struct block { 
    struct block *next; 
    long counter; //@< the busy record 
}; 

EDIT: changing "area" to "user" 
struct user { 
    struct block *head; 
    ... 
}; 

EDIT: ответ на вопрос "почему? Счетчик не достаточно для блока" Требуется дополнительная информация при перемещении блока из «списка свободных блоков» в «список выделенных блоков» или наоборот, например. порядок, используемый для быстрого нахождения позиции в списке. в то время как я просто догадываюсь об этом.