Влияние usleep (0) в C ++ на Linux

документация для услипа утверждает, что зовет usleep(0) не имеет никакого эффекта Тем не менее, в моей системе (RHEL 5.2), выполняющей небольшие фрагменты кода C ++, приведенного ниже, я обнаружил, что он на самом деле имеет тот же эффект, что и usleep(1), Можно ли этого ожидать, и если да, то почему существует несоответствие между документацией и тем, что я вижу в реальной жизни?

Выставка

Код:

#include <unistd.h>

int main()
{
for( int i = 0; i < 10000; i++ )
{
usleep(1);
}
}

Выход:

$ time ./test
real   0m10.124s
user   0m0.001s
sys    0m0.000s

Экспонат Б

Код:

#include <unistd.h>

int main()
{
for( int i = 0; i < 10000; i++ )
{
usleep(1);
usleep(0);
}
}

Выход:

$ time ./test
real   0m20.770s
user   0m0.002s
sys    0m0.001s

10

Решение

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

13

Другие решения

Я просто хотел указать на команду времени, используемую здесь. Вы должны использовать /usr/bin/time вместо только time Команда, если вы хотите проверить память вашей программы, процессор, время статистики. Когда вы вызываете время без полного пути, вызывается встроенная команда времени. Посмотри на разницу.

# time -v ./a.out
-bash: -v: command not found

real    0m0.001s
user    0m0.000s
sys     0m0.001s
# /usr/bin/time -v ./a.out
Command being timed: "./a.out"User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:10.87
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 220
Voluntary context switches: 10001
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

использование man time за /usr/bin/time руководство и использование help time для встроенной информации о времени.

4

Я должен был бы взглянуть на источник, чтобы убедиться, но я предполагаю, что это не совсем «не влияет», но, вероятно, все еще меньше, чем usleep(1) — все еще есть издержки вызова функции, которые можно измерить в узком цикле, даже если вызов библиотеки просто проверяет свои аргументы и немедленно возвращает результат, избегая более обычного процесса установки таймера / обратного вызова и вызова планировщика.

3

Эта документация вернулась с 1997 года, и я не уверен, применима ли она к текущему RHEL5, моя страница руководства по системам Redhat dev для usleep не указывает, что время ожидания 0 не имеет никакого эффекта.

Параметр, который вы передаете, является минимальным временем для сна. Нет никакой гарантии, что нить проснется после точно указанного времени. Учитывая специфическую динамику планировщика, это может привести к более длительным, чем ожидалось, задержкам.

2

usleep() а также sleep() переведены на nanosleep() системные вызовы. Пытаться strace ваша программа, и вы увидите это. От nanosleep () руководство:

   nanosleep() suspends the execution of the calling thread until either
at least the time specified in *req has elapsed, or the delivery of a
signal that triggers the invocation of a handler in the calling
thread or that terminates the process.

Так что я думаю ulseep (0) сгенерирует прерывание и переключение контекста.

2

Это также зависит от того, реализован ли udelay в качестве занятого цикла на короткое время.

1

По моему опыту это имеет один эффект: это вызывает прерывание.
Это хорошо для освобождения процессора на минимальное количество времени в многопоточном программировании.

0
По вопросам рекламы [email protected]