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