{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introducci\u00f3n a los sistemas operativos<\/h1>\n<p>\n\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>\nOtras 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<\/ul>\n<p>\nY 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>Introducci\u00f3n al programador<\/h2>\n<p>\n<u>El n\u00facleo del problema: \u00bfC\u00f3mo desarrollar una pol\u00edtica de programaci\u00f3n?<br \/>\n\u00bfC\u00f3mo deben desarrollarse los marcos b\u00e1sicos de pol\u00edticas de programaci\u00f3n? \u00bfCu\u00e1les deben ser las supuestos clave? \u00bfQu\u00e9 m\u00e9tricas son importantes? \u00bfQu\u00e9 t\u00e9cnicas b\u00e1sicas se utilizaron en los primeros sistemas computacionales?<\/u><\/p>\n<h3>Supuestos sobre la carga de trabajo<\/h3>\n<p>\n Antes de discutir las posibles pol\u00edticas, primero hagamos algunas simplificaciones sobre los procesos que se ejecutan en el sistema, que en conjunto se denominan <b>carga de trabajo<\/b>. Definir la carga de trabajo como una parte cr\u00edtica para construir pol\u00edticas y cuanto m\u00e1s sepas sobre la carga, mejor ser\u00e1 la pol\u00edtica que puedas escribir.<\/p>\n<p>Haremos los siguientes supuestos sobre los procesos ejecutados en el sistema, a veces tambi\u00e9n llamados <b>jobs<\/b> (tareas). Pr\u00e1cticamente todos estos supuestos son poco realistas, pero son necesarios para desarrollar el pensamiento.<\/p>\n<ol>\n<li> Cada tarea se ejecuta durante el mismo tiempo,<\/li>\n<li> Todas las tareas se programan al mismo tiempo,<\/li>\n<li> La tarea programada trabaja hasta su finalizaci\u00f3n,<\/li>\n<li> Todas las tareas utilizan \u00fanicamente la CPU,<\/li>\n<li> El tiempo de ejecuci\u00f3n de cada tarea es conocido.<\/li>\n<\/ol>\n<h3>M\u00e9tricas del Programador<\/h3>\n<p>\n Adem\u00e1s de algunos supuestos sobre la carga, tambi\u00e9n se necesita alguna herramienta para comparar diferentes pol\u00edticas de programaci\u00f3n: m\u00e9tricas del programador. Una m\u00e9trica es simplemente una medida de algo. Existen varias m\u00e9tricas que se pueden utilizar para comparar programadores.<\/p>\n<p>Por ejemplo, utilizaremos una m\u00e9trica llamada <b>tiempo de respuesta<\/b> (turnaround time). El tiempo de respuesta de una tarea se define como la diferencia entre el tiempo de finalizaci\u00f3n de la tarea y el tiempo de llegada de la tarea al sistema.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Dado que hemos supuesto que todas las tareas llegan al mismo tiempo, entonces Ta=0 y as\u00ed Tt=Tc. Este valor naturalmente cambiar\u00e1 cuando modifiquemos los supuestos anteriores.<\/p>\n<p>Otra m\u00e9trica es <b>justicia<\/b> (fairness). La productividad y la justicia a menudo son caracter\u00edsticas opuestas en la programaci\u00f3n. Por ejemplo, un programador puede optimizar la productividad, pero a expensas de la espera para iniciar otras tareas, disminuyendo as\u00ed la justicia.<\/p>\n<h3>PRIMERO EN ENTRAR, PRIMERO EN SALIR (FIFO)<\/h3>\n<p>\n El algoritmo m\u00e1s b\u00e1sico que podemos implementar se llama FIFO o <b>el primero en llegar (dentro), el primero en ser servido (fuera)<\/b>. Este algoritmo tiene varias ventajas: es muy simple de implementar y se adapta a todas nuestras suposiciones, realizando el trabajo bastante bien.<\/p>\n<p>Consideremos un ejemplo simple. Supongamos que 3 tareas se han asignado al mismo tiempo. Pero asumamos que la tarea A lleg\u00f3 un poco antes que las dem\u00e1s, por lo que estar\u00e1 en la lista de ejecuci\u00f3n antes que las otras, al igual que la B en relaci\u00f3n con la C. Supongamos que cada una de ellas tomar\u00e1 10 segundos. \u00bfCu\u00e1l ser\u00eda, en este caso, el tiempo medio de ejecuci\u00f3n de estas tareas?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAl calcular los valores \u2014 10+20+30 y dividir por 3, obtendremos un tiempo medio de ejecuci\u00f3n del programa igual a 20 segundos.<br \/>\n Ahora intentaremos cambiar nuestras suposiciones. En particular, la suposici\u00f3n 1 y as\u00ed no asumiremos m\u00e1s que cada tarea se ejecuta el mismo tiempo. \u00bfC\u00f3mo se comportar\u00e1 FIFO esta vez?<\/p>\n<p>Como resulta, los diferentes tiempos de ejecuci\u00f3n de las tareas afectan negativamente la productividad del algoritmo FIFO. Supongamos que la tarea A se ejecuta durante 100 segundos, mientras que B y C siguen siendo de 10 cada una.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Como se puede ver en la imagen, el tiempo medio para el sistema ser\u00e1 (100+110+120)\/3=110. Este efecto se llama <b>efecto de convoy<\/b>, cuando algunos consumidores de recursos de corta duraci\u00f3n est\u00e1n en cola detr\u00e1s de un consumidor pesado. Es similar a una fila en el supermercado, cuando delante de usted hay un comprador con un carrito lleno. La mejor soluci\u00f3n al problema es intentar cambiar de caja o relajarse y respirar profundamente.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n \u00bfSe puede resolver de alguna manera esta situaci\u00f3n con procesos pesados? Por supuesto. Otro tipo de planificaci\u00f3n se llama<b>Shortest Job First<\/b> (SJF). Su algoritmo tambi\u00e9n es bastante primitivo: como se entiende por el nombre, las tareas m\u00e1s cortas se ejecutar\u00e1n primero una tras otra.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn este ejemplo, el resultado de la ejecuci\u00f3n de los mismos procesos mejorar\u00e1 el tiempo medio de rotaci\u00f3n de los programas y ser\u00e1 igual a <b>50 en lugar de 110<\/b>, lo que es pr\u00e1cticamente el doble de mejor.<\/p>\n<p>Por lo tanto, bajo la suposici\u00f3n de que todas las tareas llegan al mismo tiempo, el algoritmo SJF parece ser el m\u00e1s \u00f3ptimo. Sin embargo, nuestras suposiciones a\u00fan no parecen realistas. Esta vez, cambiamos la suposici\u00f3n 2 y presentamos que las tareas pueden llegar en cualquier momento, no todas al mismo tiempo. \u00bfQu\u00e9 problemas podr\u00eda ocasionar esto?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nImaginemos que la tarea A (100s) llega primero y comienza a ejecutarse. En el momento t=10, llegan las tareas B y C, cada una de las cuales tomar\u00e1 10 segundos. As\u00ed, el tiempo promedio de ejecuci\u00f3n es (100+(110-10)+(120-10))\/3 = 103. \u00bfQu\u00e9 podr\u00eda hacer el planificador para mejorar la situaci\u00f3n?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n Para mejorar la situaci\u00f3n, omitamos la suposici\u00f3n 3 de que el programa se inicia y funciona hasta completarse. Adem\u00e1s, vamos a necesitar soporte de hardware y, como pueden suponer, vamos a utilizar un <b>temporizador<\/b> para interrumpir la tarea en ejecuci\u00f3n y <b>realizar cambios de contexto<\/b>. De este modo, el planificador puede actuar en el momento en que llegan las tareas B y C: interrumpir la ejecuci\u00f3n de la tarea A y procesar las tareas B y C, y despu\u00e9s de finalizarlas, continuar con el proceso A. Este tipo de planificador se llama <b>STCF<\/b>o <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl resultado del funcionamiento de este planificador ser\u00e1 el siguiente: ((120-0)+(20-10)+(30-10))\/3=50. As\u00ed, este planificador se vuelve a\u00fan m\u00e1s \u00f3ptimo para nuestras tareas.<\/p>\n<h3>M\u00e9trica Tiempo de respuesta (Response Time)<\/h3>\n<p>\n As\u00ed, si conocemos el tiempo de ejecuci\u00f3n de las tareas y sabemos que estas utilizan solo CPU, STCF ser\u00e1 la mejor soluci\u00f3n. Y en tiempos antiguos, estos algoritmos funcionaban bastante bien. Sin embargo, ahora el usuario pasa la mayor parte del tiempo frente al terminal y espera una interacci\u00f3n productiva e interactiva. As\u00ed naci\u00f3 una nueva m\u00e9trica \u2014 <b>tiempo de respuesta<\/b> (response time).<\/p>\n<p>El tiempo de respuesta se calcula de la siguiente manera:<\/p>\n<p><u>Tresponse=Tfirstrun\u2212Tarrival<\/u><\/p>\n<p>Por lo tanto, para el ejemplo anterior, el tiempo de respuesta ser\u00e1: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>Y resulta que el algoritmo STCF no es tan bueno en la situaci\u00f3n en la que 3 tareas llegan al mismo tiempo; tendr\u00e1 que esperar hasta que las tareas peque\u00f1as se completen completamente. As\u00ed, el algoritmo es bueno para la m\u00e9trica de tiempo de retorno, pero malo para la m\u00e9trica de interactividad. Imagina que, sentado frente a la terminal tratando de escribir caracteres en un editor, tuviste que esperar m\u00e1s de 10 segundos porque alguna otra tarea est\u00e1 ocupando el procesador. No es nada agradable.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed que nos enfrentamos a otro problema: \u00bfc\u00f3mo podemos construir un planificador que sea sensible al tiempo de respuesta?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n Para resolver este problema, se desarroll\u00f3 un algoritmo <b>Round Robin<\/b> (RR). La idea b\u00e1sica es bastante simple: en lugar de ejecutar las tareas hasta que se completen, ejecutamos una tarea durante un cierto per\u00edodo de tiempo (llamado cu\u00e1ntum de tiempo) y luego cambiamos a otra tarea de la cola. El algoritmo repite su trabajo hasta que todas las tareas est\u00e1n completas. En este proceso, el tiempo de ejecuci\u00f3n del programa debe ser un m\u00faltiplo del tiempo tras el cual el temporizador interrupta el proceso. Por ejemplo, si el temporizador interrumpe el proceso cada x=10 ms, el tama\u00f1o de la ventana de ejecuci\u00f3n del proceso debe ser m\u00faltiplo de 10 y puede ser 10, 20 o x*10.<\/p>\n<p>Consideremos un ejemplo: las tareas A, B y C llegan al sistema al mismo tiempo y cada una quiere trabajar 5 segundos. El algoritmo SJF ejecutar\u00e1 cada tarea hasta el final antes de iniciar otra. En cambio, el algoritmo RR con ventana de ejecuci\u00f3n=1s pasar\u00e1 por las tareas de la siguiente manera (fig. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Nuevamente (Malo para el Tiempo de Respuesta)<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (Bueno para el Tiempo de Respuesta)<\/p>\n<p>El tiempo promedio de respuesta para el algoritmo RR (0+1+2)\/3=1, mientras que para SJF (0+5+10)\/3=5.<\/p>\n<p>Es l\u00f3gico suponer que la ventana de tiempo es un par\u00e1metro muy importante para RR; cuanto menor sea, mayor ser\u00e1 el tiempo de respuesta. Sin embargo, no se puede hacer que sea demasiado peque\u00f1a, ya que el tiempo de cambio de contexto tambi\u00e9n jugar\u00e1 un papel en el rendimiento general. As\u00ed, la elecci\u00f3n del tiempo de ventana se establece por el arquitecto del sistema operativo y depende de las tareas que se planea ejecutar en \u00e9l. Cambiar de contexto no es la \u00fanica operaci\u00f3n auxiliar que consume tiempo; el programa en ejecuci\u00f3n opera con muchos otros elementos, como diferentes cach\u00e9s, y en cada cambio es necesario guardar y restaurar este entorno, lo que tambi\u00e9n puede requerir mucho tiempo.<\/p>\n<p>RR es un excelente planificador si solo se considera la m\u00e9trica del tiempo de respuesta. Pero, \u00bfc\u00f3mo se comportar\u00e1 la m\u00e9trica del tiempo de rotaci\u00f3n de tareas con este algoritmo? Consideremos el ejemplo anterior, donde el tiempo de ejecuci\u00f3n de A, B y C es de 5 segundos y llegan al mismo tiempo. La tarea A terminar\u00e1 a las 13, B a las 14 y C a las 15 segundos, por lo que el tiempo promedio de rotaci\u00f3n ser\u00e1 de 14 segundos. Por lo tanto, RR es el peor algoritmo para la m\u00e9trica de rotaci\u00f3n.<\/p>\n<p>En t\u00e9rminos m\u00e1s generales, cualquier algoritmo del tipo RR es justo; divide el tiempo de ejecuci\u00f3n de la CPU equitativamente entre todos los procesos. As\u00ed, estas m\u00e9tricas entran en conflicto constantemente entre s\u00ed.<\/p>\n<p>Por lo tanto, tenemos varios algoritmos contrapuestos y a\u00fan quedan algunas suposiciones: que el tiempo de la tarea es conocido y que la tarea solo utiliza la CPU.<\/p>\n<h3>Mezcla con I\/O<\/h3>\n<p>\n Primero eliminemos la suposici\u00f3n 4, que el proceso solo utiliza la CPU; esto no es cierto ya que los procesos pueden acceder a otro hardware.<\/p>\n<p>En el momento en que un proceso solicita una operaci\u00f3n de entrada\/salida, el proceso pasa al estado bloqueado, esperando la finalizaci\u00f3n de la I\/O. Si la I\/O se env\u00eda al disco duro, tal operaci\u00f3n puede tardar unos milisegundos o m\u00e1s, y en ese momento el procesador estar\u00e1 inactivo. Durante este tiempo, el planificador puede usar el procesador para otro proceso. La siguiente decisi\u00f3n que debe tomar el planificador es cu\u00e1ndo el proceso completar\u00e1 su I\/O. Cuando esto suceda, habr\u00e1 una interrupci\u00f3n y el sistema operativo cambiar\u00e1 el proceso que solicit\u00f3 la I\/O al estado listo.<\/p>\n<p>Consideremos un ejemplo de varias tareas. Cada una de ellas necesita 50 ms de tiempo de CPU. Sin embargo, la primera acceder\u00e1 a I\/O cada 10 ms (tambi\u00e9n se ejecutar\u00e1 cada 10 ms). Y el proceso B simplemente utiliza 50 ms de CPU sin I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn este ejemplo utilizaremos el programador STCF. \u00bfC\u00f3mo se comportar\u00e1 el programador si lanzamos un proceso como A? Actuar\u00e1 de la siguiente manera: primero completar\u00e1 el proceso A por completo, y luego el proceso B.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemas Operativos: Tres Piezas F\u00e1ciles. Parte 4: Introducci\u00f3n al planificador (traducci\u00f3n)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl enfoque tradicional para resolver este problema es interpretar cada subtarea de 10 ms del proceso A como una tarea separada. As\u00ed, al comenzar con el algoritmo STJF, la elecci\u00f3n entre una tarea de 50 ms y una de 10 ms es obvia. Luego, cuando la subtarea A termine, se iniciar\u00e1 el proceso B y I\/O. Despu\u00e9s de completar I\/O, se decidir\u00e1 reiniciar el proceso A de 10 ms en lugar del proceso B. De esta manera, es posible implementar la superposici\u00f3n, donde la CPU es utilizada por otro proceso mientras el primero espera I\/O. Como resultado, el sistema se utiliza mejor: en el momento en que los procesos interactivos esperan I\/O, otros procesos pueden ejecutarse en la CPU.<\/p>\n<h3>Ya no hay or\u00e1culos.<\/h3>\n<p>\n Ahora tratemos de deshacernos de la suposici\u00f3n de que el tiempo de ejecuci\u00f3n de la tarea es conocido. Este es, en general, el peor y m\u00e1s irrealista supuesto de toda la lista. De hecho, en los sistemas operativos promedio, el propio SO geralmente sabe muy poco sobre el tiempo de ejecuci\u00f3n de las tareas, \u00bfc\u00f3mo entonces construir un programador sin saber cu\u00e1nto tiempo ejecutar\u00e1 una tarea? Quiz\u00e1s podr\u00edamos utilizar algunos principios de RR para resolver este problema.<\/p>\n<h3>Summary<\/h3>\n<p>\n Hemos revisado las ideas b\u00e1sicas de la planificaci\u00f3n de tareas y hemos considerado 2 familias de programadores. El primero lanza la tarea m\u00e1s corta primero, aumentando as\u00ed el tiempo de rotaci\u00f3n, mientras que el segundo se divide equitativamente entre todas las tareas, mejorando el tiempo de respuesta. Ambos algoritmos son deficientes donde los algoritmos de la otra familia son efectivos. Tambi\u00e9n hemos visto c\u00f3mo el uso paralelo de CPU e I\/O puede mejorar el rendimiento, pero no hemos resuelto el problema de la visi\u00f3n del SO. En la pr\u00f3xima clase, discutiremos un programador que mira al pasado cercano y intenta predecir el futuro. Se llama cola de retroalimentaci\u00f3n de m\u00faltiples niveles.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">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":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","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-4-vvedenie-v-planirovshhik-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 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\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-4-vvedenie-v-planirovshhik-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:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+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 4: Introducci\u00f3n al programador (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-4-vvedenie-v-planirovshhik-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 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\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-4-vvedenie-v-planirovshhik-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:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"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 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34: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\/32158","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=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}