una tener longitud description descripcion debe cuantos caracteres algorithm language-agnostic io

algorithm - tener - ¿Cómo calificas el límite de una operación IO?



cuantos caracteres debe tener una meta descripcion (8)

Supongamos que tiene un programa que lee desde un socket. ¿Cómo se mantiene la tasa de descarga por debajo de un determinado umbral determinado?


Como han dicho otros, el kernel del sistema operativo está administrando el tráfico y simplemente está leyendo una copia de los datos de la memoria del kernel. Para limitar aproximadamente la velocidad de una sola aplicación, necesitas retrasar tus lecturas de los datos y permitir que los paquetes entrantes se almacenen en el kernel, lo que eventualmente ralentizará el reconocimiento de los paquetes entrantes y reducirá la velocidad en ese socket.

Si desea ralentizar todo el tráfico hacia la máquina, debe ir y ajustar el tamaño de sus búferes TCP entrantes. En Linux, afectaría este cambio al alterar los valores en / proc / sys / net / ipv4 / tcp_rmem (leer tamaños de búfer de memoria) y otros archivos tcp_ *.


Es como cuando se limita un juego a un cierto número de FPS.

extern int FPS; .... timePerFrameinMS = 1000/FPS; while(1) { time = getMilliseconds(); DrawScene(); time = getMilliseconds()-time; if (time < timePerFrameinMS) { sleep(timePerFrameinMS - time); } }

De esta forma, se asegura de que la frecuencia de actualización del juego sea como máximo FPS. De la misma manera DrawScene puede ser la función utilizada para bombear bytes en la secuencia de socket.


Si está leyendo desde un socket, no tiene control sobre el ancho de banda utilizado; está leyendo el búfer del sistema operativo de ese socket, y nada de lo que diga hará que la persona que escribe en el socket escriba menos datos (a menos, por supuesto, , has elaborado un protocolo para eso).

Todo lo que leería lentamente sería llenar el búfer y provocar un eventual bloqueo en el extremo de la red, pero no tiene control de cómo o cuándo sucede esto.

Si realmente desea leer solo tantos datos a la vez, puede hacer algo como esto:

ReadFixedRate() { while(Data_Exists()) { t = GetTime(); ReadBlock(); while(t + delay > GetTime()) { Delay()'' } } }


Suponiendo un transporte de red, basado en TCP / IP, los paquetes se envían en respuesta a los paquetes ACK / NACK que van por el otro camino.

Al limitar la velocidad de los paquetes que acusan recibo de los paquetes entrantes, a su vez se reducirá la velocidad a la que se envían los nuevos paquetes.

Puede ser un poco impreciso, por lo que es posiblemente óptimo para monitorear la tasa de flujo descendente y ajustar la tasa de respuesta de forma adaptativa hasta que caiga dentro de un umbral confortable. (Esto sucederá muy rápido, sin embargo, envían dosens of acks por segundo)


wget parece administrarlo con la opción --limit-rate. Aquí está de la página man:

Tenga en cuenta que Wget implementa la limitación al dormir la cantidad de tiempo adecuada después de una lectura de red que tomó menos tiempo del especificado por la velocidad. Finalmente, esta estrategia hace que la transferencia de TCP disminuya a aproximadamente la velocidad especificada. Sin embargo, puede tomar algún tiempo para lograr este equilibrio, por lo que no se sorprenda si la limitación de la tasa no funciona bien con archivos muy pequeños.


En la capa de aplicación (utilizando una API de estilo de socket de Berkeley) simplemente observa el reloj y lee o escribe datos a la velocidad que desea limitar.

Si solo lee 10 kbps en promedio, pero la fuente envía más que eso, eventualmente todos los buffers entre él y usted se llenarán. TCP / IP lo permite, y el protocolo hará que el emisor se desacelere (en la capa de aplicación, probablemente todo lo que necesita saber es que, en el otro extremo, bloqueará las llamadas de escritura, las que no sean de bloqueo fallarán y las asincrónicas las escrituras no se completarán, hasta que haya leído suficientes datos para permitirlo).

En la capa de aplicación solo puede ser aproximado: no puede garantizar límites estrictos, como "no más de 10 kb pasará un punto determinado de la red en cualquier segundo". Pero si realiza un seguimiento de lo que ha recibido, puede obtener el promedio correcto a la larga.


Para agregar a la respuesta de Branan:

Si limita voluntariamente la velocidad de lectura en el extremo del receptor, eventualmente las colas se llenarán en ambos extremos. Luego, el remitente bloqueará en su llamada de envío () o regresará de la llamada de envío () con una longitud de envío inferior a la duración esperada transferida a la llamada de envío ().

Si el remitente no está listo para lidiar con este caso durmiendo e intentando reenviar lo que no cabe en los búferes del sistema operativo, terminará teniendo problemas de conexión (el remitente puede detectar esto como un error) o la pérdida de datos (el remitente puede sin saberlo descartar datos que no encajaban en los búferes del sistema operativo).


Configure buffers pequeños de envío y recepción de sockets, digamos 1k o 2k, de modo que el ancho de banda * demore el producto = el tamaño del búfer. Es posible que no pueda obtenerlo lo suficientemente pequeño a través de enlaces rápidos.