Рубрики
Без рубрики

Estructuras de Datos Para Network Engineers 101: очереди и стеки

Antes de Empezar a Leer, ES рекомендуется Tener Manejo del Lenguaje de Programación Python 3, También … Tagged с помощью сети, Queuestack, Python, Datastructure.

Estructura de Datos Para Networking (5 серии деталей)

Antes de Empezar A Leer, ES рекомендуется Tener Manejo del Lenguaje de Programación Python 3 , También Conocimientos en Programación Orientada A objetos (Poo) Анкет Нет эстраммента Necesario, Pero Vatinge, Tener por lo menos nociones del concepto Магические методы (методы Dundder) de Python.

También, Te Recomiendo Que Visites El Post Ofter (Si no lo имеет Hecho) Acerca de Las Linked List, Ya Que Reutilizaremos algunos conceptos de estos.

ВВЕДЕНИЕ

Tecnologías Como White Box Switches (WBS) SE Están Levantando Hoy En Día Con El Auge Del Software Dely Defined Networking (SDN), EN Pocas Palabras: Los WBS, Se Refieren Equipos de Red Que Son ” анти-поставки ” y Como Tal, Sólo Vienen Con El Аппаратное обеспечение Necesario para lidiar con tráfico de red y opcionalmente un sistema operativo (comúnmente una hiplibución de linux), Después de ahí las demás funcionalidades de esos siffos quedan tu outsabilidad. Aquí Puedes Sabre Algo Мас Si Tanto te Gustó el Tema.

Para Animarte A Seguir Leyendo, Te Voy A Plantear Una Situación, Y Es La Que estaremos tratando de solucionar a lo largo de este post.

Supón Que llegó a tus manos un wbs, y tu trabajo es Instalar en sistema operativo aplicaciones que brinden las funcionalidades de red que tu compañía necesita, sin embargo, hay un upperta: el quedere quedarse a altar acomodar acomodar acomodar acomodar acomodar acomodar , esto ocurre si la Velocidad de Llegada del Tráfico es Mayor Que la Velocidad A La Que Este Le Da Salida. En tal situación, el tráfico que va llegando se ignora, es decir, ocurre el famoso Потеря пакета , esta situación en las interfaces de red algunos fabricantes le dicen Переполняет . Como parte de los mecanismos de asignación de Recurcos, Los Sifeos de Red Deben infular Algún Типо de técnica para gobernar la forma en que el tráfico se almacena en el буфер Del Equipo Анкет

¿Qué es Una queue?

Imagina Que estas bebiendo moada agua, e Inclinas la cabeza hacia atrás junto con el vaso, si tragas muy lento con relación a la velocidad a la que baja el agua del vaso, llegará unmo donde esta se botará de boca ra harás unmem Регуаро 😓. Como ya se mencionó antes, algo аналогичный Pasa con los quideo de Redes. LAS очереди Vienen, решающая проблема.

Уна очередь o Cola (ya sabes del post передняя Que aquí usamos anglicismos 😜) es ena estructura datos lineal que almacena los datos de forma ordenada, en donde los primeros en enter FIFO (сначала, сначала) Анкет Сын Алго аналогично а -ля Фила Кеса, Эн Эль -Банко, о Куандо Эсперас Е. Уна ламада, ун Колл -центр Porque Todos Los Operadores Están Ocupados. Te dejo una Imagen para que veas a li que me refiero.

Como Te Habrás Podido Imaginar, En La Imagen, передний, El objeto que sigue para extraer es obj1 , luego obj2 , y si quisieras obj4 Tendrías Que Sacar obj3 Primero.

Para Insertar un elemento hacemos una operación llamada Enqueue , que no es nada más que insertar el elemento al final de la queue ( задний ). ESSECT UNA OTRA OPERACION ВАЖНО LLAMADA Dequeue , la cual Se Refiere A Extron El Emento En Turno, Es Decir, El Primero ( Front ). Cabe destacar Que Cuando se hace un unqueue, se debe desvincular de la estructura dicho elemento y se debe de poner como primero ( front ) Al Que Le Sigue.

Очередь пропио

Debido a que ya habíamos inreplectado una linked list en el post передний, Vamos a reutilizarla y hacer la infulación sobre dicha listed listed. Sí, Esto es Válido, Podemos ver nuestra queue como una linked list que sólo puede retirar el nodo глава Y Se Puede INSERTAR DESTER DEL último Etemento. Entnons, Tenemos Que el Фронт Será Nuestro глава y el Задний Será el último elemento de la Laked List.

Para la infulación utilizaremos el concepto de Геренсия Del Campo de Poo, por lo Que nuestra clase Очередь Heredará de la Clase Связанный список Анкет

class Queue(LinkedList):
    def __init__(self, head=None, l=None):
        super().__init__(head=None, l=None)

        # Si se pasó una lista, crea la Linked List a partir de esta
        if l is not None:
            self.list_to_linked(l)

