c - sonido - temporizador online
Simular varios temporizadores virtuales con un temporizador fĂsico (1)
Estoy tratando de implementar un protocolo de repetición selectiva utilizando C para una asignación de red, pero no entiendo cómo simular el temporizador para cada paquete individual. Solo tengo acceso a un solo temporizador y solo puedo llamar a las funciones como se describe a continuación.
/* start timer at A or B (int), increment in time*/
extern void starttimer(int, double);
/* stop timer at A or B (int) */
extern void stoptimer(int);
Kurose y Ross mencionaron en su libro de texto de redes que
Se puede usar un solo temporizador de hardware para imitar la operación de múltiples temporizadores lógicos [Varghese 1997].
Y encontré la siguiente pista para una tarea similar
Puede simular múltiples temporizadores virtuales usando un solo temporizador físico. La idea básica es mantener una cadena de temporizadores virtuales ordenados en su tiempo de caducidad y el temporizador físico se activará en la primera caducidad del temporizador virtual.
Sin embargo, no tengo acceso a ninguna variable de tiempo que no sea RTT ya que el emulador se encuentra en otra capa de abstracción. ¿Cómo puedo implementar el temporizador para paquetes individuales en este caso?
Puede hacerlo de la misma manera que se implementa en el nivel Kernel. Necesita tener una lista vinculada de "temporizadores" donde cada temporizador tiene un tiempo de espera relativo al anterior. Sería algo así como: Timer1: 500 ms desde t0, Timer2: 400 ms desde t0, Timer3 1000 ms desde t0.
Luego tendrá una lista vinculada en la que cada elemento tiene el tiempo de espera relativo al anterior, como este:
HEAD-> Timer2 (400ms) -> Timer1 (100ms) -> Timer3 (500ms)
Cada elemento contiene un mínimo: ID de tiempo, tiempo de espera relativo, tiempo de inicio absoluto (marca de tiempo de época). Puede agregar un puntero de devolución de llamada por temporizador.
Utiliza su único temporizador y establece el tiempo de espera para el tiempo de espera relativo del primer elemento en la lista: 400 ms (Timer2)
Después del tiempo de espera eliminará el primer elemento, probablemente ejecute una devolución de llamada relacionada con Timer2, idealmente esta devolución de llamada se ejecuta con otra cadena de trabajo. Luego establece el nuevo tiempo de espera en el tiempo de espera relativo del siguiente elemento, Timer1: 100ms.
Ahora, cuando necesite crear un nuevo temporizador, digamos a 3.000 ms, después de 300 ms desde t0, debe insertarlo en la posición correcta para navegar la lista de temporizadores enlazados. El tiempo de espera relativo en Timer4 será 2.300. Esto se calcula con (Timer2.RelativeTimeout - (ahora - Timer2.AbsoluteTimeout)) yendo a través de la lista enlazada para encontrar la posición correspondiente, agregando tiempos de espera relativos de cada elemento anterior. Su lista vinculada se convertirá en:
HEAD-> Timer2 (400ms) -> Timer1 (100ms) -> Timer3 (500ms) -> Timer4 (2,300)
De esta forma, implementa muchos temporizadores lógicos con un temporizador físico. Su temporizador crear y encontrar tiempo será O (n) pero puede agregar varias mejoras para el rendimiento de inserción. Lo más importante es que la gestión y actualización del tiempo de espera de los temporizadores es O (1). La complejidad de eliminación será O (n) para encontrar el temporizador y O (1) para eliminar.
Debe tener en cuenta las posibles condiciones de carrera entre el hilo que controla el temporizador y un hilo que inserta o elimina un temporizador. Una forma de implementar este temporizador en el espacio de usuario es con variables de condición y espera de tiempo de espera.