Подскажите как правильно посчитать сколько милисекунд процесс был в определённой функции? И если использовать для этого clock(), то учитывается ли время которое процесс был в sleep(1 sec); ? А то у меня ерунда получается. Спасибо.
Единственно доступным достоверным способом: вызвать процедуру n-миллионов раз и взять среднее время. С помощью ядерных utime/stime и c*time замерять время выполнения куска кода, скажем, слегка проблематично. А если ядро старое, без CFS, и таймслайсы считаются по тикам, то вообще невозможно.
На каком нить контроллере посоветовал бы писать в какой нить порт и смотреть осциллографом - никакой привязке к системному таймеру. Но, в данном случае не покатит, бо эзерспейс.
> Да - из юзерспейса такм можно, только прова root'а нужны. Но для отладки можно и под рутом.
Юзерспейс - это ring3, из него разве вообще что-то можно такое сделать? По-моему, произойдёт исключение, которое будет обрабатывать ядро. Т.е. будет переключение контекста, которое весьма дорого обходится по времени.
Афтор вопроса т.е я. Проясняю. Это вообще студенческая задача.Перед изучением тредов препод дал задание. Есть простая програма. в ней есть три функции a, b, c
вот такого вида
void a(int i)
{ int k =0; while(1)
{
k +=i;
sleep(1);
}
}
Переключение между ними делается в обработчике SIGALRM
раз в секунду при помощи longjmp. Всё это у меня работает
но по SIGTERM нужно распечатать сколько времени програма
была в каждой из этих функций и завершиться. И тут у меня поппа.
> Юзерспейс - это ring3, из него разве вообще что-то можно такое
> сделать?
можно
man 2 ioperm
man 2 iopl
первый системный вызов изменяет I/O Permission Bitmap в TSS без изменения IOPL, тем самым разрешая доступ к указанным портам
второй - изменяет IOPL, тем самым дает возможность получить доступ ко всему пространству I/O
для них нужен root или наличие CAP_SYS_RAWIO
И in*/out* можно будет делать без участия ядра, т.е. на операции ввода/вывода не будет генерироваться исключение? Тогда зачем нужен root или CAP_SYS_RAWIO, если это абстракции операционной системы, а возможность ввода/вывода можно сделать на уровне железа?
Честно говоря, никогда не слышал, чтобы Ring3 такое позволял.
> И in*/out* можно будет делать без участия ядра, т.е. на операции
> ввода/вывода не будет генерироваться исключение?
да
> Тогда зачем нужен root или CAP_SYS_RAWIO, если это абстракции
> операционной системы
чтобы непривилегированный пользователь не смог угробить систему, получив доступ к портам
> Честно говоря, никогда не слышал, чтобы Ring3 такое позволял.
читайте мануалы от Intel или AMD
Да, действительно...
Operation
IF ((PE = 1) and ((CPL > IOPL) or (VM = 1)))
THEN (* Protected mode with CPL > IOPL or virtual-8086 mode *)
IF (Any I/O Permission Bit for I/O port being accessed = 1)
THEN (* I/O operation is not allowed *)
#GP(0);
ELSE ( * I/O operation is allowed *)
DEST ←SRC; (* Writes to selected I/O port *)
FI;
ELSE (Real Mode or Protected Mode with CPL ≤IOPL *)
DEST ←SRC; (* Writes to selected I/O port *)
FI;
Flags Affected
None.
Protected Mode Exceptions
#GP(0) If the CPL is greater than (has less privilege) the I/O privilege
level (IOPL) and any of the corresponding I/O permission bits in
TSS for the I/O port being accessed is 1.