<?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=Albrojfer1</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=Albrojfer1"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php/Especial:Contribuciones/Albrojfer1"/>
		<updated>2026-06-17T00:09:16Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Subidas_de_notas&amp;diff=2956</id>
		<title>Subidas de notas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Subidas_de_notas&amp;diff=2956"/>
				<updated>2014-02-26T13:35:53Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pérez Asién, Manuel (manperasi)&lt;br /&gt;
&lt;br /&gt;
Rojas Fernández, Alberto (albrojfer1)&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Subidas_de_notas&amp;diff=2955</id>
		<title>Subidas de notas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Subidas_de_notas&amp;diff=2955"/>
				<updated>2014-02-26T13:35:25Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pérez Asién, Manuel (manperasi)&lt;br /&gt;
Rojas Fernández, Alberto (albrojfer1)&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Evaluame_mis_contribuciones_a_la_wiki&amp;diff=2913</id>
		<title>Evaluame mis contribuciones a la wiki</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Evaluame_mis_contribuciones_a_la_wiki&amp;diff=2913"/>
				<updated>2014-01-02T17:01:18Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A continuación, indica tu nombre y apellidos:&lt;br /&gt;
&lt;br /&gt;
* Juan Carlos Roldán Salvador IS-G1&lt;br /&gt;
* Daniel Ayala Hernández IS-G1&lt;br /&gt;
* Daniel de los Reyes Leal IS-G1&lt;br /&gt;
* Olga Minerva Moreno Martín IS-G1&lt;br /&gt;
* Vanessa Chipirrás Navalón IC&lt;br /&gt;
* Alejandro Sánchez Medina IS-G1&lt;br /&gt;
* Francisco Javier Borrego Cejudo IC-G2&lt;br /&gt;
* Samuel Martin Arenas IC-G2&lt;br /&gt;
* Álvaro Fernández García IS-G1&lt;br /&gt;
* Rafael Gomez Galbarro GIC2&lt;br /&gt;
* María Pérez Reina IS-G1&lt;br /&gt;
* José Antonio Rojo Vidal IS-G1&lt;br /&gt;
* Jorge Rodríguez Fuerte IS-G1&lt;br /&gt;
* Alberto Rojas Fernández IS-G1&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Albrojfer1&amp;diff=2888</id>
		<title>Usuario:Albrojfer1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Albrojfer1&amp;diff=2888"/>
				<updated>2013-12-17T22:08:20Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;~ Alberto Rojas Fernández 2º ING SOFTWARE 2013 - 2014 ~&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[http://www.linkedin.com/pub/alberto-rojas-fernández/7b/461/830 LinkedIn]&lt;br /&gt;
*[http://www.codecademy.com/es/albertfx Codeacademy]&lt;br /&gt;
*[https://github.com/AlbertFX91 Github]&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Albrojfer1&amp;diff=2887</id>
		<title>Usuario:Albrojfer1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Albrojfer1&amp;diff=2887"/>
				<updated>2013-12-17T22:02:41Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: Página creada con '~ Alberto Rojas Fernández 2º ING SOFTWARE 2013 - 2014 ~'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;~ Alberto Rojas Fernández 2º ING SOFTWARE 2013 - 2014 ~&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_tercera_oportunidad&amp;diff=2886</id>
		<title>Sol tercera oportunidad</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_tercera_oportunidad&amp;diff=2886"/>
				<updated>2013-12-17T22:01:03Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; '''2(W)--2(R)--3(R)--1(R)--1(W)--3(W)--4(W)--5(W)--1(R)--1(R)--2(W)--3(R)--4(R)'''&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  Cola: 2 -&lt;br /&gt;
                  Pagina 2    | R=1 |     |     |     |&lt;br /&gt;
                              |_M=1_|_____|_____|_____|&lt;br /&gt;
                 2º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |     |     |     | Nª de fallos: 1  Cola: 2 -&lt;br /&gt;
                  Pagina 2    | R=1 |     |     |     |&lt;br /&gt;
                              |_M=1_|_____|_____|_____|&lt;br /&gt;
                 3º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |     |     | Nª de fallos: 2  Cola: 2 - 3 &lt;br /&gt;
                  Pagina 3    | R=1 | R=1 |     |     |&lt;br /&gt;
                              |_M=1_|_M=0_|_____|_____|    &lt;br /&gt;
                 4º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1&lt;br /&gt;
                  Pagina 1    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=0_|_M=0_|_____| &lt;br /&gt;
                 5º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1   &lt;br /&gt;
                  Pagina 1    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=0_|_M=1_|_____|&lt;br /&gt;
                 6º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1&lt;br /&gt;
                  Pagina 3    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=1_|_M=0_|_____|&lt;br /&gt;
                 7º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |  4  | Nª de fallos: 4  Cola: 2 - 3 - 1 - 4 &lt;br /&gt;
                  Pagina 4    | R=1 | R=1 | R=1 | R=1 |  &lt;br /&gt;
                              |_M=1_|_M=1_|_M=0_|_M=1_| &lt;br /&gt;
                 8º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  5  |  4  | Nª de fallos: 5  Cola: 2 - 3 - 4 - 5 &lt;br /&gt;
                  Pagina 5    | R=0 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|    &lt;br /&gt;
                 9º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  3  |  5  |  4  | Nª de fallos: 6  Cola: 3 - 4 - 5 - 1&lt;br /&gt;
                  Pagina 1    | R=1 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|  &lt;br /&gt;
                10º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  3  |  5  |  4  | Nª de fallos: 6  Cola: 3 - 4 - 5 - 1 &lt;br /&gt;
                  Pagina 1    | R=1 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|  &lt;br /&gt;
                11º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  2  |  5  |  4  | Nª de fallos: 7  Cola: 4 - 5 - 1 - 2 &lt;br /&gt;
                  Pagina 2    | R=1 | R=1 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=1_|_M=1_|&lt;br /&gt;
                12º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  2  |  5  |  3  | Nª de fallos: 8  Cola: 5 - 1 - 2 - 3&lt;br /&gt;
                  Pagina 3    | R=0 | R=0 | R=0 | R=1 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=1_|_M=0_| &lt;br /&gt;
                13º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  4  |  2  |  5  |  3  | Nª de fallos: 9  Cola: 5 - 2 - 3 - 4   &lt;br /&gt;
                  Pagina 4    | R=1 | R=0 | R=0 | R=1 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=0_|_M=0_|&lt;br /&gt;
&lt;br /&gt;
                         9&lt;br /&gt;
     Tasa fallos pág = ───── = 0,692307&lt;br /&gt;
                        13&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_tercera_oportunidad&amp;diff=2885</id>
		<title>Sol tercera oportunidad</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_tercera_oportunidad&amp;diff=2885"/>
				<updated>2013-12-17T21:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: Página creada con ' '''2(W)--2(R)--3(R)--1(R)--1(W)--3(W)--4(W)--5(W)--1(R)--1(R)--2(W)--3(R)--4(R)'''                                ___1____ 2_____3_____4___                  1º Acceso    |    …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; '''2(W)--2(R)--3(R)--1(R)--1(W)--3(W)--4(W)--5(W)--1(R)--1(R)--2(W)--3(R)--4(R)'''&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  Cola: 2 -&lt;br /&gt;
                  Pagina 2    | R=1 |     |     |     |&lt;br /&gt;
                              |_M=1_|_____|_____|_____|&lt;br /&gt;
                 2º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |     |     |     | Nª de fallos: 1  Cola: 2 -&lt;br /&gt;
                  Pagina 2    | R=1 |     |     |     |&lt;br /&gt;
                              |_M=1_|_____|_____|_____|&lt;br /&gt;
                 3º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |     |     | Nª de fallos: 2  Cola: 2 - 3 &lt;br /&gt;
                  Pagina 3    | R=1 | R=1 |     |     |&lt;br /&gt;
                              |_M=1_|_M=0_|_____|_____|    &lt;br /&gt;
                 4º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1&lt;br /&gt;
                  Pagina 1    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=0_|_M=0_|_____| &lt;br /&gt;
                 5º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1   &lt;br /&gt;
                  Pagina 1    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=0_|_M=1_|_____|&lt;br /&gt;
                 6º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3  Cola: 2 - 3 - 1&lt;br /&gt;
                  Pagina 3    | R=1 | R=1 | R=1 |     |  &lt;br /&gt;
                              |_M=1_|_M=1_|_M=0_|_____|&lt;br /&gt;
                 7º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |  4  | Nª de fallos: 4  Cola: 2 - 3 - 1 - 4 &lt;br /&gt;
                  Pagina 4    | R=1 | R=1 | R=1 | R=1 |  &lt;br /&gt;
                              |_M=1_|_M=1_|_M=0_|_M=1_| &lt;br /&gt;
                 8º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  5  |  4  | Nª de fallos: 5  Cola: 2 - 3 - 4 - 5 &lt;br /&gt;
                  Pagina 5    | R=0 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|    &lt;br /&gt;
                 9º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  3  |  5  |  4  | Nª de fallos: 6  Cola: 3 - 4 - 5 - 1&lt;br /&gt;
                  Pagina 1    | R=1 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|  &lt;br /&gt;
                10º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  3  |  5  |  4  | Nª de fallos: 6  Cola: 3 - 4 - 5 - 1 &lt;br /&gt;
                  Pagina 1    | R=1 | R=0 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=0_|_M=1_|_M=1_|  &lt;br /&gt;
                11º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  2  |  5  |  4  | Nª de fallos: 7  Cola: 4 - 5 - 1 - 2 &lt;br /&gt;
                  Pagina 2    | R=1 | R=1 | R=1 | R=0 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=1_|_M=1_|&lt;br /&gt;
                12º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  1  |  2  |  5  |  3  | Nª de fallos: 8  Cola: 5 - 1 - 2 - 3&lt;br /&gt;
                  Pagina 3    | R=0 | R=0 | R=0 | R=1 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=1_|_M=0_| &lt;br /&gt;
                13º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  4  |  2  |  5  |  3  | Nª de fallos: 9  Cola: 5 - 2 - 3 - 4   &lt;br /&gt;
                  Pagina 4    | R=1 | R=0 | R=0 | R=1 |  &lt;br /&gt;
                              |_M=0_|_M=1_|_M=0_|_M=0_|&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=2884</id>
		<title>Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=2884"/>
				<updated>2013-12-17T21:17:36Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
Un segmento es un espacio de memoria de tamaño variable, compuesto por:&lt;br /&gt;
*Descriptor: Identificador único del segmento (dentro del espacio de memoria del proceso).&lt;br /&gt;
*Tamaño del segmento&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segmentos.png|725px]]&lt;br /&gt;
&lt;br /&gt;
=Características=&lt;br /&gt;
*Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.&lt;br /&gt;
&lt;br /&gt;
*Solapamiento: Se puede hacer que 2 segmentos se superpongan de manera que compartan direcciones de memoria física con direcciones lógicas diferentes. Para evitar problemas de concurrencia, debe de indicarse explícitamente que una porción de memoria pueda ser compartida. De esta manera, procesos diferentes pueden compartir información y código usando la memoria común.&lt;br /&gt;
&lt;br /&gt;
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).&lt;br /&gt;
&lt;br /&gt;
*Cuando un proceso requiere más memoria se crea un nuevo segmento.&lt;br /&gt;
&lt;br /&gt;
*Dos instancias de un mismo proceso pueden compartir segmentos de memoria de instrucciones/código, pero no para datos ya que esto complicaría la gestión.&lt;br /&gt;
&lt;br /&gt;
*Es posible la redimensión de segmentos siempre que haya posiciones libres contiguas, o crear un nuevo segmento y copiar el contenido del anterior.&lt;br /&gt;
&lt;br /&gt;
*Gestión compleja, sobretodo por su tamaño variable&lt;br /&gt;
&lt;br /&gt;
*Permite la carga de segmentos a petición, de manera que no se disponga de todos los segmentos en memoria principal, que se puedan descargar a disco (en la zona de intercambio o swap) en base a un cierto criterio (ver [[Intro | Memoria virtual]]). Esta zona de intercambio puede ser:&lt;br /&gt;
**Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
**Un fichero oculto de tamaño fijo o variable dependiendo de la configuración dada por el usuario (Windows).&lt;br /&gt;
&lt;br /&gt;
*La segmentación se hizo para equipos con poca memoria, no está pensada para sistemas modernos.&lt;br /&gt;
&lt;br /&gt;
=Mecanismos=&lt;br /&gt;
Los diferentes mecanismos que nos ofrece la segmentación de memoria son los siguientes.&lt;br /&gt;
==Carga de segmentos a petición==&lt;br /&gt;
Es un mecanismo que permite a un proceso no disponer de todos sus segmentos en memoria principal, se pueden descargar a disco (en la zona de intercambio o swap) segmentos en base a un cierto criterio (ver [[Intro | Memoria virtual]]). &lt;br /&gt;
&lt;br /&gt;
Esta zona de intercambio puede ser:&lt;br /&gt;
&lt;br /&gt;
* Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
&lt;br /&gt;
* Un fichero oculto de tamaño fijo o variable dependiendo de la configuracion dada por el usuario (Windows).&lt;br /&gt;
&lt;br /&gt;
==Formas de uso de los descriptores==&lt;br /&gt;
En cuanto a aspectos materiales, se plantea el problema de que no es habitual que la tabla de segmentos quepa en el dispositivo de traducción (MMU), por lo que se almacena la tabla en memoria, y el MMU contiene su dirección. El problema es que esta técnica hace que el tiempo de acceso se duplique, al haber un primer acceso al MMU y un segundo acceso a la dirección efectiva. Se plantean dos soluciones no excluyentes:&lt;br /&gt;
* '''Uso de registros descriptores de segmento en MMU:'''&lt;br /&gt;
&amp;lt;blockquote&amp;gt; &lt;br /&gt;
En MMU nos encontraremos varios registros que pueden contener descriptores, en los que se copiarán los que se vayan a usar en un futuro inmediato. Hay dos tipos de registros:&lt;br /&gt;
*Registros de propósito general:&lt;br /&gt;
Registros sobre los que se cargan los próximos descriptores a usar, y dos tipos de direcciones:&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en la tabla de memoria (y necesitan más bits para hacer referencia al descriptor)&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en MMU (y necesitan menos bits para referir al descriptor)&lt;br /&gt;
*Registros especializados:&lt;br /&gt;
Registros capaces de albergar a un descriptor concreto, como el DS (Para manejo de datos), SS (Para manipulación de pila) o el CS (Para instrucciones de salto y llamadas a rutinas). También existen dos tipos de direcciones:&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en la tabla de memoria&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que no hacen referencia a ningún descriptor, y emplean descriptores de MMU, según el tipo de instrucción&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Uso de descriptores en memoria asociativa (Cache):'''&lt;br /&gt;
&amp;lt;blockquote&amp;gt; &lt;br /&gt;
La MMU contiene una memoria asociativa indexada por número de descriptor. Para cada acceso, se busca en la memoria asociativa el número de descriptor, y si no está, se carga a esta (Si se llena la memoria asociativa se lleva a cabo reemplazo). Este tipo de memoria es transparente, por lo que se puede usar en conjunción con registros descriptores de segmento en MMU.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Superposición de segmentos=&lt;br /&gt;
&lt;br /&gt;
El administrador de memoria puede definir segmentos superpuestos para crear áreas de memoria compartidas entre dos o más procesos del sistema. Los procesos emplean una llamada al sistema explícita para solicitar la creación del área de memoria compartida. El mecanismo de segmentos solapados es un aspecto propio del administrador de memoria, del que se puede valer para implementar la memoria compartida.&lt;br /&gt;
&lt;br /&gt;
=Crecimiento de proceso=&lt;br /&gt;
Existen dos formas de crecimiento: Asignando nuevos segmentos al proceso, y haciendo crecer algún segmento asignado. &lt;br /&gt;
Para crecer un segmento: si hay suficiente espacio libre contiguo, se actualiza el tamaño en el descriptor del segmento. Si no hay suficiente espacio: se define un nuevo segmento y se copia el contenido al nuevo segmento.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_reemplazo&amp;diff=2883</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=2883"/>
				<updated>2013-12-17T20:57:52Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Criterio de la 3ª oportunidad (Método Multics) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
El fallo de página se produce cuando se accede a una posición de memoria que pertenece a una página de memoria que esta descargada en disco.&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;math&amp;gt;tasa fallos pagina = \frac{total fallos de pagina}{total accesos a pagina}&amp;lt;/math&amp;gt;&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 está 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;
== Criterio de página óptima (OPT, MIN) ==&lt;br /&gt;
&lt;br /&gt;
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;
&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;
*[[sol_1|Solución]]&lt;br /&gt;
&lt;br /&gt;
Otra forma de evaluar la eficiencia de un criterio de selección de página víctima es observando su curva paracorde, que relaciona el nº de fallos de página con el nº de marcos. La de un buen criterio se aproximará a la curva del criterio óptimo, y la de uno malo, a la del criterio al azar, o incluso pésimo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Curvas paracordes.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo real se compara la efectividad de varios criterios en varios programas:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:img26.png]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de página pésima (MAX)==&lt;br /&gt;
&lt;br /&gt;
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. También implica tener conocimiento de futuro, por lo que no es implementable en la práctica.&lt;br /&gt;
&lt;br /&gt;
*[[sol_2|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica (aleatoria) ==&lt;br /&gt;
&lt;br /&gt;
Se trata también de un criterio teórico, serviría para aproximar la cota media de la ''tasa de fallos de página''. Consiste en seleccionar una página al azar.&lt;br /&gt;
&lt;br /&gt;
Dado que su implementación es trivial, cualquier algoritmo que de resultados similares a este será un mal criterio, pues seguro que su eficiencia será menor que la de no implementar ningún criterio y seleccionar una página al azar.&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU('''M'''ost '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona la última página a la que se ha accedido. Podría implementarse con una LIFO por orden de acceso. Es una aproximación implementable en la práctica del criterio MAX, pudiendo así compararlo con otros criterios. Según el principio de localidad, mientras más recientemente se haya accedido a una página, más probable es que vuelva a accederse a ella. Por ello, este criterio es muy deficiente, siendo su curva cercana a la pésima:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:MRU.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_3|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio por orden de carga FIFO ==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
El inconveniente de este criterio es que las páginas más usadas son las que más tiempo deberían permanecer en memoria, y son las más atacadas. No se debe suponer que, si las páginas “dejarán de ser necesarias”, implica que “ya no sean necesarias”.&lt;br /&gt;
Además, se produce la anomalía de Belady, efecto que consiste en la posibilidad de tener más fallos de página al aumentar el número de marcos en la memoria física:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FIFO.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_5|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio NRU ('''N'''ot '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
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;
&lt;br /&gt;
En resumen, el bit R se pondrá a 1 ante cualquier tipo de acceso, y el bit M se pondrá a 1 sólo ante eventos de escritura.&lt;br /&gt;
&lt;br /&gt;
Para seleccionar la página víctima iteramos sobre los marcos cargados en memoria (comenzando por el primero de ellos) buscando el que cumpla lo siguiente, en este orden:&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;
Periódicamente se pone a cero el bit R.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:LRU.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_6|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de 2ª oportunidad ==&lt;br /&gt;
&lt;br /&gt;
Se trata de la combinación de los criterios FIFO y NRU, pero sin emplear el bit M de NRU. Cuando hay que seleccionar una página víctima, se recorre la lista de páginas por orden de carga en memoria hasta encontrar alguna que tenga el bit R a 0. Durante la iteración, si se encuentra una cuyo bit R valga 1, se pone a 0, se retira de la lista y se añade al final (para darle una segunda oportunidad). Cuando se añade una nueva página, se añade al final de la cola con el bit R a 1.&lt;br /&gt;
Añadir que, en este caso, no se pone el bit R a 0 periódicamente, ya que se hace directamente con la 2ª oportunidad.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segunda Oportunidad.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_7|Solución]]&lt;br /&gt;
&lt;br /&gt;
;Criterio del reloj: Es una variante en la manera de implementar la 2ª oportunidad. Se emplea una lista circular. En lugar de eliminar y añadir elementos al final de la FIFO, mantenemos un puntero a la página siguiente a la última página víctima seleccionada, de manera que para dar la 2ª oportunidad a una página, sólo hemos de poner su bit R a 0 y pasar al siguiente.&lt;br /&gt;
&lt;br /&gt;
*[[sol_reloj|Solución]]&lt;br /&gt;
&lt;br /&gt;
==Criterio de la 3ª oportunidad (Método Multics)==&lt;br /&gt;
Es otra variante del criterio NRU, en la que se mantiene una lista ordenanda por orden de carga. Ante una sustitución, la primera candidata es la más antigua.&lt;br /&gt;
&lt;br /&gt;
Si dicha página tiene el bit R a 1, se pone a 0 y se pasa al final de la lista (recibe una segunda oportunidad).&lt;br /&gt;
&lt;br /&gt;
Si dicha página tiene el bit R a 0, existen dos casos:&lt;br /&gt;
*Si tiene el bit M a 1, se pone a 0 y se pasa al final de la lista.&lt;br /&gt;
*Si tiene el bit M a 0, se selecciona como página víctima.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Tercera oportunidad.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_tercera_oportunidad|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio LRU ('''L'''east '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Es justamente el criterio contrario al MRU. En LRU elegimos la página que más tiempo lleve sin ser accedida. Se implementa mediante una FIFO que mantiene el '''orden de acceso''' a las páginas. Es decir, cada vez que se accede a una página, en caso de estar ya en la FIFO, se retira de la cola y se añade al final.&lt;br /&gt;
&lt;br /&gt;
*[[sol_8|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio LFU ('''L'''east '''F'''recuently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona a la página que haya sido accedida con menor frecuencia. Se implementa mediante un contador. Básicamente, por cada acceso se incrementa el contador de uso de la página. La página víctima será aquella con menor contador. Cuando una página es expulsada a disco su contador pasa a ser cero. Es inviable en la práctica, pues supone mantener contadores de tamaños muy grande, uno por cada página en memoria, y por cada acceso a memoria podría ser necesario ejecutar una rutina que actualice la lista.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Aproximación discreta LRU ==&lt;br /&gt;
&lt;br /&gt;
Se tiene un bit R y un contador por cada página. Cuando una página es cargada a un marco, se carga con su bit R a 1 y su contador inicial a 0. Cuando pasa un período determinado de tiempo (viene dado en el enunciado) se itera sobre toda la lista de páginas, y pueden ocurrir dos cosas:&lt;br /&gt;
* '''Si su bit R está a 1''': Se ponen su bit R a cero y su contador se incrementa.&lt;br /&gt;
* '''Si su bit R está a 0''': No se hace nada.&lt;br /&gt;
&lt;br /&gt;
Cuando hay que seleccionar una página víctima, se escoge aquella cuyo contador sea más pequeño. En caso de empate, habrá que establecer un criterio de desempate.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9.2|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
Se emplea un registro R de N bits, asociado a cada página. Por cada acceso se pone a 1 el bit más significativo. Periódicamente se desplaza hacia la derecha el registro R. La página víctima será la que tenga el menor valor en el registro R (en caso de empate se emplea otro criterio). La información que contienen los bits menos significativos se pierden al realizar desplazamientos. Este criterio permite mantener un historial de acceso a las páginas, para seleccionar como víctima aquella que lleve más tiempo sin ser accedida.&lt;br /&gt;
&lt;br /&gt;
*[[sol_10|Solución]]&lt;br /&gt;
&lt;br /&gt;
= Implementaciones =&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>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_reemplazo&amp;diff=2881</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=2881"/>
				<updated>2013-12-17T20:53:05Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Criterio de 2ª oportunidad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
El fallo de página se produce cuando se accede a una posición de memoria que pertenece a una página de memoria que esta descargada en disco.&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;math&amp;gt;tasa fallos pagina = \frac{total fallos de pagina}{total accesos a pagina}&amp;lt;/math&amp;gt;&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 está 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;
== Criterio de página óptima (OPT, MIN) ==&lt;br /&gt;
&lt;br /&gt;
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;
&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;
*[[sol_1|Solución]]&lt;br /&gt;
&lt;br /&gt;
Otra forma de evaluar la eficiencia de un criterio de selección de página víctima es observando su curva paracorde, que relaciona el nº de fallos de página con el nº de marcos. La de un buen criterio se aproximará a la curva del criterio óptimo, y la de uno malo, a la del criterio al azar, o incluso pésimo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Curvas paracordes.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo real se compara la efectividad de varios criterios en varios programas:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:img26.png]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de página pésima (MAX)==&lt;br /&gt;
&lt;br /&gt;
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. También implica tener conocimiento de futuro, por lo que no es implementable en la práctica.&lt;br /&gt;
&lt;br /&gt;
*[[sol_2|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de selección estocástica (aleatoria) ==&lt;br /&gt;
&lt;br /&gt;
Se trata también de un criterio teórico, serviría para aproximar la cota media de la ''tasa de fallos de página''. Consiste en seleccionar una página al azar.&lt;br /&gt;
&lt;br /&gt;
Dado que su implementación es trivial, cualquier algoritmo que de resultados similares a este será un mal criterio, pues seguro que su eficiencia será menor que la de no implementar ningún criterio y seleccionar una página al azar.&lt;br /&gt;
&lt;br /&gt;
== Criterio MRU('''M'''ost '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona la última página a la que se ha accedido. Podría implementarse con una LIFO por orden de acceso. Es una aproximación implementable en la práctica del criterio MAX, pudiendo así compararlo con otros criterios. Según el principio de localidad, mientras más recientemente se haya accedido a una página, más probable es que vuelva a accederse a ella. Por ello, este criterio es muy deficiente, siendo su curva cercana a la pésima:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:MRU.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_3|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio por orden de carga FIFO ==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
El inconveniente de este criterio es que las páginas más usadas son las que más tiempo deberían permanecer en memoria, y son las más atacadas. No se debe suponer que, si las páginas “dejarán de ser necesarias”, implica que “ya no sean necesarias”.&lt;br /&gt;
Además, se produce la anomalía de Belady, efecto que consiste en la posibilidad de tener más fallos de página al aumentar el número de marcos en la memoria física:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:FIFO.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_5|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio NRU ('''N'''ot '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
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;
&lt;br /&gt;
En resumen, el bit R se pondrá a 1 ante cualquier tipo de acceso, y el bit M se pondrá a 1 sólo ante eventos de escritura.&lt;br /&gt;
&lt;br /&gt;
Para seleccionar la página víctima iteramos sobre los marcos cargados en memoria (comenzando por el primero de ellos) buscando el que cumpla lo siguiente, en este orden:&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;
Periódicamente se pone a cero el bit R.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:LRU.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_6|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio de 2ª oportunidad ==&lt;br /&gt;
&lt;br /&gt;
Se trata de la combinación de los criterios FIFO y NRU, pero sin emplear el bit M de NRU. Cuando hay que seleccionar una página víctima, se recorre la lista de páginas por orden de carga en memoria hasta encontrar alguna que tenga el bit R a 0. Durante la iteración, si se encuentra una cuyo bit R valga 1, se pone a 0, se retira de la lista y se añade al final (para darle una segunda oportunidad). Cuando se añade una nueva página, se añade al final de la cola con el bit R a 1.&lt;br /&gt;
Añadir que, en este caso, no se pone el bit R a 0 periódicamente, ya que se hace directamente con la 2ª oportunidad.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segunda Oportunidad.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[sol_7|Solución]]&lt;br /&gt;
&lt;br /&gt;
;Criterio del reloj: Es una variante en la manera de implementar la 2ª oportunidad. Se emplea una lista circular. En lugar de eliminar y añadir elementos al final de la FIFO, mantenemos un puntero a la página siguiente a la última página víctima seleccionada, de manera que para dar la 2ª oportunidad a una página, sólo hemos de poner su bit R a 0 y pasar al siguiente.&lt;br /&gt;
&lt;br /&gt;
*[[sol_reloj|Solución]]&lt;br /&gt;
&lt;br /&gt;
==Criterio de la 3ª oportunidad (Método Multics)==&lt;br /&gt;
Es otra variante del criterio NRU, en la que se mantiene una lista ordenanda por orden de carga. Ante una sustitución, la primera candidata es la más antigua.&lt;br /&gt;
&lt;br /&gt;
Si dicha página tiene el bit R a 1, se pone a 0 y se pasa al final de la lista (recibe una segunda oportunidad).&lt;br /&gt;
&lt;br /&gt;
Si dicha página tiene el bit R a 0, existen dos casos:&lt;br /&gt;
*Si tiene el bit M a 1, se pone a 0 y se pasa al final de la lista.&lt;br /&gt;
*Si tiene el bit M a 0, se selecciona como página víctima.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Tercera oportunidad.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Criterio LRU ('''L'''east '''R'''ecently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Es justamente el criterio contrario al MRU. En LRU elegimos la página que más tiempo lleve sin ser accedida. Se implementa mediante una FIFO que mantiene el '''orden de acceso''' a las páginas. Es decir, cada vez que se accede a una página, en caso de estar ya en la FIFO, se retira de la cola y se añade al final.&lt;br /&gt;
&lt;br /&gt;
*[[sol_8|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Criterio LFU ('''L'''east '''F'''recuently '''U'''sed) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona a la página que haya sido accedida con menor frecuencia. Se implementa mediante un contador. Básicamente, por cada acceso se incrementa el contador de uso de la página. La página víctima será aquella con menor contador. Cuando una página es expulsada a disco su contador pasa a ser cero. Es inviable en la práctica, pues supone mantener contadores de tamaños muy grande, uno por cada página en memoria, y por cada acceso a memoria podría ser necesario ejecutar una rutina que actualice la lista.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Aproximación discreta LRU ==&lt;br /&gt;
&lt;br /&gt;
Se tiene un bit R y un contador por cada página. Cuando una página es cargada a un marco, se carga con su bit R a 1 y su contador inicial a 0. Cuando pasa un período determinado de tiempo (viene dado en el enunciado) se itera sobre toda la lista de páginas, y pueden ocurrir dos cosas:&lt;br /&gt;
* '''Si su bit R está a 1''': Se ponen su bit R a cero y su contador se incrementa.&lt;br /&gt;
* '''Si su bit R está a 0''': No se hace nada.&lt;br /&gt;
&lt;br /&gt;
Cuando hay que seleccionar una página víctima, se escoge aquella cuyo contador sea más pequeño. En caso de empate, habrá que establecer un criterio de desempate.&lt;br /&gt;
&lt;br /&gt;
*[[sol_9.2|Solución]]&lt;br /&gt;
&lt;br /&gt;
== Sustitución por envejecimiento ==&lt;br /&gt;
&lt;br /&gt;
Se emplea un registro R de N bits, asociado a cada página. Por cada acceso se pone a 1 el bit más significativo. Periódicamente se desplaza hacia la derecha el registro R. La página víctima será la que tenga el menor valor en el registro R (en caso de empate se emplea otro criterio). La información que contienen los bits menos significativos se pierden al realizar desplazamientos. Este criterio permite mantener un historial de acceso a las páginas, para seleccionar como víctima aquella que lleve más tiempo sin ser accedida.&lt;br /&gt;
&lt;br /&gt;
*[[sol_10|Solución]]&lt;br /&gt;
&lt;br /&gt;
= Implementaciones =&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>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Paginaci%C3%B3n&amp;diff=2876</id>
		<title>Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Paginaci%C3%B3n&amp;diff=2876"/>
				<updated>2013-12-16T20:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Dispositivo de traducción de direcciones paginadas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
La paginación es una estrategia de organización de la memoria que consiste en dividir la memoria en porciones de igual tamaño, a dichas porciones se las conoce como marcos de página o simplemente como páginas.&lt;br /&gt;
Las páginas están definidas por un número de página, que identifica de forma única a cada página (dentro del espacio de memoria de un proceso). Cada página se asigna en exclusividad a un proceso.&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
Desde el punto de vista de la paginación la traducción de las direcciones de memoria se basa en dos conceptos:&lt;br /&gt;
&lt;br /&gt;
1. El dispositivo traductor divide las direcciones lógicas en 2 partes de la siguiente forma: los n bits más significativos identifican la página mientras que el resto identifica el desplazamiento.&lt;br /&gt;
&lt;br /&gt;
2. Cuando el traductor dinámico de páginas recibe, en una dirección lógica, un número de página este examina una tabla (llamada tabla de páginas) en la cual se relacionan las páginas lógicas con las páginas físicas y obtiene la dirección real (Número de marco) de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Paginas.png]]&lt;br /&gt;
&lt;br /&gt;
Al igual que en la segmentación al intentar acceder a una página ausente se produce un fallo (llamado en este caso '''fallo de página''').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Otras características=&lt;br /&gt;
*Los valores óptimos para las porciones son: en arquitectura de 32 bits es de 4KB, y en arquitectura de 64 bits es de 8KB.&lt;br /&gt;
*Los criterios vistos en el tema anterior no se aplican aquí, no tiene sentido hacerlo ya que todas las páginas de memoria son iguales.&lt;br /&gt;
&lt;br /&gt;
==Dispositivo de traducción de direcciones paginadas==&lt;br /&gt;
Se dispone de la tabla de páginas de cada proceso en memoria para llevar a cabo la traducción. La tabla de páginas se indexa por número de página.&lt;br /&gt;
&lt;br /&gt;
El dispositivo de traducción de direcciones paginadas debe ser un dispositivo muy rápido, ya que se usa con cada acceso a memoria que se realiza. El tamaño de la tabla de páginas es uno de los aspectos que más influye en el diseño del dispositivo e incluso en la organización de la propia tabla. Otro aspecto relevante es la localización de dicha tabla, la cual puede encontrarse en el traductor o guardada en memoria:&lt;br /&gt;
*'''Tabla de páginas en el traductor:'''&lt;br /&gt;
&lt;br /&gt;
Se usa en equipos cuyo espacio de direcciones es de pocas páginas. &lt;br /&gt;
El dispositivo de traducción contiene un conjunto de registros organizados como una memoria en los cuales almacena la tabla de páginas.&lt;br /&gt;
Dicha tabla de páginas debe sustituirse (lo cual aumenta el tiempo de conmutación) en dos situaciones distintas: al cambiar de proceso y al transferir el control al ss.oo. (en este caso se reduce el tiempo de conmutación utilizando dos tablas separadas, una para los procesos y otra para el ss.oo., las cuales se utilizan dependiendo del modo de uso de la cpu, supervisor o usuario).&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de páginas en memoria:'''&lt;br /&gt;
&lt;br /&gt;
Se usa en equipos con mucha memoria, en los cuales el número de páginas puede llegar a ser muy alto con lo que el tiempo necesario para cargar las páginas en el traductor es demasiado alto.&lt;br /&gt;
La tabla de páginas es guardada en la memoria principal y el dispositivo traductor tiene la dirección de comienzo y el tamaño de la tabla, debido a que la tabla está en la memoria principal se necesita, por cada acceso a memoria, un acceso a memoria adicional para obtener el número de página física asociado a la página lógica. Para mantener un tiempo de acceso aceptable se establece una memoria asociativa que conserva las parejas página lógica-página física utilizadas recientemente. &lt;br /&gt;
&lt;br /&gt;
También hay dispositivos traductores que no utilizan tablas de páginas, buscan directamente la información en una memoria asociativa, y si no la encuentran, lanzan una excepción que manejará el sistema operativo. Así, el SO es el responsable de determinar la asociación entre números de página y números de marco, y además de actualizar la memoria asociativa, lo que da cierta flexibilidad.&lt;br /&gt;
&lt;br /&gt;
==Tabla de páginas multinivel==&lt;br /&gt;
El objetivo es paginar la tabla de páginas lo que permite que esta no esté cargada completa en memoria y que no ocupe direcciones consecutivas.&lt;br /&gt;
En los ss.oo. con tablas de páginas multinivel los números de página se dividen en dos partes: los bits más significativos indican el directorio de páginas correspondiente y con los bits menos significativos el índice del directorio en el que se encuentra la página buscada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:PaginacionMultinivel.jpg‎ ]]&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de páginas para todo el sistema:''' Es una variante de las tablas de página multinivel, en la que el dispositivo traductor sólo contiene una entrada por cada proceso, indexadas por PID, y una dirección de tabla que contiene las páginas de dicho proceso. Así, ante una conmutación de procesos basta con cambiar de PID.&lt;br /&gt;
==Elementos de administración==&lt;br /&gt;
La administración es sencilla ya que todas las porciones de memoria son de igual tamaño (se limita a comprobar si hay suficientes marcos libres para ejecutar el proceso).&lt;br /&gt;
&lt;br /&gt;
Se pueden usar:&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de asignación de marcos a procesos:''' Tiene una entrada por marco, que contiene el PID del proceso que lo tiene asignado, o 0, si está libre. &lt;br /&gt;
*'''Lista de marcos asignados a procesos:''' Dado que el número de marcos es fijo, se implementa mediante una tabla. Estas listas tienen una entrada por marco. En cada entrada está, o el siguiente marco en la lista, o -1 si el marco es el último. Hay una lista global de marcos libres, y una lista por proceso de marcos ocupados. Para ayudar a la gestión, cada proceso tiene en su PCB los índices del primer y el último marco que tiene asignados.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2872</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2872"/>
				<updated>2013-12-16T13:54:17Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''A)'''Razone si las direcciones de memoria 0xabc10008 y 0xabc100aa pertenecen al mismo marco. ¿Y las direcciones 0xabc1fa00 y 0xabc2fa08?&lt;br /&gt;
   En las direcciones de memoria 0xabc180008 y 0xabc100aa, como el tamaño de pagina es de 4 Kbytes = 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;, podemos diferenciar dos partes:&lt;br /&gt;
      - Número de página física (primeros 20  bytes) &lt;br /&gt;
      - Desplazamiento (12 bytes siguientes) &lt;br /&gt;
   En un tamaño de palabra de 32 bits (20+12).&lt;br /&gt;
   Para comprobar si pertenecen al mismo marco miramos si el número de página física es el mismo, y en las dos direcciones que nos &lt;br /&gt;
   dan lo es:___abc10___&lt;br /&gt;
   Mientras que en las direcciones 0xabc1fa00 y 0xabc2fa08 podemos ver que no es el mismo marco: ___abc1f___ no es igual a ___abc2f___&lt;br /&gt;
&lt;br /&gt;
'''B)'''¿De cuántas páginas físicas dispone el sistema?&lt;br /&gt;
   Si tenemos 256 Kbytes de tamaño de memoria, es decir, 2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;, y 4 Kbytes de tamaño de página, 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;:&lt;br /&gt;
            2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;(del tamaño de memoria) / 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;(del tamaño de página) = 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; páginas físicas, porciones de una zona de memoria.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''C)'' Si las páginas fueran de 1 KByte, ¿pertenecen las direccion 0xabc10008 y 0xabc800aa al mismo marco? Razone la respuesta.&lt;br /&gt;
 &lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
          &lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
                 ┌───────────────────────────┬────────────┐&lt;br /&gt;
      0xabc10008:│1010 1011 1100 '''0001''' 0000 00│00 0000 1000│&lt;br /&gt;
      0xabc800aa:│1010 1011 1100 '''1000''' 0000 00│00 1010 1010│&lt;br /&gt;
                 └───────────────────────────┴────────────┘&lt;br /&gt;
                             ''marco''           ''desplazamiento''&lt;br /&gt;
&lt;br /&gt;
''D)'' Indique el tamaño máximo de la tabla de páginas de un proceso suponiendo que cada entrada ocupa 8 bytes. &lt;br /&gt;
   Para calcular el tamaño máximo de la tabla de de páginas de un proceso:&lt;br /&gt;
   - ''Número de páginas máximo'': 64 páginas (2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   - ''Tamaño de entrada'': 8 bytes(2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   '''Tamaño máximo''': número de páginas máximo * tamaño de entrada = 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; = '''512 bytes'''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2871</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2871"/>
				<updated>2013-12-16T13:53:07Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''A)'''Razone si las direcciones de memoria 0xabc10008 y 0xabc100aa pertenecen al mismo marco. ¿Y las direcciones 0xabc1fa00 y 0xabc2fa08?&lt;br /&gt;
   En las direcciones de memoria 0xabc180008 y 0xabc100aa, como el tamaño de pagina es de 4 Kbytes = 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;, podemos diferenciar dos partes:&lt;br /&gt;
      - Número de página física (primeros 20  bytes) &lt;br /&gt;
      - Desplazamiento (12 bytes siguientes) &lt;br /&gt;
   En un tamaño de palabra de 32 bits (20+12).&lt;br /&gt;
   Para comprobar si pertenecen al mismo marco miramos si el número de página física es el mismo, y en las dos direcciones que nos dan lo es:___abc10___&lt;br /&gt;
   Mientras que en las direcciones 0xabc1fa00 y 0xabc2fa08 podemos ver que no es el mismo marco: ___abc1f___ no es igual a ___abc2f___&lt;br /&gt;
&lt;br /&gt;
'''B)'''¿De cuántas páginas físicas dispone el sistema?&lt;br /&gt;
   Si tenemos 256 Kbytes de tamaño de memoria, es decir, 2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;, y 4 Kbytes de tamaño de página, 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;:&lt;br /&gt;
            2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;(del tamaño de memoria) / 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;(del tamaño de página) = 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; páginas físicas, porciones de una zona de memoria.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''C)'' Si las páginas fueran de 1 KByte, ¿pertenecen las direccion 0xabc10008 y 0xabc800aa al mismo marco? Razone la respuesta.&lt;br /&gt;
 &lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
          &lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
                 ┌───────────────────────────┬────────────┐&lt;br /&gt;
      0xabc10008:│1010 1011 1100 '''0001''' 0000 00│00 0000 1000│&lt;br /&gt;
      0xabc800aa:│1010 1011 1100 '''1000''' 0000 00│00 1010 1010│&lt;br /&gt;
                 └───────────────────────────┴────────────┘&lt;br /&gt;
                             ''marco''           ''desplazamiento''&lt;br /&gt;
