LINUX.ORG.RU

clock()


0

0
Подскажите как правильно посчитать сколько милисекунд процесс был в определённой функции? И если использовать для этого clock(), то учитывается ли время которое процесс был в sleep(1 sec); ? А то у меня ерунда получается. Спасибо.
anonymous
> Подскажите как правильно посчитать сколько милисекунд процесс был в 
> определённой функции?

char stack[4096];
struct rusage rusage;
pid_t pid = (pid_t)clone((int (*)(void*))&routine, stack, 
    CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM | CLONE_THREAD | CLONE_SYSVSEM, NULL, NULL, NULL, NULL);
wait4(pid, NULL, 0, &rusage);
rei3er ★
()
ты объясни что какое именно время нужно. clock() измеряет время процессора затраченное на реальныю работу т.е. sleep не учитывается.

Если нужно просто прошедщее время (wall clock) то man gettimeofday

dilmah ★★★★★
()
Ответ на: комментарий от rei3er
> как собираешься учитывать асинхронные события?

Единственно доступным достоверным способом: вызвать процедуру n-миллионов раз и взять среднее время. С помощью ядерных utime/stime и c*time замерять время выполнения куска кода, скажем, слегка проблематично. А если ядро старое, без CFS, и таймслайсы считаются по тикам, то вообще невозможно.

mv ★★★★★
()
Ответ на: комментарий от dilmah
> Если нужно просто прошедщее время (wall clock) то man gettimeofday

Тоже не очень точно

mv ★★★★★
()
На каком нить контроллере посоветовал бы писать в какой нить порт и смотреть осциллографом - никакой привязке к системному таймеру. Но, в данном случае не покатит, бо эзерспейс.
marsijanin ★★
()
Ответ на: комментарий от marsijanin
Впрочем, можно делать outb в Lpt порт, если таковой имеется - это что около одной микросекунды, если мне память не изменяет.
marsijanin ★★
()
Ответ на: комментарий от marsijanin
> Впрочем, можно делать outb в Lpt порт, если таковой имеется - это что около одной микросекунды, если мне память не изменяет.

Из юзерспейса?

mv ★★★★★
()
Ответ на: комментарий от marsijanin
> Да - из юзерспейса такм можно, только прова root'а нужны. Но для отладки можно и под рутом.

Юзерспейс - это ring3, из него разве вообще что-то можно такое сделать? По-моему, произойдёт исключение, которое будет обрабатывать ядро. Т.е. будет переключение контекста, которое весьма дорого обходится по времени.

mv ★★★★★
()
Ответ на: комментарий от mv
Афтор вопроса т.е я. Проясняю. Это вообще студенческая задача.Перед изучением тредов препод дал задание. Есть простая програма. в ней есть три функции a, b, c

вот такого вида

void a(int i)

{ int k =0; while(1)

{

k +=i;

sleep(1);

}

}

Переключение между ними делается в обработчике SIGALRM

раз в секунду при помощи longjmp. Всё это у меня работает

но по SIGTERM нужно распечатать сколько времени програма

была в каждой из этих функций и завершиться. И тут у меня поппа.

anonymous
()
Ответ на: комментарий от anonymous
sleep(1)!?!? Что ты мозг пудришь тогда? :-D Заведи по счётчику на каждую функцию, инкрементируй его в цикле. По sigterm выводи значение счётчиков.
mv ★★★★★
()
Ответ на: комментарий от mv
> Юзерспейс - это ring3, из него разве вообще что-то можно такое 
> сделать?

можно

man 2 ioperm
man 2 iopl

первый системный вызов изменяет I/O Permission Bitmap в TSS без изменения IOPL, тем самым разрешая доступ к указанным портам
второй - изменяет IOPL, тем самым дает возможность получить доступ ко всему пространству I/O

для них нужен root или наличие CAP_SYS_RAWIO
rei3er ★
()
Ответ на: комментарий от rei3er
И in*/out* можно будет делать без участия ядра, т.е. на операции ввода/вывода не будет генерироваться исключение? Тогда зачем нужен root или CAP_SYS_RAWIO, если это абстракции операционной системы, а возможность ввода/вывода можно сделать на уровне железа?

Честно говоря, никогда не слышал, чтобы Ring3 такое позволял.

mv ★★★★★
()
Ответ на: комментарий от mv
> И in*/out* можно будет делать без участия ядра, т.е. на операции 
> ввода/вывода не будет генерироваться исключение?

да

> Тогда зачем нужен root или CAP_SYS_RAWIO, если это абстракции 
> операционной системы

чтобы непривилегированный пользователь не смог угробить систему, получив доступ к портам

> Честно говоря, никогда не слышал, чтобы Ring3 такое позволял.

читайте мануалы от Intel или AMD
rei3er ★
()
Ответ на: комментарий от rei3er
Да, действительно...

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.
mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.