Podemos utilizar el atributo голова Como Nuestro Front, y ya que no podemos renombrar en la clase hija los atributos de la clase padre, podemos utilizar los методос Сеттер y Getter nativos de python Para Hacer un Pseudo Cambio de Nombre.

    @property
    def front(self):
        return self.head

    @front.setter
    def front(self, new: Node):
        self.head = new

Nota : Cambiar El Nombre Sería lo Forrecto Porque Agrega Legibilidad y Contexto al Código, Es decir, Hace Que Se Vea más “limpio” Анкет

El Siguiente Paso Es Crear Los Métodos Para Enqueing y Dequeing Анкет Пара Enqueing La Estrategia Será Hacer Uso del Método append () que se hereda de nuestra clase Связанный список , Dicho Método Sólo Recorre La Linked List Y E INSERTA EL ELEMENTO AL FINAL (задний). Пара Dequeing LA Idea Es Vincular El Фронт Con El Nodo Siguiente Al Primero. Confundido😵? Te dejo una Imagen Que te Sacará de apuros:

    def enqueue(self, equeueing: Node):
        # Llama el método heredado 'append', el cual itera sobre
        # la lista y agrega el nuevo Nodo después del Nodo último
        self.append(equeueing)

    def dequeue(self):
        # Desvincula el Front de su Nodo y lo apunta al siguiente
        dequeued = self.front
        self.front = self.front.next
        dequeued.next = None

        return dequeued

¿Qué es Un Stack?

Imagina que estás montando cajas en un camión, y las pons una al lado de la otra, llegará un momono donde no habrá más espacio para las cajas, por lo que recurrarás aremancarlas de una manera más eficiente. Ponerlas una arriba de otra es la opción más común, y la que todos previntiríamos, básicamente de eso se trata el stack o Пила Otro ejemplo es la pila de platos que se arma antes y/o después de lavarlos, cuando vas tomar un plato, sacas el que es en la cima para no thumbar los otros, de igual manera, Куандо вас. Colocas Arriba. En esta estructura se colocan los datos de manera que el último en llegar es el primero en salir, dicho mecanismo se conoce como Lifo (Последнее, сначала) Анкет Принцип Los Equipos de Red Utilizan Esta Estructura Para Consultar Registoros del Tráfico, Por Lo Rigtion, Los Que Se DeSean Ver Son Los últimos, Por Eso es Más Commandientes Tenerlos de Primero.

Como Se Puede Obsarear, Al último elemento (El Cual Es El Primero En Salir) Se Le Llama верхний . Las Operaciones básicas con esta estructura сын Толкать y Поп , la primera inserta un emento de último y La Segunda retira ese elemento Que está de último (Como Cuando te Toca Coger 4 Cartas Jugando uno 😂).

Infulantando nuestro propio stack

De igual forma, utilizamos nuestra clase Связанный список para infular nuestro Stack. Podemos ver nuestro Stack Como una Linked List Que Sólo Puede retirar el nodo Верх (Que Realmente es Nuestro Head ) y se puede вставка

Nota : de igual forma que con la clase queue, utilizaremos los métodos Setter y Getter nativos de python para enombrar el head como top :

class Stack(LinkedList):
    def __init__(self, head=None, l=None):
        super().__init__(head=None, l=None)

        # Si se pasó una lista, crea la Linked List a partir de esta
        if l is not None:
            # La lista está invertida para mantener el concepto de Stack
            self.list_to_linked(lst=l[::-1])

    @property
    def top(self):
        return self.head

    @top.setter
    def top(self, new: Node):
        self.head = new

Лос -методос Поп y Push Serán Signes, de Hecho, Son Inversos. Para El Método Pop, utilizaremos la misma técnica que para el proceso dequeing (sí, es lis mismo Realmente 😆), por lo queedes volver a consultar la Imagen que lo lie si tienes dudas. En el caso del método push, lo que aremos será utilizar un método ya incorporado en la clase Связанный список que se llama insert_first () , Este Método desvincula el Верх (Que Realmente es el Head) Del Primer nodo y luego lo apunta al nuevo nodo avertar (Recuerda que te dije que que el el proceso inverso a pop 😉). Confundido de nuevo😵? Не волнуйся, мой друг , Aquí Tienes:

    def push(self, item: Node):
        # Llama al método heredado 'insert_first', el cual agrega
        # un nodo en la primera posición de la Linked List 
        self.insert_first(item)

    def pop(self):
        # Desvincula el Top del nodo a extraer y lo vincula al siguiente
        popped = self.top
        self.top = self.top.next
        # Apunta el nodo extraido a None
        popped.next = None

        return popped

Resolviendo los placeas con lo aprendido

Para Resolver el Plessa Planteado en la inventución, vamos a infular una queue como estructura de datos para mantener los datos en memoria estructurados en dicho estilo, de modo que se vayan acumulando y salgan en elden de llegad Примеро (FIFO).

