документация для услипа утверждает, что зовет 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
технически это не должно иметь никакого эффекта. Но вы должны помнить, что переданное значение используется как минимальный, и не абсолют, поэтому система может использовать вместо этого наименьший возможный интервал.
Я просто хотел указать на команду времени, используемую здесь. Вы должны использовать /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
для встроенной информации о времени.
Я должен был бы взглянуть на источник, чтобы убедиться, но я предполагаю, что это не совсем «не влияет», но, вероятно, все еще меньше, чем usleep(1)
— все еще есть издержки вызова функции, которые можно измерить в узком цикле, даже если вызов библиотеки просто проверяет свои аргументы и немедленно возвращает результат, избегая более обычного процесса установки таймера / обратного вызова и вызова планировщика.
Эта документация вернулась с 1997 года, и я не уверен, применима ли она к текущему RHEL5, моя страница руководства по системам Redhat dev для usleep не указывает, что время ожидания 0 не имеет никакого эффекта.
Параметр, который вы передаете, является минимальным временем для сна. Нет никакой гарантии, что нить проснется после точно указанного времени. Учитывая специфическую динамику планировщика, это может привести к более длительным, чем ожидалось, задержкам.
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) сгенерирует прерывание и переключение контекста.
Это также зависит от того, реализован ли udelay в качестве занятого цикла на короткое время.
По моему опыту это имеет один эффект: это вызывает прерывание.
Это хорошо для освобождения процессора на минимальное количество времени в многопоточном программировании.