uso trabaja solucion reducir procesador porcentaje liberar como bajar alto c++ c timer operating-system

c++ - trabaja - ¿while while siempre toma el uso completo de la CPU?



mi procesador no trabaja al 100 (3)

Necesito crear un bucle de juego del lado del servidor, el problema es cómo limitar el uso de la CPU de bucle.

En mi experiencia de programación, un ciclo ocupado siempre toma el uso máximo de CPU que podría. Pero estoy leyendo el código de SDL (Simple DirectMedia Layer), tiene una función SDL_Delay(UINT32 ms) , y tiene un ciclo while, ¿necesita el máximo uso de la CPU ?, si no es así, ¿por qué?

https://github.com/eddieringle/SDL/blob/master/src/timer/unix/SDL_systimer.c#L137-158

do { errno = 0; #if HAVE_NANOSLEEP tv.tv_sec = elapsed.tv_sec; tv.tv_nsec = elapsed.tv_nsec; was_error = nanosleep(&tv, &elapsed); #else /* Calculate the time interval left (in case of interrupt) */ now = SDL_GetTicks(); elapsed = (now - then); then = now; if (elapsed >= ms) { break; } ms -= elapsed; tv.tv_sec = ms / 1000; tv.tv_usec = (ms % 1000) * 1000; was_error = select(0, NULL, NULL, NULL, &tv); #endif /* HAVE_NANOSLEEP */ } while (was_error && (errno == EINTR));


Ese bucle no ocupará toda la CPU. Utiliza una de dos funciones diferentes para indicarle al sistema operativo que pause el hilo durante un tiempo determinado y que otro hilo utilice la CPU:

// First function call - if HAVE_NANOSLEEP is defined. was_error = nanosleep(&tv, &elapsed); // Second function call - fallback without nanosleep. was_error = select(0, NULL, NULL, NULL, &tv);


Este código usa select para un tiempo de espera excedido. select generalmente toma un descriptor de archivo y hace que la persona que llama espere hasta que ocurra un evento IO en la fd. También se necesita un argumento de tiempo de espera para el tiempo máximo de espera. Aquí el fd es 0, por lo que no ocurrirán eventos, y la función siempre regresará cuando se alcance el tiempo de espera.

La select(3) que obtienes de la biblioteca C es un envoltorio alrededor de la llamada al sistema select(2) , lo que significa que la llamada select(3) finalmente te lleva al kernel. Luego, el kernel no programa el proceso a menos que ocurra un evento IO o se alcance el tiempo de espera. Entonces el proceso no usa la CPU mientras espera.

Obviamente, el salto al kernel y la programación del proceso introducen retrasos. Por lo tanto, si debe tener una latencia muy baja (nanosegundos), debe esperar ocupado.


Mientras que el hilo está bloqueado en SDL_Delay, cede la CPU a otras tareas. Si la demora es lo suficientemente larga, el sistema operativo incluso pondrá la CPU en modo inactivo o detenido si no hay otro trabajo que hacer. Tenga en cuenta que esto no funcionará bien si el tiempo de demora no es de al menos 20 milisegundos más o menos.

Sin embargo, esta no suele ser la forma correcta de hacer lo que sea que estés tratando de hacer. ¿Cuál es tu problema externo? ¿Por qué su bucle de juego nunca termina de hacer lo que sea necesario hacer en este momento y entonces necesita esperar a que suceda algo para que tenga más trabajo por hacer? ¿Cómo puede tener siempre una cantidad infinita de trabajo para hacer inmediatamente?