&lt;br /&gt;
''D)'' Indique el tamaño máximo de la tabla de páginas de un proceso suponiendo que cada entrada ocupa 8 bytes. &lt;br /&gt;
   Para calcular el tamaño máximo de la tabla de de páginas de un proceso:&lt;br /&gt;
   - ''Número de páginas máximo'': 64 páginas (2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   - ''Tamaño de entrada'': 8 bytes(2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   '''Tamaño máximo''': número de páginas máximo * tamaño de entrada = 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; = '''512 bytes'''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2870</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2870"/>
				<updated>2013-12-16T13:51:35Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''A)'''Razone si las direcciones de memoria 0xabc10008 y 0xabc100aa pertenecen al mismo marco. ¿Y las direcciones 0xabc1fa00 y 0xabc2fa08?&lt;br /&gt;
   En las direcciones de memoria 0xabc180008 y 0xabc100aa, como el tamaño de pagina es de 4 Kbytes = 2^12, podemos diferenciar dos partes:&lt;br /&gt;
      - Número de página física (primeros 20  bytes) &lt;br /&gt;
      - Desplazamiento (12 bytes siguientes) &lt;br /&gt;
   En un tamaño de palabra de 32 bits (20+12).&lt;br /&gt;
   Para comprobar si pertenecen al mismo marco miramos si el número de página física es el mismo, y en las dos direcciones que nos dan lo es:___abc10___&lt;br /&gt;
   Mientras que en las direcciones 0xabc1fa00 y 0xabc2fa08 podemos ver que no es el mismo marco: ___abc1f___ no es igual a ___abc2f___&lt;br /&gt;
&lt;br /&gt;
'''B)'''¿De cuántas páginas físicas dispone el sistema?&lt;br /&gt;
   Si tenemos 256 Kbytes de tamaño de memoria, es decir, 2^18, y 4 Kbytes de tamaño de página, 2^12:&lt;br /&gt;
            2^18(del tamaño de memoria) / 2^12(del tamaño de página) = 2^6 páginas físicas, porciones de una zona de memoria.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''C)'' Si las páginas fueran de 1 KByte, ¿pertenecen las direccion 0xabc10008 y 0xabc800aa al mismo marco? Razone la respuesta.&lt;br /&gt;
 &lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
          &lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
                 ┌───────────────────────────┬────────────┐&lt;br /&gt;
      0xabc10008:│1010 1011 1100 '''0001''' 0000 00│00 0000 1000│&lt;br /&gt;
      0xabc800aa:│1010 1011 1100 '''1000''' 0000 00│00 1010 1010│&lt;br /&gt;
                 └───────────────────────────┴────────────┘&lt;br /&gt;
                             ''marco''           ''desplazamiento''&lt;br /&gt;
&lt;br /&gt;
''D)'' Indique el tamaño máximo de la tabla de páginas de un proceso suponiendo que cada entrada ocupa 8 bytes. &lt;br /&gt;
   Para calcular el tamaño máximo de la tabla de de páginas de un proceso:&lt;br /&gt;
   - ''Número de páginas máximo'': 64 páginas (2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   - ''Tamaño de entrada'': 8 bytes(2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;)&lt;br /&gt;
   '''Tamaño máximo''': número de páginas máximo * tamaño de entrada = 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; = '''512 bytes'''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=2869</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=2869"/>
				<updated>2013-12-16T13:50:20Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Método de los compañeros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En este tipo de sistemas, las particiones para cada proceso se van creando a medida que son asignadas al procesador. Tiene como ventaja principal 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(supone un alto coste de rendimiento) 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 (llamados unidades de asignación), se utiliza un bit para representar si dicho bloque está libre o asignado. El tamaño de los bloques tiene una cierta importancia, ya que cuanto mayor sea, menos bloques cabrán en memoria con lo que serán necesarios menos bits para controlar todos los bloques y el mapa de bits será de menor tamaño.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se usa una lista de nodos ordenada por dirección. Por cada bloque libre u ocupado habrá un nodo con:&lt;br /&gt;
** Dirección inicial del bloque&lt;br /&gt;
** Tamaño del bloque&lt;br /&gt;
** Estado (Libre u ocupado)&lt;br /&gt;
** Proceso al que está asignado&lt;br /&gt;
&lt;br /&gt;
= Criterios de asignación =&lt;br /&gt;
&lt;br /&gt;
== Primer ajuste ==&lt;br /&gt;
&lt;br /&gt;
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;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
                         0-5&lt;br /&gt;
             P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                           6-11&lt;br /&gt;
             P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                 12-19&lt;br /&gt;
             P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                             20-26    &lt;br /&gt;
             P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                   20-26&lt;br /&gt;
             P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                        0-4             &lt;br /&gt;
             P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
== Siguiente ajuste ==&lt;br /&gt;
&lt;br /&gt;
Se continúa a partir de la posición de la última asignación realizada.Es muy probable que haya un hueco a partir de esa posición, reduciendo la longitud de la búsqueda. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria. Cuando se alcanza el final de la memoria se vuelve a comenzar la búsqueda desde el principio (por ello este criterio es también conocido como primer ajuste circular).&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
&lt;br /&gt;
                        0-5&lt;br /&gt;
            P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                          6-11&lt;br /&gt;
            P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                12-19&lt;br /&gt;
            P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                            20-26    &lt;br /&gt;
            P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                  20-26&lt;br /&gt;
            P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                      27-31             &lt;br /&gt;
            P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
'''DUDA:'''&lt;br /&gt;
&lt;br /&gt;
Es evidente que cuando llega el P5 se necesitan 7 unidades de memoria, y éstas no están disponibles en el hueco de 27 a 31 (ahí solo hay 5) por lo que da la vuelta, vuelve a comenzar y lo asigna al primero que encuentra, que resulta ser casualmente, el 20-26. --[[Usuario:Ferguatol|fernandoenzo]] 22:14 19 dic 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Mejor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Consiste en asignarle al proceso el hueco con menor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja menos espacio sin utilizar. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'') debido a que hay que recorrer todo el mapa de bits o toda la lista de control (una posible solución seria usar una lista de control encadenada que mantenga los huecos ordenados por tamaño creciente).&lt;br /&gt;
Otro problema es la fragmentación externa, debido a que se asigna el menor hueco posible, el espacio sobrante sera del menor tamaño posible lo que da lugar a huecos de tamaño normalmente insuficiente para contener programas.&lt;br /&gt;
&lt;br /&gt;
== Peor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Al contrario que el criterio anterior, se busca el hueco con mayor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja más espacio sin utilizar, y se corta de él el trozo necesario (así la porción sobrante será del mayor tamaño posible y será más aprovechable). Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste (debido a la longitud de las búsquedas) y la fragmentación no resulta demasiado eficiente.&lt;br /&gt;
&lt;br /&gt;
== Ajuste rápido ==&lt;br /&gt;
&lt;br /&gt;
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 que corresponda. 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;
Organización de los huecos en el ajuste rápido:&lt;br /&gt;
&lt;br /&gt;
  Punteros a listas       Lista de huecos&lt;br /&gt;
     según tamaño&lt;br /&gt;
  __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |    0 &amp;lt; t &amp;lt; 10    |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |   10 &amp;lt; t &amp;lt; 20    |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |      t &amp;lt; 200     |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
== Método de los compañeros ==&lt;br /&gt;
&lt;br /&gt;
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. Es un método rápido tanto en la asignación como en la liberación de bloques.&lt;br /&gt;
El funcionamiento es el siguiente: &lt;br /&gt;
Cuando se necesita un bloque de tamaño T se busca en la lista de la 1ª potencia mayor o igual a T (por ejemplo 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;), si no hay ninguno se busca en la lista de la siguiente potencia (2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;+1), si encontramos un bloque libre se retira y se divide por la mitad: una parte se le asigna al proceso y la otra se almacena en la lista de los huecos de tamaño 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Organización de los bloques:'' &lt;br /&gt;
&lt;br /&gt;
  __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |      2^(k+1)     |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |       2^k        |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |         1        |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
Debido a la forma de dividir los bloques al liberarse uno de ellos solamente podrá fusionarse con sus compañeros (bloques del mismo tamaño) con los que formará un bloque de tamaño superior.&lt;br /&gt;
&lt;br /&gt;
''Divisiones sucesivas de los bloques:''&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0                      |8                      |&lt;br /&gt;
 |_______________________|_______________________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0          |4          |8          |12         |&lt;br /&gt;
 |___________|___________|___________|___________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0    |2    |4    |6    |8    |10   |12   |14   | &lt;br /&gt;
 |_____|_____|_____|_____|_____|_____|_____|_____|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0 | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|&lt;br /&gt;
 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|&lt;br /&gt;
&lt;br /&gt;
=Implementación de ajustes en Java=&lt;br /&gt;
&lt;br /&gt;
Se ha realizado un Anexo con la [[Implementación de ajustes en Java|implementación de los criterios de ajuste en Java]], con un gestor de memoria, sobre el que se implementan los métodos de primer ajuste, siguiente ajuste, mejor ajuste y peor ajuste.&lt;br /&gt;
&lt;br /&gt;
Además, permite la visualización de la memoria en cada momento tanto como listas de control como mapas de bits.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=2868</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=2868"/>
				<updated>2013-12-16T13:47:00Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Método de los compañeros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En este tipo de sistemas, las particiones para cada proceso se van creando a medida que son asignadas al procesador. Tiene como ventaja principal 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(supone un alto coste de rendimiento) 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 (llamados unidades de asignación), se utiliza un bit para representar si dicho bloque está libre o asignado. El tamaño de los bloques tiene una cierta importancia, ya que cuanto mayor sea, menos bloques cabrán en memoria con lo que serán necesarios menos bits para controlar todos los bloques y el mapa de bits será de menor tamaño.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se usa una lista de nodos ordenada por dirección. Por cada bloque libre u ocupado habrá un nodo con:&lt;br /&gt;
** Dirección inicial del bloque&lt;br /&gt;
** Tamaño del bloque&lt;br /&gt;
** Estado (Libre u ocupado)&lt;br /&gt;
** Proceso al que está asignado&lt;br /&gt;
&lt;br /&gt;
= Criterios de asignación =&lt;br /&gt;
&lt;br /&gt;
== Primer ajuste ==&lt;br /&gt;
&lt;br /&gt;
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;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
                         0-5&lt;br /&gt;
             P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                           6-11&lt;br /&gt;
             P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                 12-19&lt;br /&gt;
             P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                             20-26    &lt;br /&gt;
             P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                   20-26&lt;br /&gt;
             P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                        0-4             &lt;br /&gt;
             P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
== Siguiente ajuste ==&lt;br /&gt;
&lt;br /&gt;
Se continúa a partir de la posición de la última asignación realizada.Es muy probable que haya un hueco a partir de esa posición, reduciendo la longitud de la búsqueda. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria. Cuando se alcanza el final de la memoria se vuelve a comenzar la búsqueda desde el principio (por ello este criterio es también conocido como primer ajuste circular).&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
&lt;br /&gt;
                        0-5&lt;br /&gt;
            P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                          6-11&lt;br /&gt;
            P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                12-19&lt;br /&gt;
            P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                            20-26    &lt;br /&gt;
            P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                  20-26&lt;br /&gt;
            P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                      27-31             &lt;br /&gt;
            P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
'''DUDA:'''&lt;br /&gt;
&lt;br /&gt;
Es evidente que cuando llega el P5 se necesitan 7 unidades de memoria, y éstas no están disponibles en el hueco de 27 a 31 (ahí solo hay 5) por lo que da la vuelta, vuelve a comenzar y lo asigna al primero que encuentra, que resulta ser casualmente, el 20-26. --[[Usuario:Ferguatol|fernandoenzo]] 22:14 19 dic 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Mejor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Consiste en asignarle al proceso el hueco con menor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja menos espacio sin utilizar. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'') debido a que hay que recorrer todo el mapa de bits o toda la lista de control (una posible solución seria usar una lista de control encadenada que mantenga los huecos ordenados por tamaño creciente).&lt;br /&gt;
Otro problema es la fragmentación externa, debido a que se asigna el menor hueco posible, el espacio sobrante sera del menor tamaño posible lo que da lugar a huecos de tamaño normalmente insuficiente para contener programas.&lt;br /&gt;
&lt;br /&gt;
== Peor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Al contrario que el criterio anterior, se busca el hueco con mayor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja más espacio sin utilizar, y se corta de él el trozo necesario (así la porción sobrante será del mayor tamaño posible y será más aprovechable). Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste (debido a la longitud de las búsquedas) y la fragmentación no resulta demasiado eficiente.&lt;br /&gt;
&lt;br /&gt;
== Ajuste rápido ==&lt;br /&gt;
&lt;br /&gt;
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 que corresponda. 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;
Organización de los huecos en el ajuste rápido:&lt;br /&gt;
&lt;br /&gt;
  Punteros a listas       Lista de huecos&lt;br /&gt;
     según tamaño&lt;br /&gt;
  __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |    0 &amp;lt; t &amp;lt; 10    |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |   10 &amp;lt; t &amp;lt; 20    |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |      t &amp;lt; 200     |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
== Método de los compañeros ==&lt;br /&gt;
&lt;br /&gt;
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. Es un método rápido tanto en la asignación como en la liberación de bloques.&lt;br /&gt;
El funcionamiento es el siguiente: &lt;br /&gt;
Cuando se necesita un bloque de tamaño T se busca en la lista de la 1ª potencia mayor o igual a T (por ejemplo 2^k), si no hay ninguno se busca en la lista de la siguiente potencia (2^k+1), si encontramos un bloque libre se retira y se divide por la mitad: una parte se le asigna al proceso y la otra se almacena en la lista de los huecos de tamaño 2^k.&lt;br /&gt;
&lt;br /&gt;
''Organización de los bloques:'' &lt;br /&gt;
&lt;br /&gt;
   __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |      2^(k+1)     |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |       2^k        |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |         1        |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
Debido a la forma de dividir los bloques al liberarse uno de ellos solamente podrá fusionarse con sus compañeros (bloques del mismo tamaño) con los que formará un bloque de tamaño superior.&lt;br /&gt;
&lt;br /&gt;
''Divisiones sucesivas de los bloques:''&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0                      |8                      |&lt;br /&gt;
 |_______________________|_______________________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0          |4          |8          |12         |&lt;br /&gt;
 |___________|___________|___________|___________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0    |2    |4    |6    |8    |10   |12   |14   | &lt;br /&gt;
 |_____|_____|_____|_____|_____|_____|_____|_____|&lt;br /&gt;
 ________________________________________________&lt;br /&gt;
 |0 | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|&lt;br /&gt;
 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|&lt;br /&gt;
&lt;br /&gt;
=Implementación de ajustes en Java=&lt;br /&gt;
&lt;br /&gt;
Se ha realizado un Anexo con la [[Implementación de ajustes en Java|implementación de los criterios de ajuste en Java]], con un gestor de memoria, sobre el que se implementan los métodos de primer ajuste, siguiente ajuste, mejor ajuste y peor ajuste.&lt;br /&gt;
&lt;br /&gt;
Además, permite la visualización de la memoria en cada momento tanto como listas de control como mapas de bits.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_variables&amp;diff=2867</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=2867"/>
				<updated>2013-12-16T13:46:22Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Siguiente ajuste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En este tipo de sistemas, las particiones para cada proceso se van creando a medida que son asignadas al procesador. Tiene como ventaja principal 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(supone un alto coste de rendimiento) 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 (llamados unidades de asignación), se utiliza un bit para representar si dicho bloque está libre o asignado. El tamaño de los bloques tiene una cierta importancia, ya que cuanto mayor sea, menos bloques cabrán en memoria con lo que serán necesarios menos bits para controlar todos los bloques y el mapa de bits será de menor tamaño.&lt;br /&gt;
&lt;br /&gt;
* '''Listas de control''': Se usa una lista de nodos ordenada por dirección. Por cada bloque libre u ocupado habrá un nodo con:&lt;br /&gt;
** Dirección inicial del bloque&lt;br /&gt;
** Tamaño del bloque&lt;br /&gt;
** Estado (Libre u ocupado)&lt;br /&gt;
** Proceso al que está asignado&lt;br /&gt;
&lt;br /&gt;
= Criterios de asignación =&lt;br /&gt;
&lt;br /&gt;
== Primer ajuste ==&lt;br /&gt;
&lt;br /&gt;
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;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
                         0-5&lt;br /&gt;
             P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                           6-11&lt;br /&gt;
             P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                 12-19&lt;br /&gt;
             P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                             20-26    &lt;br /&gt;
             P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                   20-26&lt;br /&gt;
             P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                        0-4             &lt;br /&gt;
             P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
== Siguiente ajuste ==&lt;br /&gt;
&lt;br /&gt;
Se continúa a partir de la posición de la última asignación realizada.Es muy probable que haya un hueco a partir de esa posición, reduciendo la longitud de la búsqueda. De esta forma se resuelve el inconveniente de usar en exceso las primeras posiciones de la memoria. Cuando se alcanza el final de la memoria se vuelve a comenzar la búsqueda desde el principio (por ello este criterio es también conocido como primer ajuste circular).&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Suponiendo una memoria principal de 32 KB.&lt;br /&gt;
&lt;br /&gt;
     | H0 | t | M |&lt;br /&gt;
 -------------------&lt;br /&gt;
 P1  | 0  | 5 | 6 |&lt;br /&gt;
 P2  | 1  | 3 | 6 |&lt;br /&gt;
 P3  | 2  | 5 | 8 |&lt;br /&gt;
 P4  | 3  | 1 | 7 |&lt;br /&gt;
 P5  | 4  | 2 | 7 |&lt;br /&gt;
 P6  | 5  | 2 | 5 |&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
&lt;br /&gt;
                        0-5&lt;br /&gt;
            P1  &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
                          6-11&lt;br /&gt;
            P2  |   &amp;lt;---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                                12-19&lt;br /&gt;
            P3  |   |   &amp;lt;---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |       &lt;br /&gt;
                            20-26    &lt;br /&gt;
            P4  |   |   |   &amp;lt;---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |      &lt;br /&gt;
                                  20-26&lt;br /&gt;
            P5  |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
                                      27-31             &lt;br /&gt;
            P6  |   |   |   |   |   &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   &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  20&lt;br /&gt;
&lt;br /&gt;
'''DUDA:'''&lt;br /&gt;
&lt;br /&gt;
Es evidente que cuando llega el P5 se necesitan 7 unidades de memoria, y éstas no están disponibles en el hueco de 27 a 31 (ahí solo hay 5) por lo que da la vuelta, vuelve a comenzar y lo asigna al primero que encuentra, que resulta ser casualmente, el 20-26. --[[Usuario:Ferguatol|fernandoenzo]] 22:14 19 dic 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Mejor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Consiste en asignarle al proceso el hueco con menor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja menos espacio sin utilizar. Su mayor inconveniente es su orden de complejidad (orden lineal, ''O(n)'') debido a que hay que recorrer todo el mapa de bits o toda la lista de control (una posible solución seria usar una lista de control encadenada que mantenga los huecos ordenados por tamaño creciente).&lt;br /&gt;
Otro problema es la fragmentación externa, debido a que se asigna el menor hueco posible, el espacio sobrante sera del menor tamaño posible lo que da lugar a huecos de tamaño normalmente insuficiente para contener programas.&lt;br /&gt;
&lt;br /&gt;
== Peor ajuste ==&lt;br /&gt;
&lt;br /&gt;
Al contrario que el criterio anterior, se busca el hueco con mayor ajuste interno, i.e, el hueco el cual al serle asignado el proceso deja más espacio sin utilizar, y se corta de él el trozo necesario (así la porción sobrante será del mayor tamaño posible y será más aprovechable). Tiene el mismo inconveniente en cuanto a orden de complejidad que el mejor ajuste (debido a la longitud de las búsquedas) y la fragmentación no resulta demasiado eficiente.&lt;br /&gt;
&lt;br /&gt;
== Ajuste rápido ==&lt;br /&gt;
&lt;br /&gt;
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 que corresponda. 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;
Organización de los huecos en el ajuste rápido:&lt;br /&gt;
&lt;br /&gt;
  Punteros a listas       Lista de huecos&lt;br /&gt;
     según tamaño&lt;br /&gt;
  __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |    0 &amp;lt; t &amp;lt; 10    |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |   10 &amp;lt; t &amp;lt; 20    |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |      t &amp;lt; 200     |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
== Método de los compañeros ==&lt;br /&gt;
&lt;br /&gt;
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. Es un método rápido tanto en la asignación como en la liberación de bloques.&lt;br /&gt;
El funcionamiento es el siguiente: &lt;br /&gt;
Cuando se necesita un bloque de tamaño T se busca en la lista de la 1ª potencia mayor o igual a T (por ejemplo 2^k), si no hay ninguno se busca en la lista de la siguiente potencia (2^k+1), si encontramos un bloque libre se retira y se divide por la mitad: una parte se le asigna al proceso y la otra se almacena en la lista de los huecos de tamaño 2^k.&lt;br /&gt;
&lt;br /&gt;
''Organización de los bloques:'' &lt;br /&gt;
&lt;br /&gt;
   __________________     &lt;br /&gt;
 |                  |     _____     _____     _____&lt;br /&gt;
 |      2^(k+1)     |---&amp;gt;|_____|--&amp;gt;|_____|--&amp;gt;|_____|  &lt;br /&gt;
 |__________________|    &lt;br /&gt;
 |                  |     _____     _____ &lt;br /&gt;
 |       2^k        |---&amp;gt;|_____|--&amp;gt;|_____| &lt;br /&gt;
 |__________________| &lt;br /&gt;
 |                  |&lt;br /&gt;
 |       ...        |&lt;br /&gt;
 |__________________|&lt;br /&gt;
 |                  |     _____&lt;br /&gt;
 |         1        |---&amp;gt;|_____|&lt;br /&gt;
 |__________________|&lt;br /&gt;
&lt;br /&gt;
Debido a la forma de dividir los bloques al liberarse uno de ellos solamente podrá fusionarse con sus compañeros (bloques del mismo tamaño) con los que formará un bloque de tamaño superior.&lt;br /&gt;
&lt;br /&gt;
''Divisiones sucesivas de los bloques:''&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0                      |8                      |&lt;br /&gt;
 |_______________________|_______________________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0          |4          |8          |12          |&lt;br /&gt;
 |___________|___________|___________|___________|&lt;br /&gt;
  _______________________________________________&lt;br /&gt;
 |0    |2    |4    |6    |8    |10   |12   |14   | &lt;br /&gt;
 |_____|_____|_____|_____|_____|_____|_____|_____|&lt;br /&gt;
 ________________________________________________&lt;br /&gt;
 |0 | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|&lt;br /&gt;
 |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|&lt;br /&gt;
=Implementación de ajustes en Java=&lt;br /&gt;
&lt;br /&gt;
Se ha realizado un Anexo con la [[Implementación de ajustes en Java|implementación de los criterios de ajuste en Java]], con un gestor de memoria, sobre el que se implementan los métodos de primer ajuste, siguiente ajuste, mejor ajuste y peor ajuste.&lt;br /&gt;
&lt;br /&gt;
Además, permite la visualización de la memoria en cada momento tanto como listas de control como mapas de bits.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</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=2856</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=2856"/>
				<updated>2013-12-12T21:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Prevención */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Condiciones para que se produzca interbloqueo ==&lt;br /&gt;
&lt;br /&gt;
Según [http://en.wikipedia.org/wiki/Edward_G._Coffman,_Jr. Coffman], para que se pueda producir un interbloqueo se tienen que dar las siguientes cuatro condiciones:&lt;br /&gt;
&lt;br /&gt;
* '''Exclusión mutua''': cada recurso está asignado a un único proceso de manera exclusiva.&lt;br /&gt;
* '''Retención y espera''': los procesos que tienen, en un momento dado, recursos asignados con anterioridad, pueden solicitar nuevos recursos y esperar a que se le asignen sin liberar antes alguno de los recursos que ya tenía asignados.&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. Ni siquiera el sistema operativo puede expropiárselo.&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;
Existen diversas estrategias frente a los interbloqueos, que se pueden agrupar en:&lt;br /&gt;
&lt;br /&gt;
* Omisión&lt;br /&gt;
* Detección y recuperación&lt;br /&gt;
* Prevención&lt;br /&gt;
* Predicción&lt;br /&gt;
&lt;br /&gt;
Que se detallan a continuación.&lt;br /&gt;
&lt;br /&gt;
=== Omisión ===&lt;br /&gt;
&lt;br /&gt;
Considera que la probabilidad de un interbloqueo es muy baja, de modo que se confía en que no se van a producir. Por sorprendente que parezca, los sistemas operativos modernos convencionales suelen aplicar esta estrategia. Por justificar la decisión de los fabricantes de sistemas operativos cabe incidir en que las estrategias de resolución y prevención de interbloqueos tienen un coste alto desde el punto de vista del consumo de recursos de procesamiento y memoria.&lt;br /&gt;
&lt;br /&gt;
=== Detección y Recuperación ===&lt;br /&gt;
&lt;br /&gt;
Esta estrategia permite la detección de una situación de interbloqueo y su consiguiente resolución. De entre las medidas de detección consideramos las siguientes:&lt;br /&gt;
&lt;br /&gt;
* ''Grafo de relación recursos-procesos'': Consiste en la representación gráfica de los recursos asignados a los procesos y los recursos que dichos procesos requieren para finalizar su ejecución. Esta técnica se basa en  recorrer el grafo yendo de un nodo a otro, por lo que si se consigue volver al nodo de partida estaremos en un recorrido circular. Para que este tipo de error sea detectado usamos algoritmos de detección,  se lanzan cuando se solicita un recurso ocupado, es decir, hay una nueva arista dentro de nuestro grafo y debemos comprobar que no da lugar a un recorrido cíclico.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo de grafo en el que se detecta un ciclo es el siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:deteccion_ciclo.png]]&lt;br /&gt;
&lt;br /&gt;
* ''Matrices de relación recursos-procesos'': Consiste en la representación matricial de los recursos asignados a los procesos y los recursos que dichos procesos requieren para finalizar su ejecución. Se distinguen dos tipos, el '''método mediante matrices binarias de relación''', y el '''método de detección matricial''':&lt;br /&gt;
&lt;br /&gt;
-''Matrices binarias de relación:''&lt;br /&gt;
Una matriz binaria de relación es aquella que representa una relación R entre dos conjuntos, en la cual el primero de estos dos tiene múltiples asignaciones a elementos del segundo. &lt;br /&gt;
&lt;br /&gt;
El método consiste en, aplicando matrices binarias de relación, utilizar el cierre transitivo para determinar si algún proceso está relacionado consigo mismo a través de otros, señalando así la existencia de ciclos. El procedimiento sería:&lt;br /&gt;
&lt;br /&gt;
1.- Formar la matriz de espera (W: P-&amp;gt;R): Los procesos P están a la espera de recursos R.&lt;br /&gt;
&lt;br /&gt;
2.- Formar la matriz de asignación (A: R-&amp;gt;P): Los recursos R están asignados a procesos P.&lt;br /&gt;
&lt;br /&gt;
3.- Formar la matriz de procesos a la espera de procesos (T: WxA): Producto cartesiano de ambas matrices.&lt;br /&gt;
&lt;br /&gt;
4.- Hallar el cierre transitivo de la matriz T: Que se puede obtener, por ejemplo, aplicando el Algoritmo de Warshall (algoritmo de análisis sobre grafos para encontrar el camino mínimo entre todos los pares de vértices en una única ejecución). El algoritmo es el siguiente:&lt;br /&gt;
&lt;br /&gt;
Warshall(T, n){&lt;br /&gt;
   for (k=1 to n){&lt;br /&gt;
      for (i=1 to n){&lt;br /&gt;
         for (j=1 to n){&lt;br /&gt;
            Tij = Tij ⋁ (Tik ⋀ Tkj)&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Donde n es la dimensión de la matriz T&lt;br /&gt;
&lt;br /&gt;
5.- Si hay procesos que tengan un 1 en la diagonal principal, forman parte de algún ciclo.&lt;br /&gt;
&lt;br /&gt;
Se trata de un método fácil de implementar, ya que solo se realizan operaciones con matrices y bucles, algo muy sencillo para una máquina. Sim embargo, tiene dos inconvenientes:&lt;br /&gt;
* El número de operaciones a realizar es muy alto teniendo en cuenta el tamaño que pueden alcanzar las matrices de recursos&lt;br /&gt;
* Solo se puede usar cuando solo existe una instancia de cada recurso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-''Detección matricial'':&lt;br /&gt;
Método matricial que trata aquellos casos en los que hay múltiples instancias equivalentes de un mismo tipo de recurso. Aísla grupos de procesos que no pueden proseguir la ejecución porque no pueden ver satisfechas sus peticiones pendientes.&lt;br /&gt;
Usan un método iterativo que:&lt;br /&gt;
&lt;br /&gt;
1.-Marca procesos cuyas peticiones puedan satisfacerse con el actual vector de recursos disponibles.&lt;br /&gt;
&lt;br /&gt;
2.-Suma al vector de disponibles los recursos asignados a los procesos marcados.&lt;br /&gt;
&lt;br /&gt;
3.-Si todos los procesos están marcados: no hay interbloqueo.&lt;br /&gt;
&lt;br /&gt;
4.-Si en una iteración no se marcan procesos: los procesos que quedan están interbloqueados.&lt;br /&gt;
&lt;br /&gt;
Tras la detección de un interbloqueo, se pueden aplicar algunas de las siguientes estrategias para resolverlo:&lt;br /&gt;
&lt;br /&gt;
* ''Eliminación'': El sistema operativo selecciona a uno de los procesos que forma parte del interbloqueo y elimina el ciclo acabando con la ejecución de dicho proceso, si no es suficiente se eliminarán procesos hasta que se rompa el ciclo. La selección del proceso se realiza en base a un cierto criterio, por ejemplo, aquel proceso que lleve menos tiempo en ejecución o aquel que sea más voraz consumiendo recursos.Sin embargo, de una manera u otra el trabajo realizado por el proceso se pierde, algo que en algunos casos resulta inadmisible, como en sistemas en tiempo real. Aunque parezca una medida drástica, es la empleada en sistemas operativos convencionales. Aplicar el criterio de selección y eliminar procesos cuando el número de procesos es relativamente bajo puede solucionar el interbloqueo, pero si se da un bloqueo de por ejemplo, centenares de procesos, es una situación prácticamente inmanejable.&lt;br /&gt;
&lt;br /&gt;
* ''Apropiación temporal'': Se retira la asignación de un recurso a un proceso (durante el tiempo necesario) para deshacer el interbloqueo(hemos de asegurarnos de que el proceso no se desbloquea al romperse el interbloqueo). Por ejemplo, supongamos que el recurso es una impresora: podríamos retirarle la asignación a un proceso P1 cuando este terminase de imprimir una página, asignarle la impresora a otro proceso P2 y volver a asignársela a P1 cuando P2 haya terminado su ejecución. El problema es que este método solo es posible dependiendo de la naturaleza del proceso. Con frecuencia es imposible recuperarse de esta manera ya que los recursos no pueden ser apropiados. &lt;br /&gt;
&lt;br /&gt;
* ''Puntos de conformidad'',''sincronismo'' o ''checkpoints'': Consiste en tomar una imagen del estado del proceso, ya sea periódicamente o a instancia del propio proceso, de manera que si se produce un interbloqueo se vuelve a un estado de la ejecución anterior. Son muy poco usados ya que tienen un elevado coste en memoria y existe la posibilidad de que un proceso permanezca indefinidamente sin progresar, y no todos los recursos permiten almacenar y recuperar su estado. Además, puede darse el caso de que el estado del proceso sea externo al sistema (Como en el caso de una conexión a Base de Datos&lt;br /&gt;
&lt;br /&gt;
=== Prevención ===&lt;br /&gt;
&lt;br /&gt;
La prevención apunta a una serie de estrategias que eviten el interbloqueo. Concretamente, son cuatro las estrategias de prevención posibles en base a los  principios que [http://en.wikipedia.org/wiki/Edward_G._Coffman,_Jr. Coffman] estableció como interbloqueo. Dichas estrategias son:&lt;br /&gt;
&lt;br /&gt;
* ''Supresión de exclusión mutua'': Un proceso no puede tener acceso exclusivo a un recurso. No siempre es posible, y puede que lo único que haga sea cambiar el problema de sitio. Es una solución drástica, inviable. Por ejemplo, permitir que dos procesos usaran a la vez una impresora sería caótico.&lt;br /&gt;
* ''Supresión de retención y espera'' (1ª estrategia de Havender): El proceso debe tener asignado todos los recursos necesarios al inicio y no liberarlos hasta que éste finalice, se consigue utilizando un mismo semáforo para todos los recursos necesarios por el proceso. Esto presenta un inconveniente: si un recurso sólo se utiliza al final, estará ocupado durante toda la ejecución, no permitiendo ser usado por otros procesos. El aprovechamiento de recursos puede mejorarse mediante una programación más elaborada, dividiendo la ejecución del proceso en distintas fases y gestionando los recursos para cada una de ellas. Sin embargo, muchos procesos no saben cuántos recursos necesitarán hasta que hayan empezado a ejecutarse. No obstante, esta estrategia presenta unos inconvenientes: la posibilidad de aplazamiento indefinido por parte de aquellos procesos que usan más recursos, que siempre cuando no le falta uno le falta otro, lo que concluye en un mal aprovechamiento de recursos, obligando a los procesos a solicitar los recursos antes de que les haga falta y atentando contra el objetivo eficiente que nos proponemos.&lt;br /&gt;
* ''Supresión de no apropiación'' (2ª estrategia de Havender): Si un proceso está en ejecución y no puede obtener un recurso, dicho proceso libera todos los recursos que está usando y espera a que todos los que necesita estén disponibles. Es una estrategia optimista, usada cuando la probabilidad de que se produzca un interbloqueo en el sistema es baja. Problemas: se puede perder trabajo, además de presentar una carga extra la realización de peticiones. &lt;br /&gt;
* ''Supresión de espera circular'' (3ª estrategia de Havender): Si todos los recursos comunes a varios procesos se solicitan siempre en el mismo orden no se producen interbloqueos. De esta manera, se ordenan los procesos y se solicitan en ese orden. Por ejemplo: tenemos un proceso A y otro B, de manera que ambos hacen uso de los recursos X e Y. En el siguiente caso, no pedirían los recursos en el mismo orden:&lt;br /&gt;
&lt;br /&gt;
{| {{table}}&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''A:'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''B:'''&lt;br /&gt;
|-&lt;br /&gt;
| down(X)||down(Y)&lt;br /&gt;
|-&lt;br /&gt;
| down(Y)||down(X)&lt;br /&gt;
|-&lt;br /&gt;
| …||…&lt;br /&gt;
|-&lt;br /&gt;
| up(Y)||up(X)&lt;br /&gt;
|-&lt;br /&gt;
| up(X)||up(Y)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si se ejecuta la instrucción down(X) de A, se conmuta a B y se ejecuta down(Y), se producirá un interbloqueo, ya que ambos estarán esperando a que el otro libere el recurso que necesitan. &lt;br /&gt;
Sin embargo, si pedimos los recursos siempre en el mismo orden de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
{| {{table}}&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''A:'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''B:'''&lt;br /&gt;
|-&lt;br /&gt;
| down(X)||down(X)&lt;br /&gt;
|-&lt;br /&gt;
| down(Y)||down(Y)&lt;br /&gt;
|-&lt;br /&gt;
| …||…&lt;br /&gt;
|-&lt;br /&gt;
| up(Y)||up(Y)&lt;br /&gt;
|-&lt;br /&gt;
| up(X)||up(X)&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se puede comprobar que es imposible que se de un interbloqueo como en el caso anterior, ocurriendo lo mismo con cualquier número de procesos y recursos.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente radica en que a veces, debido a la variedad y al número de recursos y procesos, es muy engorroso mantener un criterio de orden para todos los procesos de todo tipo.&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, y predice una posible situación de interbloqueo. Si detecta una alta probabilidad de que suceda, adopta una trayectoria de ejecución nueva para los procesos involucrados de manera que se garantice que no va a suceder un interbloqueo.&lt;br /&gt;
&lt;br /&gt;
Si tuviéramos de antemano información sobre cómo los procesos van a usar los recursos, tal vez podríamos forzar un entrelazado de las asignaciones que nunca llevase a interbloqueo. Es un ejemplo el algoritmo del banquero. El inconveniente de este tipo de técnicas es que son poco realistas, ya que en sistemas reales no tenemos forma de predecir a la perfección el futuro de accesos a recursos.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</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=2855</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=2855"/>
				<updated>2013-12-12T21:34:51Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Prevención */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Condiciones para que se produzca interbloqueo ==&lt;br /&gt;
&lt;br /&gt;
Según [http://en.wikipedia.org/wiki/Edward_G._Coffman,_Jr. Coffman], para que se pueda producir un interbloqueo se tienen que dar las siguientes cuatro condiciones:&lt;br /&gt;
&lt;br /&gt;
* '''Exclusión mutua''': cada recurso está asignado a un único proceso de manera exclusiva.&lt;br /&gt;
* '''Retención y espera''': los procesos que tienen, en un momento dado, recursos asignados con anterioridad, pueden solicitar nuevos recursos y esperar a que se le asignen sin liberar antes alguno de los recursos que ya tenía asignados.&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. Ni siquiera el sistema operativo puede expropiárselo.&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;
Existen diversas estrategias frente a los interbloqueos, que se pueden agrupar en:&lt;br /&gt;
&lt;br /&gt;
* Omisión&lt;br /&gt;
* Detección y recuperación&lt;br /&gt;
* Prevención&lt;br /&gt;
* Predicción&lt;br /&gt;
&lt;br /&gt;
Que se detallan a continuación.&lt;br /&gt;
&lt;br /&gt;
=== Omisión ===&lt;br /&gt;
&lt;br /&gt;
Considera que la probabilidad de un interbloqueo es muy baja, de modo que se confía en que no se van a producir. Por sorprendente que parezca, los sistemas operativos modernos convencionales suelen aplicar esta estrategia. Por justificar la decisión de los fabricantes de sistemas operativos cabe incidir en que las estrategias de resolución y prevención de interbloqueos tienen un coste alto desde el punto de vista del consumo de recursos de procesamiento y memoria.&lt;br /&gt;
&lt;br /&gt;
=== Detección y Recuperación ===&lt;br /&gt;
&lt;br /&gt;
Esta estrategia permite la detección de una situación de interbloqueo y su consiguiente resolución. De entre las medidas de detección consideramos las siguientes:&lt;br /&gt;
&lt;br /&gt;
* ''Grafo de relación recursos-procesos'': Consiste en la representación gráfica de los recursos asignados a los procesos y los recursos que dichos procesos requieren para finalizar su ejecución. Esta técnica se basa en  recorrer el grafo yendo de un nodo a otro, por lo que si se consigue volver al nodo de partida estaremos en un recorrido circular. Para que este tipo de error sea detectado usamos algoritmos de detección,  se lanzan cuando se solicita un recurso ocupado, es decir, hay una nueva arista dentro de nuestro grafo y debemos comprobar que no da lugar a un recorrido cíclico.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo de grafo en el que se detecta un ciclo es el siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:deteccion_ciclo.png]]&lt;br /&gt;
&lt;br /&gt;
* ''Matrices de relación recursos-procesos'': Consiste en la representación matricial de los recursos asignados a los procesos y los recursos que dichos procesos requieren para finalizar su ejecución. Se distinguen dos tipos, el '''método mediante matrices binarias de relación''', y el '''método de detección matricial''':&lt;br /&gt;
&lt;br /&gt;
-''Matrices binarias de relación:''&lt;br /&gt;
Una matriz binaria de relación es aquella que representa una relación R entre dos conjuntos, en la cual el primero de estos dos tiene múltiples asignaciones a elementos del segundo. &lt;br /&gt;
&lt;br /&gt;
El método consiste en, aplicando matrices binarias de relación, utilizar el cierre transitivo para determinar si algún proceso está relacionado consigo mismo a través de otros, señalando así la existencia de ciclos. El procedimiento sería:&lt;br /&gt;
&lt;br /&gt;
1.- Formar la matriz de espera (W: P-&amp;gt;R): Los procesos P están a la espera de recursos R.&lt;br /&gt;
&lt;br /&gt;
2.- Formar la matriz de asignación (A: R-&amp;gt;P): Los recursos R están asignados a procesos P.&lt;br /&gt;
&lt;br /&gt;
3.- Formar la matriz de procesos a la espera de procesos (T: WxA): Producto cartesiano de ambas matrices.&lt;br /&gt;
&lt;br /&gt;
4.- Hallar el cierre transitivo de la matriz T: Que se puede obtener, por ejemplo, aplicando el Algoritmo de Warshall (algoritmo de análisis sobre grafos para encontrar el camino mínimo entre todos los pares de vértices en una única ejecución). El algoritmo es el siguiente:&lt;br /&gt;
&lt;br /&gt;
Warshall(T, n){&lt;br /&gt;
   for (k=1 to n){&lt;br /&gt;
      for (i=1 to n){&lt;br /&gt;
         for (j=1 to n){&lt;br /&gt;
            Tij = Tij ⋁ (Tik ⋀ Tkj)&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Donde n es la dimensión de la matriz T&lt;br /&gt;
&lt;br /&gt;
5.- Si hay procesos que tengan un 1 en la diagonal principal, forman parte de algún ciclo.&lt;br /&gt;
&lt;br /&gt;
Se trata de un método fácil de implementar, ya que solo se realizan operaciones con matrices y bucles, algo muy sencillo para una máquina. Sim embargo, tiene dos inconvenientes:&lt;br /&gt;
* El número de operaciones a realizar es muy alto teniendo en cuenta el tamaño que pueden alcanzar las matrices de recursos&lt;br /&gt;
* Solo se puede usar cuando solo existe una instancia de cada recurso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-''Detección matricial'':&lt;br /&gt;
Método matricial que trata aquellos casos en los que hay múltiples instancias equivalentes de un mismo tipo de recurso. Aísla grupos de procesos que no pueden proseguir la ejecución porque no pueden ver satisfechas sus peticiones pendientes.&lt;br /&gt;
Usan un método iterativo que:&lt;br /&gt;
&lt;br /&gt;
1.-Marca procesos cuyas peticiones puedan satisfacerse con el actual vector de recursos disponibles.&lt;br /&gt;
&lt;br /&gt;
2.-Suma al vector de disponibles los recursos asignados a los procesos marcados.&lt;br /&gt;
&lt;br /&gt;
3.-Si todos los procesos están marcados: no hay interbloqueo.&lt;br /&gt;
&lt;br /&gt;
4.-Si en una iteración no se marcan procesos: los procesos que quedan están interbloqueados.&lt;br /&gt;
&lt;br /&gt;
Tras la detección de un interbloqueo, se pueden aplicar algunas de las siguientes estrategias para resolverlo:&lt;br /&gt;
&lt;br /&gt;
* ''Eliminación'': El sistema operativo selecciona a uno de los procesos que forma parte del interbloqueo y elimina el ciclo acabando con la ejecución de dicho proceso, si no es suficiente se eliminarán procesos hasta que se rompa el ciclo. La selección del proceso se realiza en base a un cierto criterio, por ejemplo, aquel proceso que lleve menos tiempo en ejecución o aquel que sea más voraz consumiendo recursos.Sin embargo, de una manera u otra el trabajo realizado por el proceso se pierde, algo que en algunos casos resulta inadmisible, como en sistemas en tiempo real. Aunque parezca una medida drástica, es la empleada en sistemas operativos convencionales. Aplicar el criterio de selección y eliminar procesos cuando el número de procesos es relativamente bajo puede solucionar el interbloqueo, pero si se da un bloqueo de por ejemplo, centenares de procesos, es una situación prácticamente inmanejable.&lt;br /&gt;
&lt;br /&gt;
* ''Apropiación temporal'': Se retira la asignación de un recurso a un proceso (durante el tiempo necesario) para deshacer el interbloqueo(hemos de asegurarnos de que el proceso no se desbloquea al romperse el interbloqueo). Por ejemplo, supongamos que el recurso es una impresora: podríamos retirarle la asignación a un proceso P1 cuando este terminase de imprimir una página, asignarle la impresora a otro proceso P2 y volver a asignársela a P1 cuando P2 haya terminado su ejecución. El problema es que este método solo es posible dependiendo de la naturaleza del proceso. Con frecuencia es imposible recuperarse de esta manera ya que los recursos no pueden ser apropiados. &lt;br /&gt;
&lt;br /&gt;
* ''Puntos de conformidad'',''sincronismo'' o ''checkpoints'': Consiste en tomar una imagen del estado del proceso, ya sea periódicamente o a instancia del propio proceso, de manera que si se produce un interbloqueo se vuelve a un estado de la ejecución anterior. Son muy poco usados ya que tienen un elevado coste en memoria y existe la posibilidad de que un proceso permanezca indefinidamente sin progresar, y no todos los recursos permiten almacenar y recuperar su estado. Además, puede darse el caso de que el estado del proceso sea externo al sistema (Como en el caso de una conexión a Base de Datos&lt;br /&gt;
&lt;br /&gt;
=== Prevención ===&lt;br /&gt;
&lt;br /&gt;
La prevención apunta a una serie de estrategias que eviten el interbloqueo. Concretamente, son cuatro las estrategias de prevención posibles en base a los  principios que [http://en.wikipedia.org/wiki/Edward_G._Coffman,_Jr. Coffman] estableció como interbloqueo. Dichas estrategias son:&lt;br /&gt;
&lt;br /&gt;
* ''Supresión de exclusión mutua'': Un proceso no puede tener acceso exclusivo a un recurso. No siempre es posible, y puede que lo único que haga sea cambiar el problema de sitio. Es una solución drástica, inviable. Por ejemplo, permitir que dos procesos usaran a la vez una impresora sería caótico.&lt;br /&gt;
* ''Supresión de retención y espera'' (1ª estrategia de Havender): El proceso debe tener asignado todos los recursos necesarios al inicio y no liberarlos hasta que éste finalice, se consigue utilizando un mismo semáforo para todos los recursos necesarios por el proceso. Esto presenta un inconveniente: si un recurso sólo se utiliza al final, estará ocupado durante toda la ejecución, no permitiendo ser usado por otros procesos. El aprovechamiento de recursos puede mejorarse mediante una programación más elaborada, dividiendo la ejecución del proceso en distintas fases y gestionando los recursos para cada una de ellas. Sin embargo, muchos procesos no saben cuántos recursos necesitarán hasta que hayan empezado a ejecutarse. No obstante, esta estrategia presenta unos inconvenientes: la posibilidad de aplazamiento indefinido por parte de aquellos procesos que usan más recursos, que siempre cuando no le falta uno le falta otro, lo que concluye en un mal aprovechamiento de recursos, obligando a los procesos a solicitar los recursos antes de que les haga falta y atentando contra el objetivo eficiente que nos proponemos.&lt;br /&gt;
* ''Supresión de no apropiación'' (2ª estrategia de Havender): Si un proceso está en ejecución y no puede obtener un recurso, dicho proceso libera todos los recursos que está usando y espera a que todos los que necesita estén disponibles. Es una estrategia optimista, usada especialmente tengo la certeza de que hay una probabilidad muy baja de que se produzca un interbloqueo. Problemas: se puede perder trabajo, además de presentar una carga extra la realización de peticiones. &lt;br /&gt;
* ''Supresión de espera circular'' (3ª estrategia de Havender): Si todos los recursos comunes a varios procesos se solicitan siempre en el mismo orden no se producen interbloqueos. De esta manera, se ordenan los procesos y se solicitan en ese orden. Por ejemplo: tenemos un proceso A y otro B, de manera que ambos hacen uso de los recursos X e Y. En el siguiente caso, no pedirían los recursos en el mismo orden:&lt;br /&gt;
&lt;br /&gt;
{| {{table}}&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''A:'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''B:'''&lt;br /&gt;
|-&lt;br /&gt;
| down(X)||down(Y)&lt;br /&gt;
|-&lt;br /&gt;
| down(Y)||down(X)&lt;br /&gt;
|-&lt;br /&gt;
| …||…&lt;br /&gt;
|-&lt;br /&gt;
| up(Y)||up(X)&lt;br /&gt;
|-&lt;br /&gt;
| up(X)||up(Y)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si se ejecuta la instrucción down(X) de A, se conmuta a B y se ejecuta down(Y), se producirá un interbloqueo, ya que ambos estarán esperando a que el otro libere el recurso que necesitan. &lt;br /&gt;
Sin embargo, si pedimos los recursos siempre en el mismo orden de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
{| {{table}}&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''A:'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''B:'''&lt;br /&gt;
|-&lt;br /&gt;
| down(X)||down(X)&lt;br /&gt;
|-&lt;br /&gt;
| down(Y)||down(Y)&lt;br /&gt;
|-&lt;br /&gt;
| …||…&lt;br /&gt;
|-&lt;br /&gt;
| up(Y)||up(Y)&lt;br /&gt;
|-&lt;br /&gt;
| up(X)||up(X)&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se puede comprobar que es imposible que se de un interbloqueo como en el caso anterior, ocurriendo lo mismo con cualquier número de procesos y recursos.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente radica en que a veces, debido a la variedad y al número de recursos y procesos, es muy engorroso mantener un criterio de orden para todos los procesos de todo tipo.&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, y predice una posible situación de interbloqueo. Si detecta una alta probabilidad de que suceda, adopta una trayectoria de ejecución nueva para los procesos involucrados de manera que se garantice que no va a suceder un interbloqueo.&lt;br /&gt;
&lt;br /&gt;
Si tuviéramos de antemano información sobre cómo los procesos van a usar los recursos, tal vez podríamos forzar un entrelazado de las asignaciones que nunca llevase a interbloqueo. Es un ejemplo el algoritmo del banquero. El inconveniente de este tipo de técnicas es que son poco realistas, ya que en sistemas reales no tenemos forma de predecir a la perfección el futuro de accesos a recursos.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2846</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2846"/>
				<updated>2013-12-05T11:04:31Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''C)'' Si las páginas fueran de 1 KByte, ¿pertenecen las direccion 0xabc10008 y 0xabc800aa al mismo marco? Razone la respuesta. &lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
          &lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
                 ┌───────────────────────────┬────────────┐&lt;br /&gt;
      0xabc10008:│1010 1011 1100 '''0001''' 0000 00│00 0000 1000│&lt;br /&gt;
      0xabc800aa:│1010 1011 1100 '''1000''' 0000 00│00 1010 1010│&lt;br /&gt;
                 └───────────────────────────┴────────────┘&lt;br /&gt;
                             ''marco''           ''desplazamiento''&lt;br /&gt;
&lt;br /&gt;
''D)'' Indique el tamaño máximo de la tabla de páginas de un proceso suponiendo que cada entrada ocupa 8 bytes. &lt;br /&gt;
   Para calcular el tamaño máximo de la tabla de de páginas de un proceso:&lt;br /&gt;
   - ''Número de páginas máximo'': 64 páginas (2^6)&lt;br /&gt;
   - ''Tamaño de entrada'': 8 bytes(2^3)&lt;br /&gt;
   '''Tamaño máximo''': número de páginas máximo * tamaño de entrada = 2^6 * 2^3 = '''512 bytes'''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2845</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2845"/>
				<updated>2013-12-05T10:57:19Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C) Si las páginas fuesen de 1 Kb(2^10 bits), la distribución sería:&lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
          &lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
                 ┌───────────────────────────┬────────────┐&lt;br /&gt;
      0xabc10008:│1010 1011 1100 '''0001''' 0000 00│00 0000 1000│&lt;br /&gt;
      0xabc800aa:│1010 1011 1100 '''1000''' 0000 00│00 1010 1010│&lt;br /&gt;
                 └───────────────────────────┴────────────┘&lt;br /&gt;
                             ''marco''           ''desplazamiento''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2844</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2844"/>
				<updated>2013-12-05T10:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C) Si las páginas fuesen de 1 Kb(2^10 bits), la distribución sería:&lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
         &lt;br /&gt;
   '''Desglose de direcciones'''&lt;br /&gt;
   &lt;br /&gt;
              ┌---------------------------┬------------┐&lt;br /&gt;
   0xabc10008:|1010 1011 1100 '''0001''' 0000 00|00 0000 1000|&lt;br /&gt;
   0xabc800aa:|1010 1011 1100 '''1000''' 0000 00|00 1010 1010|&lt;br /&gt;
              └---------------------------┴------------┘&lt;br /&gt;
                           ''marco''          ''desplazamiento''&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2843</id>
		<title>Solución del ejercicio 4 de paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_del_ejercicio_4_de_paginaci%C3%B3n&amp;diff=2843"/>
				<updated>2013-12-05T10:52:17Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: Página creada con 'C) Si las páginas fuesen de 1 Kb(2^10 bits), la distribución sería:    - Bits de marco          = '''22 bits de marco'''    - Bits de desplazamiento = '''10 bits de desplazam…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C) Si las páginas fuesen de 1 Kb(2^10 bits), la distribución sería:&lt;br /&gt;
   - Bits de marco          = '''22 bits de marco'''&lt;br /&gt;
   - Bits de desplazamiento = '''10 bits de desplazamiento'''.&lt;br /&gt;
   0xabc10008 -&amp;gt; Marco: abc10 y los dos primeros bits de 0 = 00&lt;br /&gt;
   0xabc800aa -&amp;gt; Marco: abc80 y los dos primeros bits de 0 = 00&lt;br /&gt;
   &lt;br /&gt;
   Aunque los dos últimos bits coincidan, la primera parte no, por lo tanto '''no son del mismo marco'''.&lt;br /&gt;
&lt;br /&gt;
''Desglose de direcciones''&lt;br /&gt;
   &lt;br /&gt;
              ┌---------------------------┬------------┐&lt;br /&gt;
   0xabc10008:|1010 1011 1100 0001 0000 00|00 0000 1000|&lt;br /&gt;
   0xabc800aa:|1010 1011 1100 1000 0000 00|00 1010 1010|&lt;br /&gt;
              └---------------------------┴------------┘&lt;br /&gt;
                           marco          desplazamiento&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sistema_combinado&amp;diff=2842</id>
		<title>Sistema combinado</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sistema_combinado&amp;diff=2842"/>
				<updated>2013-12-05T08:09:27Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consiste en combinar la segmentación y la paginación. La idea fundamental consiste en definir segmentos que están compuestos por N páginas. De ahí que reciba el nombre de '''segmentación paginada'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Archivo:Sistema combinado.jpg]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por tanto, cualquier segmento ocupa, como mínimo una página de memoria.&lt;br /&gt;
&lt;br /&gt;
Por una parte, la segmentación proporciona ventajas hacia los procesos: Organización de datos y código, mecanismos de protección, compartición de datos y código, y optimización en el espacio ocupado. Por otra parte, la paginación facilita el uso de la memoria virtual, y genera dispersión en memoria. Además como la paginación es transparente, se puede usar paginación bajo un sistema segmentado sin problema.&lt;br /&gt;
&lt;br /&gt;
Los procesos emplean direcciones lógica de memoria segmentada, que son traducidas a direcciones lógicas páginadas, que a su vez deben de ser traducidas a direcciones físicas. Por tanto, cualquier acceso a memoria supone un total de tres accesos a memoria. Uno para acceder a la tabla de segmentos, otro para acceder a la tabla de páginas y, por último, otro más para acceder a la dirección física. Aquí hay un ejemplo de la arquitectura IA32:&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Arquitecturaia32_2.jpg]] &amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Arquitecturaia32_2.jpg&amp;diff=2841</id>
		<title>Archivo:Arquitecturaia32 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Arquitecturaia32_2.jpg&amp;diff=2841"/>
				<updated>2013-12-05T08:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Algoritmo_para_averiguar_interbloqueo&amp;diff=2813</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=2813"/>
				<updated>2013-11-27T20:41:29Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Algoritmo en Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmo del Banquero ==&lt;br /&gt;
&lt;br /&gt;
'''Introducción:'''&lt;br /&gt;
&lt;br /&gt;
Este algoritmo recibe el nombre de banquero porque su funcionamiento es parecido a la gestión que hacen los bancos con las cuentas de crédito.&lt;br /&gt;
Necesita conocer de antemano las necesidades máximas de recursos por parte de cada proceso, esto es poco realista. Además, supone que cuando un proceso ha conseguido todos los recursos que necesita, los libera. &lt;br /&gt;
&lt;br /&gt;
Para entenderlo un poco mejor hagamos la similitud con un banco:&lt;br /&gt;
Un banquero (s.o.) dispone de unos fondos (recursos) y tiene unos clienes (procesos). Cada cliente dispone de un crédito que corresponde al máximo que el banquero le prestará. El cliente irá solicitando fondos de ese crédito conforme los necesite. Si el banquero tuviese&lt;br /&gt;
fondos suficientes para prestar el máximo a cada cliente, no habría inconvenientes. Sin embargo, esto no es así, los recursos del banquero &lt;br /&gt;
son limitados, por lo que si todos reclaman todo su crédito no podrá satisfacerlos simultáneamente. Por lo tanto, la solución es que el &lt;br /&gt;
banquero gestione sus fondos de manera que todos los clientes puedan llegar al máximo en algún momento, aunque no lo hagan todos al mismo tiempo.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La idea genérica del algoritmo es:&lt;br /&gt;
&lt;br /&gt;
     1. Buscar un proceso cuya suma recAsig + recDisp &amp;gt;= recMax&lt;br /&gt;
     2. Suponemos que se asignan dichos recursos y el proceso termina su ejecución. &lt;br /&gt;
        Sumamos sus recursos al vector recDisp y añadimos el proceso a la lista de finalizados.&lt;br /&gt;
     3. Repetir primer paso hasta terminar todos los procesos (siendo un estado estable)&lt;br /&gt;
        o bien hasta el punto en el que no sea posible ninguna asignación de recursos,&lt;br /&gt;
        existiendo pues interbloqueo.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
     Proceso  |  Asignados  |  Maximos  |  Disponibles&lt;br /&gt;
              |  A B C D E  | A B C D E |   A B C D E   &lt;br /&gt;
    __________|_____________|___________|_______________  &lt;br /&gt;
    P0        |  1 0 2 1 1  | 1 2 2 1 2 |   0 0 2 1 1    //Recursos Disponibles Iniciales&lt;br /&gt;
    P1        |  2 0 1 1 0  | 2 2 2 1 0 |   1 1 3 2 1    //P3 finalizado&lt;br /&gt;
    P2        |  1 1 0 1 0  | 2 1 3 1 0 |   2 2 3 3 1    //P2 finalizado&lt;br /&gt;
    P3        |  1 1 1 1 0  | 1 1 2 2 1 |   3 2 5 4 2    //P0 finalizado&lt;br /&gt;
                                                         //P1 finalizado&lt;br /&gt;
Pasos:&lt;br /&gt;
  1. El primer proceso que cumple el paso 1 del algoritmo en esta tabla es P3: &lt;br /&gt;
     [1 1 1 1 0]+[0 0 2 1 1] &amp;gt;= [1 1 3 2 1]&lt;br /&gt;
     Lo consideramos terminado y añadimos sus recursos a los disponibles&lt;br /&gt;
  2. Volvemos a iterar desde P0. El siguiente proceso que puede adquirir los recursos necesarios&lt;br /&gt;
     es P2. Añadimos sus recursos a la lista de disponibles&lt;br /&gt;
  3. Ahora nos es posible terminar P0 y por último P1.&lt;br /&gt;
  4. Hemos logrado terminar todos los procesos sin problemas.&lt;br /&gt;
&lt;br /&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;br /&gt;
&lt;br /&gt;
== Algoritmo en Java ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Comprobaciones {&lt;br /&gt;
&lt;br /&gt;
	public static List&amp;lt;Proceso&amp;gt; devuelveLista(List&amp;lt;Proceso&amp;gt; asignados, List&amp;lt;Proceso&amp;gt; necesarios, Disponibles recursos){&lt;br /&gt;
		List&amp;lt;Proceso&amp;gt; terminados = new ArrayList&amp;lt;Proceso&amp;gt;();&lt;br /&gt;
		for(int i = 0; i &amp;lt; necesarios.size(); i++){&lt;br /&gt;
			if(!(terminados.contains(asignados.get(i))) &amp;amp;&amp;amp; ejecuta(asignados.get(i), necesarios.get(i), recursos)){&lt;br /&gt;
					terminados.add(asignados.get(i));&lt;br /&gt;
				System.out.println(&amp;quot;Proceso &amp;quot; + asignados.get(i).getNombre() + &amp;quot; terminado&amp;quot;);&lt;br /&gt;
				for(int j = 0; j &amp;lt; recursos.getDisponibles().size(); j++){&lt;br /&gt;
					recursos.setDisponible(recursos.getDisponibles().get(j) + asignados.get(i).getRecursosNecesarios().get(j), j);&lt;br /&gt;
				}&lt;br /&gt;
				System.out.println(&amp;quot;Recursos disponibles: &amp;quot; + recursos.getDisponibles());&lt;br /&gt;
				i = -1;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		if(terminados.size() == asignados.size()){&lt;br /&gt;
			System.out.println(&amp;quot;Todos los procesos han sido ejecutados sin problemas.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			System.out.println(&amp;quot;Hay un interbloqueo, no se pueden seguir ejecutando procesos...&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		return terminados;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public static Boolean ejecuta(Proceso asignados, Proceso necesarios, Disponibles disponibles){&lt;br /&gt;
		// Devuelve True si tiene recursos suficientes...&lt;br /&gt;
		Boolean ej = true;&lt;br /&gt;
		for(int i = 0; i &amp;lt; necesarios.getRecursosNecesarios().size(); i++){&lt;br /&gt;
			if((asignados.getRecursosNecesarios().get(i) + disponibles.getDisponibles().get(i)) &amp;lt; necesarios.getRecursosNecesarios().get(i)){&lt;br /&gt;
				ej = false;&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return ej;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
		&lt;br /&gt;
		List&amp;lt;Proceso&amp;gt; asignados = creaAsignados();&lt;br /&gt;
		List&amp;lt;Proceso&amp;gt; necesarios = creaNecesarios();&lt;br /&gt;
		Disponibles disponibles = creaDisponibles();&lt;br /&gt;
		Comprobaciones.devuelveLista(asignados, necesarios, disponibles);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Resultado:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Proceso P4 terminado&lt;br /&gt;
Recursos disponibles: [1, 1, 3, 2, 1]&lt;br /&gt;
Proceso P3 terminado&lt;br /&gt;
Recursos disponibles: [2, 2, 3, 3, 1]&lt;br /&gt;
Proceso P1 terminado&lt;br /&gt;
Recursos disponibles: [3, 2, 5, 4, 2]&lt;br /&gt;
Proceso P2 terminado&lt;br /&gt;
Recursos disponibles: [5, 2, 6, 5, 2]&lt;br /&gt;
Todos los procesos han sido ejecutados sin problemas.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nota: Las clases lo único que contienen son listas de enteros, y los procesos contienen además los nombres de los mismos.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=2807</id>
		<title>Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=2807"/>
				<updated>2013-11-26T09:50:09Z</updated>
		
		<summary type="html">&lt;p&gt;Albrojfer1: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
Un segmento es un espacio de memoria de tamaño variable, compuesto por:&lt;br /&gt;
*Descriptor: Identificador único del segmento (dentro del espacio de memoria del proceso).&lt;br /&gt;
*Tamaño del segmento&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segmentos.png|725px]]&lt;br /&gt;
&lt;br /&gt;
=Características=&lt;br /&gt;
*Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.&lt;br /&gt;
&lt;br /&gt;
*Solapamiento: Se puede hacer que 2 segmentos se superpongan de manera que compartan direcciones de memoria física con direcciones lógicas diferentes. Para evitar problemas de concurrencia, debe de indicarse explícitamente que una porción de memoria puede ser compartida. De esta manera, procesos diferentes pueden compartir información y código usando la memoria común.&lt;br /&gt;
&lt;br /&gt;
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).&lt;br /&gt;
&lt;br /&gt;
*Cuando un proceso requiere más memoria se crea un nuevo segmento.&lt;br /&gt;
&lt;br /&gt;
*Dos instancias de un mismo proceso pueden compartir segmentos de memoria de instrucciones/código, pero no para datos ya que esto complicaría la gestión.&lt;br /&gt;
&lt;br /&gt;
*Es posible la redimensión de un segmento.&lt;br /&gt;
&lt;br /&gt;
*Gestión compleja, sobretodo por su tamaño variable&lt;br /&gt;
&lt;br /&gt;
*Permite la carga de segmentos a petición, de manera que no se disponga de todos los segmentos en memoria principal, que se puedan descargar a disco (en la zona de intercambio o swap) en base a un cierto criterio (ver [[Intro | Memoria virtual]]). Esta zona de intercambio puede ser:&lt;br /&gt;
**Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
**Un fichero oculto de tamaño fijo o variable dependiendo de la configuración dada por el usuario (Windows).&lt;br /&gt;
&lt;br /&gt;
=Mecanismos=&lt;br /&gt;
Los diferentes mecanismos que nos ofrece la segmentación de memoria son los siguientes.&lt;br /&gt;
==Carga de segmentos a petición==&lt;br /&gt;
Es un mecanismo que permite a un proceso no disponer de todos sus segmentos en memoria principal, se pueden descargar a disco (en la zona de intercambio o swap) segmentos en base a un cierto criterio (ver [[Intro | Memoria virtual]]). &lt;br /&gt;
&lt;br /&gt;
Esta zona de intercambio puede ser:&lt;br /&gt;
&lt;br /&gt;
* Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
&lt;br /&gt;
* Un fichero oculto de tamaño fijo o variable dependiendo de la configuracion dada por el usuario (Windows).&lt;br /&gt;
&lt;br /&gt;
==Formas de uso de los descriptores==&lt;br /&gt;
En cuanto a aspectos materiales, se plantea el problema de que no es habitual que la tabla de segmentos quepa en el dispositivo de traducción (MMU), por lo que se almacena la tabla en memoria, y el MMU contiene su dirección. El problema es que esta técnica hace que el tiempo de acceso se duplique, al haber un primer acceso al MMU y un segundo acceso a la dirección efectiva. Se plantean dos soluciones no excluyentes:&lt;br /&gt;
* '''Uso de registros descriptores de segmento en MMU:'''&lt;br /&gt;
&amp;lt;blockquote&amp;gt; &lt;br /&gt;
En MMU nos encontraremos varios registros que pueden contener descriptores, en los que se copiarán los que se vayan a usar en un futuro inmediato. Hay dos tipos de registros:&lt;br /&gt;
*Registros de propósito general:&lt;br /&gt;
Registros sobre los que se cargan los próximos descriptores a usar, y dos tipos de direcciones:&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en la tabla de memoria (y necesitan más bits para hacer referencia al descriptor)&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en MMU (y necesitan menos bits para referir al descriptor)&lt;br /&gt;
*Registros especializados:&lt;br /&gt;
Registros capaces de albergar a un descriptor concreto, como el DS (Para manejo de datos), SS (Para manipulación de pila) o el CS (Para instrucciones de salto y llamadas a rutinas). También existen dos tipos de direcciones:&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que hacen referencia a un descriptor en la tabla de memoria&lt;br /&gt;
&amp;lt;br&amp;gt;- Las que no hacen referencia a ningún descriptor, y emplean descriptores de MMU, según el tipo de instrucción&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Uso de descriptores en memoria asociativa (Cache):'''&lt;br /&gt;
&amp;lt;blockquote&amp;gt; &lt;br /&gt;
La MMU contiene una memoria asociativa indexada por número de descriptor. Para cada acceso, se busca en la memoria asociativa el número de descriptor, y si no está, se carga a esta (Si se llena la memoria asociativa se lleva a cabo reemplazo). Este tipo de memoria es transparente, por lo que se puede usar en conjunción con registros descriptores de segmento en MMU.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Superposición de segmentos=&lt;br /&gt;
Varios segmentos pueden estar parcial o totalmente solapados en memoria. Una dirección física se puede corresponder con múltiples direcciones lógicas. Los segmentos superpuestos pueden tener incluso distintos permisos (segmento 0 y 1 ). Si son totalmente superpuestos se denominan segmentos alias. &lt;br /&gt;
&lt;br /&gt;
Se aplica para implementar la técnica de &amp;quot;copy on write&amp;quot; (animación). Se crea inicialmente un segmento de datos, con permiso de lectura y escritura. Al crear el segmento de COW, este se crea con la misma dirección y tamaño (totalmente solapado), pero nótese que se quita el permiso de escritura en ambos segmentos. Si se intenta escribir en uno de los dos, se produce un fallo de protección. Entonces se copia el segundo segmento sobre una nueva ubicación, actualizándose su dirección y restituyéndose en ambos el permiso de escritura.&lt;br /&gt;
Otra aplicación: en un micro que no permita modificar segmento de código, se puede crear un segmento alias de dato para modificarlo.&lt;br /&gt;
&lt;br /&gt;
=Crecimiento de proceso=&lt;br /&gt;
Existen dos formas de crecimiento: Asignando nuevos segmentos al proceso, y haciendo crecer algún segmento asignado. &lt;br /&gt;
Para crecer un segmento: si hay suficiente espacio libre detrás, se cambia el tamaño en el descriptor; si no hay suficiente espacio: se copia al hueco libre (compactando si es necesario) y se cambia el tamaño ( y dirección base, claro está). &lt;br /&gt;
Existe la posibilidad de crecimiento automático, a cada segmento se asocia un atributo &amp;quot;permitir crecer&amp;quot;; Si se sobrepasa el límite en un segmento que puede crecer, el tratamiento de la excepción es el que hará crecer al segmento.&lt;br /&gt;
Gracias a la segmentación, todas las direcciones son reubicables.&lt;/div&gt;</summary>
		<author><name>Albrojfer1</name></author>	</entry>

	</feed>