Необходимо выровнять память по степени 2 и выровнять разрыв программы по кратному 2 * getpagesize() в C

Я перекодирую функцию malloc, используя brk, sbrk и getpagesize().

Я должен соблюдать два правила:

1) Я должен выровнять свою память по степени 2

Это означает: Если вызов malloc: malloc(9); я должен вернуть им блок из 16 байт. (ближайшая степень числа 2);

2) Я должен выровнять разрыв (сегмент данных конца программы) на кратном 2 страницам.

Я думаю о правилах, мне интересно, прав ли я;

Правило 1) Мне просто нужно сделать возврат моего malloc (то есть адрес, возвращаемый malloc в шестнадцатеричном формате) кратным 2?

И для правила 2)

разрыв - это последний адрес в куче, если я не ошибаюсь, мне нужно установить мой разрыв следующим образом (разрыв - начало кучи) % (2 * getpagesize())== 0? или просто разрыв% (2 * getpagesize() == 0? Спасибо


person freeinternet    schedule 10.02.2020    source источник
comment
«Выровнять память по степени двойки» — это не полная спецификация. Единица — это степень двойки (два в степени нуля), поэтому любое целое число кратно этой степени двойки, поэтому каждый адрес выравнивается по a степени двойки. Является ли спецификацией, что память, предоставленная вашим malloc, должна быть выровнена по определенной степени двойки? Фиксирована ли эта мощность в постановке задачи, она в два раза превышает размер страницы, передается ли она каким-то образом вызывающей стороне malloc или это что-то еще?   -  person Eric Postpischil    schedule 10.02.2020
comment
Нет, кроме того, нет никаких ограничений или большего определения проблемы; Ваша стратегия распределения должна быть следующей: вы должны выровнять память по степени 2, а разрыв должен быть выровнен по кратному 2 страницам) @EricPostpischil   -  person freeinternet    schedule 10.02.2020
comment
И использовать алгоритм наилучшего соответствия (но я уже понял, что это такое и как я буду это делать), поэтому для вас правило 1 ничего не значит, и я могу не заботиться об этом? @EricPostpischil   -  person freeinternet    schedule 10.02.2020
comment
Извините, но учителя просто так не ставят проблемные формулировки, если только они не ошибаются. Как я уже писал, не имеет смысла требовать, чтобы malloc было просто выравниванием памяти по «степени двойки», потому что каждый адрес памяти выравнивается по степени двойки. Если это точная формулировка постановки задачи, следует вернуться к учителю за разъяснениями. Если это не так, вы должны ввести точную формулировку в вопросе.   -  person Eric Postpischil    schedule 10.02.2020
comment
@EricPostpischil спасибо, я вернусь к учителям за это, а для второго правила разрыв должен быть выровнен по кратному 2 страницам, я думаю, что последний адрес в куче % 2 * getpagesize должен быть равен 0, am 'Я прав?   -  person freeinternet    schedule 10.02.2020
comment
Да, остаток кучи по модулю удвоенного размера страницы должен быть равен нулю. Однако вы не будете выражать это в коде как heap % 2 * pagesize, потому что % и * имеют одинаковый приоритет, поэтому это будет проанализировано как (heap % 2) * pagesize. Вам нужно, чтобы heap % (2 * pagesize) было равно нулю.   -  person Eric Postpischil    schedule 10.02.2020
comment
@EricPostpischil позволяет оценить степень 2 в степени 2, так как учитель больше не будет давать мне информацию   -  person freeinternet    schedule 10.02.2020
comment
Вы должны обновить этот вопрос, указав точный полный текст задачи.   -  person Eric Postpischil    schedule 10.02.2020


Ответы (1)


1) Я должен выровнять свою память по степени 2

Правило 1) Мне просто нужно сделать возврат моего malloc (то есть адрес, возвращаемый malloc в шестнадцатеричном формате) кратным 2?

Чтобы адрес был выровнен по степени 2, равной 2p, адрес должен быть кратным 2p.

2) Я должен выровнять разрыв (сегмент данных конца программы) на кратном 2 страницам.

разрыв - это последний адрес в куче, если я не ошибаюсь, мне нужно установить мой разрыв следующим образом (разрыв - начало кучи) % (2 * getpagesize())== 0? или просто разрыв% (2 * getpagesize() == 0?

Фраза «установить мой перерыв» неясна. Вам нужно использовать sbrk(0), чтобы получить текущее значение разрыва и рассчитать, сколько вам нужно добавить к нему, чтобы сделать его кратным удвоенному размеру страницы. Это говорит вам, где вам нужно начать блок памяти, выровненный по кратному удвоенному размеру страницы. Затем вам понадобится дополнительная память, чтобы содержать любое количество данных, которое вы хотите поместить туда (выделенное количество).

person Eric Postpischil    schedule 10.02.2020
comment
Итак, для правила n1 это так: если они вызывают malloc(9), я должен вернуть им 16-байтовый блок, я должен вернуть первую степень числа 2, которая может содержать запрошенный malloc - person freeinternet; 10.02.2020
comment
@freeinternet: Нет. Во-первых, у вас все еще нет надлежащей спецификации того, какую степень двойки следует использовать. Спецификация учителя, как вы сообщили, неадекватна. Когда вызывается malloc(9), есть некоторые требования к выравниванию, о которых мы не знаем из-за неадекватной спецификации. Давайте установим, что это A. То, что вы должны вернуть, — это адрес p, такой, что p кратно A, и байты от p до p+8 доступны для использования вызывающей стороной. Вы можете делать с байтами от p+9 до p+infinity все, что захотите; они не имеют никакого отношения к вызывающему абоненту. - person Eric Postpischil; 10.02.2020
comment
@freeinternet: Если вы хотите организовать свою реализацию malloc в 16-байтовые блоки, потому что вам это удобно, хорошо. Но это выбор реализации, а не требование спецификации, как показано. - person Eric Postpischil; 10.02.2020