€•†¤Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_CN/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_TW/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/it_IT/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ja_JP/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ko_KR/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/pt_BR/scheduler/sched-design-CFS”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒSpanish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.”h]”hŒ paragraph”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.”h]”hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.”…””}”(hh½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³Œ2Documentation/translations/sp_SP/disclaimer-sp.rst”h´Khh·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hµhhh²hh³hËh´NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhhÙh³Œ[/var/lib/git/docbuild/linux/Documentation/translations/sp_SP/scheduler/sched-design-CFS.rst”h´KubhŒ field_body”“”)”}”(hŒF:ref:`Documentation/scheduler/sched-design-CFS.rst `”h]”h¼)”}”(hhñh]”h)”}”(hhñh]”hŒinline”“”)”}”(hhñh]”hŒ,Documentation/scheduler/sched-design-CFS.rst”…””}”(hhûh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hùhhöubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ-translations/sp_SP/scheduler/sched-design-CFS”Œ refdomain”jŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œsched_design_cfs”uh1hh³hìh´Khhóubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khhïubah}”(h]”h ]”h"]”h$]”h&]”uh1híhhÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hìh´KhhÔh²hubhØ)”}”(hhh]”(hÝ)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj,h³hìh´Kubhî)”}”(hŒ4Sergio González Collado ”h]”h¼)”}”(hŒ3Sergio González Collado ”h]”(hŒSergio González Collado <”…””}”(hjAh²hh³Nh´NubhŒ reference”“”)”}”(hŒsergio.collado@gmail.com”h]”hŒsergio.collado@gmail.com”…””}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:sergio.collado@gmail.com”uh1jIhjAubhŒ>”…””}”(hjAh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1híhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hìh´KhhÔh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhh²hh³hìh´KubhŒtarget”“”)”}”(hŒ.. _sp_sched_desing_CFS:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œsp-sched-desing-cfs”uh1jwh´Khhh²hh³hìubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒGestor de tareas CFS”h]”hŒGestor de tareas CFS”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hìh´K ubj†)”}”(hhh]”(j‹)”}”(hŒ1. VISIÓN GENERAL”h]”hŒ1. VISIÓN GENERAL”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjšh²hh³hìh´K ubh¼)”}”(hX™CFS viene de las siglas en inglés de "Gestor de tareas totalmente justo" ("Completely Fair Scheduler"), y es el nuevo gestor de tareas de escritorio implementado por Ingo Molnar e integrado en Linux 2.6.23. Es el sustituto del previo gestor de tareas SCHED_OTHER. Hoy en día se está abriendo camino para el gestor de tareas EEVDF, cuya documentación se puede ver en Documentation/scheduler/sched-eevdf.rst”h]”hX¡CFS viene de las siglas en inglés de “Gestor de tareas totalmente justo†(“Completely Fair Schedulerâ€), y es el nuevo gestor de tareas de escritorio implementado por Ingo Molnar e integrado en Linux 2.6.23. Es el sustituto del previo gestor de tareas SCHED_OTHER. Hoy en día se está abriendo camino para el gestor de tareas EEVDF, cuya documentación se puede ver en Documentation/scheduler/sched-eevdf.rst”…””}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khjšh²hubh¼)”}”(hŒ•El 80% del diseño de CFS puede ser resumido en una única frase: CFS básicamente modela una "CPU ideal, precisa y multi-tarea" sobre hardware real.”h]”hŒ™El 80% del diseño de CFS puede ser resumido en una única frase: CFS básicamente modela una “CPU ideal, precisa y multi-tarea†sobre hardware real.”…””}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khjšh²hubh¼)”}”(hXP"una CPU multitarea ideal" es una CPU (inexistente :-)) que tiene un 100% de potencia y que puede ejecutar cualquier tarea exactamente a la misma velocidad, en paralelo, y cada una a 1/n velocidad. Por ejemplo, si hay dos tareas ejecutándose, entonces cada una usa un 50% de la potencia --- es decir, como si se ejecutaran en paralelo.”h]”hXT“una CPU multitarea ideal†es una CPU (inexistente :-)) que tiene un 100% de potencia y que puede ejecutar cualquier tarea exactamente a la misma velocidad, en paralelo, y cada una a 1/n velocidad. Por ejemplo, si hay dos tareas ejecutándose, entonces cada una usa un 50% de la potencia --- es decir, como si se ejecutaran en paralelo.”…””}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khjšh²hubh¼)”}”(hXËEn hardware real, se puede ejecutar una única tarea a la vez, así que se ha usado el concepto de "tiempo de ejecución virtual". El tiempo de ejecución virtual de una tarea específica cuando la siguiente porción de ejecución podría empezar en la CPU ideal multi-tarea descrita anteriormente. En la práctica, el tiempo de ejecución virtual de una tarea es el tiempo de ejecución real normalizado con respecto al número total de tareas ejecutándose.”h]”hXÏEn hardware real, se puede ejecutar una única tarea a la vez, así que se ha usado el concepto de “tiempo de ejecución virtualâ€. El tiempo de ejecución virtual de una tarea específica cuando la siguiente porción de ejecución podría empezar en la CPU ideal multi-tarea descrita anteriormente. En la práctica, el tiempo de ejecución virtual de una tarea es el tiempo de ejecución real normalizado con respecto al número total de tareas ejecutándose.”…””}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K hjšh²hubeh}”(h]”Œvision-general”ah ]”h"]”Œ1. visión general”ah$]”h&]”uh1j…hj‡h²hh³hìh´K ubj†)”}”(hhh]”(j‹)”}”(hŒ,2. UNOS CUANTOS DETALLES DE IMPLEMENTACIÓN”h]”hŒ,2. UNOS CUANTOS DETALLES DE IMPLEMENTACIÓN”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjëh²hh³hìh´K*ubh¼)”}”(hXEn CFS, el tiempo de ejecución virtual se expresa y se monitoriza por cada tarea, en su valor de p->se.vruntime (en unidades de nanosegundos). De este modo, es posible temporizar con precisión y medir el "tiempo de CPU esperado" que una tarea debería tener.”h]”hXEn CFS, el tiempo de ejecución virtual se expresa y se monitoriza por cada tarea, en su valor de p->se.vruntime (en unidades de nanosegundos). De este modo, es posible temporizar con precisión y medir el “tiempo de CPU esperado†que una tarea debería tener.”…””}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K,hjëh²hubh¼)”}”(hXUn pequeño detalle: en hardware "ideal", en cualquier momento todas las tareas pueden tener el mismo valor de p->se.vruntime --- i.e., tareas se podrían ejecutar simultáneamente y ninguna tarea podría escaparse del "balance" de la partición "ideal" del tiempo compartido de la CPU.”h]”hX*Un pequeño detalle: en hardware “idealâ€, en cualquier momento todas las tareas pueden tener el mismo valor de p->se.vruntime --- i.e., tareas se podrían ejecutar simultáneamente y ninguna tarea podría escaparse del “balance†de la partición “ideal†del tiempo compartido de la CPU.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K1hjëh²hubh¼)”}”(hXLa lógica de elección del tareas de CFS se basa en el valor de p->se.vruntime y por tanto es muy sencilla: siempre intenta ejecutar la tarea con el valor p->se.vruntime más pequeño (i.e., la tarea que se ha ejecutado menos hasta el momento). CFS siempre intenta dividir el espacio de tiempo entre tareas en ejecución tan próximo a la "ejecución multitarea ideal del hardware" como sea posible.”h]”hX”La lógica de elección del tareas de CFS se basa en el valor de p->se.vruntime y por tanto es muy sencilla: siempre intenta ejecutar la tarea con el valor p->se.vruntime más pequeño (i.e., la tarea que se ha ejecutado menos hasta el momento). CFS siempre intenta dividir el espacio de tiempo entre tareas en ejecución tan próximo a la “ejecución multitarea ideal del hardware†como sea posible.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K6hjëh²hubh¼)”}”(hŒ÷El resto del diseño de CFS simplemente se escapa de este simple concepto, con unos cuantos añadidos como los niveles "nice" ("nice" significa "amable" en inglés), multi-tarea y varias variantes del algoritmo para identificar tareas "durmiendo".”h]”hXEl resto del diseño de CFS simplemente se escapa de este simple concepto, con unos cuantos añadidos como los niveles “nice†(“nice†significa “amable†en inglés), multi-tarea y varias variantes del algoritmo para identificar tareas “durmiendoâ€.”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K=hjëh²hubeh}”(h]”Œ'unos-cuantos-detalles-de-implementacion”ah ]”h"]”Œ+2. unos cuantos detalles de implementación”ah$]”h&]”uh1j…hj‡h²hh³hìh´K*ubj†)”}”(hhh]”(j‹)”}”(hŒ3. EL ÃRBOL ROJO-NEGRO”h]”hŒ3. EL ÃRBOL ROJO-NEGRO”…””}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj<h²hh³hìh´KDubh¼)”}”(hX£El diseño de CFS es bastante radical: no utiliza las antiguas estructuras de datos para las colas de ejecución (en inglés "runqueues"), pero usa una estructura de árbol rojo-negro (en inglés "red-black tree") ordenado cronológicamente para construir un línea de ejecución en el futuro, y por eso no tiene ningún artificio de "cambio de tareas" (algo que previamente era usado por el gestor anterior y RSDL/SD).”h]”hX¯El diseño de CFS es bastante radical: no utiliza las antiguas estructuras de datos para las colas de ejecución (en inglés “runqueuesâ€), pero usa una estructura de árbol rojo-negro (en inglés “red-black treeâ€) ordenado cronológicamente para construir un línea de ejecución en el futuro, y por eso no tiene ningún artificio de “cambio de tareas†(algo que previamente era usado por el gestor anterior y RSDL/SD).”…””}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KFhj<h²hubh¼)”}”(hX|CFS también mantiene el valor de rq->cfs.min_vruntime, el cual crece monotónicamente siguiendo el valor más pequeño de vruntime de entre todas las tareas en la cola de ejecución. La cantidad total de trabajo realizado por el sistema es monitorizado usado min_vruntime; este valor es usado para situar las nuevas tareas en la parte izquierda del árbol tanto como sea posible.”h]”hX|CFS también mantiene el valor de rq->cfs.min_vruntime, el cual crece monotónicamente siguiendo el valor más pequeño de vruntime de entre todas las tareas en la cola de ejecución. La cantidad total de trabajo realizado por el sistema es monitorizado usado min_vruntime; este valor es usado para situar las nuevas tareas en la parte izquierda del árbol tanto como sea posible.”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KMhj<h²hubh¼)”}”(hŒ¾El valor total de tareas ejecutándose en la cola de ejecución es contabilizado mediante el valor rq->cfs.load, el cual es la suma de los de esas tareas que están en la cola de ejecución.”h]”hŒ¾El valor total de tareas ejecutándose en la cola de ejecución es contabilizado mediante el valor rq->cfs.load, el cual es la suma de los de esas tareas que están en la cola de ejecución.”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KThj<h²hubh¼)”}”(hXCFS mantiene un árbol rojo-negro cronológicamente ordenado, donde todas las tareas que pueden ser ejecutadas están ordenadas por su valor de p->se.vruntime. CFS selecciona la tarea más hacia la izquierda de este árbol y la mantiene. Según el sistema continúa, las tareas ejecutadas se ponen en este árbol más y más hacia la derecha --- lentamente pero de forma continuada dando una oportunidad a cada tarea de ser la que está "la más hacia la izquierda" y por tanto obtener la CPU una cantidad determinista de tiempo.”h]”hXCFS mantiene un árbol rojo-negro cronológicamente ordenado, donde todas las tareas que pueden ser ejecutadas están ordenadas por su valor de p->se.vruntime. CFS selecciona la tarea más hacia la izquierda de este árbol y la mantiene. Según el sistema continúa, las tareas ejecutadas se ponen en este árbol más y más hacia la derecha --- lentamente pero de forma continuada dando una oportunidad a cada tarea de ser la que está “la más hacia la izquierda†y por tanto obtener la CPU una cantidad determinista de tiempo.”…””}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KXhj<h²hubh¼)”}”(hX¸Resumiendo, CFS funciona así: ejecuta una tarea un tiempo, y cuando la tarea se gestiona (o sucede un tic del gestor de tareas) se considera que el tiempo de uso de la CPU se ha completado, y se añade a p->se.vruntime. Una vez p->se.vruntime ha aumentado lo suficiente como para que otra tarea sea "la tarea más hacia la izquierda" del árbol rojo-negro ordenado cronológicamente esta mantienen (más una cierta pequeña cantidad de distancia relativa a la tarea más hacia la izquierda para que no se sobre-reserven tareas y perjudique a la cache), entonces la nueva tarea "que está a la izquierda del todo", es la que se elige para que se ejecute, y la tarea en ejecución es interrumpida.”h]”hXÀResumiendo, CFS funciona así: ejecuta una tarea un tiempo, y cuando la tarea se gestiona (o sucede un tic del gestor de tareas) se considera que el tiempo de uso de la CPU se ha completado, y se añade a p->se.vruntime. Una vez p->se.vruntime ha aumentado lo suficiente como para que otra tarea sea “la tarea más hacia la izquierda†del árbol rojo-negro ordenado cronológicamente esta mantienen (más una cierta pequeña cantidad de distancia relativa a la tarea más hacia la izquierda para que no se sobre-reserven tareas y perjudique a la cache), entonces la nueva tarea “que está a la izquierda del todoâ€, es la que se elige para que se ejecute, y la tarea en ejecución es interrumpida.”…””}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kahj<h²hubeh}”(h]”Œel-arbol-rojo-negro”ah ]”h"]”Œ3. el árbol rojo-negro”ah$]”h&]”uh1j…hj‡h²hh³hìh´KDubj†)”}”(hhh]”(j‹)”}”(hŒ#4. ALGUNAS CARACTERÃSTICAS DE CFS”h]”hŒ#4. ALGUNAS CARACTERÃSTICAS DE CFS”…””}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj›h²hh³hìh´Kmubh¼)”}”(hX.CFS usa una granularidad de nanosegundos y no depende de ningún jiffy o detalles como HZ. De este modo, el gestor de tareas CFS no tiene noción de "ventanas de tiempo" de la forma en que tenía el gestor de tareas previo, y tampoco tiene heurísticos. Únicamente hay un parámetro central ajustable:”h]”hX2CFS usa una granularidad de nanosegundos y no depende de ningún jiffy o detalles como HZ. De este modo, el gestor de tareas CFS no tiene noción de “ventanas de tiempo†de la forma en que tenía el gestor de tareas previo, y tampoco tiene heurísticos. Únicamente hay un parámetro central ajustable:”…””}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kohj›h²hubhŒ block_quote”“”)”}”(hŒ&/sys/kernel/debug/sched/base_slice_ns ”h]”h¼)”}”(hŒ%/sys/kernel/debug/sched/base_slice_ns”h]”hŒ%/sys/kernel/debug/sched/base_slice_ns”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kuhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºh³hìh´Kuhj›h²hubh¼)”}”(hXEl cual puede ser usado para afinar desde el gestor de tareas del "escritorio" (i.e., bajas latencias) hacia cargas de "servidor" (i.e., bueno con procesamientos). Su valor por defecto es adecuado para tareas de escritorio. SCHED_BATCH también es gestionado por el gestor de tareas CFS.”h]”hX'El cual puede ser usado para afinar desde el gestor de tareas del “escritorio†(i.e., bajas latencias) hacia cargas de “servidor†(i.e., bueno con procesamientos). Su valor por defecto es adecuado para tareas de escritorio. SCHED_BATCH también es gestionado por el gestor de tareas CFS.”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kwhj›h²hubh¼)”}”(hX;Debido a su diseño, el gestor de tareas CFS no es proclive a ninguno de los ataques que existen a día de hoy contra los heurísticos del gestor de tareas: fiftyp.c, thud.c, chew.c, ring-test.c, massive_intr.c todos trabajan correctamente y no tienen impacto en la interacción y se comportan de la forma esperada.”h]”hX;Debido a su diseño, el gestor de tareas CFS no es proclive a ninguno de los ataques que existen a día de hoy contra los heurísticos del gestor de tareas: fiftyp.c, thud.c, chew.c, ring-test.c, massive_intr.c todos trabajan correctamente y no tienen impacto en la interacción y se comportan de la forma esperada.”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K|hj›h²hubh¼)”}”(hŒÂEl gestor de tareas CFS tiene una gestión mucho más firme de los niveles "nice" y SCHED_BATCH que los previos gestores de tareas: ambos tipos de tareas están aisladas de forma más eficiente.”h]”hŒÆEl gestor de tareas CFS tiene una gestión mucho más firme de los niveles “nice†y SCHED_BATCH que los previos gestores de tareas: ambos tipos de tareas están aisladas de forma más eficiente.”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K‚hj›h²hubh¼)”}”(hXEl balanceo de tareas SMP ha sido rehecho/mejorado: el avance por las colas de ejecución de tareas ha desaparecido del código de balanceo de carga, y ahora se usan iteradores en la gestión de módulos. El balanceo del código ha sido simplificado como resultado esto.”h]”hXEl balanceo de tareas SMP ha sido rehecho/mejorado: el avance por las colas de ejecución de tareas ha desaparecido del código de balanceo de carga, y ahora se usan iteradores en la gestión de módulos. El balanceo del código ha sido simplificado como resultado esto.”…””}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K†hj›h²hubeh}”(h]”Œalgunas-caracteristicas-de-cfs”ah ]”h"]”Œ"4. algunas características de cfs”ah$]”h&]”uh1j…hj‡h²hh³hìh´Kmubj†)”}”(hhh]”(j‹)”}”(hŒ$5. Políticas de gestión de tareas”h]”hŒ$5. Políticas de gestión de tareas”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjh²hh³hìh´KŒubh¼)”}”(hŒ5CFS implementa tres políticas de gestión de tareas:”h]”hŒ5CFS implementa tres políticas de gestión de tareas:”…””}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KŽhjh²hubj»)”}”(hXq- SCHED_NORMAL (tradicionalmente llamada SCHED_OTHER): Gestión de tareas que se usan para tareas normales. - SCHED_BATCH: No interrumpe tareas tan a menudo como las tareas normales harían, por eso permite a las tareas ejecutarse durante ventanas de tiempo mayores y hace un uso más efectivo de las caches pero al coste de la interactividad. Esto es adecuado para trabajos de procesado de datos. - SCHED_IDLE: Esta política es más débil incluso que nice 19, pero no es un gestor "idle" para evitar caer en el problema de la inversión de prioridades que causaría un bloqueo de la máquina (deadlock). ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒjSCHED_NORMAL (tradicionalmente llamada SCHED_OTHER): Gestión de tareas que se usan para tareas normales. ”h]”h¼)”}”(hŒiSCHED_NORMAL (tradicionalmente llamada SCHED_OTHER): Gestión de tareas que se usan para tareas normales.”h]”hŒiSCHED_NORMAL (tradicionalmente llamada SCHED_OTHER): Gestión de tareas que se usan para tareas normales.”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Khj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j<hj9ubj=)”}”(hX SCHED_BATCH: No interrumpe tareas tan a menudo como las tareas normales harían, por eso permite a las tareas ejecutarse durante ventanas de tiempo mayores y hace un uso más efectivo de las caches pero al coste de la interactividad. Esto es adecuado para trabajos de procesado de datos. ”h]”h¼)”}”(hXSCHED_BATCH: No interrumpe tareas tan a menudo como las tareas normales harían, por eso permite a las tareas ejecutarse durante ventanas de tiempo mayores y hace un uso más efectivo de las caches pero al coste de la interactividad. Esto es adecuado para trabajos de procesado de datos.”h]”hXSCHED_BATCH: No interrumpe tareas tan a menudo como las tareas normales harían, por eso permite a las tareas ejecutarse durante ventanas de tiempo mayores y hace un uso más efectivo de las caches pero al coste de la interactividad. Esto es adecuado para trabajos de procesado de datos.”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K“hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1j<hj9ubj=)”}”(hŒÏSCHED_IDLE: Esta política es más débil incluso que nice 19, pero no es un gestor "idle" para evitar caer en el problema de la inversión de prioridades que causaría un bloqueo de la máquina (deadlock). ”h]”h¼)”}”(hŒÎSCHED_IDLE: Esta política es más débil incluso que nice 19, pero no es un gestor "idle" para evitar caer en el problema de la inversión de prioridades que causaría un bloqueo de la máquina (deadlock).”h]”hŒÒSCHED_IDLE: Esta política es más débil incluso que nice 19, pero no es un gestor “idle†para evitar caer en el problema de la inversión de prioridades que causaría un bloqueo de la máquina (deadlock).”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K™hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1j<hj9ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j7h³hìh´Khj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºh³hìh´Khjh²hubh¼)”}”(hŒHSCHED_FIFO/_RR se implementan en sched/rt.c y son específicos de POSIX.”h]”hŒHSCHED_FIFO/_RR se implementan en sched/rt.c y son específicos de POSIX.”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kžhjh²hubh¼)”}”(hŒkEl comando chrt de util-linux-ng 2.13.1.1. puede asignar cualquiera de estas políticas excepto SCHED_IDLE.”h]”hŒkEl comando chrt de util-linux-ng 2.13.1.1. puede asignar cualquiera de estas políticas excepto SCHED_IDLE.”…””}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K¡hjh²hubeh}”(h]”Œpoliticas-de-gestion-de-tareas”ah ]”h"]”Œ#5. políticas de gestión de tareas”ah$]”h&]”uh1j…hj‡h²hh³hìh´KŒubj†)”}”(hhh]”(j‹)”}”(hŒ6. CLASES DE GESTIÓN”h]”hŒ6. CLASES DE GESTIÓN”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj¸h²hh³hìh´K¦ubh¼)”}”(hXtEl nuevo gestor de tareas CFS ha sido diseñado de tal modo para incluir "clases de gestión", una jerarquía ampliable de módulos que pueden tener distintas políticas de gestión de tareas. Estos módulos encapsulan los detalles de las politicas de gestión y son manejadas por el núcleo del gestor de tareas sin que este tenga que presuponer mucho sobre estas clases.”h]”hXxEl nuevo gestor de tareas CFS ha sido diseñado de tal modo para incluir “clases de gestiónâ€, una jerarquía ampliable de módulos que pueden tener distintas políticas de gestión de tareas. Estos módulos encapsulan los detalles de las politicas de gestión y son manejadas por el núcleo del gestor de tareas sin que este tenga que presuponer mucho sobre estas clases.”…””}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K¨hj¸h²hubh¼)”}”(hŒ?sched/fair.c implementa el gestor de tareas CFS descrito antes.”h]”hŒ?sched/fair.c implementa el gestor de tareas CFS descrito antes.”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K®hj¸h²hubh¼)”}”(hX*sched/rt.c implementa la semántica de SCHED_FIFO y SCHED_RR, de una forma más sencilla que el gestor de tareas anterior. Usa 100 colas de ejecución (por todos los 100 niveles de prioridad RT, en vez de las 140 que necesitaba el gestor de tareas anterior) y no necesita las listas de expiración.”h]”hX*sched/rt.c implementa la semántica de SCHED_FIFO y SCHED_RR, de una forma más sencilla que el gestor de tareas anterior. Usa 100 colas de ejecución (por todos los 100 niveles de prioridad RT, en vez de las 140 que necesitaba el gestor de tareas anterior) y no necesita las listas de expiración.”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K°hj¸h²hubh¼)”}”(hŒÇLas clases de gestión de tareas son implementadas por medio de la estructura sched_class, la cual tiene llamadas a las funciones que deben de llamarse cuando quiera que ocurra un evento interesante.”h]”hŒÇLas clases de gestión de tareas son implementadas por medio de la estructura sched_class, la cual tiene llamadas a las funciones que deben de llamarse cuando quiera que ocurra un evento interesante.”…””}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kµhj¸h²hubh¼)”}”(hŒ%Esta es la lista parcial de llamadas:”h]”hŒ%Esta es la lista parcial de llamadas:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K¹hj¸h²hubj»)”}”(hXÍ- enqueue_task(...) Llamada cuando una tarea entra en el estado de lista para ejecución. Pone la entidad a ser gestionada (la tarea) en el árbol rojo-negro e incrementa la variable nr_running. - dequeue_task(...) Cuando una tarea deja de ser ejecutable, esta función se llama para mantener a la entidad gestionada fuera del árbol rojo-negor. Esto decrementa la variable nr_running. - yield_task(...) Esta función cede la CPU desplazando la posición de la tarea actualmente en ejecución hacia atrás en la cola de ejecución, para que otras tareas ejecutables sean planificadas primero. - check_preempt_curr(...) Esta función comprueba si una tarea que ha entrado en el estado de poder ser ejecutada, podría reemplazar a la tarea que actualmente se esté ejecutando. - pick_next_task(...) Esta función elige la tarea más apropiada para ser ejecutada a continuación. - set_curr_task(...) Esta función se llama cuando una tarea cambia su clase de gestión o cambia su grupo de tareas. - task_tick(...) Esta función es llamada la mayoría de las veces desde la función de tiempo tick; esto puede llevar a un cambio de procesos. Esto dirige el reemplazo de las tareas. ”h]”j8)”}”(hhh]”(j=)”}”(hŒÂenqueue_task(...) Llamada cuando una tarea entra en el estado de lista para ejecución. Pone la entidad a ser gestionada (la tarea) en el árbol rojo-negro e incrementa la variable nr_running. ”h]”(h¼)”}”(hŒenqueue_task(...)”h]”hŒenqueue_task(...)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K»hjubh¼)”}”(hŒ®Llamada cuando una tarea entra en el estado de lista para ejecución. Pone la entidad a ser gestionada (la tarea) en el árbol rojo-negro e incrementa la variable nr_running.”h]”hŒ®Llamada cuando una tarea entra en el estado de lista para ejecución. Pone la entidad a ser gestionada (la tarea) en el árbol rojo-negro e incrementa la variable nr_running.”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K½hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒ¾dequeue_task(...) Cuando una tarea deja de ser ejecutable, esta función se llama para mantener a la entidad gestionada fuera del árbol rojo-negor. Esto decrementa la variable nr_running. ”h]”(h¼)”}”(hŒdequeue_task(...)”h]”hŒdequeue_task(...)”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÁhj<ubh¼)”}”(hŒªCuando una tarea deja de ser ejecutable, esta función se llama para mantener a la entidad gestionada fuera del árbol rojo-negor. Esto decrementa la variable nr_running.”h]”hŒªCuando una tarea deja de ser ejecutable, esta función se llama para mantener a la entidad gestionada fuera del árbol rojo-negor. Esto decrementa la variable nr_running.”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÃhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒÎyield_task(...) Esta función cede la CPU desplazando la posición de la tarea actualmente en ejecución hacia atrás en la cola de ejecución, para que otras tareas ejecutables sean planificadas primero. ”h]”(h¼)”}”(hŒyield_task(...)”h]”hŒyield_task(...)”…””}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÇhjbubh¼)”}”(hŒ¼Esta función cede la CPU desplazando la posición de la tarea actualmente en ejecución hacia atrás en la cola de ejecución, para que otras tareas ejecutables sean planificadas primero.”h]”hŒ¼Esta función cede la CPU desplazando la posición de la tarea actualmente en ejecución hacia atrás en la cola de ejecución, para que otras tareas ejecutables sean planificadas primero.”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÉhjbubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒµcheck_preempt_curr(...) Esta función comprueba si una tarea que ha entrado en el estado de poder ser ejecutada, podría reemplazar a la tarea que actualmente se esté ejecutando. ”h]”(h¼)”}”(hŒcheck_preempt_curr(...)”h]”hŒcheck_preempt_curr(...)”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÍhjˆubh¼)”}”(hŒ›Esta función comprueba si una tarea que ha entrado en el estado de poder ser ejecutada, podría reemplazar a la tarea que actualmente se esté ejecutando.”h]”hŒ›Esta función comprueba si una tarea que ha entrado en el estado de poder ser ejecutada, podría reemplazar a la tarea que actualmente se esté ejecutando.”…””}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÏhjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒepick_next_task(...) Esta función elige la tarea más apropiada para ser ejecutada a continuación. ”h]”(h¼)”}”(hŒpick_next_task(...)”h]”hŒpick_next_task(...)”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÓhj®ubh¼)”}”(hŒOEsta función elige la tarea más apropiada para ser ejecutada a continuación.”h]”hŒOEsta función elige la tarea más apropiada para ser ejecutada a continuación.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÕhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒuset_curr_task(...) Esta función se llama cuando una tarea cambia su clase de gestión o cambia su grupo de tareas. ”h]”(h¼)”}”(hŒset_curr_task(...)”h]”hŒset_curr_task(...)”…””}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´K×hjÔubh¼)”}”(hŒ`Esta función se llama cuando una tarea cambia su clase de gestión o cambia su grupo de tareas.”h]”hŒ`Esta función se llama cuando una tarea cambia su clase de gestión o cambia su grupo de tareas.”…””}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÙhjÔubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubj=)”}”(hŒ¸task_tick(...) Esta función es llamada la mayoría de las veces desde la función de tiempo tick; esto puede llevar a un cambio de procesos. Esto dirige el reemplazo de las tareas. ”h]”(h¼)”}”(hŒtask_tick(...)”h]”hŒtask_tick(...)”…””}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÜhjúubh¼)”}”(hŒ¦Esta función es llamada la mayoría de las veces desde la función de tiempo tick; esto puede llevar a un cambio de procesos. Esto dirige el reemplazo de las tareas.”h]”hŒ¦Esta función es llamada la mayoría de las veces desde la función de tiempo tick; esto puede llevar a un cambio de procesos. Esto dirige el reemplazo de las tareas.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´KÞhjúubeh}”(h]”h ]”h"]”h$]”h&]”uh1j<hjubeh}”(h]”h ]”h"]”h$]”h&]”jŒjuh1j7h³hìh´K»hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jºh³hìh´K»hj¸h²hubeh}”(h]”Œclases-de-gestion”ah ]”h"]”Œ6. clases de gestión”ah$]”h&]”uh1j…hj‡h²hh³hìh´K¦ubj†)”}”(hhh]”(j‹)”}”(hŒ"7. EXTENSIONES DE GRUPOS PARA CFS”h]”hŒ"7. EXTENSIONES DE GRUPOS PARA CFS”…””}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj4h²hh³hìh´Käubh¼)”}”(hX¿Normalmente, el gestor de tareas gestiona tareas individuales e intenta proporcionar una cantidad justa de CPU a cada tarea. Algunas veces, puede ser deseable agrupar las tareas y proporcionarles una cantidad justa de tiempo de CPU a cada una de las tareas de ese grupo. Por ejemplo, podría ser deseable que primero se proporcione una cantidad justa de tiempo de CPU a cada usuario del sistema y después a cada tarea que pertenezca a un usuario.”h]”hX¿Normalmente, el gestor de tareas gestiona tareas individuales e intenta proporcionar una cantidad justa de CPU a cada tarea. Algunas veces, puede ser deseable agrupar las tareas y proporcionarles una cantidad justa de tiempo de CPU a cada una de las tareas de ese grupo. Por ejemplo, podría ser deseable que primero se proporcione una cantidad justa de tiempo de CPU a cada usuario del sistema y después a cada tarea que pertenezca a un usuario.”…””}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kæhj4h²hubh¼)”}”(hŒ—CONFIG_CGROUP_SCHED destaca en conseguir exactamente eso. Permite a las tareas ser agrupadas y divide el tiempo de CPU de forma just entre esos grupos.”h]”hŒ—CONFIG_CGROUP_SCHED destaca en conseguir exactamente eso. Permite a las tareas ser agrupadas y divide el tiempo de CPU de forma just entre esos grupos.”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kîhj4h²hubh¼)”}”(hŒZCONFIG_RT_GROUP_SCHED permite agrupar tareas de tiempo real (i.e., SCHED_FIFO y SCHED_RR).”h]”hŒZCONFIG_RT_GROUP_SCHED permite agrupar tareas de tiempo real (i.e., SCHED_FIFO y SCHED_RR).”…””}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kòhj4h²hubh¼)”}”(hŒYCONFIG_FAIR_GROUP_SCHED permite agrupar tareas de CFS (i.e., SCHED_NORMAL y SCHED_BATCH).”h]”hŒYCONFIG_FAIR_GROUP_SCHED permite agrupar tareas de CFS (i.e., SCHED_NORMAL y SCHED_BATCH).”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kõhj4h²hubh¼)”}”(hX)Estas opciones necesitan CONFIG_CGROUPS para ser definidas, y permitir al administrador crear grupos arbitrarios de tareas, usando el pseudo sistema de archivos "cgroup". Vease la documentación para más información sobre este sistema de archivos: Documentation/admin-guide/cgroup-v1/cgroups.rst”h]”hX-Estas opciones necesitan CONFIG_CGROUPS para ser definidas, y permitir al administrador crear grupos arbitrarios de tareas, usando el pseudo sistema de archivos “cgroupâ€. Vease la documentación para más información sobre este sistema de archivos: Documentation/admin-guide/cgroup-v1/cgroups.rst”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Køhj4h²hubh¼)”}”(hX-Cuando CONFIG_FAIR_GROUP_SCHED es definido, un archivo "cpu.shares" es creado por cada grupo creado usado en el pseudo sistema de archivos. Véanse por ejemplo los pasos a continuación para crear grupos de tareas y modificar cuanto comparten de la CPU usando el pseudo sistema de archivos "cgroup" ::”h]”hX2Cuando CONFIG_FAIR_GROUP_SCHED es definido, un archivo “cpu.shares†es creado por cada grupo creado usado en el pseudo sistema de archivos. Véanse por ejemplo los pasos a continuación para crear grupos de tareas y modificar cuanto comparten de la CPU usando el pseudo sistema de archivos “cgroup—…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hìh´Kýhj4h²hubhŒ literal_block”“”)”}”(hX# mount -t tmpfs cgroup_root /sys/fs/cgroup # mkdir /sys/fs/cgroup/cpu # mount -t cgroup -ocpu none /sys/fs/cgroup/cpu # cd /sys/fs/cgroup/cpu # mkdir multimedia # crear un grupo de tareas "multimedia" # mkdir browser # crear un grupo de tareas "browser" # #Configurar el grupo multimedia para tener el doble de tiempo de CPU # #que el grupo browser # echo 2048 > multimedia/cpu.shares # echo 1024 > browser/cpu.shares # firefox & # Lanzar firefox y moverlo al grupo "browser" # echo > browser/tasks # #Lanzar gmplayer (o su programa favorito de reproducción de películas) # echo > multimedia/tasks”h]”hX# mount -t tmpfs cgroup_root /sys/fs/cgroup # mkdir /sys/fs/cgroup/cpu # mount -t cgroup -ocpu none /sys/fs/cgroup/cpu # cd /sys/fs/cgroup/cpu # mkdir multimedia # crear un grupo de tareas "multimedia" # mkdir browser # crear un grupo de tareas "browser" # #Configurar el grupo multimedia para tener el doble de tiempo de CPU # #que el grupo browser # echo 2048 > multimedia/cpu.shares # echo 1024 > browser/cpu.shares # firefox & # Lanzar firefox y moverlo al grupo "browser" # echo > browser/tasks # #Lanzar gmplayer (o su programa favorito de reproducción de películas) # echo > multimedia/tasks”…””}”hj›sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j™h³hìh´Mhj4h²hubeh}”(h]”Œextensiones-de-grupos-para-cfs”ah ]”h"]”Œ!7. extensiones de grupos para cfs”ah$]”h&]”uh1j…hj‡h²hh³hìh´Käubeh}”(h]”(Œgestor-de-tareas-cfs”j„eh ]”h"]”(Œgestor de tareas cfs”Œsp_sched_desing_cfs”eh$]”h&]”uh1j…hhh²hh³hìh´K Œexpect_referenced_by_name”}”j¹jysŒexpect_referenced_by_id”}”j„jysubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hìuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jŠNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jãŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hìŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”j„]”jyasŒnameids”}”(j¹j„j¸jµjèjåj9j6j˜j•jjjµj²j1j.j°j­uŒ nametypes”}”(j¹ˆj¸‰jè‰j9‰j˜‰j‰jµ‰j1‰j°‰uh}”(j„j‡jµj‡jåjšj6jëj•j<jj›j²jj.j¸j­j4uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”h¼)”}”(hhh]”hŒ9Hyperlink target "sp-sched-desing-cfs" is not referenced.”…””}”hjMsbah}”(h]”h ]”h"]”h$]”h&]”uh1h»hjJubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hìŒline”Kuh1jHubaŒ transformer”NŒ include_log”]”Œ?Documentation/translations/sp_SP/scheduler/sched-design-CFS.rst”(NNNNt”†”aŒ decoration”Nh²hub.