Red de conocimiento informático - Aprendizaje de programación - Cómo implementar sleep(0) en Linux

Cómo implementar sleep(0) en Linux

Recientemente porté un programa de Windows a Linux, pero el rendimiento fue deficiente por alguna razón. Después de verificar el motivo, descubrí que se debe a que una función ZeroSleep requiere mucho tiempo. El código de esta función es muy simple, como se muestra a continuación:

void ZeroSleep()

{

Sleep(0);

}

Sleep(0) se utiliza para liberar el intervalo de tiempo de la CPU para evitar esperas ocupadas. Por lo tanto, damos por sentado que la forma en que se implementa en Linux es:

void ZeroSleep()

{

msleep(0);

}

Pero, de hecho, el código fuente de la API msleep es el siguiente:

void msleep(unsigned int msecs)

{

tiempo de espera largo sin firmar = msecs_to_jiffies(msecs) 1;

while (tiempo de espera)

tiempo de espera = Schedule_timeout_ uninterruptible(tiempo de espera);

De esta forma, aunque el parámetro sea 0, al menos una unidad de santiamén deberá estar hibernada, provocando graves problemas de rendimiento.

La solución a este problema es:

Dado que el propósito de ZeroSleep es liberar recursos de la CPU, msleep se puede reemplazar llamando a la función Schedule(). De hecho, msleep se implementa llamando a Schedule_timeout_uninterruptible, por lo que este método es razonable.

/blog/static/17230170820100275580656/