{"id":32730,"date":"2019-10-31T21:48:36","date_gmt":"2019-10-31T18:48:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\/"},"modified":"2021-02-08T11:40:35","modified_gmt":"2021-02-08T09:40:35","slug":"operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","title":{"rendered":"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introducci\u00f3n a los sistemas operativos<\/h1>\n<p>\u00a1Hola, Habr! Quiero presentar a su atenci\u00f3n una serie de art\u00edculos traducidos sobre una literatura que me parece interesante: OSTEP. Este material examina a fondo el funcionamiento de los sistemas operativos similares a Unix, es decir, el manejo de procesos, varios planificadores, memoria y otros componentes similares que conforman un sistema operativo moderno. Puede ver el origen de todos los materiales aqu\u00ed <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">aqu\u00ed<\/a><\/noindex>. Por favor, tengan en cuenta que la traducci\u00f3n se realiz\u00f3 de manera no profesional (bastante libre), pero espero haber mantenido el sentido general.<\/p>\n<p>Los trabajos de laboratorio sobre este tema se pueden encontrar aqu\u00ed:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">mi adaptaci\u00f3n personal<\/a><\/noindex><\/li>\n<\/ul>\n<p>Otras partes:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Parte 1: Introducci\u00f3n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Parte 2: Abstracci\u00f3n: proceso<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Parte 3: Introducci\u00f3n a la API de procesos<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Parte 4: Introducci\u00f3n al planificador<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/450116\/\">Parte 5: Planificador MLFQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Y tambi\u00e9n pueden visitar mi canal en <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">Telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multi-Nivel<\/h2>\n<p>En esta lecci\u00f3n, hablaremos sobre los problemas de desarrollar uno de los enfoques m\u00e1s conocidos de<br \/>\nplanificaci\u00f3n, que se llama <b>Cola de Retroalimentaci\u00f3n Multi-Nivel<\/b> (MLFQ). El planificador MLFQ fue descrito por primera vez en 1962 por Fernando J. Corbat\u00f3 en un sistema llamado<br \/>\nCompatible Time-Sharing System (CTSS). Estos trabajos (incluyendo trabajos posteriores sobre<br \/>\nMultics) fueron posteriormente nominados al premio Turing. El planificador fue<br \/>\nposteriormente mejorado y adquiri\u00f3 una forma que se puede encontrar en<br \/>\nalgunos sistemas modernos.<\/p>\n<p>El algoritmo MLFQ intenta resolver 2 problemas fundamentales interrelacionados.<br \/>\n<b>Primero<\/b>, intenta optimizar el tiempo de giro, que como hemos discutido en la lecci\u00f3n anterior, se optimiza mediante el m\u00e9todo de ejecutar al principio de la cola las tareas m\u00e1s<br \/>\ncortas. Sin embargo, el SO no sabe cu\u00e1nto tiempo funcionar\u00e1 un proceso determinado, y ese es un<br \/>\nconocimiento necesario para el funcionamiento de los algoritmos SJF, STCF. <b>En segundo lugar<\/b>, MLFQ intenta<br \/>\nhacer que el sistema sea receptivo para los usuarios (por ejemplo, para aquellos que est\u00e1n sentados y<br \/>\nmirando la pantalla esperando que se complete una tarea) y as\u00ed minimizar el tiempo<br \/>\nde respuesta. Desafortunadamente, algoritmos como RR reducen el tiempo de respuesta, pero afectan bastante<br \/>\nmal a la m\u00e9trica del tiempo de giro. De ah\u00ed nuestra pregunta: \u00bfC\u00f3mo dise\u00f1ar un<br \/>\nplanificador que cumpla con nuestros requisitos y a la vez no sepa nada sobre<br \/>\nla naturaleza del proceso, en general? \u00bfC\u00f3mo puede un planificador aprender las caracter\u00edsticas de las tareas,<br \/>\nque ejecuta para as\u00ed tomar mejores decisiones de planificaci\u00f3n?<\/p>\n<p><u>La esencia del problema: \u00bfC\u00f3mo planificar la ejecuci\u00f3n de tareas sin conocimiento perfecto?<br \/>\n\u00bfC\u00f3mo desarrollar un planificador que minimice simult\u00e1neamente el tiempo de respuesta<br \/>\npara tareas interactivas y tambi\u00e9n minimice el tiempo de giro sin un conocimiento previo<br \/>\ndel tiempo de ejecuci\u00f3n de la tarea?<\/u><\/p>\n<p>Nota: aprendiendo de eventos pasados<\/p>\n<p>La cola MLFQ es un excelente ejemplo de un sistema que aprende de<br \/>\neventos pasados para predecir el futuro. Enfoques similares son comunes en sistemas operativos (y muchos otros campos de la inform\u00e1tica, incluyendo ramas<br \/>\nde predicciones en hardware y algoritmos de cach\u00e9). Estas aproximaciones<br \/>\nson efectivas cuando las tareas tienen fases de comportamiento y por lo tanto son predecibles.<br \/>\nse activan cuando las tareas tienen fases comportamentales y, por lo tanto, son predecibles.<br \/>\nSin embargo, con esta t\u00e9cnica se debe tener cuidado, porque las predicciones pueden<br \/>\nresultar incorrectas y llevar al sistema a tomar decisiones peores que<br \/>\nsi no tuviera ning\u00fan conocimiento en absoluto.<\/p>\n<h3>MLFQ: Reglas B\u00e1sicas<\/h3>\n<p>Analicemos las reglas b\u00e1sicas del algoritmo MLFQ. Y aunque existen varias implementaciones de este algoritmo,<br \/>\nlos enfoques b\u00e1sicos son similares.<br \/>\nEn la implementaci\u00f3n que estaremos considerando, el MLFQ tendr\u00e1 varias<br \/>\ncolas separadas, cada una con diferente prioridad. En cualquier momento,<br \/>\nla tarea lista para su ejecuci\u00f3n se encuentra en una cola. El MLFQ utiliza prioridades<br \/>\npara decidir qu\u00e9 tarea ejecutar, es decir, la tarea con mayor<br \/>\nprioridad (la tarea de la cola con mayor prioridad) se ejecutar\u00e1 primero.<br \/>\nSin duda, en una cola particular pueden haber m\u00e1s de una tarea, as\u00ed<br \/>\nque tendr\u00e1n la misma prioridad. En este caso se utilizar\u00e1 el mecanismo<br \/>\nRR para programar la ejecuci\u00f3n entre esas tareas.<br \/>\nAs\u00ed llegamos a dos reglas b\u00e1sicas para el MLFQ:<br \/>\nRegla 1: Si prioridad(A) &gt; Prioridad(B), se ejecutar\u00e1 la tarea A (B no se ejecutar\u00e1)<\/p>\n<ul>\n<li> Regla 2: Si prioridad(A) = Prioridad(B), A y B se ejecutan usando RR.<\/li>\n<li> A partir de lo anterior, los elementos clave para la programaci\u00f3n MLFQ<\/li>\n<\/ul>\n<p>son las prioridades. En lugar de asignar una prioridad fija a cada<br \/>\ntarea, el MLFQ ajusta su prioridad seg\u00fan el comportamiento observado.<br \/>\nPor ejemplo, si una tarea constantemente cede el control del CPU esperando la entrada del teclado,<br \/>\nel MLFQ mantendr\u00e1 la prioridad del proceso en un nivel alto, porque as\u00ed es como<br \/>\ndeber\u00eda funcionar un proceso interactivo. Sin embargo, si por el contrario, la tarea utiliza<br \/>\nintensamente el CPU durante un largo per\u00edodo, el MLFQ reducir\u00e1 su<br \/>\nprioridad. De esta manera, el MLFQ aprender\u00e1 el comportamiento de los procesos mientras trabajan<br \/>\ny adaptar\u00e1 su comportamiento.<br \/>\nDibujemos un ejemplo de c\u00f3mo podr\u00edan verse las colas en un momento<br \/>\ndado y as\u00ed obtendremos algo como esto:<br \/>\nEn este esquema, hay 2 procesos A y B en la cola de mayor prioridad. El proceso<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/3598e9ca43a56049625bdcf3074de472.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>C est\u00e1 en alg\u00fan lugar a mitad de camino, y el proceso D al final de la cola. De acuerdo con las descripciones<br \/>\nprevias del algoritmo MLFQ, el planificador solo ejecutar\u00e1 tareas de mayor prioridad.<br \/>\ndescripciones del algoritmo MLFQ el planificador ejecutar\u00e1 tareas solo con la m\u00e1s alta prioridad<br \/>\nprioridad seg\u00fan RR, y las tareas C y D no estar\u00e1n en el lote.<br \/>\nNaturalmente, un snapshot est\u00e1tico no dar\u00e1 una imagen completa de c\u00f3mo funciona MLFQ.<br \/>\nEs importante entender c\u00f3mo cambia la situaci\u00f3n con el tiempo.<\/p>\n<h4>Intento 1: C\u00f3mo modificar la prioridad<\/h4>\n<p>En este momento, es necesario decidir c\u00f3mo MLFQ cambiar\u00e1 el nivel de prioridad<br \/>\nde las tareas (y, por ende, la posici\u00f3n de la tarea en la cola) a lo largo de su ciclo de vida. Para<br \/>\nesto, es necesario tener en mente el flujo de trabajo: una cierta cantidad<br \/>\nde tareas interactivas con un corto tiempo de trabajo (y, por lo tanto, una liberaci\u00f3n frecuente del<br \/>\nCPU) y algunas tareas largas, que utilizan el CPU durante todo su tiempo de trabajo, donde<br \/>\nel tiempo de respuesta para tales tareas no es cr\u00edtico. As\u00ed, se puede hacer un primer intento de<br \/>\nimplementar el algoritmo MLFQ con las siguientes reglas:<\/p>\n<ul>\n<li> Regla 3: Cuando una tarea entra en el sistema, se coloca en la cola con la m\u00e1s alta<\/li>\n<li>prioridad.<\/li>\n<li>Regla 4a: Si la tarea utiliza completamente su ventana de tiempo asignada, entonces su<\/li>\n<li>prioridad se reduce.<\/li>\n<li>Regla 4b: Si la Tarea libera el CPU antes de que finalice su ventana de tiempo, entonces<\/li>\n<li>mantiene la misma prioridad.<\/li>\n<\/ul>\n<p><b>Ejemplo 1: Una tarea de larga duraci\u00f3n<\/b><\/p>\n<p>Como se puede ver en este ejemplo, la tarea se asigna con la m\u00e1s alta<br \/>\nprioridad al ingresar. Despu\u00e9s de una ventana de tiempo de 10 ms, el proceso disminuye en prioridad<br \/>\npor el programador. Despu\u00e9s de la siguiente ventana de tiempo, la tarea finalmente se reduce a<br \/>\nla m\u00e1s baja prioridad en el sistema, donde permanece.<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/9b4ee6de03aa92d7957d50b4ffa73949.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><b>Ejemplo 2: Se introduce una tarea corta<\/b><\/p>\n<p>Ahora veamos un ejemplo de c\u00f3mo MLFQ intentar\u00e1 acercarse a SJF. En este<br \/>\nejemplo, hay dos tareas: A, que es una tarea de larga duraci\u00f3n que utiliza<br \/>\nel CPU continuamente, y B, que es una tarea breve e interactiva. Supongamos que<br \/>\nA ya ha estado trabajando un tiempo cuando llega la tarea B.<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/19c299b0519585fd1076a341a71f048b.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>En este gr\u00e1fico se muestran los resultados del escenario. La tarea A, como cualquier tarea,<br \/>\nque utiliza el CPU se encuentra en la parte inferior. La tarea B llegar\u00e1 en T=100 y ser\u00e1<br \/>\ncolocada en la cola con la m\u00e1s alta prioridad. Dado que su tiempo de trabajo es corto,<br \/>\nfinalizar\u00e1 antes de llegar a la \u00faltima cola.<\/p>\n<p>De este ejemplo se deduce el objetivo principal del algoritmo: dado que el algoritmo no<br \/>\nsabe si una tarea es larga o corta, primero supone que la tarea<br \/>\ncorta y le da la m\u00e1xima prioridad. Si realmente es una tarea corta, entonces<br \/>\nse completar\u00e1 r\u00e1pidamente, de lo contrario, si es una tarea larga, avanzar\u00e1 lentamente<br \/>\nen prioridad hacia abajo y pronto demostrar\u00e1 que realmente es una tarea larga que no<br \/>\nrequiere respuesta.<\/p>\n<p><b>Ejemplo 3: \u00bfQu\u00e9 pasa con la entrada-salida?<\/b><\/p>\n<p>Ahora echemos un vistazo a un ejemplo de entrada-salida. Como se mencion\u00f3 en la regla 4b,<br \/>\nsi un proceso libera el procesador sin usar completamente su tiempo de CPU,<br \/>\nentonces permanece en el mismo nivel de prioridad. Las intenciones de esta regla son bastante simples<br \/>\n\u2014 si una tarea interactiva realiza muchas operaciones de entrada-salida, como esperar<br \/>\npor pulsaciones de tecla o clics del mouse del usuario, tal tarea liberar\u00e1 el procesador<br \/>\nantes del tiempo asignado. No querr\u00edamos bajar esa tarea de prioridad,<br \/>\ny as\u00ed permanecer\u00e1 en su nivel anterior.<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/480d33a670fb62a639e5938dd59e30a1.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>Este ejemplo muestra c\u00f3mo funcionar\u00e1 el algoritmo con tales procesos: la tarea interactiva B, que necesita CPU solo durante 1 ms antes de ejecutar<br \/>\nun proceso de entrada-salida y la tarea larga A, que utiliza todo su tiempo de CPU.<br \/>\nMLFQ mantiene el proceso B con la m\u00e1s alta prioridad, ya que contin\u00faa liberando<br \/>\nCPU todo el tiempo. Si B es una tarea interactiva, entonces el algoritmo ha<br \/>\nalcanzado su objetivo de ejecutar tareas interactivas r\u00e1pidamente.<\/p>\n<p><b>Problemas con el algoritmo MLFQ actual<\/b><\/p>\n<p>En los ejemplos anteriores, construimos una variante b\u00e1sica de MLFQ. Y parece que<br \/>\nhace su trabajo bien y de manera justa, distribuyendo el tiempo de CPU de manera equitativa entre<br \/>\ntareas largas y permitiendo que las tareas cortas o aquellas que hacen muchas<br \/>\nllamadas de entrada-salida se ejecuten r\u00e1pidamente. Desafortunadamente, este enfoque tiene varios<br \/>\nproblemas graves.<br \/>\n<b>Primero<\/b>, el problema del hambre: si hay muchas tareas interactivas en el sistema,<br \/>\nconsumir\u00e1n todo el tiempo de CPU y, por lo tanto, ninguna tarea larga<br \/>\ntendr\u00e1 la oportunidad de ejecutarse (se ver\u00e1n privadas).<\/p>\n<p><b>En segundo lugar<\/b>, los usuarios astutos podr\u00edan escribir sus programas de tal manera que<br \/>\nenga\u00f1en al planificador. El enga\u00f1o consiste en hacer algo que motive al<br \/>\nplanificador a asignar m\u00e1s tiempo de CPU al proceso. El algoritmo que<br \/>\ndescrito anteriormente es bastante vulnerable a tales ataques: antes de que el tiempo de la ventana pr\u00e1cticamente<br \/>\nse agote, es necesario realizar una operaci\u00f3n de entrada-salida (a alg\u00fan archivo, no importa cu\u00e1l)<br \/>\ny de esta manera liberar CPU. Este comportamiento permitir\u00e1 permanecer en la misma<br \/>\ncola y nuevamente obtener un mayor porcentaje de tiempo del procesador. Si se hace<br \/>\ncorrectamente (por ejemplo, ejecutar el 99% del tiempo de la ventana antes de liberar la CPU),<br \/>\ntarea simplemente puede monopolizar el procesador.<\/p>\n<p>Finalmente, el programa puede cambiar su comportamiento con el tiempo. Aquellas tareas,<br \/>\nque usaban CPU, pueden volverse interactivas. En nuestro ejemplo, tales<br \/>\ntareas no recibir\u00e1n el debido trato del planificador, al igual que recibir\u00edan otras<br \/>\n(originales) tareas interactivas.<\/p>\n<p><u>Pregunta para el p\u00fablico: \u00bfqu\u00e9 ataques al planificador se podr\u00edan realizar en el mundo moderno?<br \/>\n<\/u><\/p>\n<h4>Intento 2: Aumento de prioridad<\/h4>\n<p>Probemos cambiar las reglas y veamos si podemos evitar problemas de<br \/>\nhambruna. \u00bfQu\u00e9 podr\u00edamos hacer para garantizar que las tareas relacionadas con<br \/>\nCPU obtengan su tiempo (aunque no sea mucho).<br \/>\nComo una soluci\u00f3n simple al problema, se puede proponer aumentar peri\u00f3dicamente<br \/>\nla prioridad de todas esas tareas en el sistema. Existen muchas formas<br \/>\nde lograr esto, intentemos implementar como ejemplo algo simple: elevar<br \/>\ntodas las tareas a la m\u00e1xima prioridad, de ah\u00ed la nueva regla:<\/p>\n<ul>\n<li><b>Regla5<\/b>: Despu\u00e9s de un per\u00edodo de tiempo S, elevar todas las tareas en el sistema a la cola m\u00e1s alta.<\/li>\n<\/ul>\n<p>Nuestra nueva regla resuelve dos problemas a la vez. En primer lugar, los procesos<br \/>\nno experimentan hambruna garantizada: las tareas en la cola superior compartir\u00e1n<br \/>\nel tiempo del procesador de acuerdo con el algoritmo RR y as\u00ed, todos los procesos recibir\u00e1n<br \/>\ntiempo de procesador. En segundo lugar, si alg\u00fan proceso que antes usaba<br \/>\nsolo CPU se vuelve interactivo, permanecer\u00e1 en la cola con la mayor<br \/>\nprioridad despu\u00e9s de haber recibido una vez un aumento de prioridad a la m\u00e1xima.<br \/>\nConsideremos un ejemplo. En este escenario, consideremos un proceso que utiliza<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/3b8d879ab4479622684b126ec5af6af3.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>CPU y dos procesos interactivos cortos. A la izquierda, la imagen muestra el comportamiento sin elevaci\u00f3n de prioridad, y as\u00ed, una tarea de larga duraci\u00f3n comienza a quedar hambrienta tras la llegada de dos tareas interactivas al sistema. En la imagen de la derecha, cada 50 ms se realiza una elevaci\u00f3n de prioridad, garantizando que todos los procesos obtengan tiempo del procesador y se ejecuten peri\u00f3dicamente. 50 ms se ha tomado como ejemplo, en realidad este n\u00famero es un poco mayor.<br \/>\nEs evidente que la adici\u00f3n del tiempo de elevaci\u00f3n peri\u00f3dica S conduce a<br \/>\nla pregunta inevitable: \u00bfqu\u00e9 valor debe ser establecido? Uno de los merecidos<br \/>\ningenieros de sistemas, John Ousterhout, se refer\u00eda a tales magnitudes en los sistemas como voo-doo<br \/>\nconstantes, ya que de alguna manera requer\u00edan magia negra para ser<br \/>\najustadas correctamente. Y, desafortunadamente, S tiene ese aroma. Si se establece un valor demasiado<br \/>\nalto, las tareas largas comenzar\u00e1n a quedar hambrientas. Y si se establece un valor demasiado bajo,<br \/>\nlas tareas interactivas no recibir\u00e1n el tiempo de procesador adecuado.<\/p>\n<h4>Intento 3: Mejor contabilizaci\u00f3n<\/h4>\n<p>Ahora tenemos otro problema que resolver: \u00bfc\u00f3mo evitar<br \/>\nque nuestro planificador sea enga\u00f1ado? Los culpables de esta posibilidad son<br \/>\nlas reglas 4a y 4b, que permiten que una tarea mantenga prioridad, liberando el procesador<br \/>\nantes de que se agote el tiempo asignado. \u00bfC\u00f3mo se puede manejar esto?<br \/>\nUna soluci\u00f3n en este caso podr\u00eda ser llevar un mejor registro del tiempo de CPU en cada<br \/>\nnivel de MLFQ. En lugar de olvidar el tiempo que el programa utiliz\u00f3<br \/>\ndel procesador durante el periodo asignado, se debe contabilizar y retener. Despu\u00e9s de que<br \/>\nun proceso haya consumido su tiempo asignado, su prioridad debe bajarse al siguiente<br \/>\nnivel. Ahora no importa c\u00f3mo el proceso utilice su tiempo, ya sea como<br \/>\nc\u00e1lculos continuos en el procesador o como m\u00faltiples llamadas. Por lo tanto,<br \/>\nse debe reescribir la regla 4 de la siguiente manera:<\/p>\n<ul>\n<li><b>Regla 4<\/b>: Despu\u00e9s de que una tarea haya consumido el tiempo asignado en la cola actual (independientemente de cu\u00e1ntas veces haya liberado el CPU), la prioridad de dicha tarea se reduce (se mueve hacia abajo en la cola).<\/li>\n<\/ul>\n<p>Veamos un ejemplo:<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/18c53e62b9b342d14a23995bd422ef5e.png\" style=\"display:block;margin: 0 auto;\">\u00bb<\/p>\n<p>La imagen muestra lo que sucede si se intenta enga\u00f1ar al planificador, como<br \/>\nsi se mantuvieran las reglas anteriores 4a, 4b, el resultado a la izquierda ser\u00eda. Con la nueva<br \/>\nregla \u2014 el resultado est\u00e1 a la derecha. Antes de la protecci\u00f3n, cualquier proceso pod\u00eda provocar I\/O hasta completar y<br \/>\nas\u00ed dominar la CPU, despu\u00e9s de activar la protecci\u00f3n, independientemente del comportamiento<br \/>\nde I\/O, a\u00fan as\u00ed ser\u00e1 relegado en las colas y as\u00ed no podr\u00e1 apoderarse de manera deshonesta<br \/>\nde los recursos de la CPU.<\/p>\n<h4>Mejorando MLFQ y otros problemas<\/h4>\n<p>Con las mejoras mencionadas surgen nuevos problemas: una de las principales<br \/>\ncuestiones es c\u00f3mo parametrizar tal planificador. Es decir, \u00bfcu\u00e1ntas deben ser<br \/>\nlas colas? \u00bfCu\u00e1l debe ser el tama\u00f1o de la ventana de trabajo del programa dentro de la cola? \u00bfCon<br \/>\nqu\u00e9 frecuencia deber\u00eda elevarse el privilegio de un programa para evitar el hambre y<br \/>\nconsiderar el cambio en el comportamiento del programa? No hay una simple<br \/>\nrespuesta a estas preguntas y solo los experimentos con cargas y la posterior configuraci\u00f3n<br \/>\ndel planificador pueden llevar a un cierto equilibrio satisfactorio.<\/p>\n<p>Por ejemplo, la mayor\u00eda de las implementaciones de MLFQ permiten asignar diferentes<br \/>\nintervalos de tiempo a diversas colas. A las colas de alto prioridad se les asignan generalmente<br \/>\nintervalos cortos. Estas colas est\u00e1n compuestas por tareas interactivas,<br \/>\ncuyo cambio entre ellas es bastante sensible y deber\u00eda llevar 10 ms o menos.<br \/>\nEn contraste, las colas de baja prioridad est\u00e1n compuestas por tareas largas que utilizan<br \/>\nla CPU. En este caso, los intervalos de tiempo largos son muy adecuados (100 ms).<br \/>\n<img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/4eb6c6669034adeb1615c29454fbb1dc.png\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p>En este ejemplo, hay 2 tareas que trabajaron en la cola de alta prioridad durante 20<br \/>\nms, divididas en ventanas de 10 ms. 40 ms en la cola media (ventana de 20 ms) y en la cola de baja prioridad<br \/>\nel intervalo de tiempo se volvi\u00f3 de 40 ms, donde las tareas completaron su trabajo.<\/p>\n<p>La implementaci\u00f3n de MLFQ en el sistema operativo Solaris es una clase de planificadores de tiempo compartido.<br \/>\nEl planificador proporciona un conjunto de tablas que definen con precisi\u00f3n c\u00f3mo debe<br \/>\ncambiar la prioridad de un proceso a lo largo de su vida, cu\u00e1l debe ser el tama\u00f1o<br \/>\nde la ventana asignada y con qu\u00e9 frecuencia se deben elevar las prioridades de la tarea. El administrador<br \/>\ndel sistema puede interactuar con esta tabla y hacer que el planificador se comporte<br \/>\nde manera diferente. Por defecto, esta tabla tiene 60 colas con un aumento gradual<br \/>\ndel tama\u00f1o de la ventana de 20 ms (alta prioridad) a varios cientos de ms (baja prioridad), y<br \/>\ntambi\u00e9n con un impulso de todas las tareas por segundo.<\/p>\n<p>Otros planificadores MLFQ no utilizan tablas ni reglas espec\u00edficas<br \/>\nque se describen en esta lecci\u00f3n, por el contrario, calculan las prioridades utilizando<br \/>\nf\u00f3rmulas matem\u00e1ticas. As\u00ed, por ejemplo, el planificador en FreeBSD utiliza una f\u00f3rmula para<br \/>\ncalcular la prioridad actual de una tarea, bas\u00e1ndose en cu\u00e1nto tiempo ha utilizado el CPU.<br \/>\nAdem\u00e1s, el uso de la CPU se degrada con el tiempo, y de esta manera, el aumento de la prioridad ocurre de una manera un poco diferente a la descrita anteriormente. Estos son los<br \/>\nllamados algoritmos de decrecimiento. Desde la versi\u00f3n 7.1 en FreeBSD, se utiliza el planificador ULE.<br \/>\nFinalmente, muchos planificadores tienen otras caracter\u00edsticas. Por ejemplo, algunos<\/p>\n<p>planificadores reservan los niveles m\u00e1s altos para el funcionamiento del sistema operativo, y as\u00ed<br \/>\nning\u00fan proceso de usuario podr\u00e1 obtener la prioridad m\u00e1s alta en<br \/>\nel sistema. Algunos sistemas permiten dar sugerencias para ayudar al<br \/>\nplanificador a ajustar correctamente las prioridades. Por ejemplo, con el comando<br \/>\nse puede aumentar o disminuir la prioridad de una tarea y, de esta forma, aumentar o <b>nice<\/b><br \/>\nreducir las posibilidades de que un programa obtenga tiempo de CPU.<br \/>\nMLFQ: Resumen<\/p>\n<h3>Hemos descrito un enfoque para la planificaci\u00f3n conocido como MLFQ. Su nombre<\/h3>\n<p>se basa en el principio de funcionamiento: tiene varias colas y utiliza la retroalimentaci\u00f3n<br \/>\npara determinar la prioridad de la tarea.<br \/>\nLa forma final de las reglas ser\u00e1 la siguiente:<br \/>\nRegla1<\/p>\n<ul>\n<li><b>: Si prioridad(A) &gt; Prioridad(B), se ejecutar\u00e1 la tarea A (B no se ejecutar\u00e1)<\/b>Regla2<\/li>\n<li><b>: Si prioridad(A) = Prioridad(B), A y B se ejecutan utilizando RR<\/b>Regla3<\/li>\n<li><b>: Cuando una tarea llega al sistema, se coloca en la cola de mayor prioridad.<\/b>MLFQ es interesante por la siguiente raz\u00f3n: en lugar de requerir conocimiento sobre<\/li>\n<li><b>Regla 4<\/b>: Despu\u00e9s de que una tarea haya consumido el tiempo asignado en la cola actual (independientemente de cu\u00e1ntas veces haya liberado el CPU), la prioridad de dicha tarea se reduce (se mueve hacia abajo en la cola).<\/li>\n<li><b>Regla5<\/b>: Despu\u00e9s de un per\u00edodo de tiempo S, elevar todas las tareas en el sistema a la cola m\u00e1s alta.<\/li>\n<\/ul>\n<p>la naturaleza de la tarea de antemano, el algoritmo estudia el comportamiento pasado de la tarea y asigna<br \/>\nlas prioridades en consecuencia. De esta manera, intenta sentarse en dos sillas a la vez: alcanzar un rendimiento para tareas peque\u00f1as (SJF, STCF) y ejecutar de manera justa tareas largas y<br \/>\nque ocupan el CPU. Por eso muchos sistemas, incluyendo BSD y sus derivados,<br \/>\nSolaris, Windows, Mac utilizan alguna forma del algoritmo MLFQ como base.<br \/>\nmanpages.debian.org\/stretch\/manpages\/sched.7.en.html<br \/>\nen.wikipedia.org\/wiki\/Scheduling_<\/p>\n<h4>Material adicional:<\/h4>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/manpages.debian.org\/stretch\/manpages\/sched.7.en.html\">(computing)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Scheduling_\">chebykin.org\/freebsd-process-scheduling<\/a><\/noindex>(computaci\u00f3n)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pages.lip6.fr\/Julia.Lawall\/atc18-bouron.pdf\">pages.lip6.fr\/Julia.Lawall\/atc18-bouron.pdf<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/legacy\/event\/bsdcon03\/tech\/full_papers\/roberson\/roberson.pdf\">www.usenix.org\/legacy\/event\/bsdcon03\/tech\/full_papers\/roberson\/roberson.pdf<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/chebykin.org\/freebsd-process-scheduling\">chebykin.org\/freebsd-process-scheduling<\/a><\/noindex><\/li>\n<\/ol>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450116\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24514,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32730","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 5: \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: Multi-Level Feedback Queue (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:48:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2021-02-08T09:40:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sistemas Operativos: Tres Piezas Sencillas. Parte 5: Planificaci\u00f3n: Cola de Retroalimentaci\u00f3n Multinivel (traducci\u00f3n) | ProHoster","description":"Introducci\u00f3n a los sistemas operativos Hola, Habr! Quiero presentar a su atenci\u00f3n una serie de art\u00edculos traducidos de una literatura que considero interesante: OSTEP.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 5: \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: Multi-Level Feedback Queue (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-5-planirovanie-multi-level-feedback-queue-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:48:36+00:00","article:modified_time":"2021-02-08T09:40:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32730","title":null,"description":"","keywords":"","keyphrases":null,"primary_term":null,"canonical_url":"","og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:18:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:53:25","updated":"2026-01-21 12:18:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=32730"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32730\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/24514"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=32730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=32730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=32730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}