Почему существует разница в скорости выполнения кода между пользовательским пространством Linux и пространством ядра?

Когда я запускаю простой код цикла while в пользовательском пространстве Linux и пространстве ядра и измеряю прошедшее время, я могу получить разницу.

тестовый код заключается в доступе к некоторым аппаратным регистрам в чипе Arm Cortex SoC.

for(k = 0; k < 100000; k++)
{   //I tested this code in user space and kernel space with IOCTL.
    for(i = 0; i < 1000; i++)  
    {  
        tv2 = *(volatile UInt32 *)(0xfe110080);  
        *(volatile UInt32 *)(0xfe628024) = i + tv2 ;  
    }
}

В результате
Уровень пользователя: 52002,16 мс
Уровень ядра: 32650,53 мс

Уровень ядра был в 1,6 раза быстрее, чем уровень пользователя.


person gsoh83    schedule 27.12.2011    source источник


Ответы (1)


Как правило, пользовательский уровень занимает больше времени, потому что он делает несколько дополнительных вызовов для выполнения задачи.

Например, возьмем пример чтения файла. чтобы прочитать файл из пользовательского слоя, мы вызываем read(file_name). Этот вызов чтения внутренне вызывает вызов чтения ядра, который взаимодействует с драйвером устройства диска и получает данные.

Таким образом, уровень ядра работает лучше из-за уменьшения количества вызовов.

person Balu    schedule 27.12.2011
comment
Спасибо за ваш ответ. Но я все еще в замешательстве. Потому что нет кода, который должен вызывать системный вызов или какой-либо дополнительный вызов. Это просто доступ к памяти с помощью указателя в цикле while. - person gsoh83; 27.12.2011
comment
Возможно, код пользователя нуждается в дополнительных проверках, есть ли у него права доступа к этой части памяти. - person Daniel Fischer; 27.12.2011
comment
Вы имеете в виду, что вам нужно какое-то разрешение для доступа к регистру на пользовательском уровне и автоматически добавленный код проверки разрешения, когда я компилирую свой код? - person gsoh83; 27.12.2011