<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexrdp</id>
		<title>Wiki de Sistemas Operativos - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexrdp"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php/Especial:Contribuciones/Alexrdp"/>
		<updated>2026-04-08T03:16:17Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1_memoria_virtual&amp;diff=1289</id>
		<title>Solución ejercicio 1 memoria virtual</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1_memoria_virtual&amp;diff=1289"/>
				<updated>2011-06-14T09:37:52Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* NRU con 2º oportunidad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= FIFO =&lt;br /&gt;
                                          accesos a páginas&lt;br /&gt;
                 -------------------------------------------------------------------------&lt;br /&gt;
                 |  1  |  1  |  1  |  2  |  3  |  4  |  5  |  3  |  1  |  2  |  3  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |  1  |  =  |  =  |  =  |  =  |  =  |  5  |  =  |  =  |  =  |  =  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |     |     |     |  2  |  =  |  =  |  =  |  =  |  1  |  =  |  =  |  =  |&lt;br /&gt;
         --------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |     |     |     |     |  3  |  =  |  =  |  =  |  =  |  2  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |     |     |     |     |     |  4  |  =  |  =  |  =  |  =  |  3  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |  X  |     |     |  X  |  X  |  X  |  X  |     |  X  |  X  |  X  |  X  |&lt;br /&gt;
 página          -------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                                9&lt;br /&gt;
 talla de fallos de página =  ------ = 0.75&lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
= NRU =&lt;br /&gt;
&lt;br /&gt;
En caso de empate, se emplea LRU.&lt;br /&gt;
                                          accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M | 1 | 0 | = | = | 1 | 1 | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   | 1 | 0 | = | = | = | = | 1 | 0 | = | = | = | = | = | = | = | = | 1 | 0 |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   =   |   3   |   =   |   =   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   |   |   | 1 | 0 | = | = | = | = | 1 | 1 | = | = | = | = | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   =   |   =   |   =   |   2   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   |   |   |   |   | 1 | 0 | = | = | = | = | = | = | 1 | 1 | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |       |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 7&lt;br /&gt;
 talla de fallos de página =  ------ = 0.583&lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
= NRU con 2º oportunidad =&lt;br /&gt;
&lt;br /&gt;
                                              accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   =   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   2   |   =   |   1   |   =   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |   1   |   =   |   =   |   0   |   =   |   1   |   =   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   3   |   3   |   =   |   3   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |   1   |   =   |   0   |   1   |   =   |   0   |   1   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   4   |   =   |   =   |   2   |   =   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |       |   1   |   0   |   =   |   =   |   1   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |   X   |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 contenido       |   1   |   1   |   1   |  1-2  | 1-2-3 |1-2-3-4|2-3-4-5|2-3-4-5|3-4-5-1|5-1-3-2|5-1-3-2|1-3-2-4|&lt;br /&gt;
 de la cola      -------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 8&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
 Creo que es asi, pero no me lo tomeis a pies juntillas que no estoy muy seguro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por favor que alguien explique bien este criterio, que en cada ejercicio se aplica de una forma diferente.Gracias&lt;br /&gt;