Para hacer la aplicación un poco más didáctica y que podamos ver el funcionamiento de la queue, la centraremos en una simulación de la llegada y salida del tráfico en un tiempo specifico generados aleatoriatione, eSto provocarárá no los paquete sealese vo lose ue ue ue ue ue ue sealese ue vo lose lose los uempote voray voray vo lose vo los uempo ine generados aleatoriamente. Para esto crearemos dos funciones que corran como dos procesos “más o menos paralelos”, una para simular la recepción del tráfico y otra para la simulación de la transpción. Para esto aremos uso de Потоки Анкет

También, Para Hacer el ejercicio más Visual, Recustaremos la queue en una tabla, donde se opperificará el orden de salida. El id del tráfico (un número generado aleatoriamente para fines de demostración), el tiempo de llegada y las interfaces de ontrada y salida.

Para la presectación de la tabla utilizaremos un módulo externo llamado PrettyTable , El Cual Puede Instalarse fácilmente Vía пип Комо: PIP установка -u PrettyTable Анкет

Crearemos una clase llamada TrafficQueue Que Heredará de la Clase Creada Adertmente Очередь Анкет Esta clase será muy sencilla y su diseño es muy fácil, ya que soo agrega 2 компоненты. EL Primer Componentee es un atributo llamado frame_table , Que Servirá Para Instanciar El Objeto del Módulo Que nos ayudará A Crear La Tabla. El Segundo Componentee es Un Переходящий Al Magic Method de __repr__ , esto es para que a la hora de imprimir la queue, immprimamos la tabla como una oursación.

from prettytable import PrettyTable
import time
import threading
import random
from Utils.DataStructures.ds import Node, Queue
import os


class TrafficQueue(Queue):
    def __init__(self, head=None, l=None):
        super().__init__(head=None, l=None)

        # Atributo utilizado para imprimir la tabla
        self.frame_table = PrettyTable()
        self.frame_table.field_names = ['Index', 'Id', 'Time', 'In Interface','Out Interface']

        if l is not None:
            self.list_to_linked(l)


    def __repr__(self):
        # Agrega todos los nodos de la Queue a la tabla
        self.frame_table.clear_rows()
        if self.front:
            count = 0
            for node in self:
                count += 1
                frame_id, frame_time, input_int, output_int = node.value
                self.frame_table.add_row([count, frame_id, frame_time, input_int, output_int])

        return self.frame_table.get_string()

queue = TrafficQueue()

def rx(interfaces: list, input_time):
    # Espera el tiempo indicado para simular la llegada del tráfico
    # en interfaces de entrada y salida aleatorias
    while True:
        time.sleep(input_time)

        frame_id = hex(abs(random.randint(100, 5000)))
        frame_time = time.ctime(time.time())
        input_int, output_int = random.sample(interfaces, 2)

        # Agrega la información del trafico generado a la Queue
        queue.enqueue(Node(value=(frame_id, frame_time, input_int, output_int)))        

def tx(output_time):
    # Espera el tiempo indicado para simular la salida del tráfico
    while True:
        time.sleep(output_time)
        queue.dequeue()

def app():
    # Lista de los números de interfaces a simular
    interfaces = range(1,21)

    # Tiempo de entrada/salida del tráfico
    # El tiempo de entrada debe ser menor
    input_time, output_time = (0.7, 0.8)

    # Crea los threads
    rx_thread = threading.Thread(target=rx, args=(interfaces, input_time))
    tx_thread = threading.Thread(target=tx, args=(output_time,))

    rx_thread.start()
    tx_thread.start()

    refresh_time = 0.5

    # Hará una actualización de la taba en el tiempo estipulado
    while True:
        time.sleep(refresh_time)
        os.system('clear') if os.name == 'posix' else os.system('cls')

        print('Network Equipment Interfaces Queue')
        print(queue, end= '\r')

Вывод

Realizamos una Aplicación Que Concentra el USO de uekues y explica la impormancia de estas en el mundo de las пересматривает компьютерные. CABE DESTACAR QUE LO WATTERE DE LA PARTE DE CUELEUS FUE LA INSLICACION DE LA ESTRUCTURA MEDIANTE LA INTULACION DE UNA APLICACION QUE MANEJA EL REENVío del Tráfico en nuestros Difos de Red. Normalmente Estos Equipos ya Traen uplecato un sistema de queues para resolver la plapetica planteada, sin embargo, review la posibilidad de que se necesite crear una variante propia de la infrevatast Энкусирует Loienes Cubierto.

Te dejo el Repositorio de Recipt Con Todo El Código Desarrollado Y La Aplicación финал. Te Recomiendo Que la abras en la web de recalite y decietamente y pongas el waterado de la consola más grande para que se puede apreciar bien la tabla.

Estructura de Datos Para Networking (5 серии деталей)

Оригинал: “https://dev.to/jorgmassih/estructuras-de-datos-para-network-engineers-101-queues-stacks-4c8n”