Каково различие между vmalloc и kmalloc?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

107
задан Sam Protsenko 24 June 2016 в 09:16
поделиться

3 ответа

Только необходимо волноваться об использовании физически непрерывной памяти, если к буферу получит доступ устройство DMA на физически обращенной шине (как PCI). Проблема состоит в том, что много системных вызовов не имеют никакого способа знать, будет ли их буфер в конечном счете передан устройству DMA: как только Вы передаете буфер другой подсистеме ядра, Вы действительно не можете знать, куда это собирается пойти. Даже если ядро не использует буфер для DMA сегодня, , будущая разработка могла бы сделать так.

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

kmalloc ограничен в размере буфера, который это может обеспечить: 128 кбайт <глоток> *) . При необходимости в действительно большом буфере необходимо использовать vmalloc или некоторый другой механизм как резервирование верхней памяти при начальной загрузке.

<глоток> *) Это было верно для более ранних ядер. На недавних ядрах (я протестировал это на 2.6.33.2), макс. размер единственного kmalloc составляет до 4 МБ! (Я записал справедливо подробное сообщение на этом .) — kaiwan

Для системного вызова, Вы не должны передавать GFP_ATOMIC kmalloc (), можно использовать GFP_KERNEL. Вы не обработчик прерываний: код приложения вводит контекст ядра посредством прерывания, это не прерывание.

90
ответ дан stakx supports GoFundMonica 24 November 2019 в 03:43
поделиться

Короткий ответ: загрузите Драйверы устройств Linux и прочитайте главу по управлению памятью.

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

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

17
ответ дан Mike Heinz 24 November 2019 в 03:43
поделиться

, Каковы преимущества наличия непрерывного блока памяти? А именно, почему у меня должен был бы быть непрерывный физический блок памяти в системном вызове? Есть ли какая-либо причина, я не мог просто использовать vmalloc?

От Google "я Чувствую себя Удачливым" на vmalloc:

kmalloc является предпочтительным путем, пока Вам не нужны очень большие площади. Проблема, если Вы захотите сделать DMA из/в некоторое устройство, необходимо будет использовать kmalloc, и Вам, вероятно, будет нужен больший блок. Решение состоит в том, чтобы выделить память как можно скорее, прежде чем память будет фрагментирована.

5
ответ дан Dark Shikari 24 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

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