&lt;br /&gt;
Explicación:&lt;br /&gt;
&lt;br /&gt;
El criterio se basa en combinar el NRU (sin bit M) con FIFO. En la cola se van añadiendo las páginas según se cargan con su respectivo valor del bit R. A la hora de sustituir se mira el candidato de la cabecera de la cola. Si su R=1, se le da una segunda oportunidad desplazándolo al final de la cola y poniendo su bit R=0. Si hubiera tenido el R=0, se hubiera tomada esa página como víctima. Eso es lo que sucede cuando llega la página 5. En ese momento la cola es 1 2 3 4 con su bit R=1 en todas las páginas. Se va mirando el candidato si tiene el bit R=0 como no es así, pasa al final de la cola. Llega un momento en el que la página 1 vuelve a la cabecera(en este caso con R=0),por lo que ahora si es sustituida por la página 5.[[Usuario:Jherrera|Jherrera]]&lt;br /&gt;
&lt;br /&gt;
Una Dudilla : la FIFO es por orden de carga o por orden de acceso?¿ Según veo en el ejercicio lo hace por orden de acceso --[[Usuario:DvS 013|DvS 013]]&lt;br /&gt;
--&lt;br /&gt;
Respuesta : La fifo almacena el tiempo que una página lleva cargada en memoria, por lo que es por orden de carga. [[Usuario : JCGarrido|JCGarrido]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
He puesto el orden de la cola para que se vea más claro. Cuando el candidato tiene R=1 se pone a 0 y se inserta al final. Es por eso que cuando se accede por última vez a la página 2, al estar 3 la primera, se pone su bit R a 0 se inserta al final (no estaba en la solución anterior) y la siguiente (4, con R=0) es la página víctima.--[[Usuario:Alexrdp|Alexrdp]] 09:37 14 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Entonces, sería asi:&lt;br /&gt;
&lt;br /&gt;
                                              accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   5   |   =   |   5   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   0   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   2   |   =   |   1   |   1   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |   1   |   =   |   =   |   0   |   =   |   1   |   0   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   3   |   3   |   3   |   2   |   2   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |   1   |   =   |   0   |   1   |   0   |   1   |   0   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   4   |   =   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |       |   1   |   0   |   =   |   =   |   =   |   1   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |    X  |       |   X   |   X   |   X   |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 9&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esta segunda solución creo que no está del todo correcta.&lt;br /&gt;
Cuando llega el cuarto acceso a 1 (donde se produce el sexto fallo de página), el contenido de la cola es el siguiente:&lt;br /&gt;
&lt;br /&gt;
2 (R=0) - 3 (R=1) - 4 (R=0) - 5 (R=1)&lt;br /&gt;
&lt;br /&gt;
Con lo cual, la víctima es el 2, pero sin poner a 0 el resto de los bits R, ya que el primer elemento de la cola tiene el bit R=0 y no hace falta seguir iterando sobre ésta.&lt;br /&gt;
&lt;br /&gt;
= LRU =&lt;br /&gt;
&lt;br /&gt;
                                       accesos a páginas&lt;br /&gt;
                 -------------------------------------------------------------------------&lt;br /&gt;
                 |  1  |  1  |  1  |  2  |  3  |  4  |  5  |  3  |  1  |  2  |  3  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |  1  |  =  |  =  |  =  |  =  |  =  |  5  |  =  |  =  |  =  |  =  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |     |     |     |  2  |  =  |  =  |  =  |  =  |  1  |  =  |  =  |  =  |&lt;br /&gt;
         --------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |     |     |     |     |  3  |  =  |  =  |  =  |  =  |  =  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |     |     |     |     |     |  4  |  =  |  =  |  =  |  2  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |  X  |     |     |  X  |  X  |  X  |  X  |     |  X  |  X  |     |  X  |&lt;br /&gt;
 página          -------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                                8&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LFU =&lt;br /&gt;
&lt;br /&gt;
                                                   accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |   1   |   2   |   3   |   =   |   =   |   =   |   =   |   =   |   4   |   =   |   =   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |   1   |   =   |   =   |   1   |   =   |   =   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   =   |   3   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |       |   1   |   =   |   =   |   2   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   =   |   =   |   =   |   2   |   =   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |       |       |   1   |   =   |   =   |   =   |   1   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |       |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 7&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
Observación: al quitar un elemento se resetea su contador&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sustitución por envejecimiento =&lt;br /&gt;
 Periodo de 4, registro R de 3 bits, desempate: FIFO (por orden de carga)&lt;br /&gt;
&lt;br /&gt;
     _________________accesos a página__________________&lt;br /&gt;
     |_1_|_1_|_1_|_2_||_3_|_4_|_5_|_3_||_1_|_2_|_3_|_4_|&lt;br /&gt;
  ======================================================&lt;br /&gt;
   1 | 1 | = | = | = || 1 | = | 5 | = || 5 | = | = | 4 |&lt;br /&gt;
     |100| = | = | = ||010| = |100| = ||010| = | = |100|&lt;br /&gt;
 m---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
 a 2 |   |   |   | 2 || 2 | = | = | = || 1 | = | = | = |&lt;br /&gt;
 r   |   |   |   |100||010| = | = | = ||100| = | = | = |&lt;br /&gt;
 c---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
 o 3 |   |   |   |   || 3 | = | = | = || 3 | 2 | = | = |&lt;br /&gt;
 s   |   |   |   |   ||100| = | = | = ||010|100| = | = |&lt;br /&gt;
  ---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
   4 |   |   |   |   ||   | 4 | = | = || 4 | = | 3 | = |&lt;br /&gt;
     |   |   |   |   ||   |100| = | = ||010| = |100| = |&lt;br /&gt;
  --------------------------------------------------------&amp;gt; t&lt;br /&gt;
       x           x    x   x   x        x   x   x   x&lt;br /&gt;
 &lt;br /&gt;
                     9&lt;br /&gt;
  tasa fallos pág = ---- &lt;br /&gt;
                     12&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1_memoria_virtual&amp;diff=1287</id>
		<title>Solución ejercicio 1 memoria virtual</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1_memoria_virtual&amp;diff=1287"/>
				<updated>2011-06-14T09:29:17Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* NRU con 2º oportunidad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= FIFO =&lt;br /&gt;
                                          accesos a páginas&lt;br /&gt;
                 -------------------------------------------------------------------------&lt;br /&gt;
                 |  1  |  1  |  1  |  2  |  3  |  4  |  5  |  3  |  1  |  2  |  3  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |  1  |  =  |  =  |  =  |  =  |  =  |  5  |  =  |  =  |  =  |  =  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |     |     |     |  2  |  =  |  =  |  =  |  =  |  1  |  =  |  =  |  =  |&lt;br /&gt;
         --------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |     |     |     |     |  3  |  =  |  =  |  =  |  =  |  2  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |     |     |     |     |     |  4  |  =  |  =  |  =  |  =  |  3  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |  X  |     |     |  X  |  X  |  X  |  X  |     |  X  |  X  |  X  |  X  |&lt;br /&gt;
 página          -------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                                9&lt;br /&gt;
 talla de fallos de página =  ------ = 0.75&lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
= NRU =&lt;br /&gt;
&lt;br /&gt;
En caso de empate, se emplea LRU.&lt;br /&gt;
                                          accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M | 1 | 0 | = | = | 1 | 1 | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   | 1 | 0 | = | = | = | = | 1 | 0 | = | = | = | = | = | = | = | = | 1 | 0 |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   =   |   3   |   =   |   =   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   |   |   | 1 | 0 | = | = | = | = | 1 | 1 | = | = | = | = | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   =   |   =   |   =   |   2   |   =   |   =   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         | R | M |   |   |   |   |   |   |   |   |   |   | 1 | 0 | = | = | = | = | = | = | 1 | 1 | = | = | = | = |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |       |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 7&lt;br /&gt;
 talla de fallos de página =  ------ = 0.583&lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
= NRU con 2º oportunidad =&lt;br /&gt;
&lt;br /&gt;
                                              accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   =   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   2   |   =   |   1   |   =   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |   1   |   =   |   =   |   0   |   =   |   1   |   =   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   3   |   3   |   =   |   3   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |   1   |   =   |   0   |   1   |   =   |   0   |   1   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   4   |   =   |   =   |   2   |   =   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |       |   1   |   0   |   =   |   =   |   1   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |   X   |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 8&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
 Creo que es asi, pero no me lo tomeis a pies juntillas que no estoy muy seguro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por favor que alguien explique bien este criterio, que en cada ejercicio se aplica de una forma diferente.Gracias&lt;br /&gt;
&lt;br /&gt;
Explicación:&lt;br /&gt;
&lt;br /&gt;
El criterio se basa en combinar el NRU (sin bit M) con FIFO. En la cola se van añadiendo las páginas según se cargan con su respectivo valor del bit R. A la hora de sustituir se mira el candidato de la cabecera de la cola. Si su R=1, se le da una segunda oportunidad desplazándolo al final de la cola y poniendo su bit R=0. Si hubiera tenido el R=0, se hubiera tomada esa página como víctima. Eso es lo que sucede cuando llega la página 5. En ese momento la cola es 1 2 3 4 con su bit R=1 en todas las páginas. Se va mirando el candidato si tiene el bit R=0 como no es así, pasa al final de la cola. Llega un momento en el que la página 1 vuelve a la cabecera(en este caso con R=0),por lo que ahora si es sustituida por la página 5.[[Usuario:Jherrera|Jherrera]]&lt;br /&gt;
&lt;br /&gt;
Una Dudilla : la FIFO es por orden de carga o por orden de acceso?¿ Según veo en el ejercicio lo hace por orden de acceso --[[Usuario:DvS 013|DvS 013]]&lt;br /&gt;
--&lt;br /&gt;
Respuesta : La fifo almacena el tiempo que una página lleva cargada en memoria, por lo que es por orden de carga. [[Usuario : JCGarrido|JCGarrido]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, sería asi:&lt;br /&gt;
&lt;br /&gt;
                                              accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   5   |   =   |   5   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   0   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   2   |   =   |   1   |   1   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |   1   |   =   |   =   |   0   |   =   |   1   |   0   |   =   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   3   |   3   |   3   |   2   |   2   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |   1   |   =   |   0   |   1   |   0   |   1   |   0   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   4   |   =   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   R   |       |       |       |       |       |   1   |   0   |   =   |   =   |   =   |   1   |   0   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |    X  |       |   X   |   X   |   X   |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 9&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esta segunda solución creo que no está del todo correcta.&lt;br /&gt;
Cuando llega el cuarto acceso a 1 (donde se produce el sexto fallo de página), el contenido de la cola es el siguiente:&lt;br /&gt;
&lt;br /&gt;
2 (R=0) - 3 (R=1) - 4 (R=0) - 5 (R=1)&lt;br /&gt;
&lt;br /&gt;
Con lo cual, la víctima es el 2, pero sin poner a 0 el resto de los bits R, ya que el primer elemento de la cola tiene el bit R=0 y no hace falta seguir iterando sobre ésta.&lt;br /&gt;
&lt;br /&gt;
= LRU =&lt;br /&gt;
&lt;br /&gt;
                                       accesos a páginas&lt;br /&gt;
                 -------------------------------------------------------------------------&lt;br /&gt;
                 |  1  |  1  |  1  |  2  |  3  |  4  |  5  |  3  |  1  |  2  |  3  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |  1  |  =  |  =  |  =  |  =  |  =  |  5  |  =  |  =  |  =  |  =  |  4  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |     |     |     |  2  |  =  |  =  |  =  |  =  |  1  |  =  |  =  |  =  |&lt;br /&gt;
         --------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |     |     |     |     |  3  |  =  |  =  |  =  |  =  |  =  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |     |     |     |     |     |  4  |  =  |  =  |  =  |  2  |  =  |  =  |&lt;br /&gt;
         ---------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |  X  |     |     |  X  |  X  |  X  |  X  |     |  X  |  X  |     |  X  |&lt;br /&gt;
 página          -------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                                8&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LFU =&lt;br /&gt;
&lt;br /&gt;
                                                   accesos a páginas&lt;br /&gt;
 &lt;br /&gt;
                 |   r   |   r   |   w   |   r   |   r   |   r   |   r   |   w   |   w   |   w   |   r   |   r   |&lt;br /&gt;
                 -------------------------------------------------------------------------------------------------&lt;br /&gt;
                 |   1   |   1   |   1   |   2   |   3   |   4   |   5   |   3   |   1   |   2   |   3   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   1   |   1   |   1   |   1   |   =   |   =   |   =   |   =   |   =   |   1   |   =   |   =   |   1   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |   1   |   2   |   3   |   =   |   =   |   =   |   =   |   =   |   4   |   =   |   =   |   4   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 marcos  |   2   |       |       |       |   2   |   =   |   =   |   5   |   =   |   =   |   =   |   =   |   4   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |   1   |   =   |   =   |   1   |   =   |   =   |   =   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   3   |       |       |       |       |   3   |   =   |   =   |   3   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |       |   1   |   =   |   =   |   2   |   =   |   =   |   3   |   3   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
         |   4   |       |       |       |       |       |   4   |   =   |   =   |   =   |   2   |   =   |   2   |&lt;br /&gt;
         |       |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|&lt;br /&gt;
         |   C   |       |       |       |       |       |   1   |   =   |   =   |   =   |   1   |   =   |   1   |&lt;br /&gt;
         ---------------------------------------------------------------------------------------------------------&lt;br /&gt;
 fallo           |   X   |       |       |   X   |   X   |   X   |   X   |       |       |   X   |       |   X   |&lt;br /&gt;
 página          -------------------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
                                               tiempo -&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                                 7&lt;br /&gt;
 talla de fallos de página =  ------ &lt;br /&gt;
                                12&lt;br /&gt;
&lt;br /&gt;
Observación: al quitar un elemento se resetea su contador&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sustitución por envejecimiento =&lt;br /&gt;
 Periodo de 4, registro R de 3 bits, desempate: FIFO (por orden de carga)&lt;br /&gt;
&lt;br /&gt;
     _________________accesos a página__________________&lt;br /&gt;
     |_1_|_1_|_1_|_2_||_3_|_4_|_5_|_3_||_1_|_2_|_3_|_4_|&lt;br /&gt;
  ======================================================&lt;br /&gt;
   1 | 1 | = | = | = || 1 | = | 5 | = || 5 | = | = | 4 |&lt;br /&gt;
     |100| = | = | = ||010| = |100| = ||010| = | = |100|&lt;br /&gt;
 m---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
 a 2 |   |   |   | 2 || 2 | = | = | = || 1 | = | = | = |&lt;br /&gt;
 r   |   |   |   |100||010| = | = | = ||100| = | = | = |&lt;br /&gt;
 c---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
 o 3 |   |   |   |   || 3 | = | = | = || 3 | 2 | = | = |&lt;br /&gt;
 s   |   |   |   |   ||100| = | = | = ||010|100| = | = |&lt;br /&gt;
  ---|---|---|---|---||---|---|---|---||---|---|---|---|&lt;br /&gt;
   4 |   |   |   |   ||   | 4 | = | = || 4 | = | 3 | = |&lt;br /&gt;
     |   |   |   |   ||   |100| = | = ||010| = |100| = |&lt;br /&gt;
  --------------------------------------------------------&amp;gt; t&lt;br /&gt;
       x           x    x   x   x        x   x   x   x&lt;br /&gt;
 &lt;br /&gt;
                     9&lt;br /&gt;
  tasa fallos pág = ---- &lt;br /&gt;
                     12&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_administraci%C3%B3n_de_ficheros&amp;diff=1281</id>
		<title>Solución de los ejercicios de administración de ficheros</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_administraci%C3%B3n_de_ficheros&amp;diff=1281"/>
				<updated>2011-06-13T17:33:25Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir respuesta ejercicio 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicio 1 ==&lt;br /&gt;
&lt;br /&gt;
A. Los archivos Fichero2.txt e Imagen2.jpg están corruptos, ya que ambos tienen (o envían) a una etiqueta 'BAD'.&lt;br /&gt;
&lt;br /&gt;
B. &lt;br /&gt;
   Entrada a directorio raíz E: 1 acceso&lt;br /&gt;
   Entrada a Imagen.jpg: 1 acceso&lt;br /&gt;
   Llegada a etiqueta EOF: 3 accesos&lt;br /&gt;
   Total: 5 accesos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
¿No serían 4 accesos? A los bloques 2, 3, 5 y 6. Cuando se llega a la etiqueta EOF no hacen falta más accesos, ¿no?--[[Usuario:Alexrdp|Alexrdp]] 17:33 13 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 2 ==&lt;br /&gt;
&lt;br /&gt;
1º: Acceso al bloque del i-nodo.&lt;br /&gt;
2 y 3º: Acceso a los bloques para alcanzar el bloque del doble indirecto.&lt;br /&gt;
4º: Acceso al bloque del doble indirecto.&lt;br /&gt;
&lt;br /&gt;
Total: 4 accesos&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1260</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1260"/>
				<updated>2011-06-10T12:28:26Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir LRU y LFU&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Criterios de reemplazo =&lt;br /&gt;
&lt;br /&gt;
Algoritmos en Python para comprobar los ejercicios de [[Criterios de reemplazo|criterios de reemplazo]] del tema de [[Página Principal#Memoria virtual|memoria virtual]]. El contenido mínimo que debe tener el script es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
from random import choice&lt;br /&gt;
&lt;br /&gt;
class Memoria:&lt;br /&gt;
    def imprime_cabecera(self):&lt;br /&gt;
        s = ' '&lt;br /&gt;
        for i in range(len(self.marcos)):&lt;br /&gt;
            s+= '___%s___ ' % (i+1)&lt;br /&gt;
        return s&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = '|'&lt;br /&gt;
        for programa in self.marcos:&lt;br /&gt;
            if programa:&lt;br /&gt;
                s+= '   %s   ' % programa&lt;br /&gt;
            else:&lt;br /&gt;
                s+= '       '&lt;br /&gt;
            s+= '|'&lt;br /&gt;
        s += '\n' + len(s)*'-'&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
def ejecuta(memoria, secuencia):&lt;br /&gt;
    fallos = 0&lt;br /&gt;
    res = memoria.imprime_cabecera()&lt;br /&gt;
    for programa in secuencia:&lt;br /&gt;
        hay_fallo = memoria.add(programa)&lt;br /&gt;
        if hay_fallo:&lt;br /&gt;
            print(res + '  Fallo de %s!'%programa)&lt;br /&gt;
            fallos += 1&lt;br /&gt;
        else:&lt;br /&gt;
            print(res + '  Acceso a %s'%programa)&lt;br /&gt;
        res = str(memoria)&lt;br /&gt;
    print(res)&lt;br /&gt;
    print('\nTasa de fallos = %s/%s\n\n' % (fallos, len(secuencia)))&lt;br /&gt;
&lt;br /&gt;
secuencia = [2,2,3,1,1,3,4,5,1,1,2,3,4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU (Most Recently Used) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaMRU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.pila = []&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                # Borramos el de lo alto de la pila&lt;br /&gt;
                indice = self.marcos.index(self.pila.pop())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
        # Insertamos el programa en la pila actualizando&lt;br /&gt;
        if programa in self.pila:&lt;br /&gt;
            self.pila.remove(programa)&lt;br /&gt;
        self.pila.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m1 = MemoriaMRU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m1, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaEstocastica(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                # Elegimos uno aleatorio&lt;br /&gt;
                rand = choice(range(len(self.marcos)))&lt;br /&gt;
                self.marcos[rand] = programa&lt;br /&gt;
            else:&lt;br /&gt;
                # Hay un marco vacio&lt;br /&gt;
                self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
        return fallo &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m2 = MemoriaEstocastica(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m2, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio por orden de carga FIFO ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaFIFO(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.cola = deque([])&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                # Borramos el primero de la cola&lt;br /&gt;
                indice = self.marcos.index(self.cola.popleft())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la cola&lt;br /&gt;
        if not programa in self.cola:&lt;br /&gt;
            self.cola.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m3 = MemoriaFIFO(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m3, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio LRU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaLRU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.cola = deque([])&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                # Borramos el primero de la cola&lt;br /&gt;
                indice = self.marcos.index(self.cola.popleft())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la cola actualizando&lt;br /&gt;
        if programa in self.cola:&lt;br /&gt;
            self.cola.remove(programa)&lt;br /&gt;
        self.cola.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m4 = MemoriaLRU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m4, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio LFU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaLFU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
            self.contadores = [0] * i&lt;br /&gt;
            &lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            # Fallo de pagina&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if False in self.marcos:&lt;br /&gt;
                # Seleccionamos un marco vacio&lt;br /&gt;
                indice_false = self.marcos.index(False)&lt;br /&gt;
                self.contadores[indice_false] = 1&lt;br /&gt;
                self.marcos[indice_false] = programa&lt;br /&gt;
            else:&lt;br /&gt;
                # Seleccionamos el de menor contador&lt;br /&gt;
                indice = self.contadores.index(min(self.contadores))&lt;br /&gt;
                self.marcos[indice] = programa&lt;br /&gt;
                self.contadores[indice] = 1&lt;br /&gt;
        else:&lt;br /&gt;
            # Exito, incrementamos contador&lt;br /&gt;
            indice = self.marcos.index(programa)&lt;br /&gt;
            self.contadores[indice] += 1&lt;br /&gt;
        return fallo&lt;br /&gt;
&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = '|'&lt;br /&gt;
        i = 0&lt;br /&gt;
        for programa in self.marcos:&lt;br /&gt;
            if programa:&lt;br /&gt;
                s+= ' %s {%s} ' % (programa, self.contadores[i])&lt;br /&gt;
            else:&lt;br /&gt;
                s+= '       '&lt;br /&gt;
            s += '|'&lt;br /&gt;
            i += 1&lt;br /&gt;
        s += '\n' + len(s)*'-'&lt;br /&gt;
        return s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m5 = MemoriaLFU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m5, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio de Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1231</id>
		<title>Mejoras de tiempos de desplazamiento</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1231"/>
				<updated>2011-06-07T21:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: MejorasTiempoBusqueda trasladada a Mejoras de tiempos de búsqueda&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FCFS (por orden de llegada &amp;quot;FIFO&amp;quot;) ==&lt;br /&gt;
&lt;br /&gt;
Las peticiones se atienden en el mismo orden en que se reciben. Tiene el inconveniente de que se realizan muchos desplazamientos del cabezal, especialmente si se realizan accesos consecutivos a bloques muy alejados entre sí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSTF (Shortest Seek Time First) ==&lt;br /&gt;
&lt;br /&gt;
También conocido como atención por menor tiempo de búsqueda: Ordena todas las solicitudes y selecciona el lote de las ''n'' primeras. Si no se llega a las ''n'' peticiones tras un tiempo se realiza la búsqueda. Su mayor desventaja es que aplaza las peticiones lejanas indefinidamente cuando ''n'' tiende a ifinito (''n'' -&amp;gt; ∞).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== N-SCAN (criterio del ascensor) ==&lt;br /&gt;
&lt;br /&gt;
Dentro de cada lote de la lista de accesos, escogemos aquellos sectores que nos permita ascender y descender en la tabla, dando de esta manera prioridad a los sectores que se encuentren en la parte central de la pista.&lt;br /&gt;
&lt;br /&gt;
      |  &lt;br /&gt;
      |   /\   |   /\&lt;br /&gt;
      |  /  \  |  /  \&lt;br /&gt;
      | /    \ | /    \&lt;br /&gt;
   ___|/______\|/______\__&lt;br /&gt;
      |&lt;br /&gt;
Nota: La gráfica resultante no tiene por qué ser simétrica, dependerá de los sectores a los que accedamos.&lt;br /&gt;
&lt;br /&gt;
Nota2: El número de sectores integrantes de cada lote será el indicado por la N, ejemplo: 3-SCAN, 4-SCAN, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C-SCAN (Circular-Scan) ==&lt;br /&gt;
&lt;br /&gt;
Da preferencia al ascenso o descenso, y se mantiene. Así se elimina el trato favorable a las partes centrales.&lt;br /&gt;
&lt;br /&gt;
      |                                |   &lt;br /&gt;
      |   /|   /|    /|                |\   |\   |\   |&lt;br /&gt;
      |  / |  / |   / |      ó         | \  | \  | \  |&lt;br /&gt;
      | /  | /  |  /  |                |  \ |  \ |  \ |&lt;br /&gt;
   ___|/___|/___|_/___|_            ___|___\|__ \|___\|_ &lt;br /&gt;
      |                                |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algún alma caritativa sube los ejemplos de clase antes del parcial??&lt;br /&gt;
&lt;br /&gt;
No copié los datos, pero eran algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
Orden de acceso: 3, 80, 15, 45, 1, 79, 4 &lt;br /&gt;
&lt;br /&gt;
=== Solución FCFS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x&lt;br /&gt;
      |       / \                 x&lt;br /&gt;
      |      /   \               / \&lt;br /&gt;
     50     /     \             /   \&lt;br /&gt;
      |    /       \   x       /     \&lt;br /&gt;
      |   /         \ / \     /       \&lt;br /&gt;
     20  /           x   \   /         \&lt;br /&gt;
      | x                 \ /           x&lt;br /&gt;
   ___|/___________________x______________&lt;br /&gt;
      |&lt;br /&gt;
      | 3      80    15 45 1      79    4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Solución 3N-SCAN ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x|        |&lt;br /&gt;
      |       / |x       |&lt;br /&gt;
      |      /  | \      |&lt;br /&gt;
     50     /   |  \     |&lt;br /&gt;
      |    /    |   x    |&lt;br /&gt;
      |   /     |    \   |&lt;br /&gt;
     20  x      |     \  | &lt;br /&gt;
      | x       |      \ |x &lt;br /&gt;
   ___|/________|_______x|__&lt;br /&gt;
      |&lt;br /&gt;
      | 3 15  80|79 45  1|4&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=MejorasTiempoBusqueda&amp;diff=1232</id>
		<title>MejorasTiempoBusqueda</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=MejorasTiempoBusqueda&amp;diff=1232"/>
				<updated>2011-06-07T21:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: MejorasTiempoBusqueda trasladada a Mejoras de tiempos de búsqueda&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECCIÓN [[Mejoras de tiempos de búsqueda]]&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1230</id>
		<title>Mejoras de tiempos de desplazamiento</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1230"/>
				<updated>2011-06-07T21:27:05Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Ejemplos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FCFS (por orden de llegada &amp;quot;FIFO&amp;quot;) ==&lt;br /&gt;
&lt;br /&gt;
Las peticiones se atienden en el mismo orden en que se reciben. Tiene el inconveniente de que se realizan muchos desplazamientos del cabezal, especialmente si se realizan accesos consecutivos a bloques muy alejados entre sí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSTF (Shortest Seek Time First) ==&lt;br /&gt;
&lt;br /&gt;
También conocido como atención por menor tiempo de búsqueda: Ordena todas las solicitudes y selecciona el lote de las ''n'' primeras. Si no se llega a las ''n'' peticiones tras un tiempo se realiza la búsqueda. Su mayor desventaja es que aplaza las peticiones lejanas indefinidamente cuando ''n'' tiende a ifinito (''n'' -&amp;gt; ∞).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== N-SCAN (criterio del ascensor) ==&lt;br /&gt;
&lt;br /&gt;
Dentro de cada lote de la lista de accesos, escogemos aquellos sectores que nos permita ascender y descender en la tabla, dando de esta manera prioridad a los sectores que se encuentren en la parte central de la pista.&lt;br /&gt;
&lt;br /&gt;
      |  &lt;br /&gt;
      |   /\   |   /\&lt;br /&gt;
      |  /  \  |  /  \&lt;br /&gt;
      | /    \ | /    \&lt;br /&gt;
   ___|/______\|/______\__&lt;br /&gt;
      |&lt;br /&gt;
Nota: La gráfica resultante no tiene por qué ser simétrica, dependerá de los sectores a los que accedamos.&lt;br /&gt;
&lt;br /&gt;
Nota2: El número de sectores integrantes de cada lote será el indicado por la N, ejemplo: 3-SCAN, 4-SCAN, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C-SCAN (Circular-Scan) ==&lt;br /&gt;
&lt;br /&gt;
Da preferencia al ascenso o descenso, y se mantiene. Así se elimina el trato favorable a las partes centrales.&lt;br /&gt;
&lt;br /&gt;
      |                                |   &lt;br /&gt;
      |   /|   /|    /|                |\   |\   |\   |&lt;br /&gt;
      |  / |  / |   / |      ó         | \  | \  | \  |&lt;br /&gt;
      | /  | /  |  /  |                |  \ |  \ |  \ |&lt;br /&gt;
   ___|/___|/___|_/___|_            ___|___\|__ \|___\|_ &lt;br /&gt;
      |                                |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algún alma caritativa sube los ejemplos de clase antes del parcial??&lt;br /&gt;
&lt;br /&gt;
No copié los datos, pero eran algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
Orden de acceso: 3, 80, 15, 45, 1, 79, 4 &lt;br /&gt;
&lt;br /&gt;
=== Solución FCFS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x&lt;br /&gt;
      |       / \                 x&lt;br /&gt;
      |      /   \               / \&lt;br /&gt;
     50     /     \             /   \&lt;br /&gt;
      |    /       \   x       /     \&lt;br /&gt;
      |   /         \ / \     /       \&lt;br /&gt;
     20  /           x   \   /         \&lt;br /&gt;
      | x                 \ /           x&lt;br /&gt;
   ___|/___________________x______________&lt;br /&gt;
      |&lt;br /&gt;
      | 3      80    15 45 1      79    4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Solución 3N-SCAN ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x|        |&lt;br /&gt;
      |       / |x       |&lt;br /&gt;
      |      /  | \      |&lt;br /&gt;
     50     /   |  \     |&lt;br /&gt;
      |    /    |   x    |&lt;br /&gt;
      |   /     |    \   |&lt;br /&gt;
     20  x      |     \  | &lt;br /&gt;
      | x       |      \ |x &lt;br /&gt;
   ___|/________|_______x|__&lt;br /&gt;
      |&lt;br /&gt;
      | 3 15  80|79 45  1|4&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1228</id>
		<title>Mejoras de tiempos de desplazamiento</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mejoras_de_tiempos_de_desplazamiento&amp;diff=1228"/>
				<updated>2011-06-07T21:25:16Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Completar y ejemplos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FCFS (por orden de llegada &amp;quot;FIFO&amp;quot;) ==&lt;br /&gt;
&lt;br /&gt;
Las peticiones se atienden en el mismo orden en que se reciben. Tiene el inconveniente de que se realizan muchos desplazamientos del cabezal, especialmente si se realizan accesos consecutivos a bloques muy alejados entre sí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSTF (Shortest Seek Time First) ==&lt;br /&gt;
&lt;br /&gt;
También conocido como atención por menor tiempo de búsqueda: Ordena todas las solicitudes y selecciona el lote de las ''n'' primeras. Si no se llega a las ''n'' peticiones tras un tiempo se realiza la búsqueda. Su mayor desventaja es que aplaza las peticiones lejanas indefinidamente cuando ''n'' tiende a ifinito (''n'' -&amp;gt; ∞).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== N-SCAN (criterio del ascensor) ==&lt;br /&gt;
&lt;br /&gt;
Dentro de cada lote de la lista de accesos, escogemos aquellos sectores que nos permita ascender y descender en la tabla, dando de esta manera prioridad a los sectores que se encuentren en la parte central de la pista.&lt;br /&gt;
&lt;br /&gt;
      |  &lt;br /&gt;
      |   /\   |   /\&lt;br /&gt;
      |  /  \  |  /  \&lt;br /&gt;
      | /    \ | /    \&lt;br /&gt;
   ___|/______\|/______\__&lt;br /&gt;
      |&lt;br /&gt;
Nota: La gráfica resultante no tiene por qué ser simétrica, dependerá de los sectores a los que accedamos.&lt;br /&gt;
&lt;br /&gt;
Nota2: El número de sectores integrantes de cada lote será el indicado por la N, ejemplo: 3-SCAN, 4-SCAN, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C-SCAN (Circular-Scan) ==&lt;br /&gt;
&lt;br /&gt;
Da preferencia al ascenso o descenso, y se mantiene. Así se elimina el trato favorable a las partes centrales.&lt;br /&gt;
&lt;br /&gt;
      |                                |   &lt;br /&gt;
      |   /|   /|    /|                |\   |\   |\   |&lt;br /&gt;
      |  / |  / |   / |      ó         | \  | \  | \  |&lt;br /&gt;
      | /  | /  |  /  |                |  \ |  \ |  \ |&lt;br /&gt;
   ___|/___|/___|_/___|_            ___|___\|__ \|___\|_ &lt;br /&gt;
      |                                |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algún alma caritativa sube los ejemplos de clase antes del parcial??&lt;br /&gt;
&lt;br /&gt;
No copié los datos, pero eran algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
Orden de acceso: 3, 80, 15, 45, 1, 79, 4 &lt;br /&gt;
&lt;br /&gt;
=== Solución FCFS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x&lt;br /&gt;
      |       / \                 x&lt;br /&gt;
      |      /   \               / \&lt;br /&gt;
     50     /     \             /   \&lt;br /&gt;
      |    /       \   x       /     \&lt;br /&gt;
      |   /         \ / \     /       \&lt;br /&gt;
     20  /           x   \   /         \&lt;br /&gt;
      | x                 \ /           x&lt;br /&gt;
   ___|/___________________x_____________&lt;br /&gt;
      |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Solución 3N-SCAN ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     80        x|        |&lt;br /&gt;
      |       / |x       |&lt;br /&gt;
      |      /  | \      |&lt;br /&gt;
     50     /   |  \     |&lt;br /&gt;
      |    /    |   x    |&lt;br /&gt;
      |   /     |    \   |&lt;br /&gt;
     20  x      |     \  | &lt;br /&gt;
      | x       |      \ |x &lt;br /&gt;
   ___|/________|_______x|__&lt;br /&gt;
      |         |        |&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1172</id>
		<title>Discusión:Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1172"/>
				<updated>2011-06-07T13:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;¿Los mapas de bits no son de O(n) frente a las listas que son de O(1)? Lo digo porque:&lt;br /&gt;
*Para encontrar un espacio libre en el mapa de bits hay que recorrer toda la lista hasta encontrar una página libre, en cuyo caso hemos recorrido n elementos&lt;br /&gt;
*Para encontrar una página libre en la lista solo hay que hacer un pull sobre el FIFO de páginas libres, por lo tanto orden constante O(1)&lt;br /&gt;
&lt;br /&gt;
Si lo pregunto y no lo corrijo directamente es porque en los apuntes que tomé en clase también tengo que los mapas de bits son de O(1)&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 11:51 7 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ambas son de orden constante: El número de elementos de un mapa de bits es siempre el mismo. Sería O(n) en el caso de que el número de bits fuese variable.&lt;br /&gt;
Por ejemplo, cuando se recorre un array en el que se sabe que el tamaño es 10, ese bucle se considera de orden constante. Por el contrario, en una lista enlazada, como no se sabe de antemano cuantos elementos se van a recorrer, el algoritmo resultante es de orden lineal --[[Usuario:Alexrdp|Alexrdp]] 13:47 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_reemplazo&amp;diff=1095</id>
		<title>Criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_reemplazo&amp;diff=1095"/>
				<updated>2011-06-06T16:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Criterios de reemplazo''' =&lt;br /&gt;
&lt;br /&gt;
La evaluación se hace en base a la ''tasa de fallos de página'', que es el número de fallos de página entre el número de accesos totales a página, con lo que su valor oscila en el rango [0,1].&lt;br /&gt;
El fallo de página se produce cuando se accede a una posición de memoria que esta descargada en disco.&lt;br /&gt;
&lt;br /&gt;
                     nº fallos pág.         &lt;br /&gt;
  tasa fallos pág = -----------------&lt;br /&gt;
                     nº accesos pág.&lt;br /&gt;
&lt;br /&gt;
También hay que tener en cuenta el contexto, si estamos en arranque en frío o en caliente, así como el cumplimiento del principio de localidad espacial y temporal. &lt;br /&gt;
&lt;br /&gt;
* Arranque en frío : se dan muchos fallos de página al principio, ya que los procesos se acaban de lanzar y ninguno esta cargado en memoria principal.&lt;br /&gt;
* Arranque en caliente : se suponen ya cargadas las páginas de los procesos en memoria principal.&lt;br /&gt;
&lt;br /&gt;
==Criterios==&lt;br /&gt;
 Ejemplo: Secuencia de acceso a página : 2,2,3,1,1,3,4,5,1,1,2,3,4&lt;br /&gt;
          Suponiendo arranque en frío   &lt;br /&gt;
                                         ___1____ 2_____3_____4___&lt;br /&gt;
                   memoria principal     |     |     |     |     |&lt;br /&gt;
                    de 4 marcos          |_____|_____|_____|_____|&lt;br /&gt;
&lt;br /&gt;
;1. Criterio de página óptima: Este es un criterio teórico que viene a establecer la cota inferior de la ''tasa de fallos de página''. Consiste en escoger la página que mayor tiempo va a tardar en utilizarse. Este es el mejor caso, pero se necesita conocimiento de futuro, de ahí que sea un criterio teórico.&lt;br /&gt;
*[[sol_1|Solución]]&lt;br /&gt;
;2. Criterio de página pésima: Este también es teórico y viene a establecer la cota superior de la ''tasa de fallos de página'', para ver lo peor que podría comportarse un criterio. Consiste en seleccionar la página que menor tiempo tardará en usarse.&lt;br /&gt;
*[[sol_2|Solución]]&lt;br /&gt;
;3. Criterio MRU('''M'''ost '''R'''ecently '''U'''sed): Se selecciona la última página   a la que se ha accedido. Podría implementarse con una LIFO por orden de acceso.&lt;br /&gt;
*[[sol_3|Solución]]&lt;br /&gt;
;4. Criterio de selección estocástica (aleatoria): Consiste en seleccionar una página al azar.&lt;br /&gt;
;5. Criterio por orden de carga FIFO: Se selecciona la página que más tiempo lleva cargada en memoria principal. Se implementa con una FIFO por orden de carga, es decir, a medida que se cargan en memoria principal las páginas son añadidas a la cola. Un problema es que suele suceder que las páginas más usadas tienden a estar mucho tiempo en memoria principal y este criterio va contra eso.&lt;br /&gt;
&lt;br /&gt;
*[[sol_5|Solución]]&lt;br /&gt;
&lt;br /&gt;
;6.Criterio NRU ('''N'''ot '''R'''ecently '''U'''sed): Ofrece dos bits para cada página:&lt;br /&gt;
* bit R : Se pone a 1 si la página ha sido usada (tanto para lectura como para escritura).&lt;br /&gt;
* bit M : Se pone a 1 si la página es modificada (escritura).&lt;br /&gt;
Para seleccionar la página victima buscamos que cumpla uno de los siguientes criterios de bits si no hay ninguno se utiliza el siguiente:&lt;br /&gt;
&lt;br /&gt;
# R=0, M=0 .            &lt;br /&gt;
# R=0, M=1 .&lt;br /&gt;
# R=1, M=0 .&lt;br /&gt;
# R=1, M=1 .&lt;br /&gt;
&lt;br /&gt;
Claramente deben realizarse periodos de puesta a 0, que no tienen porque ser simultáneamente en R y M.&lt;br /&gt;
&lt;br /&gt;
*[[sol_6|Solución]]&lt;br /&gt;
&lt;br /&gt;
;7.Criterio de 2ª oportunidad: Se trata de la unión del dos criterios, FIFO más NRU sin el bit M. Tampoco se pone R a 0 periódicamente. Consiste en recorrer la cola hasta encontrar una página con R a 0 y los procesos que vaya encontrando con R a 1 se  les pone R a 0 y se les da una segunda oportunidad poniéndolos al final de la cola.&lt;br /&gt;
&lt;br /&gt;
*[[sol_7|Solución]]&lt;br /&gt;
&lt;br /&gt;
;8.Criterio LRU ('''L'''east '''R'''ecently '''U'''sed): Criterio en contraposición al MRU. En MRU elegíamos aquella página que hubiéramos utilizado más recientemente (la primera de la pila de acceso) mientras que en LRU elegimos como página víctima lo contrario: La última página de la pila.&lt;br /&gt;
&lt;br /&gt;
*[[sol_8|Solución]]&lt;br /&gt;
&lt;br /&gt;
;Criterio del reloj: Igual que el de 2º oportunidad (FIFO + NRU sin bit M) pero mantenemos un puntero a la ultima pagina examinada.&lt;br /&gt;
&lt;br /&gt;
*[[sol_reloj|Solución]]&lt;br /&gt;
&lt;br /&gt;
;9.Criterio LFU ('''L'''east '''F'''recuently '''U'''sed): Hay dos variantes: una con bit R, estando este a 1 se incrementa un contador de uso, y otra en la que se aumenta dicho contador de uso por cada acceso.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9|Solución]]&lt;br /&gt;
&lt;br /&gt;
;10.Aproximación discreta LRU: Consiste en LRU + LFU. Se usa el bit R. Se itera periódicamente sobre la lista de páginas si R = 1 entonces aumento el contador y pongo R a 0.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9.2|Solución]]&lt;br /&gt;
&lt;br /&gt;
;11.Sustitución por envejecimiento: Se emplea un registro R de n bits que se va desplazando hacia la derecha periódicamente, de forma que la página victima será la que tenga el menor valor en el registro R (en caso de empate se empleao otro criterio). Por cada acceso se pone a 1 el bit más significativo del registro R. Los LSB se pierden al desplazar.&lt;br /&gt;
&lt;br /&gt;
*[[sol_10|Solución]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el [[Algoritmos de criterios de reemplazo|Portal de la comunidad]] se encuentran implementados algunos de los anteriores criterios como ayuda para ver su funcionamiento.&lt;br /&gt;
Creo que los algoritmos están bien (coinciden con las soluciones), pero si alguien decide probarlos no estaría mal que los revisase por encima. --[[Usuario:Alexrdp|Alexrdp]] 16:24 6 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1094</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1094"/>
				<updated>2011-06-06T16:13:19Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Criterios de reemplazo =&lt;br /&gt;
&lt;br /&gt;
Algoritmos en Python para comprobar los ejercicios de [[Criterios de reemplazo|criterios de reemplazo]] del tema de [[Página Principal#Memoria virtual|memoria virtual]]. El contenido mínimo que debe tener el script es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
from random import choice&lt;br /&gt;
&lt;br /&gt;
class Memoria:&lt;br /&gt;
    def imprime_cabecera(self):&lt;br /&gt;
        s = ' '&lt;br /&gt;
        for i in range(len(self.marcos)):&lt;br /&gt;
            s+= '__%s__ ' % (i+1)&lt;br /&gt;
        print(s)&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = '|'&lt;br /&gt;
        for programa in self.marcos:&lt;br /&gt;
            if programa:&lt;br /&gt;
                s+= '  %s  ' % programa&lt;br /&gt;
            else:&lt;br /&gt;
                s+= '     '&lt;br /&gt;
            s+= '|'&lt;br /&gt;
        s += '\n' + len(s)*'-'&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
def ejecuta(memoria, secuencia):&lt;br /&gt;
    fallos = 0&lt;br /&gt;
    memoria.imprime_cabecera()&lt;br /&gt;
    for programa in secuencia:&lt;br /&gt;
        fallos += memoria.add(programa)&lt;br /&gt;
        print(memoria)&lt;br /&gt;
    print('\nTasa de fallos = %s/%s\n\n' % (fallos, len(secuencia)))&lt;br /&gt;
&lt;br /&gt;
secuencia = [2,2,3,1,1,3,4,5,1,1,2,3,4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU (Most Recently Used) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaMRU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.pila = []&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                indice = self.marcos.index(self.pila.pop())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la pila&lt;br /&gt;
        if programa in self.pila:&lt;br /&gt;
            self.pila.remove(programa)&lt;br /&gt;
        self.pila.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m1 = MemoriaMRU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m1, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaEstocastica(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                rand = choice(range(len(self.marcos)))&lt;br /&gt;
                self.marcos[rand] = programa&lt;br /&gt;
            else: &lt;br /&gt;
                self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
        return fallo &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m2 = MemoriaEstocastica(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m2, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio por orden de carga FIFO ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaFIFO(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.cola = deque([])&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                indice = self.marcos.index(self.cola.popleft())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la cola&lt;br /&gt;
        if not programa in self.cola:&lt;br /&gt;
            self.cola.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m3 = MemoriaFIFO(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m3, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterio de Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1093</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1093"/>
				<updated>2011-06-06T16:07:31Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Criterio por orden de carga FIFO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Algoritmosen Python para comprobar los ejercicios de [[Criterios de reemplazo|criterios de reemplazo]] del tema de '''Memoria Virtual'''. El contenido mínimo que debe tener el script es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
from random import choice&lt;br /&gt;
&lt;br /&gt;
class Memoria:&lt;br /&gt;
    def imprime_cabecera(self):&lt;br /&gt;
        s = ' '&lt;br /&gt;
        for i in range(len(self.marcos)):&lt;br /&gt;
            s+= '__%s__ ' % (i+1)&lt;br /&gt;
        print(s)&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = '|'&lt;br /&gt;
        for programa in self.marcos:&lt;br /&gt;
            if programa:&lt;br /&gt;
                s+= '  %s  ' % programa&lt;br /&gt;
            else:&lt;br /&gt;
                s+= '     '&lt;br /&gt;
            s+= '|'&lt;br /&gt;
        s += '\n' + len(s)*'-'&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
def ejecuta(memoria, secuencia):&lt;br /&gt;
    fallos = 0&lt;br /&gt;
    memoria.imprime_cabecera()&lt;br /&gt;
    for programa in secuencia:&lt;br /&gt;
        fallos += memoria.add(programa)&lt;br /&gt;
        print(memoria)&lt;br /&gt;
    print('\nTasa de fallos = %s/%s\n\n' % (fallos, len(secuencia)))&lt;br /&gt;
&lt;br /&gt;
secuencia = [2,2,3,1,1,3,4,5,1,1,2,3,4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU (Most Recently Used) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaMRU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.pila = []&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                indice = self.marcos.index(self.pila.pop())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la pila&lt;br /&gt;
        if programa in self.pila:&lt;br /&gt;
            self.pila.remove(programa)&lt;br /&gt;
        self.pila.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m1 = MemoriaMRU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m1, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaEstocastica(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                rand = choice(range(len(self.marcos)))&lt;br /&gt;
                self.marcos[rand] = programa&lt;br /&gt;
            else: &lt;br /&gt;
                self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
        return fallo &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m2 = MemoriaEstocastica(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m2, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criterio por orden de carga FIFO ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaFIFO(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.cola = deque([])&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                indice = self.marcos.index(self.cola.popleft())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la cola&lt;br /&gt;
        if not programa in self.cola:&lt;br /&gt;
            self.cola.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m3 = MemoriaFIFO(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m3, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Criterio de Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1092</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1092"/>
				<updated>2011-06-06T16:01:04Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir algoritmos MRU y estocástico&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Algoritmosen Python para comprobar los ejercicios de [[Criterios de reemplazo|criterios de reemplazo]] del tema de '''Memoria Virtual'''. El contenido mínimo que debe tener el script es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
from random import choice&lt;br /&gt;
&lt;br /&gt;
class Memoria:&lt;br /&gt;
    def imprime_cabecera(self):&lt;br /&gt;
        s = ' '&lt;br /&gt;
        for i in range(len(self.marcos)):&lt;br /&gt;
            s+= '__%s__ ' % (i+1)&lt;br /&gt;
        print(s)&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = '|'&lt;br /&gt;
        for programa in self.marcos:&lt;br /&gt;
            if programa:&lt;br /&gt;
                s+= '  %s  ' % programa&lt;br /&gt;
            else:&lt;br /&gt;
                s+= '     '&lt;br /&gt;
            s+= '|'&lt;br /&gt;
        s += '\n' + len(s)*'-'&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
def ejecuta(memoria, secuencia):&lt;br /&gt;
    fallos = 0&lt;br /&gt;
    memoria.imprime_cabecera()&lt;br /&gt;
    for programa in secuencia:&lt;br /&gt;
        fallos += memoria.add(programa)&lt;br /&gt;
        print(memoria)&lt;br /&gt;
    print('\nTasa de fallos = %s/%s\n\n' % (fallos, len(secuencia)))&lt;br /&gt;
&lt;br /&gt;
secuencia = [2,2,3,1,1,3,4,5,1,1,2,3,4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU (Most Recently Used) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaMRU(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.pila = []&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                indice = self.marcos.index(self.pila.pop())&lt;br /&gt;
                self.marcos[indice] = False&lt;br /&gt;
                &lt;br /&gt;
            self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
&lt;br /&gt;
        # Insertamos el programa en la pila&lt;br /&gt;
        if programa in self.pila:&lt;br /&gt;
            self.pila.remove(programa)&lt;br /&gt;
        self.pila.append(programa)&lt;br /&gt;
        &lt;br /&gt;
        return fallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m1 = MemoriaMRU(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m1, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class MemoriaEstocastica(Memoria):&lt;br /&gt;
    def __init__(self, i):&lt;br /&gt;
            self.marcos = [False] * i&lt;br /&gt;
    def add(self, programa):&lt;br /&gt;
        fallo = 0&lt;br /&gt;
        # Fallo de pagina&lt;br /&gt;
        if not programa in self.marcos:&lt;br /&gt;
            fallo = 1&lt;br /&gt;
            if not False in self.marcos:&lt;br /&gt;
                rand = choice(range(len(self.marcos)))&lt;br /&gt;
                self.marcos[rand] = programa&lt;br /&gt;
            else: &lt;br /&gt;
                self.marcos[self.marcos.index(False)] = programa&lt;br /&gt;
        return fallo &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código de prueba:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m2 = MemoriaEstocastica(4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ejecuta(m2, secuencia)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Criterio de Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_3&amp;diff=1086</id>
		<title>Sol 3</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_3&amp;diff=1086"/>
				<updated>2011-06-06T15:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Solución:&lt;br /&gt;
6/13 = 0'4615&lt;br /&gt;
--[[Usuario:Jorcalmar|Jorcalmar]] 16:52 2 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La lista de paginas a la que se acceden son las siguientes : '''2--2--3--1--1--3--4--5--1--1--2--3--4'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                               ___1____ 2_____3_____4___&lt;br /&gt;
                  1º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |     |     |     | Nª de fallos: 1&lt;br /&gt;
                   Pagina 2    |_____|_____|_____|_____|&lt;br /&gt;
                  2º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |     |     |     | Nª de fallos: 1&lt;br /&gt;
                   Pagina 2    |_____|_____|_____|_____|&lt;br /&gt;
                  3º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |     |     | Nª de fallos: 2&lt;br /&gt;
                   Pagina 3    |_____|_____|_____|_____|&lt;br /&gt;
                  4º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3&lt;br /&gt;
                   Pagina 1    |_____|_____|_____|_____|&lt;br /&gt;
                  5º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3&lt;br /&gt;
                   Pagina 1    |_____|_____|_____|_____|&lt;br /&gt;
                  6º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3&lt;br /&gt;
                   Pagina 3    |_____|_____|_____|_____|&lt;br /&gt;
                  7º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  4  | Nª de fallos: 4&lt;br /&gt;
                   Pagina 4    |_____|_____|_____|_____|&lt;br /&gt;
                  8º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  5  | Nª de fallos: 5&lt;br /&gt;
                   Pagina 5    |_____|_____|_____|_____|&lt;br /&gt;
                  9º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  5  | Nª de fallos: 5&lt;br /&gt;
                   Pagina 1    |_____|_____|_____|_____|&lt;br /&gt;
                 10º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  5  | Nª de fallos: 5&lt;br /&gt;
                   Pagina 1    |_____|_____|_____|_____|&lt;br /&gt;
                 11º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  5  | Nª de fallos: 5&lt;br /&gt;
                   Pagina 2    |_____|_____|_____|_____|&lt;br /&gt;
                 12º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  3  |  1  |  5  | Nª de fallos: 5&lt;br /&gt;
                   Pagina 3    |_____|_____|_____|_____|&lt;br /&gt;
                 13º Acceso    |     |     |     |     |&lt;br /&gt;
                  Acceso a:    |  2  |  4  |  1  |  5  | Nª de fallos: 6&lt;br /&gt;
                   Pagina 4    |_____|_____|_____|_____|&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos = 6/13 = 0'4615&lt;br /&gt;
--[[Usuario:Fcoramlop|Fcoramlop]] 21:38 4 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Usuario: lcarlosp (jejeje, que no se como se pone el enlace)&lt;br /&gt;
&lt;br /&gt;
Yo diría que son 6 fallos -- [[Usuario:PCamino|pablo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cuando en un criterio de reemplazo se usa una pila (MRU) o una cola (orden de carga), si se vuelve a acceder a una página que ya está en la lista, ¿se borra la página y se vuelve a insertar, o se deja como está?.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para la secuencia: 1,2,3,1,4; la cola del criterio FIFO sería así?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acceso a 1 -&amp;gt; Cola = [1]&lt;br /&gt;
Acceso a 2 -&amp;gt; Cola = [1,2]&lt;br /&gt;
Acceso a 3 -&amp;gt; Cola = [1,2,3]&lt;br /&gt;
Acceso a 1 -&amp;gt; Cola = [1,2,3]&lt;br /&gt;
Acceso a 4 -&amp;gt; Cola = [1,2,3,4]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--[[Usuario:Alexrdp|Alexrdp]] 15:50 6 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Criterios_de_reemplazo|Volver]]&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1074</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=1074"/>
				<updated>2011-06-06T14:25:51Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Criterio de Sustitución por envejecimiento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scripts en Python para comprobar los ejercicios de criterios de reemplazo&lt;br /&gt;
&lt;br /&gt;
== Criterio de Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=952</id>
		<title>Buffer Overflow y bit NX</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=952"/>
				<updated>2011-06-02T20:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Solución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Buffer Overflows =&lt;br /&gt;
&lt;br /&gt;
== Definición y causa ==&lt;br /&gt;
Los desbordamientos de búfer es una vulnerabilidad presente cuando se escribe en un búfer sin validar el tamaño del contenido.&lt;br /&gt;
Esto puede hacer que si se introduce un dato lo suficientemente grande, el búfer se desborde, dando como resultado que se sobreescriba con código del atacante.&lt;br /&gt;
Lo cual constituye un gran problema de seguridad cuando el programa se ejecuta con privilegios de superusuario.&lt;br /&gt;
&lt;br /&gt;
Este error de programación de encuentra comúnmente en programas que gestionan su propio uso de la memoria (P. ej, C/C++).&lt;br /&gt;
Según la OWASP (Proyecto de código abierto sobre seguridad web) es una de las vulnerabilidades más comunes, con un riesgo de explotación muy alto y variado, aún siendo una de las más antiguas y conocidas.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	strcpy(buffer, argv[1]); // Cadenas de 5 o más caracteres causarán desbordamiento&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Otro tipo de buffer overflow: Stack buffer overflow ==&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo modificando el código anterior ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mi_funcion(char *param)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	strcpy(buffer, param);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	mi_función(argv[1]);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcionamiento del exploit ===&lt;br /&gt;
Contenido de la pila:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales mi_funcion	(char buffer[] y char *param)&lt;br /&gt;
	|_______| &amp;lt;- dirección de retorno	(dir. siguiente instrucción después de mi_funcion)&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si se desborda el contenido de buffer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|xxxxxxx|&lt;br /&gt;
	|xxxxxxx| &amp;lt;- vbles. locales mi_funcion&lt;br /&gt;
	|xxxxxxx| &amp;lt;- dirección de retorno&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;	&lt;br /&gt;
x = Código introducido por el atacante&lt;br /&gt;
&lt;br /&gt;
Con lo cual, se han sobreescrito las variables de mi_funcion y la dirección de retorno, que es a la que se hará un jump después de ejecutar el código de mi_funcion.&lt;br /&gt;
Es decir, estamos permitiendo al atacante saltar a una dirección arbitraria y ejecutar el código que contenga. &lt;br /&gt;
	&lt;br /&gt;
No confundir esta vulnerabilidad con un desbordamiento de pila o stack overflow, esto último ocurre cuando la pila de &lt;br /&gt;
invocaciones se desborda por errores como recursión infinita o parámetros de retorno de demasiado tamaño.&lt;br /&gt;
&lt;br /&gt;
== Solución ==&lt;br /&gt;
Una máxima en seguridad informática es validar siempre los datos introducidos por el usuario. En este caso, bastaría con sustituir la línea de strcpy por:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	strncpy(buffer, argv[1], sizeof(buffer));&lt;br /&gt;
	buffer[sizeof(buffer) - 1] = '\0'; // Caracter nulo&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De esta forma, nos aseguramos que el contenido del buffer no se desborde al copiar argv[1] en él.&lt;br /&gt;
&lt;br /&gt;
= Bit NX =&lt;br /&gt;
La tecnología NX (No eXecutable) se introdujo para establecer determinadas zonas de memoria como no ejecutables, y así prevenir los ataques de tipo buffer overflow.&lt;br /&gt;
Este bit es el último de cada entrada de la tabla de páginas, y si se encuentra puesto a 1 significa que el contenido de dicha página se considerará como datos y por tanto no podrá ser ejecutado.&lt;br /&gt;
En el caso de arquitecturas como IA32, al basar inicialmente la protección de memoria en el mecanismo de segmentación, hizo que sus servidores sufrieran muchos ataques de buffer overflow &lt;br /&gt;
hasta que se dió mayor control al mecanismo de paginación incluyendo esta tecnología (En el caso de Intel, llamada XD bit-Executing Disabled).  &lt;br /&gt;
&lt;br /&gt;
El núcleo de Linux soporta esta tecnología para arquitecturas IA-32 e IA-64. Si el hardware no proporciona la tecnología NX, el kernel para la arquitectura de 32 bits permite emularla por software.&lt;br /&gt;
&lt;br /&gt;
= Fuentes =&lt;br /&gt;
&lt;br /&gt;
* Securing Ajax Applications (O'Reilly)&lt;br /&gt;
* http://en.wikipedia.org/wiki/Buffer_overflow&lt;br /&gt;
* https://www.owasp.org/index.php/Buffer_Overflow&lt;br /&gt;
* http://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
* Apartados 2.11 y 4.4 de los apuntes de teoría de TPBN&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=951</id>
		<title>Buffer Overflow y bit NX</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=951"/>
				<updated>2011-06-02T20:34:21Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Artículo propuesto en clase&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Buffer Overflows =&lt;br /&gt;
&lt;br /&gt;
== Definición y causa ==&lt;br /&gt;
Los desbordamientos de búfer es una vulnerabilidad presente cuando se escribe en un búfer sin validar el tamaño del contenido.&lt;br /&gt;
Esto puede hacer que si se introduce un dato lo suficientemente grande, el búfer se desborde, dando como resultado que se sobreescriba con código del atacante.&lt;br /&gt;
Lo cual constituye un gran problema de seguridad cuando el programa se ejecuta con privilegios de superusuario.&lt;br /&gt;
&lt;br /&gt;
Este error de programación de encuentra comúnmente en programas que gestionan su propio uso de la memoria (P. ej, C/C++).&lt;br /&gt;
Según la OWASP (Proyecto de código abierto sobre seguridad web) es una de las vulnerabilidades más comunes, con un riesgo de explotación muy alto y variado, aún siendo una de las más antiguas y conocidas.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	strcpy(buffer, argv[1]); // Cadenas de 5 o más caracteres causarán desbordamiento&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Otro tipo de buffer overflow: Stack buffer overflow ==&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo modificando el código anterior ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mi_funcion(char *param)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	strcpy(buffer, param);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	mi_función(argv[1]);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcionamiento del exploit ===&lt;br /&gt;
Contenido de la pila:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales mi_funcion	(char buffer[] y char *param)&lt;br /&gt;
	|_______| &amp;lt;- dirección de retorno	(dir. siguiente instrucción después de mi_funcion)&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si se desborda el contenido de buffer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|xxxxxxx|&lt;br /&gt;
	|xxxxxxx| &amp;lt;- vbles. locales mi_funcion&lt;br /&gt;
	|xxxxxxx| &amp;lt;- dirección de retorno&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;	&lt;br /&gt;
x = Código introducido por el atacante&lt;br /&gt;
&lt;br /&gt;
Con lo cual, se han sobreescrito las variables de mi_funcion y la dirección de retorno, que es a la que se hará un jump después de ejecutar el código de mi_funcion.&lt;br /&gt;
Es decir, estamos permitiendo al atacante saltar a una dirección arbitraria y ejecutar el código que contenga. &lt;br /&gt;
	&lt;br /&gt;
No confundir esta vulnerabilidad con un desbordamiento de pila o stack overflow, esto último ocurre cuando la pila de &lt;br /&gt;
invocaciones se desborda por errores como recursión infinita o parámetros de retorno de demasiado tamaño.&lt;br /&gt;
&lt;br /&gt;
== Solución ==&lt;br /&gt;
Una máxima en seguridad informática es validar siempre los datos introducidos por el usuario. En este caso, bastaría con sustituir la línea de strcpy por:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	strcpy(buffer, argv[1], sizeof(buffer));&lt;br /&gt;
	buffer[sizeof(buffer) - 1] = '\0'; // Caracter nulo&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De esta forma, nos aseguramos que el contenido del buffer no se desborde al copiar argv[1] en él.&lt;br /&gt;
&lt;br /&gt;
= Bit NX =&lt;br /&gt;
La tecnología NX (No eXecutable) se introdujo para establecer determinadas zonas de memoria como no ejecutables, y así prevenir los ataques de tipo buffer overflow.&lt;br /&gt;
Este bit es el último de cada entrada de la tabla de páginas, y si se encuentra puesto a 1 significa que el contenido de dicha página se considerará como datos y por tanto no podrá ser ejecutado.&lt;br /&gt;
En el caso de arquitecturas como IA32, al basar inicialmente la protección de memoria en el mecanismo de segmentación, hizo que sus servidores sufrieran muchos ataques de buffer overflow &lt;br /&gt;
hasta que se dió mayor control al mecanismo de paginación incluyendo esta tecnología (En el caso de Intel, llamada XD bit-Executing Disabled).  &lt;br /&gt;
&lt;br /&gt;
El núcleo de Linux soporta esta tecnología para arquitecturas IA-32 e IA-64. Si el hardware no proporciona la tecnología NX, el kernel para la arquitectura de 32 bits permite emularla por software.&lt;br /&gt;
&lt;br /&gt;
= Fuentes =&lt;br /&gt;
&lt;br /&gt;
* Securing Ajax Applications (O'Reilly)&lt;br /&gt;
* http://en.wikipedia.org/wiki/Buffer_overflow&lt;br /&gt;
* https://www.owasp.org/index.php/Buffer_Overflow&lt;br /&gt;
* http://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
* Apartados 2.11 y 4.4 de los apuntes de teoría de TPBN&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Wiki_de_Sistemas_Operativos:Portal_de_la_comunidad&amp;diff=950</id>
		<title>Wiki de Sistemas Operativos:Portal de la comunidad</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Wiki_de_Sistemas_Operativos:Portal_de_la_comunidad&amp;diff=950"/>
				<updated>2011-06-02T20:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se añadirá contenido relacionado con la asignatura, que no se encuentre dentro del temario.&lt;br /&gt;
&lt;br /&gt;
== Material complementario ==&lt;br /&gt;
&lt;br /&gt;
* [[Algoritmos de criterios de reemplazo]]&lt;br /&gt;
* [[Buffer Overflow y bit NX|Seguridad informática: Buffer Overflow y bit NX]]&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=949</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=949"/>
				<updated>2011-06-02T20:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Criterio de Aproximacion discreta LRU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scripts en Python para comprobar los ejercicios de criterios de reemplazo&lt;br /&gt;
&lt;br /&gt;
== Criterio de Aproximacion discreta LRU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Wiki_de_Sistemas_Operativos:Portal_de_la_comunidad&amp;diff=948</id>
		<title>Wiki de Sistemas Operativos:Portal de la comunidad</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Wiki_de_Sistemas_Operativos:Portal_de_la_comunidad&amp;diff=948"/>
				<updated>2011-06-02T20:26:22Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Página creada con 'En esta página se añadirá contenido relacionado con la asignatura, que no se encuentre dentro del temario.  == Material complementario ==  * [[Algoritmos de criterios de reem…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se añadirá contenido relacionado con la asignatura, que no se encuentre dentro del temario.&lt;br /&gt;
&lt;br /&gt;
== Material complementario ==&lt;br /&gt;
&lt;br /&gt;
* [[Algoritmos de criterios de reemplazo]]&lt;br /&gt;
* [[Stack Overflow y bit NX|Seguridad informática: Stack Overflow y bit NX]]&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=947</id>
		<title>Algoritmos de criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmos_de_criterios_de_reemplazo&amp;diff=947"/>
				<updated>2011-06-02T20:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Algoritmo aproximacion discreta LRU&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Criterio de Aproximacion discreta LRU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Marco:&lt;br /&gt;
    def __init__(self, tam):&lt;br /&gt;
        self.programa = False&lt;br /&gt;
        self.tam = tam&lt;br /&gt;
        self.registro = [0] * tam&lt;br /&gt;
    def inserta(self, programa):&lt;br /&gt;
        self.programa = programa&lt;br /&gt;
        self.registro = [1] + ([0] * (self.tam-1))&lt;br /&gt;
    def actualiza(self):&lt;br /&gt;
        self.registro[0] = 1&lt;br /&gt;
    def desplaza(self):&lt;br /&gt;
        self.registro = [0] + self.registro[:-1]&lt;br /&gt;
    def __gt__(self,marco):&lt;br /&gt;
        for i in range(self.tam):&lt;br /&gt;
            if self.registro[i] &amp;gt; marco.registro[i]:&lt;br /&gt;
                return True&lt;br /&gt;
        return False&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        if self.programa:&lt;br /&gt;
            return '%s %s' %(self.programa, self.registro)&lt;br /&gt;
        else:&lt;br /&gt;
            return ' ' * (self.tam*3 + 2)&lt;br /&gt;
&lt;br /&gt;
class Tabla:&lt;br /&gt;
    def __init__(self, cantidad, tam_registros):&lt;br /&gt;
        self.lista = []&lt;br /&gt;
        for i in range(cantidad):&lt;br /&gt;
            self.lista.append(Marco(tam_registros))&lt;br /&gt;
            &lt;br /&gt;
    def addPrograma(self, programa):&lt;br /&gt;
        esta = False&lt;br /&gt;
        indice = 0&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            if programa == marco.programa:&lt;br /&gt;
                esta = True&lt;br /&gt;
                break&lt;br /&gt;
            indice += 1&lt;br /&gt;
        if esta:&lt;br /&gt;
            self.lista[indice].actualiza()&lt;br /&gt;
            return 0&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Fallo!&amp;quot;)&lt;br /&gt;
            indice = self.lista.index(self.minimo())&lt;br /&gt;
            self.lista[indice].inserta(programa)&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
    def minimo(self):&lt;br /&gt;
        res = self.lista[0]&lt;br /&gt;
        for marco in self.lista[1:]:&lt;br /&gt;
            if res &amp;gt; marco:&lt;br /&gt;
                res = marco&lt;br /&gt;
        return res&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        s = ''&lt;br /&gt;
        for marco in self.lista:&lt;br /&gt;
            s += '| %s ' % marco&lt;br /&gt;
        s += '|\n' + '-'*(len(s)+1)&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
class AproximacionDiscretaLRU:&lt;br /&gt;
    def __init__(self, cantidad, periodo, tam_registros = 3):&lt;br /&gt;
        self.tabla = Tabla(cantidad, tam_registros)&lt;br /&gt;
        self.periodo = periodo&lt;br /&gt;
&lt;br /&gt;
    def ejecuta(self, lista_programas):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fallos = 0&lt;br /&gt;
        for programa in lista_programas:&lt;br /&gt;
            if i%self.periodo == 0:&lt;br /&gt;
                for marco in self.tabla.lista:&lt;br /&gt;
                    marco.desplaza()&lt;br /&gt;
            i+=1&lt;br /&gt;
            fallos += self.tabla.addPrograma(programa)&lt;br /&gt;
            print(self.tabla)&lt;br /&gt;
        print(&amp;quot;\nTasa de fallos: %s/%s&amp;quot; % (fallos, len(lista_programas)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si ejecutamos el ejemplo visto en clase mostraría:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg = AproximacionDiscretaLRU(4, 4)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; alg.ejecuta([2,2,3,1,1,3,4,5,1,1,2,3,4])&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 0] |             |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] |             |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [1, 0, 0] | 3 [1, 0, 0] | 1 [1, 0, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] |             |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [1, 1, 0] | 1 [1, 1, 0] | 5 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [0, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [0, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| 2 [1, 0, 1] | 3 [1, 1, 1] | 1 [1, 1, 1] | 5 [0, 1, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
Fallo!&lt;br /&gt;
| 2 [0, 1, 0] | 3 [0, 1, 1] | 1 [0, 1, 1] | 4 [1, 0, 0] |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tasa de fallos: 6/13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La diferencia con respecto a la solución de clase es que la resolución en caso de empate es elegir el marco con índice menor.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=869</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=869"/>
				<updated>2011-05-16T15:57:35Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Definición */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Definición ==&lt;br /&gt;
&lt;br /&gt;
En este tipo de sistemas, las particiones para cada proceso se van creando a medida que son asignadas al procesador. Como ventaja principal tiene que evitamos el desperdicio de memoria dentro de cada bloque ya que cada uno está hecho a medida para el proceso que contiene. Por el contrario, una vez que un proceso ha concluido, su partición se queda en desuso y sería necesario aplicar algoritmos de desfragmentación de memoria para poder unificar todas las partes que han quedado libres y así reciclar las particiones que quedaron huérfanas. Otra forma de obtener particiones de mayor tamaño es unificar dos o más huecos adyacentes en uno sólo.&lt;br /&gt;
&lt;br /&gt;
''Ejemplo:''&lt;br /&gt;
  _                                 _&lt;br /&gt;
 |_| P1 = 3KB                      |_| P1 = 3KB   &lt;br /&gt;
 |_| P2 = 1KB                      |_| P2 = 1KB&lt;br /&gt;
 |_| P3 = 6KB    =&amp;gt; Finaliza P3 =&amp;gt; |_| Libre = 6KB&lt;br /&gt;
 | |                               | |&lt;br /&gt;
 |_| P4 = 31KB                     |_| P4 = 31KB&lt;br /&gt;
 | |                               | |&lt;br /&gt;
 |_| Libre = 21KB                  |_| Libre = 21KB&lt;br /&gt;
&lt;br /&gt;
Si un nuevo proceso P5 requiriese 24KB de memoria, no podrían serle asignados, ya que los huecos no son contiguos y para disponer de los 27KB libres en total habría que realizar previamente una desfragmentación.&lt;br /&gt;
&lt;br /&gt;
== Elementos de administración ==&lt;br /&gt;
&lt;br /&gt;
* '''Mapas de bits''': Dividiendo la memoria en bloques, se utiliza un bit para representar si dicho bloque está libre o asignado.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se almacena en una lista el tamaño de los huecos y las posiciones de memoria entre las que se encuentran comprendidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
* '''Primer ajuste''': Consiste en asignar el primer hueco disponible que tenga un espacio suficiente para almacenar el programa. Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Siguiente ajuste''': Se continúa a partir de la posición de la última asignación realizada. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria.&lt;br /&gt;
&lt;br /&gt;
* '''Mejor ajuste''': Consiste en asignarle al proceso el hueco con menor ajuste interno. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'')&lt;br /&gt;
&lt;br /&gt;
* '''Peor ajuste''': Al contrario que el criterio anterior, se asigna a cada proceso el hueco con mayor ajuste interno. Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste.&lt;br /&gt;
&lt;br /&gt;
* '''Ajuste rápido''': Mediante listas de control, se agrupan los huecos disponibles según su tamaño (0 &amp;lt; t &amp;lt; 10, 10 &amp;lt; t &amp;lt; 20, etc.). De esta manera, cuando se necesite un hueco, se seleccionarán los del grupo del tamaño correspondiente. En el caso de que haya varios huecos disponibles, se seleccionará uno en base a cualquiera de los criterios anteriores.&lt;br /&gt;
&lt;br /&gt;
* '''Método de los compañeros''': Es una variante del ajuste rápido, en el que los huecos se dividen en potencias de 2: 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;. No es un método usado en la práctica, ya que al realizar redondeos a potencias de 2, se produce un elevado desperdicio interno&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=868</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=868"/>
				<updated>2011-05-16T15:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Definición ==&lt;br /&gt;
&lt;br /&gt;
En este tipo de sistemas, las particiones para cada proceso se van creando a medida que son asignadas al procesador. Como ventaja principal tiene que evitamos el desperdicio de memoria dentro de cada bloque ya que cada uno está hecho a medida para el proceso que contiene. Por el contrario, una vez que un proceso ha concluido, su partición se queda en desuso y sería necesario aplicar algoritmos de desfragmentación de memoria para poder unificar todas las partes que han quedado libres y así reciclar las particiones que quedaron huérfanas.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
  _                                 _&lt;br /&gt;
 |_| P1 = 3KB                      |_| P1 = 3KB   &lt;br /&gt;
 |_| P2 = 1KB                      |_| P2 = 1KB&lt;br /&gt;
 |_| P3 = 6KB    =&amp;gt; Finaliza P3 =&amp;gt; |_| Libre = 6KB&lt;br /&gt;
 | |                               | |&lt;br /&gt;
 |_| P4 = 31KB                     |_| P4 = 31KB&lt;br /&gt;
 | |                               | |&lt;br /&gt;
 |_| Libre = 21KB                  |_| Libre = 21KB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Elementos de administración ==&lt;br /&gt;
&lt;br /&gt;
* '''Mapas de bits''': Dividiendo la memoria en bloques, se utiliza un bit para representar si dicho bloque está libre o asignado.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se almacena en una lista el tamaño de los huecos y las posiciones de memoria entre las que se encuentran comprendidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
* '''Primer ajuste''': Consiste en asignar el primer hueco disponible que tenga un espacio suficiente para almacenar el programa. Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Siguiente ajuste''': Se continúa a partir de la posición de la última asignación realizada. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria.&lt;br /&gt;
&lt;br /&gt;
* '''Mejor ajuste''': Consiste en asignarle al proceso el hueco con menor ajuste interno. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'')&lt;br /&gt;
&lt;br /&gt;
* '''Peor ajuste''': Al contrario que el criterio anterior, se asigna a cada proceso el hueco con mayor ajuste interno. Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste.&lt;br /&gt;
&lt;br /&gt;
* '''Ajuste rápido''': Mediante listas de control, se agrupan los huecos disponibles según su tamaño (0 &amp;lt; t &amp;lt; 10, 10 &amp;lt; t &amp;lt; 20, etc.). De esta manera, cuando se necesite un hueco, se seleccionarán los del grupo del tamaño correspondiente. En el caso de que haya varios huecos disponibles, se seleccionará uno en base a cualquiera de los criterios anteriores.&lt;br /&gt;
&lt;br /&gt;
* '''Método de los compañeros''': Es una variante del ajuste rápido, en el que los huecos se dividen en potencias de 2: 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;. No es un método usado en la práctica, ya que al realizar redondeos a potencias de 2, se produce un elevado desperdicio interno&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=867</id>
		<title>SO multiprogramables con particiones fijas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=867"/>
				<updated>2011-05-16T15:40:20Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La memoria se encuentra dividida en particiones, en cada una habrá un proceso.&lt;br /&gt;
&lt;br /&gt;
=Estrategias=&lt;br /&gt;
*Cancelación: &amp;quot;no hay memoria, prueba luego&amp;quot;&lt;br /&gt;
*Espera: añadir a la cola&lt;br /&gt;
&lt;br /&gt;
=Limitaciones=&lt;br /&gt;
*Procesos partición máxima -&amp;gt; No se ejecuta&lt;br /&gt;
*Desperdicio de memoria. Por ejemplo, si los procesos son muy pequeños y las particiones grandes&lt;br /&gt;
&lt;br /&gt;
=Criterios de asignación=&lt;br /&gt;
Se lanza un proceso, y hay que elegir a que partición va (estrategia de espera). Puede haber una cola por partición, o una sola para todas las particiones.&lt;br /&gt;
&lt;br /&gt;
 Ej: tenemos los siguientes procesos: m(P1) = 6KB, m(P2) = 1KB, m(P3) = 3KB, m(P4) = 31KB, m(P5) = 30KB;&lt;br /&gt;
     y una memoria de 64 KB divididos en 4 huecos como sigue:&lt;br /&gt;
  _&lt;br /&gt;
 |_| H1 = 8KB   &lt;br /&gt;
 |_| H2 = 8KB &lt;br /&gt;
 | |&lt;br /&gt;
 |_| H3 = 16KB&lt;br /&gt;
 | |&lt;br /&gt;
 | |&lt;br /&gt;
 | | H4 = 32KB   &lt;br /&gt;
 |_|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste estático''': se adjudica cada proceso a la menor partición que quepa. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución mejor ajuste estático|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Primer ajuste''': cuando una partición queda libre, se asigna el primer proceso que quepa en ella. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución primer ajuste|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico''': cuando una partición queda libre, se asigna el mayor proceso que queda en ella. Complejidad: O(nlog(p))&lt;br /&gt;
&lt;br /&gt;
[[solución ajuste dinámico|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor que quepa con aplazamiento limitado''': Cuando queda una partición libre, se selecciona el mayor proceso que quepa en ella, pero se cuenta el nº de veces que un proceso se aplaza. Si se superan esas '''n''' veces (umbral), se le da paso.&lt;br /&gt;
&lt;br /&gt;
*'''Subparticiones'''&lt;br /&gt;
&lt;br /&gt;
= Métodos de colocación en memoria =&lt;br /&gt;
&lt;br /&gt;
*'''Montaje absoluto''': Se asigna una dirección de memoria constante, siendo por tanto este método muy restrictivo. Se utiliza para la carga del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
* '''Carga con reubicación''': Al realizar la carga, se le aplica a las direcciones lógicas del programa un ''offset'' o desplazamiento asociada. Este desplazamiento es establecido por el programador antes de que se ejecute el programa.&lt;br /&gt;
&lt;br /&gt;
* '''Reubicación dinámica''': A diferencia de la carga con reubicación, el desplazamiento se asigna en tiempo de ejecución.&lt;br /&gt;
** '''Reubicación dinámica parcial''': Es una variante del anterior, en la que existe también un registro límite.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=866</id>
		<title>SO multiprogramables con particiones fijas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=866"/>
				<updated>2011-05-16T15:30:01Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Criterios de asignación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La memoria se encuentra dividida en particiones, en cada una habrá un proceso.&lt;br /&gt;
&lt;br /&gt;
=Estrategias=&lt;br /&gt;
*Cancelación: &amp;quot;no hay memoria, prueba luego&amp;quot;&lt;br /&gt;
*Espera: añadir a la cola&lt;br /&gt;
&lt;br /&gt;
=Limitaciones=&lt;br /&gt;
*Procesos partición máxima -&amp;gt; No se ejecuta&lt;br /&gt;
*Desperdicio de memoria. Por ejemplo, si los procesos son muy pequeños y las particiones grandes&lt;br /&gt;
&lt;br /&gt;
=Criterios de asignación=&lt;br /&gt;
Se lanza un proceso, y hay que elegir a que partición va (estrategia de espera). Puede haber una cola por partición, o una sola para todas las particiones.&lt;br /&gt;
&lt;br /&gt;
 Ej: tenemos los siguientes procesos: m(P1) = 6KB, m(P2) = 1KB, m(P3) = 3KB, m(P4) = 31KB, m(P5) = 30KB;&lt;br /&gt;
     y una memoria de 64 KB divididos en 4 huecos como sigue:&lt;br /&gt;
  _&lt;br /&gt;
 |_| H1 = 8KB   &lt;br /&gt;
 |_| H2 = 8KB &lt;br /&gt;
 | |&lt;br /&gt;
 |_| H3 = 16KB&lt;br /&gt;
 | |&lt;br /&gt;
 | |&lt;br /&gt;
 | | H4 = 32KB   &lt;br /&gt;
 |_|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste estático''': se adjudica cada proceso a la menor partición que quepa. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución mejor ajuste estático|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Primer ajuste''': cuando una partición queda libre, se asigna el primer proceso que quepa en ella. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución primer ajuste|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico''': cuando una partición queda libre, se asigna el mayor proceso que queda en ella. Complejidad: O(nlog(p))&lt;br /&gt;
&lt;br /&gt;
[[solución ajuste dinámico|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor que quepa con aplazamiento limitado''': Cuando queda una partición libre, se selecciona el mayor proceso que quepa en ella, pero se cuenta el nº de veces que un proceso se aplaza. Si se superan esas n veces (umbral), se le da paso.&lt;br /&gt;
&lt;br /&gt;
*'''Subparticiones'''&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=863</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=863"/>
				<updated>2011-05-16T14:59:47Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Criterios de asignación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Elementos de administración ==&lt;br /&gt;
&lt;br /&gt;
* '''Mapas de bits''': Dividiendo la memoria en bloques, se utiliza un bit para representar si dicho bloque está libre o asignado.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se almacena en una lista el tamaño de los huecos y las posiciones de memoria entre las que se encuentran comprendidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
* '''Primer ajuste''': Consiste en asignar el primer hueco disponible que tenga un espacio suficiente para almacenar el programa. Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Siguiente ajuste''': Se continúa a partir de la posición de la última asignación realizada. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria.&lt;br /&gt;
&lt;br /&gt;
* '''Mejor ajuste''': Consiste en asignarle al proceso el hueco con menor ajuste interno. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'')&lt;br /&gt;
&lt;br /&gt;
* '''Peor ajuste''': Al contrario que el criterio anterior, se asigna a cada proceso el hueco con mayor ajuste interno. Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste.&lt;br /&gt;
&lt;br /&gt;
* '''Ajuste rápido''': Mediante listas de control, se agrupan los huecos disponibles según su tamaño (0 &amp;lt; t &amp;lt; 10, 10 &amp;lt; t &amp;lt; 20, etc.). De esta manera, cuando se necesite un hueco, se seleccionarán los del grupo del tamaño correspondiente. En el caso de que haya varios huecos disponibles, se seleccionará uno en base a cualquiera de los criterios anteriores.&lt;br /&gt;
&lt;br /&gt;
* '''Método de los compañeros''': Es una variante del ajuste rápido, en el que los huecos se dividen en potencias de 2: 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;. No es un método usado en la práctica, ya que al realizar redondeos a potencias de 2, se produce un elevado desperdicio interno&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=862</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=862"/>
				<updated>2011-05-16T14:54:06Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Elementos de administración ==&lt;br /&gt;
&lt;br /&gt;
* '''Mapas de bits''': Dividiendo la memoria en bloques, se utiliza un bit para representar si dicho bloque está libre o asignado.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se almacena en una lista el tamaño de los huecos y las posiciones de memoria entre las que se encuentran comprendidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
* '''Primer ajuste''': Consiste en asignar el primer hueco disponible que tenga un espacio suficiente para almacenar el programa.&lt;br /&gt;
Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Siguiente ajuste''': Se continúa a partir de la posición de la última asignación realizada. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria.&lt;br /&gt;
&lt;br /&gt;
* '''Mejor ajuste''': Consiste en asignarle al proceso el hueco con menor ajuste interno. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'')&lt;br /&gt;
&lt;br /&gt;
* '''Peor ajuste''': Al contrario que el criterio anterior, se asigna a cada proceso el hueco con mayor ajuste interno. Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste.&lt;br /&gt;
&lt;br /&gt;
* '''Ajuste rápido'''&lt;br /&gt;
&lt;br /&gt;
* '''Método de los compañeros''': Es una variante del ajuste rápido, en el que los huecos se dividen en potencias de 2: 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; No es un método usado en la práctica, ya que al realizar redondeos a potencias de 2, se produce un elevado desperdicio interno&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=861</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=861"/>
				<updated>2011-05-16T14:47:18Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Elementos de administración ==&lt;br /&gt;
&lt;br /&gt;
- '''Mapas de bits'''&lt;br /&gt;
Dividiendo la memoria en bloques, se utiliza un bit para representar si dicho bloque está libre o asignado.&lt;br /&gt;
&lt;br /&gt;
- '''Listas de control'''&lt;br /&gt;
Se almacena en una lista el tamaño de los huecos y las posiciones de memoria entre las que se encuentran comprendidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
- '''Primer ajuste'''&lt;br /&gt;
Consiste en asignar el primer hueco disponible que tenga un espacio suficiente para almacenar el programa.&lt;br /&gt;
Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
- '''Siguiente ajuste'''&lt;br /&gt;
Se continúa a partir de la posición de la última asignación realizada. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria.&lt;br /&gt;
&lt;br /&gt;
- '''Mejor ajuste'''&lt;br /&gt;
Consiste en asignarle al proceso el hueco con menor ajuste interno.&lt;br /&gt;
Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'')&lt;br /&gt;
&lt;br /&gt;
- '''Peor ajuste'''&lt;br /&gt;
&lt;br /&gt;
- '''Ajuste rápido'''&lt;br /&gt;
&lt;br /&gt;
- '''Método de los compañeros'''&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=860</id>
		<title>SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=860"/>
				<updated>2011-05-16T14:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Página nueva: Esto es un esbozo.  == Criterios de asignación ==  - Primer ajuste Consiste en  Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esto es un esbozo.&lt;br /&gt;
&lt;br /&gt;
== Criterios de asignación ==&lt;br /&gt;
&lt;br /&gt;
- Primer ajuste&lt;br /&gt;
Consiste en &lt;br /&gt;
Las dos principales desventajas son su alto desperdicio interno, y el elevado uso de las primeras posiciones de memoria. Este último inconveniente repercute negativamente en la circuitería, debido a que se produce un mayor desgaste en dichas posiciones.&lt;br /&gt;
&lt;br /&gt;
- Siguiente ajuste&lt;br /&gt;
Se continúa por la posición de la última asignación&lt;br /&gt;
&lt;br /&gt;
- Mejor ajuste&lt;br /&gt;
&lt;br /&gt;
- Peor ajuste&lt;br /&gt;
&lt;br /&gt;
- Ajuste rápido&lt;br /&gt;
&lt;br /&gt;
- Método de los compañeros&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=682</id>
		<title>Algoritmo para averiguar interbloqueo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=682"/>
				<updated>2011-04-27T15:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Algoritmo en Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmo en C# ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;            &lt;br /&gt;
            int nRecursos;&lt;br /&gt;
            int nProcesos;&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; maximos = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;int&amp;gt; disponibles = new List&amp;lt;int&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
            Random r = new Random();&lt;br /&gt;
&lt;br /&gt;
            //Generamos las matrices aleatoriamente&lt;br /&gt;
            for (int j1 = 0; j1 &amp;lt; nRecursos;j1++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles.Add(r.Next(0, nRecursos));                &lt;br /&gt;
            }&lt;br /&gt;
            for (int i = 0; i &amp;lt; nProcesos; i++)&lt;br /&gt;
            {&lt;br /&gt;
                asignados.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                maximos.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                for (int j = 0; j &amp;lt; nRecursos; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    asignados[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                    maximos[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
          &lt;br /&gt;
            bool aux = true;&lt;br /&gt;
            for (int proc = 0; proc &amp;lt; nProcesos; proc++)&lt;br /&gt;
            {&lt;br /&gt;
                aux = true;&lt;br /&gt;
                for (int recur = 0; recur &amp;lt; nRecursos; recur++)&lt;br /&gt;
                {&lt;br /&gt;
                    // comprobamos que haya recursos suficientes&lt;br /&gt;
                    aux = (maximos[proc][recur] - asignados[proc][recur] - disponibles[recur]) &amp;lt;= 0;&lt;br /&gt;
                    if (!aux)&lt;br /&gt;
                    {&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (aux)&lt;br /&gt;
                {&lt;br /&gt;
                    añadirYeliminar(ref disponibles, ref asignados, proc);&lt;br /&gt;
                    maximos.RemoveAt(proc);&lt;br /&gt;
                    nProcesos--;&lt;br /&gt;
                    proc = -1;&lt;br /&gt;
                    if (nProcesos == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        Console.WriteLine(&amp;quot;Es estado seguro&amp;quot;);&lt;br /&gt;
                        Console.ReadLine();&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            Console.WriteLine(&amp;quot;Es interbloqueo&amp;quot;);&lt;br /&gt;
            Console.ReadLine();&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private static void añadirYeliminar(ref List&amp;lt;int&amp;gt; disponibles, ref List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados, int proc)&lt;br /&gt;
        {&lt;br /&gt;
            for (int k = 0; k &amp;lt; asignados[proc].Count; k++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles[k] += asignados[proc][k];&lt;br /&gt;
            }&lt;br /&gt;
            asignados.RemoveAt(proc);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faltaria solamente leer por consola el numero de procesos y de recursos que queremos testear, o introduccirlos manualmente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmo en Python ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def comprueba_configuracion(asignados, maximos, disponibles):&lt;br /&gt;
    finalizados = []&lt;br /&gt;
    i = 0&lt;br /&gt;
    while(i &amp;lt; len(asignados)):&lt;br /&gt;
        if not i in finalizados and puede_progresar(asignados[i], disponibles, maximos[i]):&lt;br /&gt;
            print('Finaliza P%s\nDisponibles: %s' % (i,disponibles))&lt;br /&gt;
            libera_recursos(asignados[i], disponibles)&lt;br /&gt;
            finalizados.append(i)   # Marca el proceso Pi como finalizado&lt;br /&gt;
            i = 0&lt;br /&gt;
        else:&lt;br /&gt;
            i += 1&lt;br /&gt;
&lt;br /&gt;
    if(len(asignados) == len(finalizados)):     # Si todos los procesos finalizan&lt;br /&gt;
        print('\nEstado seguro para la configuracion de procesos-recursos dada')&lt;br /&gt;
    else:&lt;br /&gt;
        print('\nSe produce un interbloqueo')&lt;br /&gt;
&lt;br /&gt;
# Incrementamos la lista de disponibles con los que tenia asignados&lt;br /&gt;
def libera_recursos(asignados, disponibles):&lt;br /&gt;
    for i in range(len(disponibles)):&lt;br /&gt;
        disponibles[i] += asignados[i]&lt;br /&gt;
&lt;br /&gt;
# Devuelve True si el nº de elementos asignados mas los disponibles son mayores o iguales a los requeridos para continuar&lt;br /&gt;
def puede_progresar(asignados, disponibles, maximos):&lt;br /&gt;
    resultado = True&lt;br /&gt;
    for i in range(len(maximos)):&lt;br /&gt;
        if(asignados[i] + disponibles[i] &amp;lt; maximos[i]):&lt;br /&gt;
            resultado = False&lt;br /&gt;
            break&lt;br /&gt;
    return resultado&lt;br /&gt;
&lt;br /&gt;
asignados = [&lt;br /&gt;
    [1,0,2,1,1],&lt;br /&gt;
    [2,0,1,1,0],&lt;br /&gt;
    [1,1,0,1,0],&lt;br /&gt;
    [1,1,1,1,0]&lt;br /&gt;
    ]&lt;br /&gt;
maximos = [&lt;br /&gt;
    [1,2,2,1,2],&lt;br /&gt;
    [2,2,2,1,0],&lt;br /&gt;
    [2,1,3,1,0],&lt;br /&gt;
    [1,1,2,2,1]&lt;br /&gt;
    ]&lt;br /&gt;
disponibles = [0,0,2,1,1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este ejemplo (visto en clase) la salida sería:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; comprueba_configuracion(asignados, maximos, disponibles)&lt;br /&gt;
Finaliza P3&lt;br /&gt;
Disponibles: [0, 0, 2, 1, 1]&lt;br /&gt;
Finaliza P2&lt;br /&gt;
Disponibles: [1, 1, 3, 2, 1]&lt;br /&gt;
Finaliza P0&lt;br /&gt;
Disponibles: [2, 2, 3, 3, 1]&lt;br /&gt;
Finaliza P1&lt;br /&gt;
Disponibles: [3, 2, 5, 4, 2]&lt;br /&gt;
&lt;br /&gt;
Estado seguro para la configuracion de procesos-recursos dada&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=681</id>
		<title>Algoritmo para averiguar interbloqueo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=681"/>
				<updated>2011-04-27T15:03:09Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Algoritmo en Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmo en C# ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;            &lt;br /&gt;
            int nRecursos;&lt;br /&gt;
            int nProcesos;&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; maximos = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;int&amp;gt; disponibles = new List&amp;lt;int&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
            Random r = new Random();&lt;br /&gt;
&lt;br /&gt;
            //Generamos las matrices aleatoriamente&lt;br /&gt;
            for (int j1 = 0; j1 &amp;lt; nRecursos;j1++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles.Add(r.Next(0, nRecursos));                &lt;br /&gt;
            }&lt;br /&gt;
            for (int i = 0; i &amp;lt; nProcesos; i++)&lt;br /&gt;
            {&lt;br /&gt;
                asignados.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                maximos.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                for (int j = 0; j &amp;lt; nRecursos; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    asignados[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                    maximos[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
          &lt;br /&gt;
            bool aux = true;&lt;br /&gt;
            for (int proc = 0; proc &amp;lt; nProcesos; proc++)&lt;br /&gt;
            {&lt;br /&gt;
                aux = true;&lt;br /&gt;
                for (int recur = 0; recur &amp;lt; nRecursos; recur++)&lt;br /&gt;
                {&lt;br /&gt;
                    // comprobamos que haya recursos suficientes&lt;br /&gt;
                    aux = (maximos[proc][recur] - asignados[proc][recur] - disponibles[recur]) &amp;lt;= 0;&lt;br /&gt;
                    if (!aux)&lt;br /&gt;
                    {&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (aux)&lt;br /&gt;
                {&lt;br /&gt;
                    añadirYeliminar(ref disponibles, ref asignados, proc);&lt;br /&gt;
                    maximos.RemoveAt(proc);&lt;br /&gt;
                    nProcesos--;&lt;br /&gt;
                    proc = -1;&lt;br /&gt;
                    if (nProcesos == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        Console.WriteLine(&amp;quot;Es estado seguro&amp;quot;);&lt;br /&gt;
                        Console.ReadLine();&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            Console.WriteLine(&amp;quot;Es interbloqueo&amp;quot;);&lt;br /&gt;
            Console.ReadLine();&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private static void añadirYeliminar(ref List&amp;lt;int&amp;gt; disponibles, ref List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados, int proc)&lt;br /&gt;
        {&lt;br /&gt;
            for (int k = 0; k &amp;lt; asignados[proc].Count; k++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles[k] += asignados[proc][k];&lt;br /&gt;
            }&lt;br /&gt;
            asignados.RemoveAt(proc);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faltaria solamente leer por consola el numero de procesos y de recursos que queremos testear, o introduccirlos manualmente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmo en Python ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def comprueba_configuracion(asignados, maximos, disponibles):&lt;br /&gt;
    finalizados = []&lt;br /&gt;
    i = 0&lt;br /&gt;
    while(i &amp;lt; len(asignados)):&lt;br /&gt;
        if not i in finalizados and puede_progresar(asignados[i], disponibles, maximos[i]):&lt;br /&gt;
            print('Finaliza P%s\nDisponibles: %s' % (i,disponibles))&lt;br /&gt;
            libera_recursos(asignados[i], disponibles)&lt;br /&gt;
            finalizados.append(i)   # Marca el proceso Pi como finalizado&lt;br /&gt;
            i = 0&lt;br /&gt;
        else:&lt;br /&gt;
            i += 1&lt;br /&gt;
&lt;br /&gt;
    if(len(asignados) == len(finalizados)):     # Si todos los procesos finalizan&lt;br /&gt;
        print('\nEstado seguro para la configuracion de procesos-recursos dada')&lt;br /&gt;
    else:&lt;br /&gt;
        print('\nSe produce un interbloqueo')&lt;br /&gt;
&lt;br /&gt;
# Incrementamos la lista de disponibles con los que tenia asignados&lt;br /&gt;
def libera_recursos(asignados, disponibles):&lt;br /&gt;
    for i in range(len(disponibles)):&lt;br /&gt;
        disponibles[i] += asignados[i]&lt;br /&gt;
&lt;br /&gt;
# Devuelve True si el nº de elementos asignados mas los disponibles son mayores o iguales a los requeridos&lt;br /&gt;
def puede_progresar(asignados, disponibles, maximos):&lt;br /&gt;
    resultado = True&lt;br /&gt;
    for i in range(len(maximos)):&lt;br /&gt;
        if(asignados[i] + disponibles[i] &amp;lt; maximos[i]):&lt;br /&gt;
            resultado = False&lt;br /&gt;
            break&lt;br /&gt;
    return resultado&lt;br /&gt;
&lt;br /&gt;
asignados = [&lt;br /&gt;
    [1,0,2,1,1],&lt;br /&gt;
    [2,0,1,1,0],&lt;br /&gt;
    [1,1,0,1,0],&lt;br /&gt;
    [1,1,1,1,0]&lt;br /&gt;
    ]&lt;br /&gt;
maximos = [&lt;br /&gt;
    [1,2,2,1,2],&lt;br /&gt;
    [2,2,2,1,0],&lt;br /&gt;
    [2,1,3,1,0],&lt;br /&gt;
    [1,1,2,2,1]&lt;br /&gt;
    ]&lt;br /&gt;
disponibles = [0,0,2,1,1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este ejemplo (visto en clase) la salida sería:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; comprueba_configuracion(asignados, maximos, disponibles)&lt;br /&gt;
Finaliza P3&lt;br /&gt;
Disponibles: [0, 0, 2, 1, 1]&lt;br /&gt;
Finaliza P2&lt;br /&gt;
Disponibles: [1, 1, 3, 2, 1]&lt;br /&gt;
Finaliza P0&lt;br /&gt;
Disponibles: [2, 2, 3, 3, 1]&lt;br /&gt;
Finaliza P1&lt;br /&gt;
Disponibles: [3, 2, 5, 4, 2]&lt;br /&gt;
&lt;br /&gt;
Estado seguro para la configuracion de procesos-recursos dada&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=680</id>
		<title>Algoritmo para averiguar interbloqueo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=680"/>
				<updated>2011-04-27T14:50:09Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Algoritmo en Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmo en C# ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;            &lt;br /&gt;
            int nRecursos;&lt;br /&gt;
            int nProcesos;&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; maximos = new List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt;();&lt;br /&gt;
            List&amp;lt;int&amp;gt; disponibles = new List&amp;lt;int&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
            Random r = new Random();&lt;br /&gt;
&lt;br /&gt;
            //Generamos las matrices aleatoriamente&lt;br /&gt;
            for (int j1 = 0; j1 &amp;lt; nRecursos;j1++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles.Add(r.Next(0, nRecursos));                &lt;br /&gt;
            }&lt;br /&gt;
            for (int i = 0; i &amp;lt; nProcesos; i++)&lt;br /&gt;
            {&lt;br /&gt;
                asignados.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                maximos.Add(new List&amp;lt;int&amp;gt;());&lt;br /&gt;
                for (int j = 0; j &amp;lt; nRecursos; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    asignados[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                    maximos[i].Add(r.Next(0, nRecursos));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
          &lt;br /&gt;
            bool aux = true;&lt;br /&gt;
            for (int proc = 0; proc &amp;lt; nProcesos; proc++)&lt;br /&gt;
            {&lt;br /&gt;
                aux = true;&lt;br /&gt;
                for (int recur = 0; recur &amp;lt; nRecursos; recur++)&lt;br /&gt;
                {&lt;br /&gt;
                    // comprobamos que haya recursos suficientes&lt;br /&gt;
                    aux = (maximos[proc][recur] - asignados[proc][recur] - disponibles[recur]) &amp;lt;= 0;&lt;br /&gt;
                    if (!aux)&lt;br /&gt;
                    {&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (aux)&lt;br /&gt;
                {&lt;br /&gt;
                    añadirYeliminar(ref disponibles, ref asignados, proc);&lt;br /&gt;
                    maximos.RemoveAt(proc);&lt;br /&gt;
                    nProcesos--;&lt;br /&gt;
                    proc = -1;&lt;br /&gt;
                    if (nProcesos == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        Console.WriteLine(&amp;quot;Es estado seguro&amp;quot;);&lt;br /&gt;
                        Console.ReadLine();&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            Console.WriteLine(&amp;quot;Es interbloqueo&amp;quot;);&lt;br /&gt;
            Console.ReadLine();&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private static void añadirYeliminar(ref List&amp;lt;int&amp;gt; disponibles, ref List&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; asignados, int proc)&lt;br /&gt;
        {&lt;br /&gt;
            for (int k = 0; k &amp;lt; asignados[proc].Count; k++)&lt;br /&gt;
            {&lt;br /&gt;
                disponibles[k] += asignados[proc][k];&lt;br /&gt;
            }&lt;br /&gt;
            asignados.RemoveAt(proc);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faltaria solamente leer por consola el numero de procesos y de recursos que queremos testear, o introduccirlos manualmente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmo en Python ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def comprueba_configuracion(asignados, maximos, disponibles):&lt;br /&gt;
    finalizados = []&lt;br /&gt;
    i = 0&lt;br /&gt;
    while(i &amp;lt; len(asignados)):&lt;br /&gt;
        if not i in finalizados and puede_progresar(asignados[i], disponibles, maximos[i]):&lt;br /&gt;
            print('Finaliza P%s\nDisponibles: %s' % (i,disponibles))&lt;br /&gt;
            libera_recursos(asignados[i], disponibles)&lt;br /&gt;
            finalizados.append(i)&lt;br /&gt;
            i = 0&lt;br /&gt;
        else:&lt;br /&gt;
            i += 1&lt;br /&gt;
&lt;br /&gt;
    if(len(asignados) == len(finalizados)):     # Si todos los procesos finalizan&lt;br /&gt;
        print('\nEstado seguro para la configuracion de procesos-recursos dada')&lt;br /&gt;
    else:&lt;br /&gt;
        print('\nSe produce un interbloqueo')&lt;br /&gt;
&lt;br /&gt;
# Incrementamos la lista de disponibles con los que tenia asignados&lt;br /&gt;
def libera_recursos(asignados, disponibles):&lt;br /&gt;
    for i in range(len(disponibles)):&lt;br /&gt;
        disponibles[i] += asignados[i]&lt;br /&gt;
&lt;br /&gt;
# Devuelve True si el nº de elementos asignados mas los disponibles son mayores o iguales a los requeridos&lt;br /&gt;
def puede_progresar(asignados, disponibles, maximos):&lt;br /&gt;
    resultado = True&lt;br /&gt;
    for i in range(len(maximos)):&lt;br /&gt;
        if(asignados[i] + disponibles[i] &amp;lt; maximos[i]):&lt;br /&gt;
            resultado = False&lt;br /&gt;
            break&lt;br /&gt;
    return resultado&lt;br /&gt;
&lt;br /&gt;
asignados = [&lt;br /&gt;
    [1,0,2,1,1],&lt;br /&gt;
    [2,0,1,1,0],&lt;br /&gt;
    [1,1,0,1,0],&lt;br /&gt;
    [1,1,1,1,0],&lt;br /&gt;
    ]&lt;br /&gt;
maximos = [&lt;br /&gt;
    [1,2,2,1,2],&lt;br /&gt;
    [2,2,2,1,0],&lt;br /&gt;
    [2,1,3,1,0],&lt;br /&gt;
    [1,1,2,2,1],&lt;br /&gt;
    ]&lt;br /&gt;
disponibles = [0,0,2,1,1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este ejemplo (visto en clase) la salida sería:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; comprueba_configuracion(asignados, maximos, disponibles)&lt;br /&gt;
Finaliza P3&lt;br /&gt;
Disponibles: [0, 0, 2, 1, 1]&lt;br /&gt;
Finaliza P2&lt;br /&gt;
Disponibles: [1, 1, 3, 2, 1]&lt;br /&gt;
Finaliza P0&lt;br /&gt;
Disponibles: [2, 2, 3, 3, 1]&lt;br /&gt;
Finaliza P1&lt;br /&gt;
Disponibles: [3, 2, 5, 4, 2]&lt;br /&gt;
&lt;br /&gt;
Estado seguro para la configuracion de procesos-recursos dada&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Condiciones_para_el_interbloqueo_y_estrategias_de_resoluci%C3%B3n&amp;diff=677</id>
		<title>Condiciones para el interbloqueo y estrategias de resolución</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Condiciones_para_el_interbloqueo_y_estrategias_de_resoluci%C3%B3n&amp;diff=677"/>
				<updated>2011-04-27T12:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Estrategias */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Condiciones ==&lt;br /&gt;
&lt;br /&gt;
En la política del sistema operativo deben darse una serie de condiciones para que se produzca un interbloqueo.&lt;br /&gt;
&lt;br /&gt;
* '''Exclusión mutua''': cada recurso está asignado a un único proceso o está disponible.&lt;br /&gt;
&lt;br /&gt;
* '''Detención y espera''': los procesos que tienen, en un momento dado, recursos asignados con anterioridad, pueden solicitar nuevos recursos.&lt;br /&gt;
&lt;br /&gt;
* '''No apropiación''': los recursos otorgados con anterioridad no pueden ser forzados a dejar un  proceso. El proceso que los posee debe liberarlos en forma explícita.&lt;br /&gt;
&lt;br /&gt;
* '''Espera circular''': debe existir una cadena circular de dos o más procesos, cada uno de los cuales espera un recurso poseído por el siguiente miembro de la cadena. Esta condición es una consecuencia potencial de las tres primeras, es decir, dado que se producen las tres primeras condiciones, puede ocurrir una secuencia de eventos que desemboque en un círculo vicioso de espera irresoluble. &lt;br /&gt;
&lt;br /&gt;
Las tres primeras condiciones son necesarias, pero no suficientes para que exista interbloqueo. Sólo las cuatro condiciones en conjunto constituyen una condición necesaria y suficiente para el interbloqueo.&lt;br /&gt;
&lt;br /&gt;
== Estrategias ==&lt;br /&gt;
&lt;br /&gt;
=== Omisión ===&lt;br /&gt;
&lt;br /&gt;
Consiste en suponer que los programadores lo han hecho bien, y obviar las posibles situaciones de interbloqueo. Es la más usada.&lt;br /&gt;
&lt;br /&gt;
=== Detección y Recuperación ===&lt;br /&gt;
&lt;br /&gt;
* '''Detección'''&lt;br /&gt;
** '''Grafo de relación recursos-procesos'''&lt;br /&gt;
** '''Matrices de relación recursos-procesos'''&lt;br /&gt;
&lt;br /&gt;
* '''Recuperación'''&lt;br /&gt;
** '''Apropiación temporal'''&lt;br /&gt;
** '''Checkpoints''': Durante la ejecución de los procesos se toma una &amp;quot;foto&amp;quot; del estado de éstos, de manera que si se produce un interbloqueo se vuelve al estado anterior. Son muy poco usados ya que tienen un elevado coste en memoria y existe la posibilidad de que un proceso esté indefinidamente sin progresar.&lt;br /&gt;
** '''Eliminación''': El SO elimina un proceso en base a unos determinados criterios. Aunque parezca una medida drástica, es usada con frecuencia.&lt;br /&gt;
&lt;br /&gt;
=== Prevención ===&lt;br /&gt;
&lt;br /&gt;
* '''Supresión de exclusión mutua'''&lt;br /&gt;
* '''Supresión de retención y espera''': El proceso debe tener asignado todos los recursos necesarios al inicio y no liberarlos hasta que éste finalice. Esto hace que si por ejemplo un recurso sólo se utiliza al final, esté ocupado durante toda la ejecución, no permitiendo ser usado por otros procesos.&lt;br /&gt;
* '''Supresión de no apropiación''': El proceso libera todos los recursos que está usando y espera a que todos los que necesita estén disponibles&lt;br /&gt;
* '''Supresión de espera circular'''&lt;br /&gt;
&lt;br /&gt;
=== Predicción ===&lt;br /&gt;
&lt;br /&gt;
El sistema operativo observa la evolución que siguen los procesos, e intenta anticiparse a los futuros conflictos&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Condiciones_para_el_interbloqueo_y_estrategias_de_resoluci%C3%B3n&amp;diff=676</id>
		<title>Condiciones para el interbloqueo y estrategias de resolución</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Condiciones_para_el_interbloqueo_y_estrategias_de_resoluci%C3%B3n&amp;diff=676"/>
				<updated>2011-04-27T12:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Ampliar estrategias */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Condiciones ==&lt;br /&gt;
&lt;br /&gt;
En la política del sistema operativo deben darse una serie de condiciones para que se produzca un interbloqueo.&lt;br /&gt;
&lt;br /&gt;
* '''Exclusión mutua''': cada recurso está asignado a un único proceso o está disponible.&lt;br /&gt;
&lt;br /&gt;
* '''Detención y espera''': los procesos que tienen, en un momento dado, recursos asignados con anterioridad, pueden solicitar nuevos recursos.&lt;br /&gt;
&lt;br /&gt;
* '''No apropiación''': los recursos otorgados con anterioridad no pueden ser forzados a dejar un  proceso. El proceso que los posee debe liberarlos en forma explícita.&lt;br /&gt;
&lt;br /&gt;
* '''Espera circular''': debe existir una cadena circular de dos o más procesos, cada uno de los cuales espera un recurso poseído por el siguiente miembro de la cadena. Esta condición es una consecuencia potencial de las tres primeras, es decir, dado que se producen las tres primeras condiciones, puede ocurrir una secuencia de eventos que desemboque en un círculo vicioso de espera irresoluble. &lt;br /&gt;
&lt;br /&gt;
Las tres primeras condiciones son necesarias, pero no suficientes para que exista interbloqueo. Sólo las cuatro condiciones en conjunto constituyen una condición necesaria y suficiente para el interbloqueo.&lt;br /&gt;
&lt;br /&gt;
== Estrategias ==&lt;br /&gt;
&lt;br /&gt;
* '''Omisión''': consiste en suponer que los programadores lo han hecho bien, y obviar las posibles situaciones de interbloqueo. Es la más usada.&lt;br /&gt;
&lt;br /&gt;
* '''Detección y Recuperación'''&lt;br /&gt;
&lt;br /&gt;
** Detección&lt;br /&gt;
*** Grafo de relación recursos-procesos&lt;br /&gt;
*** Matrices de relación recursos-procesos&lt;br /&gt;
&lt;br /&gt;
** Recuperación&lt;br /&gt;
*** Apropiación temporal&lt;br /&gt;
*** Checkpoints&lt;br /&gt;
*** Eliminación&lt;br /&gt;
&lt;br /&gt;
* '''Prevención'''&lt;br /&gt;
** Supresión de exclusión mutua&lt;br /&gt;
** Supresión de retención y espera: &lt;br /&gt;
** Supresión de no apropiación: El proceso libera todos los recursos que está usando y espera a que todos los que necesita estén disponibles&lt;br /&gt;
** Supresión de espera circular&lt;br /&gt;
&lt;br /&gt;
* '''Predicción''': el SO observa la evolución que siguen los procesos, e intenta anticiparse a los futuros conflictos&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Cerrojos&amp;diff=595</id>
		<title>Cerrojos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Cerrojos&amp;diff=595"/>
				<updated>2011-03-30T13:22:38Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Títulos y correcciones&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ejemplo de implementación =&lt;br /&gt;
&lt;br /&gt;
El siguiente código sería un posible ejemplo del uso de control de concurrencia mediante cerrojos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int cerrojo = 1;      /* Inicializamos la variable cerrojo. Esto sería sólo válido para&lt;br /&gt;
                         hilos, ya que los procesos no comparten espacio de memoria */&lt;br /&gt;
&lt;br /&gt;
while(cerrojo == 0);  // Protocolo de&lt;br /&gt;
cerrojo = 0;          // entrada&lt;br /&gt;
&lt;br /&gt;
...                   // Sección crítica&lt;br /&gt;
&lt;br /&gt;
cerrojo = 1;          // Protocolo de salida&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sin embargo, esto es problemático: Supongamos que tenemos únicamente un proceso con dos hilos (Hx y Hy) y el planificador retire al proceso Hx justo antes de ejecutarse la instrucción ''cerrojo = 0;''. El proceso Hy ejecuta su código, entra en la sección crítica (Esto puede ocurrir ya que cerrojo sigue a 1) y el planificador le retira el uso del procesador dentro de ésta. A continuación, se le vuelve a asignar el procesador a Hx.&lt;br /&gt;
&lt;br /&gt;
De esta forma, tenemos a dos hilos ejecutando código de la sección crítica. Para evitar este problema, debemos implementar los protocolos de entrada y salida de forma que se ejecuten en una sola instrucción, con lo cual o el planificador retira el uso del procesador antes de esta instrucción, o sino lo retira después de haberla ejecutado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Cerrojos mediante instrucciones atómicas =&lt;br /&gt;
&lt;br /&gt;
Podemos implementar cerrojos mediante instrucciones especiales de comprobación y puesta a 0 y 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int cerrojo = 0;&lt;br /&gt;
&lt;br /&gt;
void lock() {&lt;br /&gt;
    while (__sync_lock_test_and_set(&amp;amp;cerrojo, 1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void unlock() {&lt;br /&gt;
    __sync_lock_release(&amp;amp;cerrojo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html&lt;br /&gt;
* http://stackoverflow.com/questions/1383363/is-my-spin-lock-implementation-correct-and-optimal&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Cerrojos&amp;diff=593</id>
		<title>Cerrojos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Cerrojos&amp;diff=593"/>
				<updated>2011-03-30T13:13:37Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir anotaciones y ejemplo de clase&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esto es un esbozo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int cerrojo = 1;      /* Inicializamos la variable cerrojo. Esto sería sólo válido para&lt;br /&gt;
                         hilos, ya que los procesos no comparten espacio de memoria */&lt;br /&gt;
&lt;br /&gt;
while(cerrojo == 0);  // Protocolo de&lt;br /&gt;
cerrojo = 0;          // entrada&lt;br /&gt;
&lt;br /&gt;
...                   // Sección crítica&lt;br /&gt;
&lt;br /&gt;
cerrojo = 1;          // Protocolo de salida&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sin embargo, esto es problemático: Supongamos que tenemos únicamente un proceso con dos hilos (Hx y Hy) y el planificador retire al proceso Hx justo antes de ejecutarse la instrucción ''cerrojo = 0;''. A continuación el proceso Hy ejecuta su código, entra en la sección crítica (Esto puede ocurrir ya que cerrojo sigue a 1) y el planificador le retira el uso del procesador dentro de ésta. A continuación, se le vuelve a asignar el procesador a Hx.&lt;br /&gt;
&lt;br /&gt;
De esta forma, tenemos a dos hilos ejecutando código de la sección crítica.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos implementar cerrojos mediante instrucciones especiales de comprobación y puesta a 0 y 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int cerrojo = 0;&lt;br /&gt;
&lt;br /&gt;
void lock() {&lt;br /&gt;
    while (__sync_lock_test_and_set(&amp;amp;cerrojo, 1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void unlock() {&lt;br /&gt;
    __sync_lock_release(&amp;amp;cerrojo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html&lt;br /&gt;
* http://stackoverflow.com/questions/1383363/is-my-spin-lock-implementation-correct-and-optimal&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Concurrencia_de_procesos&amp;diff=552</id>
		<title>Concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Concurrencia_de_procesos&amp;diff=552"/>
				<updated>2011-03-28T16:05:36Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Formas de interacción entre procesos=&lt;br /&gt;
Hay dos formas de interacción entre los procesos :&lt;br /&gt;
* '''Relaciones de Concurrencia''': los procesos A y B tienen objetivos diferentes y compiten por los recursos para conseguirlos.&lt;br /&gt;
&lt;br /&gt;
* '''Relaciones de Cooperación''': los procesos A y B tienen un mismo objetivo y ''se ponen de acuerdo'' a la hora de emplear los recursos existentes para alcanzarlos.&lt;br /&gt;
&lt;br /&gt;
El sistema operativo ofrece mecanismos que los procesos pueden emplear para arbitrar el acceso a los recursos.&lt;br /&gt;
&lt;br /&gt;
=Mecanismos de arbitraje=&lt;br /&gt;
Los mecanismos de arbitraje que ofrece el sistema operativo son :&lt;br /&gt;
* '''Sincronización''': el sistema operativo ofrece mecanismos que permiten a los procesos coordinar la ejecución para conseguir su objetivo en armonía (y no de manera indeseada).&lt;br /&gt;
* '''Mensajería''': el sistema operativo ofrece mecanismos de comunicación basados en mensaje.&lt;br /&gt;
&lt;br /&gt;
=Programación concurrente= &lt;br /&gt;
La programación concurrente consiste en el conjunto de técnicas que nos permite la elaboración de programas que emplean alguno de los mecanismos de arbitraje, basados en sincronización o mensajería, para resolver situaciones de concurrencia o cooperación.&lt;br /&gt;
&lt;br /&gt;
=Tipos de mecanismos de sincronización=&lt;br /&gt;
*[[Mecanismos de sincronización#Optimista|Optimista]]: se considera que la frecuencia de acceso a un recurso compartido es ''baja''.&lt;br /&gt;
*[[Mecanismos de sincronización#Pesimista|Pesimista]]: se considera que la frecuencia de acceso a un recurso compartido es ''alta''.&lt;br /&gt;
&lt;br /&gt;
Es el programador el que tiene que elegir uno de estos mecanimos a la hora de realizar su programa, y no el sistema operativo. Se debe tener en cuenta que el uso de un mecanismo inadecuado puede llevar a que el programa no responda de la manera esperada.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Concurrencia_de_procesos&amp;diff=551</id>
		<title>Concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Concurrencia_de_procesos&amp;diff=551"/>
				<updated>2011-03-28T16:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir enlaces&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Formas de interacción entre procesos=&lt;br /&gt;
Hay dos formas de interacción entre los procesos :&lt;br /&gt;
* Relaciones de Concurrencia : los procesos A y B tienen objetivos diferentes y compiten por los recursos para conseguirlos.&lt;br /&gt;
&lt;br /&gt;
* Relaciones de Cooperación : los procesos A y B tienen un mismo objetivo y ''se ponen de acuerdo'' a la hora de emplear los recursos existentes para alcanzarlos.&lt;br /&gt;
&lt;br /&gt;
El sistema operativo ofrece mecanismos que los procesos pueden emplear para arbitrar el acceso a los recursos.&lt;br /&gt;
&lt;br /&gt;
=Mecanismos de arbitraje=&lt;br /&gt;
Los mecanismos de arbitraje que ofrece el sistema operativo son :&lt;br /&gt;
* Sincronización: el sistema operativo ofrece mecanismos que permiten a los procesos coordinar la ejecución para conseguir su objetivo en armonía (y no de manera indeseada).&lt;br /&gt;
* Mensajería: el sistema operativo ofrece mecanismos de comunicación basados en mensaje.&lt;br /&gt;
&lt;br /&gt;
=Programación concurrente= &lt;br /&gt;
La programación concurrente consiste en el conjunto de técnicas que nos permite la elaboración de programas que emplean alguno de los mecanismos de arbitraje, basados en sincronización o mensajería, para resolver situaciones de concurrencia o cooperación.&lt;br /&gt;
&lt;br /&gt;
=Tipos de mecanismos de sincronización=&lt;br /&gt;
*[[Mecanismos de sincronización#Optimista|Optimista]]: se considera que la frecuencia de acceso a un recurso compartido es ''baja''.&lt;br /&gt;
*[[Mecanismos de sincronización#Pesimista|Pesimista]]: se considera que la frecuencia de acceso a un recurso compartido es ''alta''.&lt;br /&gt;
&lt;br /&gt;
Es el programador el que tiene que elegir uno de estos mecanimos a la hora de realizar su programa, y no el sistema operativo. Se debe tener en cuenta que el uso de un mecanismo inadecuado puede llevar a que el programa no responda de la manera esperada.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=550</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=550"/>
				<updated>2011-03-28T15:56:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Optimista */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Mecanismos de sincronización=&lt;br /&gt;
'''Tipos de mecanismos de sincronización :'''&lt;br /&gt;
== Optimista== &lt;br /&gt;
Se considera que la frecuencia de acceso a un recurso compartido es baja, es decir, suponemos que la probabilidad de acceso simultanea a un recurso compartido es baja.&lt;br /&gt;
 Ejemplo de control optimista suponiendo 2 hilos, hx y hy.&lt;br /&gt;
       &lt;br /&gt;
            int compartida = 1, tmp;&lt;br /&gt;
      retry:&lt;br /&gt;
            tmp = compartida;         /* anoto */&lt;br /&gt;
            tmp++;                    /* actualizo temporal */&lt;br /&gt;
            if(compartida+1 != tmp)&lt;br /&gt;
                goto retry;           /* compruebo si la variable compartida ha sido modificada mientras operaba con el temporal */&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo es su elevado recurso de memoria, ya que se debe tener una copia del recurso compartido y efectuar la comprobación, y su alto recurso de procesamiento, al tener que volver a realizar la operación. Por esto último, puede darse el caso de que un hilo esté sin progresar durante un tiempo indefinido, si se da el caso de que siempre que se le agote el tiempo de procesador asignado debido a que otro hilo modifique el recurso compartido.&lt;br /&gt;
&lt;br /&gt;
==Pesimista==&lt;br /&gt;
Se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
En este mecanismo disponemos de tres partes :&lt;br /&gt;
*Un protocolo de entrada : en el cual se restringe el permiso de acceso para las variables compartidas.&lt;br /&gt;
*Una sección crítica : donde se realizan todas las operaciones con las variables compartidas.&lt;br /&gt;
*Un protocolo de salida : en el cual se restablece el permiso de acceso para las variables compartidas.&lt;br /&gt;
&lt;br /&gt;
(Toda operación con una variable compartida necesita un protocolo de entrada y otro de salida)&lt;br /&gt;
 Ejemplo de control pesimista suponiendo 2 hilos, hx y hy.&lt;br /&gt;
       &lt;br /&gt;
            int compartida = 1;&lt;br /&gt;
      no_permito_acceso_variable_compartida();  /* protocolo de entrada */&lt;br /&gt;
            compartida++;                       /* sección crítica */&lt;br /&gt;
      permito_acceso_a_variable_compartida();   /* protocolo de salida */&lt;br /&gt;
'''¿Cómo implementamos el protocolo de E/S en el control de concurrencia pesimista?'''&lt;br /&gt;
&lt;br /&gt;
Interrumpiendo la conmutación, desactivando las interrupciones, seguidamente ejecutando la sección crítica y finalmente permitiendo el acceso a las variables compartidas y activando las interrupciones.&lt;br /&gt;
&lt;br /&gt;
'''¿Cómo implementar el control de concurrencia pesimista?'''&lt;br /&gt;
&lt;br /&gt;
*Espera ocupada/activa : cerrojos. Se comprueba continuamente la condición que permite franquear el protocolo de entrada&lt;br /&gt;
*Espera no ocupada/no activa : semáforos, monitores y mensajes. Se pasa a estado bloqueado cuando no se puede franquear el protocolo de entrada.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_otros_aspectos_de_la_planificaci%C3%B3n/Solucion_del_ejercicio_1&amp;diff=521</id>
		<title>Ejercicios otros aspectos de la planificación/Solucion del ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_otros_aspectos_de_la_planificaci%C3%B3n/Solucion_del_ejercicio_1&amp;diff=521"/>
				<updated>2011-03-23T08:27:07Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= FIFO no apropiativo con multiprocesamiento =&lt;br /&gt;
Para este caso disponemos de 2 Procesadores, y supondremos que el planificador se ejecuta en uno de ellos&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;__|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|_4__|&lt;br /&gt;
           problema  _t__|_5__|_3__|_1__|_6__|_2__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                       +++ = procesador 1&lt;br /&gt;
                       --- = procesador 2&lt;br /&gt;
 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
    Pa             &amp;lt;+++|+++|+++|+++|+++&amp;gt;   |   |   |   |   |   |   |&lt;br /&gt;
    Pb             |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |&lt;br /&gt;
    Pc             |   |   &amp;lt;   |   |---&amp;gt;   |   |   |   |   |   |   |&lt;br /&gt;
    Pd             |   |   |   &amp;lt;   |   |+++|+++|+++|+++|+++|+++&amp;gt;   |&lt;br /&gt;
    Pe             |   |   |   |   &amp;lt;   |---|---&amp;gt;   |   |   |   |   |&lt;br /&gt;
    Planificador   X   X   X   X   X   X   |   |   |   |   |   X   |&lt;br /&gt;
                   |___|___|___|___|___|___|___|___|___|___|___|___|___&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12&lt;br /&gt;
 &lt;br /&gt;
                         _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;__|&lt;br /&gt;
              Cálculos   __t__|_5__|_3__|_1__|_6__|_2__|&lt;br /&gt;
             de tiempos  __T__|_5__|_3__|_3__|_8__|_3__|&lt;br /&gt;
                         _T/t_|_1__|_1__|_3__|1.33|_1.5|&lt;br /&gt;
                           |&lt;br /&gt;
                           |_&amp;gt; Indice de penalización&lt;br /&gt;
&lt;br /&gt;
= SFJ no apropriativo con multiprocesamiento =&lt;br /&gt;
&lt;br /&gt;
La solución es igual que el FIFO no apropiativo con multiprocesamiento.&lt;br /&gt;
&lt;br /&gt;
= SFJ apropiativo con multiprocesamiento =&lt;br /&gt;
&lt;br /&gt;
Para este caso disponemos de 2 Procesadores, y supondremos que el planificador se ejecuta en uno de ellos&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;__|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|_4__|&lt;br /&gt;
           problema  _t__|_5__|_3__|_1__|_6__|_2__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                       +++ = procesador 1&lt;br /&gt;
                       --- = procesador 2&lt;br /&gt;
    &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
    Pa             &amp;lt;+++|+++|   |+++|+++|+++&amp;gt;   |   |   |   |   |   |&lt;br /&gt;
    Pb             |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |&lt;br /&gt;
    Pc             |   |   &amp;lt;+++&amp;gt;   |   |   |   |   |   |   |   |   |&lt;br /&gt;
    Pd             |   |   |   &amp;lt;   |   |   |+++|+++|+++|+++|+++|+++&amp;gt;&lt;br /&gt;
    Pe             |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |&lt;br /&gt;
     Planificador  X   X   X   X   X   |   X   |   |   |   |   |   X&lt;br /&gt;
                   |___|___|___|___|___|___|___|___|___|___|___|___|___&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12&lt;br /&gt;
           &lt;br /&gt;
                         _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;__|&lt;br /&gt;
              Cálculos   __t__|_5__|_3__|_1__|_6__|_2__|&lt;br /&gt;
             de tiempos  __T__|_6__|_3__|_1__|_9__|_2__|&lt;br /&gt;
                         _T/t_|_1.2|_1__|_1__|_1.5|_1__|&lt;br /&gt;
                           |&lt;br /&gt;
                           |_&amp;gt; Indice de penalización&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
Observaciones&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
-En este caso, pd podría haberse procesado en cualquiera de los dos procesadores,¿no?. ¿O hay que suponer que cuando ambos procesadores están ociosos se utiliza el primero?.&lt;br /&gt;
&lt;br /&gt;
- Creo que si. En clase dijeron que se suponen las mismas características para ambos procesadores, por lo que no hay preferencia por uno en concreto.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=515</id>
		<title>Sol-ejer2-planif-procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=515"/>
				<updated>2011-03-23T08:06:50Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Por prioridades */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Turno rotatorio estricto =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               Pa  &amp;lt;---|   |   |   |   |---|   |   |   |---&amp;gt;   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               Pb  |   &amp;lt;---|---|   |   |   |---|   |   |   |---|---&amp;gt;   |   |   |   |   |   |   |   &lt;br /&gt;
               Pc  |   |   &amp;lt;   |---|---|   |   |---|---|   |   |   |---|---&amp;gt;   |   |   |   |   |   &lt;br /&gt;
     Planificador  X   X   |   X   |   X   X   X   |   X   X   |   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_Pa_|_Pb_|_Pc_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_10_|_11_|_12_|&lt;br /&gt;
                   _T/t_|3.3_|2.2_|_2__|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notése que el proceso A no llega a emplear el ''quantum'' que tiene asignado, en ese caso, como indica la [[Criterios_de_planificación|teoría]], se le retira el procesador y el planificador selecciona a otro proceso. Dejar el procesador sin proceso asignado, es decir, ocioso, va contra la lógica del máximo aprovechamiento del procesador. Por ello, he retirado una solución incorrecta que aparecía en esta sección. --[[Usuario:Pneira|Pneira]] 21:15 21 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tengo una duda en este ejercicio, en la unidad de tiempo 6 cuando el planificador activa el proceso Pb, porque motivo solo le asigna una unidad de tiempo?, podria asignarle 2 no? teniendo en cuenta que el quantum = 2. Ademas el proceso B bloquea cada 3 unidades de tiempo, no entiendo porque solo le asigna una unidad y luego activa en la unidad de tiempo 7 el proceso C.  LFE (Luis Fernandez Esteban)&lt;br /&gt;
&lt;br /&gt;
Pues yo diría que es porque se bloquea cada 3, al igual que el A se bloquea a cada unidad. Ya llevaba 1, y con esa actividad, +2 --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
Gracias, tienes razon ya lo entendi. LFE (Luis Fernandez Esteban)&lt;br /&gt;
&lt;br /&gt;
= Por prioridades =&lt;br /&gt;
&lt;br /&gt;
Suponiendo que la prioridad de los procesos es la siguiente: A&amp;lt;B&amp;lt;C&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &amp;lt;---|   |   |   |   |   |   |   |   |   |---|   |   |   |---&amp;gt;   |   |   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  |   &amp;lt;---|   |   |   |   |   |   |---|---|   |   |---|---&amp;gt;   |   |   |   |   |            &lt;br /&gt;
               P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  |   |   &amp;lt;---|---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
     Planificador  X   X   X   |   |   |   |   |   X   |   X   X   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_15_|_13_|_6_|&lt;br /&gt;
                   _T/t_|__5_|_2.6|_1__|&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Alguien me puede explicar ¿por que de 14 a 15 no se procesa nada? AnaBarros&lt;br /&gt;
&lt;br /&gt;
Creo que eso esta mal...y he visto mas fallos por ahi o eso me parece... :S    Luis Fernandez Esteban&lt;br /&gt;
&lt;br /&gt;
Sí lo creo como el C solo debia de empenzar en el 3 pero empienza antes. Ana Barros&lt;br /&gt;
&lt;br /&gt;
Del 14 al 15 no se procesa nada porque sólo quedan los procesos A y B, pero en esa unidad de tiempo ambos están bloqueados (los bloqueos de A y B duran 2 uds. de tiempo)&lt;br /&gt;
&lt;br /&gt;
= Turno rotatorio proporcional al número de procesos =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A &amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C &amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                 &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &amp;lt;---|   |   |---|   |   |---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  |   &amp;lt;---|   |   |---|   |   |---|   |   |---|   |---&amp;gt;   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  |   |   &amp;lt;---|   |   |---|   |   |---|---|   |---|   |---&amp;gt;   |   |   |   |   |   |&lt;br /&gt;
    Planificador &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; X   X   X   X   X   X   X   X   X   |   X   X   X   X   |   |   |   |   |   |   |   &lt;br /&gt;
            &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; -----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20&lt;br /&gt;
 &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_7__|_12_|_12_|&lt;br /&gt;
                   _T/t_|2.3_|2.4_|_2__|&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
Observaciones&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
- Al no existir en el instante de tiempo 0 problemas de concurrencia de procesos, ¿no debería el proceso A tener derecho a sus dos unidades de tiempo de quantum, aunque este solo utilice una unidad de tiempo debido al bloqueo por E/S?. Esto dejaría al procesador con dos procesos en estado preparado (B y C) en el instante de tiempo 2, donde ya se reduciría el quantum a 1 debido a la existencia de 2 o más procesos en estado preparado. ¿Cómo lo veis?&lt;br /&gt;
&lt;br /&gt;
Creo que no, porque ya en el instante 1 hay dos procesos en el planificador, por lo que el quantum ya se reduce.&lt;br /&gt;
&lt;br /&gt;
Cierto, además creo que aunque A no se bloquease, se le seguiría asignando 1 unidad de tiempo en t=1 al proceso B: Entraría el planificador, reduciría el quantum, y al no haber compensación, A pasaría de nuevo al final de la cola del turno rotatorio, dejando el procesador a B, ¿no?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Duda: En el instante 9 no debería entrar el proceso Pb en vez de seguir el Pc??&lt;br /&gt;
&lt;br /&gt;
Lo dudo, porque el bloqueo de B dura 2 unidades, así que C tiene carta libre.--[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
- Duda: ¿Por que el proceso C se ejecuta en el instante 11 habiendo sido bloqueado en el 10?,se supone que todos los procesos tienen un tiempo de bloqueo de 2 unidades&lt;br /&gt;
&lt;br /&gt;
El proceso C no se bloquea nunca (o al menos en el enunciado no lo pone), por eso se ejecuta cada vez que puede.&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=412</id>
		<title>Sol-ejer2-planif-procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=412"/>
				<updated>2011-03-22T09:07:59Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Turno rotatorio estricto =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               Pa  &amp;lt;---|   |   |   |   |---|   |   |   |---&amp;gt;   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               Pb  |   &amp;lt;---|---|   |   |   |---|   |   |   |---|---&amp;gt;   |   |   |   |   |   |   |   &lt;br /&gt;
               Pc  |   |   &amp;lt;   |---|---|   |   |---|---|   |   |   |---|---&amp;gt;   |   |   |   |   |   &lt;br /&gt;
     Planificador  X   X   |   X   |   X   X   X   |   X   X   |   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_Pa_|_Pb_|_Pc_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_10_|_11_|_12_|&lt;br /&gt;
                   _T/t_|3.3_|2.2_|_2__|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notése que el proceso A no llega a emplear el ''quantum'' que tiene asignado, en ese caso, como indica la [[Criterios_de_planificación|teoría]], se le retira el procesador y el planificador selecciona a otro proceso. Dejar el procesador sin proceso asignado, es decir, ocioso, va contra la lógica del máximo aprovechamiento del procesador. Por ello, he retirado una solución incorrecta que aparecía en esta sección. --[[Usuario:Pneira|Pneira]] 21:15 21 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
= Por prioridades =&lt;br /&gt;
&lt;br /&gt;
Suponiendo que la prioridad de los procesos es la siguiente: A&amp;lt;B&amp;lt;C&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &amp;lt;---|   |   |   |   |   |   |   |   |   |---|   |   |   |---&amp;gt;   |   |   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  |   &amp;lt;---|   |   |   |   |   |   |---|---|   |   |---|---&amp;gt;   |   |   |   |   |            &lt;br /&gt;
               P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  |   |   &amp;lt;---|---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
     Planificador  X   X   X   |   |   |   |   |   X   |   X   X   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_15_|_13_|_6_|&lt;br /&gt;
                   _T/t_|__5_|_2.6|_1__|&lt;br /&gt;
&lt;br /&gt;
= Turno rotatorio proporcional al número de procesos =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A &amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C &amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                 &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &amp;lt;---|   |   |---|   |   |---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  |   &amp;lt;---|   |   |---|   |   |---|   |   |---|   |---&amp;gt;   |   |   |   |   |   |   |&lt;br /&gt;
               P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  |   |   &amp;lt;---|   |   |---|   |   |---|---|   |---|   |---&amp;gt;   |   |   |   |   |   |&lt;br /&gt;
    Planificador &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; X   X   X   X   X   X   X   X   X   |   X   X   X   X   |   |   |   |   |   |   |   &lt;br /&gt;
            &amp;lt;sub&amp;gt; &amp;lt;/sub&amp;gt; -----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20&lt;br /&gt;
 &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_7__|_12_|_12_|&lt;br /&gt;
                   _T/t_|2.3_|2.4_|_2__|&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
Observaciones&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
- Al no existir en el instante de tiempo 0 problemas de concurrencia de procesos, ¿no debería el proceso A tener derecho a sus dos unidades de tiempo de quantum, aunque este solo utilice una unidad de tiempo debido al bloqueo por E/S?. Esto dejaría al procesador con dos procesos en estado preparado (B y C) en el instante de tiempo 2, donde ya se reduciría el quantum a 1 debido a la existencia de 2 o más procesos en estado preparado. ¿Cómo lo veis?&lt;br /&gt;
&lt;br /&gt;
Creo que no, porque ya en el instante 1 hay dos procesos en el planificador, por lo que el quantum ya se reduce.&lt;br /&gt;
&lt;br /&gt;
Cierto, además creo que aunque A no se bloquease, se le seguiría asignando 1 unidad de tiempo en t=1 al proceso B: Entraría el planificador, reduciría el quantum, y al no haber compensación, A pasaría de nuevo al final de la cola del turno rotatorio, dejando el procesador a B, ¿no?&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=128</id>
		<title>Criterios de planificación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=128"/>
				<updated>2011-03-07T14:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Enlaces internos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Métodos no apropiativos =&lt;br /&gt;
&lt;br /&gt;
El procesador es asignado al proceso hasta fin de ejecución. Suele darse en sistemas operativos monoprogramables y sistemas de tiempo real.&lt;br /&gt;
&lt;br /&gt;
== Estocástico ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona aleatoriamente un procesos. No cumple varios [[Planificación de procesos#Aspectos para diseñar un buen planificador|aspectos de diseño de un buen planificador]], como repetitibilidad o predecibilidad. Su uso es establecer una cota inferior a la hora de diseñar un planificador: Si éste presenta peores resultados que el método estocástico, significa que estará mal diseñado.&lt;br /&gt;
&lt;br /&gt;
== Con conocimiento del futuro ==&lt;br /&gt;
&lt;br /&gt;
En base al conocimiento del futuro se asignan los procesos. Representa una cota superior, es decir, mientras un planificador tenga un comportamiento más parecido a este método, mejor diseñado estará.&lt;br /&gt;
&lt;br /&gt;
== Por orden de llegada (First In, First Out: FIFO) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el procesa por orden de lanzamiento. Su principales ventajas son su facilidad de implementación, y su orden de complejidad, O(1). Su desventaja es que los procesos de corta duración presentarán un alto índice de penalización.&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución. Para procesos largos puede presentar un índice de penalización elevado: Si se tienen muchos procesos cortos, el de mayor duración puede quedar en espera indefinidamente. Su orden de complejidad es O(n).&lt;br /&gt;
&lt;br /&gt;
== Basado en índice de penalización ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que lleva más tiempo sin estar en estado activo. Estima los índices de penalización y elige el de mayor valor.&lt;br /&gt;
&lt;br /&gt;
= Métodos apropiativos =&lt;br /&gt;
&lt;br /&gt;
El planificador puede retirar el procesador en cualquier momento al proceso activo. Suele darse en sistemas operativos [[Multiprogramación|multiprogramables]].&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución. Si hay un proceso en estado preparado que requiere menos tiempo de ejecución, se le asigna el procesador.&lt;br /&gt;
&lt;br /&gt;
== Por prioridades ==&lt;br /&gt;
&lt;br /&gt;
Se establecen índices de prioridad a cada proceso:&lt;br /&gt;
&lt;br /&gt;
* Índice estático: Establecido por el usuario.&lt;br /&gt;
* Índice dinámico: Establecido por el planificador, inicialmente basado en el índice estático.&lt;br /&gt;
&lt;br /&gt;
En el caso de Linux, como sucede con otros sistemas tipo-Unix, se dispone de una índice denominado ''nice value'' cuyos valores están entre -20 (máxima prioridad) y 19 (mínima prioridad).&lt;br /&gt;
&lt;br /&gt;
== Turno rotatorio (Round Robin: RR) ==&lt;br /&gt;
&lt;br /&gt;
== Colas multinivel ==&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos&amp;diff=127</id>
		<title>Planificación de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos&amp;diff=127"/>
				<updated>2011-03-07T14:42:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: /* Aspectos para diseñar un buen planidicador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El objetivo de la planificación de procesos es estudiar los posibles criterios de selección que puede emplear el planificador de procesos. La función de estos criterios es elegir el proceso que va a ser asignado al procesador. Para el iiestudio vamos a definir los siguientes criterios.&lt;br /&gt;
&lt;br /&gt;
==Indices de evaluacion==&lt;br /&gt;
&lt;br /&gt;
*Tiempo de ejecución : hace referencia al tiempo que el proceso está asignado al procesador. ('''t'''ejecución)&lt;br /&gt;
*Tiempo de terminación : es la diferencia entre el momento de llegada y el momento de terminación del un proceso. ('''T'''terminación)&lt;br /&gt;
*Tiempo perdido : es la diferencia entre el tiempo de ejecución y el tiempo de terminación. (T-t)&lt;br /&gt;
*Índice de penalización : indica cuanto más ha dado un proceso en ejecutarse respecto a si hubiera tenido el procesador en exclusividad. ((T/t)=x , tarda (x-1) veces más)&lt;br /&gt;
*Índice de respuesta : es el inverso del índice de penalización. (t/T)&lt;br /&gt;
*Tiempo del sistema : es el tiempo empleado por el planificador de procesos.&lt;br /&gt;
*Tiempo de inactividad : es el tiempo durante el cual el procesador está ocioso, es decir, no hace nada (idle).&lt;br /&gt;
*Tiempo de espera : es el tiempo desde el lanzamiento a estado preparado.&lt;br /&gt;
&lt;br /&gt;
==Aspectos para diseñar un buen planificador==&lt;br /&gt;
&lt;br /&gt;
*'''Repetitividad''' : con cargas de trabajo (cantidad de procesos a atender) similares, el procesador debe tener comportamientos similares.&lt;br /&gt;
*'''Predecivilidad''' : hace referencia la tiempo de terminación de un proceso para cierta carga de trabajo, deben ser similares con cargas de trabajo parecidas.&lt;br /&gt;
*'''Eficiencia''' : debe tomar decisiones rápidas para aumentar el rendimiento.&lt;br /&gt;
*'''Reducir el número de conmutaciones''' : de nuevo, para aumentar el rendimiento y reducir la penalización asociada.&lt;br /&gt;
*'''Atender prioridades'''.&lt;br /&gt;
*A mayores cargas de trabajo el rendimiento debe '''degradar uniformemente'''.&lt;br /&gt;
*Los '''tiempos de espera''' para atender a procesos deben ser '''aceptables''' (&amp;lt; 100 ns).&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Alexrdp&amp;diff=126</id>
		<title>Usuario:Alexrdp</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Alexrdp&amp;diff=126"/>
				<updated>2011-03-07T14:18:11Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Página nueva: Alejandro Rodas de Paz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alejandro Rodas de Paz&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=125</id>
		<title>Criterios de planificación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=125"/>
				<updated>2011-03-07T14:12:55Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Añadir usos y ventajas explicadas en clase&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Métodos no apropiativos =&lt;br /&gt;
&lt;br /&gt;
El procesador es asignado al proceso hasta fin de ejecución. Suele darse en sistemas operativos monoprogramables y sistemas de tiempo real.&lt;br /&gt;
&lt;br /&gt;
== Estocástico ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona aleatoriamente un procesos. No cumple varios aspectos de diseño de un buen planificador, como repetitibilidad o predecibilidad. Su uso es establecer una cota inferior a la hora de diseñar un planificador: Si éste presenta peores resultados que el método estocástico, significa que estará mal diseñado.&lt;br /&gt;
&lt;br /&gt;
== Con conocimiento del futuro ==&lt;br /&gt;
&lt;br /&gt;
En base al conocimiento del futuro se asignan los procesos. Representa una cota superior, es decir, mientras un planificador tenga un comportamiento más parecido a este método, mejor diseñado estará.&lt;br /&gt;
&lt;br /&gt;
== Por orden de llegada (First In, First Out: FIFO) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el procesa por orden de lanzamiento. Su principales ventajas son su facilidad de implementación, y su orden de complejidad, O(1). Su desventaja es que los procesos de corta duración presentarán un alto índice de penalización.&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
== Basado en índice de penalización ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que lleva más tiempo sin estar en estado activo.&lt;br /&gt;
&lt;br /&gt;
= Métodos apropiativos =&lt;br /&gt;
&lt;br /&gt;
El planificador puede retirar el procesador en cualquier momento al proceso activo. Suele darse en sistemas operativos multiprogramables.&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución. Si hay un proceso en estado preparado que requiere menos tiempo de ejecución, se le asigna el procesador.&lt;br /&gt;
&lt;br /&gt;
== Por prioridades ==&lt;br /&gt;
&lt;br /&gt;
Se establecen índices de prioridad a cada proceso:&lt;br /&gt;
&lt;br /&gt;
* Índice estático: Establecido por el usuario.&lt;br /&gt;
* Índice dinámico: Establecido por el planificador, inicialmente basado en el índice estático.&lt;br /&gt;
&lt;br /&gt;
En el caso de Linux, como sucede con otros sistemas tipo-Unix, se dispone de una índice denominado ''nice value'' cuyos valores están entre -20 (máxima prioridad) y 19 (mínima prioridad).&lt;br /&gt;
&lt;br /&gt;
== Turno rotatorio (Round Robin: RR) ==&lt;br /&gt;
&lt;br /&gt;
== Colas multinivel ==&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Grafica_ind_evaluacion1.png&amp;diff=103</id>
		<title>Archivo:Grafica ind evaluacion1.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Grafica_ind_evaluacion1.png&amp;diff=103"/>
				<updated>2011-03-02T14:58:57Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=102</id>
		<title>Índices de evaluación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=102"/>
				<updated>2011-03-02T14:39:27Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Tiempo de ejecución''' (t&amp;lt;sub&amp;gt;ejecución&amp;lt;/sub&amp;gt;): tiempo total asignado al procesador.&lt;br /&gt;
* '''Tiempo de terminación''' (T&amp;lt;sub&amp;gt;terminación&amp;lt;/sub&amp;gt;): diferencia entre el momento de llegada y de terminación.&lt;br /&gt;
* '''Tiempo perdido''': T-t . Es el tiempo en que no hace nada útil.&lt;br /&gt;
* '''Tiempo de inactividad''': tiempo durante el cual el procesador está ocioso, no hace nada (idle). Este tiempo puede deberse a un mal diseño del planificador.&lt;br /&gt;
* '''Tiempo del sistema''': tiempo empleado por el planificador.&lt;br /&gt;
* '''Tiempo de espera''': tiempo desde el lanzamiento hasta el estado preparado&lt;br /&gt;
* '''Índice de penalización''': T/t = x. El proceso ha tardado x-1 veces más en ejecutarse que si hubiera tenido el procesador para él solo.&lt;br /&gt;
* '''Índice de respuesta''': inverso al anterior.&lt;br /&gt;
&lt;br /&gt;
Ej:&lt;br /&gt;
&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
 Px |---.   .---.   .--|.   .&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
    |___.___.___.___.___.___.___&amp;gt;t&lt;br /&gt;
    0   1   2   3   4   5   6&lt;br /&gt;
&lt;br /&gt;
* t   = 3 : los 3 intervalos en los que se procesa&lt;br /&gt;
* T   = 5 : unidades de tiempo desde que se inicia hasta que se finaliza el proceso&lt;br /&gt;
* T-t = 2 : huequitos en los que el proceso está abierto sin estar procesándose&lt;br /&gt;
* x   = 5/3 = 1.67 : el proceso ha tardado un 67% más que si hubiese tenido el procesador exclusivamente&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=101</id>
		<title>Índices de evaluación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=101"/>
				<updated>2011-03-02T14:13:26Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Tiempo de ejecución''' (t&amp;lt;sub&amp;gt;ejecución&amp;lt;/sub&amp;gt;): tiempo total asignado al procesador.&lt;br /&gt;
* '''Tiempo de terminación''' (T&amp;lt;sub&amp;gt;terminación&amp;lt;/sub&amp;gt;): diferencia entre el momento de llegada y de terminación.&lt;br /&gt;
* '''Tiempo perdido''': T-t . Es el tiempo en que no hace nada útil.&lt;br /&gt;
* '''Tiempo de inactividad''': tiempo durante el cual el procesador está ocioso, no hace nada (idle)&lt;br /&gt;
* '''Tiempo del sistema''': tiempo empleado por el planificador&lt;br /&gt;
* '''Tiempo de espera''': tiempo desde el lanzamiento hasta el estado preparado&lt;br /&gt;
* '''Índice de penalización''': T/t = x. El proceso ha tardado x-1 veces más en ejecutarse que si hubiera tenido el procesador para él solo.&lt;br /&gt;
* '''Índice de respuesta''': inverso al anterior&lt;br /&gt;
&lt;br /&gt;
Ej:&lt;br /&gt;
&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
 Px |---.   .---.   .--|.   .&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
    |   .   .   .   .   .   .&lt;br /&gt;
    |___.___.___.___.___.___.___&amp;gt;t&lt;br /&gt;
    0   1   2   3   4   5   6&lt;br /&gt;
&lt;br /&gt;
* t   = 3 : los 3 intervalos en los que se procesa&lt;br /&gt;
* T   = 5 : unidades de tiempo desde que se inicia hasta que se finaliza el proceso&lt;br /&gt;
* T-t = 2 : huequitos en los que el proceso está abierto sin estar procesándose&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Grafica_ind_evaluacion.jpg&amp;diff=100</id>
		<title>Archivo:Grafica ind evaluacion.jpg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Grafica_ind_evaluacion.jpg&amp;diff=100"/>
				<updated>2011-03-02T14:11:49Z</updated>
		
		<summary type="html">&lt;p&gt;Alexrdp: Gráfica para los índices de evaluación&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gráfica para los índices de evaluación&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	</feed>