<?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=Migoligon</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=Migoligon"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php/Especial:Contribuciones/Migoligon"/>
		<updated>2026-05-05T02:22:27Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_en_sistemas_multiprocesadores&amp;diff=2475</id>
		<title>Planificación en sistemas multiprocesadores</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_en_sistemas_multiprocesadores&amp;diff=2475"/>
				<updated>2012-01-29T17:57:00Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: titulo y negrita&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=5.2 Planificación en sistemas multiprocesadores=&lt;br /&gt;
&lt;br /&gt;
Los sistemas multiprocesadores son aquellos que disponen de 2 o más procesadores. Hasta el momento hemos aplicado los criterios de planificación considerando un único procesador. Con más de un procesador, tenemos que decidir a qué procesador se asignan cada uno de los procesos en ejecución. Hay dos estrategias de asignación en sistemas multiprocesadores, que son:&lt;br /&gt;
&lt;br /&gt;
* '''Asignación estática''': Cuando un proceso pasa a estado activo por primera vez, se le asigna un determinado procesador (el que menor carga de trabajo tenga en ese momento) al que se asocia hasta fin de ejecución. Por tanto, un proceso tiene que pasar a estado activo empleando el mismo procesador hasta fin de ejecución. Dicho de otra manera, no es posible migrar procesos de un procesador a otro incluso si hay procesadores ociosos.&lt;br /&gt;
&lt;br /&gt;
* '''Asignación dinámica''': En este caso, nuestros procesos en estado preparado pueden cambiar de procesador para pasar a estado activo si resulta que el último procesador en el que se ejecutó está ocupado y existe un procesador ocioso. Este método de asignación permite la migración de procesos de un procesador a otro, llevando a cabo un balanceo de carga de procesos entre los procesadores existentes. No obstante, la migración de un proceso de un procesador a otro es costosa. Por tanto, '''siempre que sea posible''' se intentará permanecer en el mismo procesador para no incurrir en la penalización asociada a los fallos de caché que resultan de la migración de procesos.&lt;br /&gt;
&lt;br /&gt;
Los planificadores de los sistemas operativos modernos aplican una ''asignación híbrida'' de manera que emplea asignación estática la mayor parte del tiempo. Sin embargo, si el número de procesos asociados a un procesador supera en N unidades al de otro, se procede a migrar procesos al procesador con menor número de procesos para balancear la carga de trabajo. Este es el caso del planificador del núcleo de Linux.&lt;br /&gt;
&lt;br /&gt;
El alto coste en la migración de procesos entre procesadores se debe a la penalización asociada a los fallos en la caché. Cada procesador generalmente dispone de una pequeña memoria asociativa de acceso rápido, también conocida como caché, en la que se almacenan los datos accedidos recientemente. Si migramos un proceso de procesador se tienen que cargar de nuevo los datos en la caché del nuevo procesador, incrementando de manera considerable los tiempos de accesos a datos.&lt;br /&gt;
&lt;br /&gt;
A continuación, un ejemplo de planificación en sistemas multiprocesadores con dos CPUs que emplea asignación estática:&lt;br /&gt;
[[Archivo:Ejemplo de multiprocesador.png]]&lt;br /&gt;
&lt;br /&gt;
Fíjese que tras el instante de tiempo 1, el proceso A continúa en el CPU 1 pues el proceso B se asignó al CPU 2, que estaba ocioso en ese instante de tiempo.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Ejemplo_de_multiprocesador.png&amp;diff=2474</id>
		<title>Archivo:Ejemplo de multiprocesador.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Ejemplo_de_multiprocesador.png&amp;diff=2474"/>
				<updated>2012-01-29T17:55:30Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Ejemplo de multiprocesador.png»:&amp;amp;#32;Revertido a la versión subida el 1 nov 2011 a las 10:39 si quito lo blanco se ve demasiado pequeño y se ve peor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Ejemplo_de_multiprocesador.png&amp;diff=2473</id>
		<title>Archivo:Ejemplo de multiprocesador.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Ejemplo_de_multiprocesador.png&amp;diff=2473"/>
				<updated>2012-01-29T17:53:47Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Ejemplo de multiprocesador.png»:&amp;amp;#32;quitar todo lo blanco que sobra y hace feo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos_de_tiempo_real&amp;diff=2470</id>
		<title>Planificación de procesos de tiempo real</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos_de_tiempo_real&amp;diff=2470"/>
				<updated>2012-01-29T17:11:26Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Clasificación */ Darwin OS, no solo es el nombre del planificador del Mac OS si que también es un SO. (añado enlace)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ¿Qué es un proceso de tiempo real? ==&lt;br /&gt;
&lt;br /&gt;
Un proceso de tiempo real es aquel cuya actividad tiene un '''plazo de finalización'''.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué es un sistema operativo de tiempo real? ==&lt;br /&gt;
&lt;br /&gt;
Un sistema operativo de tiempo real dispone de un planificador de procesos que tiene mecanismos para hacer lo máximo posible para garantizar que sus procesos de tiempo real cumplan los plazos de finalización que tienen establecidos.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
&lt;br /&gt;
Podemos clasificar los procesos de tiempo real de diferentes maneras:&lt;br /&gt;
&lt;br /&gt;
Segun el plazo de tiempo:&lt;br /&gt;
*'''Rígidos(''hard-realtime'')''' : se debe realizar en un plazo de tiempo determinado. Si no lo hace, deja de tener sentido. Si el plazo de tiempo para realizarla es superado el proceso se aborta. Ejemplo: Industriales ( sensores, activadores,...).&lt;br /&gt;
&lt;br /&gt;
*'''Flexibles(''soft-realtime'')''' : es deseable que se cumpla el plazo de tiempo. Ej: Videoconferencia.(Mientras más rapido vaya mejor sera la comunicacion , pero si no , nos adaptamos a ella)&lt;br /&gt;
&lt;br /&gt;
*'''Opcionales''' : conviene hacerla en el plazo de tiempo, pero si no es posible se puede posponer. Ej: actualización de una aplicacion/programa instalada en el ordenador.&lt;br /&gt;
&lt;br /&gt;
Según la periodicidad:&lt;br /&gt;
&lt;br /&gt;
*'''Aperiódicas''' : se deben a sucesos externos que deben ser atendidos. El sistema operativo no sabe, a priori, cuándo van a llegar ni el tiempo que va a durar. Ej: Notificaciones de errores, Sensores de emergencia en un coche, Ventiladores para refrigeración.&lt;br /&gt;
&lt;br /&gt;
*'''Periódicas''' : se realizan cada cierto tiempo (actividad repetitiva). A diferencia del anterior el sistema operativo conoce a priori cuándo van a llegar y su tiempo de duración Ej: leer la temperatura de un sensor.&lt;br /&gt;
&lt;br /&gt;
Podemos tener aplicaciones de tiempo real (flexibles) en sistemas operativos que no son de tiempo real (Linux, [http://darwinosx.blogspot.com/p/descarga-darwin-os.html Darwin], Windows).&lt;br /&gt;
&lt;br /&gt;
== Métodos de planificación ==&lt;br /&gt;
&lt;br /&gt;
Los métodos de planificación a utilizar en SSOO de tiempo real son:&lt;br /&gt;
&lt;br /&gt;
*'''Planificación apropiativa con prioridad estática''': Cada proceso tiene asociado un índice de prioridad y el procesador elige aquel proceso de la lista de preparados con mayor prioridad, es el más tradicional y puede ser llevado a cabo por el procesador de un sistema que no sea de tiempo real.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación de tablas estáticas''': se conocen las actividades a realizar (todas periódicas) y se elabora un plan fijo de ejecución.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación dinámica''': Es muy parecida a la de tablas estáticas , pero también admite actividades aperiódicas. Cuando se presenta una actividad aperiódica , el planificador intenta construir un nuevo plan de ejecución que incluya a todas las actividades. Si no encuentra la solución que las englobe a todas, rechaza la actividad, que debe ser flexible u opcional. También puede retrasar alguna actividad flexible/opcional.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación dinámica con un mejor resultado''':Se utiliza para aplicaciones compuestas mayormente por actividades aperiódicas.El planificador intenta cumplir el plazo de todas las actividades asignandole a cada actividad una prioridad en base a sus características (las actividades fuera de plazo se abortan). Es muy similar a la anterior, la diferencia más notable es que en la anterior existe un análisis previo aceptando actividades aperiódicas y en ésta no existe tal análisis.&lt;br /&gt;
Es un método fácil de implementar, sin embargo, no podremos saber de antemano si una actividad cumplirá su plazo o no (sabremos que no lo cumple si es abortada, y viceversa).&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo emplea planificación apropiativa por prioridades estática con actividades periódicas y aperiódicas:&lt;br /&gt;
&lt;br /&gt;
                    ____|__PA__|_PB__|_PC__|_PD___|&lt;br /&gt;
         Datos del  _H0_|__0___|_1___|_2___|_3*n__|&lt;br /&gt;
          problema  _t__|__2___|_4___|_2___|_1____|&lt;br /&gt;
                   plazo|__3___|_5___|_7___|_3*n+2|&lt;br /&gt;
               prioridad|__-20_|_0___|_10__|_15___|&lt;br /&gt;
               (-20 a 19)&lt;br /&gt;
                 UNIX  &lt;br /&gt;
                      &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                      &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                      X = se ejecuta el código del planificador&lt;br /&gt;
                  plazo = si la actividad no ha terminado de ejecutarse tras pasar este instante de tiempo, se aborta&lt;br /&gt;
                      * = el proceso se aborta&lt;br /&gt;
 &lt;br /&gt;
                  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PA  &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PB  |   &amp;lt;   |---|---|---*   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PC  |   |   &amp;lt;   |   |   |---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PD  |   |   |   &amp;lt;   |   *   &amp;lt;   |---&amp;gt;   &amp;lt;---&amp;gt;   |   &amp;lt;---&amp;gt;   |   &amp;lt;---&amp;gt;   |   |   |   |&lt;br /&gt;
     Planificador X   X   X   X   |   X   X   X   |   X   |   |   X   |   |   X   |   |   |   |   |&lt;br /&gt;
             -----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---&amp;gt; t&lt;br /&gt;
                  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20&lt;br /&gt;
                                         &lt;br /&gt;
                         _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|P&amp;lt;sub&amp;gt;D1ª&amp;lt;/sub&amp;gt;_|P&amp;lt;sub&amp;gt;D2ª&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
              Cálculos   __t__|_2__|_3__|_2__|_1__|_1__|_1__|&lt;br /&gt;
             de tiempos  __T__|_2__|_*__|_4__|_*__|_2__|_1__|&lt;br /&gt;
                         _T/t_|_1__|_*__|_2__|_*__|_2__|_1__|&lt;br /&gt;
                        |&lt;br /&gt;
                        |_&amp;gt; Indice de penalización&lt;br /&gt;
&lt;br /&gt;
Si alguna actividad entrante tiene más prioridad que la que se está ejecutando, ésta última pasa a estado preparado y se da paso a la nueva.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos_de_tiempo_real&amp;diff=2469</id>
		<title>Planificación de procesos de tiempo real</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos_de_tiempo_real&amp;diff=2469"/>
				<updated>2012-01-29T17:00:38Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* ¿Qué es un proceso de tiempo real? */  reconstruir la frase para que no sea tan redundante&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ¿Qué es un proceso de tiempo real? ==&lt;br /&gt;
&lt;br /&gt;
Un proceso de tiempo real es aquel cuya actividad tiene un '''plazo de finalización'''.&lt;br /&gt;
&lt;br /&gt;
== ¿Qué es un sistema operativo de tiempo real? ==&lt;br /&gt;
&lt;br /&gt;
Un sistema operativo de tiempo real dispone de un planificador de procesos que tiene mecanismos para hacer lo máximo posible para garantizar que sus procesos de tiempo real cumplan los plazos de finalización que tienen establecidos.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
&lt;br /&gt;
Podemos clasificar los procesos de tiempo real de diferentes maneras:&lt;br /&gt;
&lt;br /&gt;
Segun el plazo de tiempo:&lt;br /&gt;
*'''Rígidos(''hard-realtime'')''' : se debe realizar en un plazo de tiempo determinado. Si no lo hace, deja de tener sentido. Si el plazo de tiempo para realizarla es superado el proceso se aborta. Ejemplo: Industriales ( sensores, activadores,...).&lt;br /&gt;
&lt;br /&gt;
*'''Flexibles(''soft-realtime'')''' : es deseable que se cumpla el plazo de tiempo. Ej: Videoconferencia.(Mientras más rapido vaya mejor sera la comunicacion , pero si no , nos adaptamos a ella)&lt;br /&gt;
&lt;br /&gt;
*'''Opcionales''' : conviene hacerla en el plazo de tiempo, pero si no es posible se puede posponer. Ej: actualización de una aplicacion/programa instalada en el ordenador.&lt;br /&gt;
&lt;br /&gt;
Según la periodicidad:&lt;br /&gt;
&lt;br /&gt;
*'''Aperiódicas''' : se deben a sucesos externos que deben ser atendidos. El sistema operativo no sabe, a priori, cuándo van a llegar ni el tiempo que va a durar. Ej: Notificaciones de errores, Sensores de emergencia en un coche, Ventiladores para refrigeración.&lt;br /&gt;
&lt;br /&gt;
*'''Periódicas''' : se realizan cada cierto tiempo (actividad repetitiva). A diferencia del anterior el sistema operativo conoce a priori cuándo van a llegar y su tiempo de duración Ej: leer la temperatura de un sensor.&lt;br /&gt;
&lt;br /&gt;
Podemos tener aplicaciones de tiempo real (flexibles) en sistemas operativos que no son de tiempo real (Linux, Darwin, Windows).&lt;br /&gt;
&lt;br /&gt;
== Métodos de planificación ==&lt;br /&gt;
&lt;br /&gt;
Los métodos de planificación a utilizar en SSOO de tiempo real son:&lt;br /&gt;
&lt;br /&gt;
*'''Planificación apropiativa con prioridad estática''': Cada proceso tiene asociado un índice de prioridad y el procesador elige aquel proceso de la lista de preparados con mayor prioridad, es el más tradicional y puede ser llevado a cabo por el procesador de un sistema que no sea de tiempo real.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación de tablas estáticas''': se conocen las actividades a realizar (todas periódicas) y se elabora un plan fijo de ejecución.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación dinámica''': Es muy parecida a la de tablas estáticas , pero también admite actividades aperiódicas. Cuando se presenta una actividad aperiódica , el planificador intenta construir un nuevo plan de ejecución que incluya a todas las actividades. Si no encuentra la solución que las englobe a todas, rechaza la actividad, que debe ser flexible u opcional. También puede retrasar alguna actividad flexible/opcional.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación dinámica con un mejor resultado''':Se utiliza para aplicaciones compuestas mayormente por actividades aperiódicas.El planificador intenta cumplir el plazo de todas las actividades asignandole a cada actividad una prioridad en base a sus características (las actividades fuera de plazo se abortan). Es muy similar a la anterior, la diferencia más notable es que en la anterior existe un análisis previo aceptando actividades aperiódicas y en ésta no existe tal análisis.&lt;br /&gt;
Es un método fácil de implementar, sin embargo, no podremos saber de antemano si una actividad cumplirá su plazo o no (sabremos que no lo cumple si es abortada, y viceversa).&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo emplea planificación apropiativa por prioridades estática con actividades periódicas y aperiódicas:&lt;br /&gt;
&lt;br /&gt;
                    ____|__PA__|_PB__|_PC__|_PD___|&lt;br /&gt;
         Datos del  _H0_|__0___|_1___|_2___|_3*n__|&lt;br /&gt;
          problema  _t__|__2___|_4___|_2___|_1____|&lt;br /&gt;
                   plazo|__3___|_5___|_7___|_3*n+2|&lt;br /&gt;
               prioridad|__-20_|_0___|_10__|_15___|&lt;br /&gt;
               (-20 a 19)&lt;br /&gt;
                 UNIX  &lt;br /&gt;
                      &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                      &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                      X = se ejecuta el código del planificador&lt;br /&gt;
                  plazo = si la actividad no ha terminado de ejecutarse tras pasar este instante de tiempo, se aborta&lt;br /&gt;
                      * = el proceso se aborta&lt;br /&gt;
 &lt;br /&gt;
                  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PA  &amp;lt;---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PB  |   &amp;lt;   |---|---|---*   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PC  |   |   &amp;lt;   |   |   |---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              PD  |   |   |   &amp;lt;   |   *   &amp;lt;   |---&amp;gt;   &amp;lt;---&amp;gt;   |   &amp;lt;---&amp;gt;   |   &amp;lt;---&amp;gt;   |   |   |   |&lt;br /&gt;
     Planificador X   X   X   X   |   X   X   X   |   X   |   |   X   |   |   X   |   |   |   |   |&lt;br /&gt;
             -----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---&amp;gt; t&lt;br /&gt;
                  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20&lt;br /&gt;
                                         &lt;br /&gt;
                         _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|P&amp;lt;sub&amp;gt;D1ª&amp;lt;/sub&amp;gt;_|P&amp;lt;sub&amp;gt;D2ª&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
              Cálculos   __t__|_2__|_3__|_2__|_1__|_1__|_1__|&lt;br /&gt;
             de tiempos  __T__|_2__|_*__|_4__|_*__|_2__|_1__|&lt;br /&gt;
                         _T/t_|_1__|_*__|_2__|_*__|_2__|_1__|&lt;br /&gt;
                        |&lt;br /&gt;
                        |_&amp;gt; Indice de penalización&lt;br /&gt;
&lt;br /&gt;
Si alguna actividad entrante tiene más prioridad que la que se está ejecutando, ésta última pasa a estado preparado y se da paso a la nueva.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=2464</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=2464"/>
				<updated>2012-01-29T15:09:40Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: poner titulo, crear oraciones apartir de frases sueltas, resaltar en negrita las ventajas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 3.5 Hilos = &lt;br /&gt;
&lt;br /&gt;
Un hilo es un &amp;quot;proceso ligero&amp;quot;, es decir, una línea de ejecución. En general, el planificador de procesos da el mismo tratamiento a los hilos y a los procesos, pero la conmutación de hilos es menos costosa que la conmutación de procesos.&lt;br /&gt;
&lt;br /&gt;
Los procesos inicialmente parten con un único hilo, aunque el sistema operativo ofrece llamadas al sistema para crear y destruir hilos. Puedo hacer uso de estas llamadas al sistema desde el propio código del programa. &lt;br /&gt;
&lt;br /&gt;
Cuando se crea un hilo, se le indica qué código se quiere que ejecute. Distintos hilos, de un mismo proceso, comparten espacio de memoria.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Uso_del_procesador_hilos.svg]]&lt;br /&gt;
&lt;br /&gt;
Con multiprocesamiento podemos ejecutar diferentes procesos a la vez. Si tenemos uno solo podemos desdoblarlo en hilos, usando técnicas de programación apoyadas en APIS (como POSIX threads).&lt;br /&gt;
&lt;br /&gt;
Para aumentar su eficiencia, un programa en ejecución debe crear tantos hilos como el doble del número de procesadores del los que disponga el sistema. Por ejemplo: 4 hilos para un programa ejecutado con 2 procesadores.&lt;br /&gt;
&lt;br /&gt;
Las principales ventajas del uso de hilos son:&lt;br /&gt;
&lt;br /&gt;
*'''Menor penalización''' en cuanto a conmutación.&lt;br /&gt;
&lt;br /&gt;
*Dos hilos de un mismo proceso pueden '''compartir memoria''' aprovechando mejor los recursos y eliminando los mecanismos de comunicación necesarios para soluciones implementadas en varios procesos.&lt;br /&gt;
&lt;br /&gt;
*Con un solo procesador es posible que una línea de proceso haga uso de una llamada al sistema bloqueante. En este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso externo, ahorrando así tiempo de conmutación asociado a la ejecución del planificador de procesos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejemplo =&lt;br /&gt;
&lt;br /&gt;
El siguiente es un código en C de ejemplo en el que se muestra la creación de dos hilos. Se hace uso de la llamada al sistema ''sleep'' que hace que el proceso pase a estado bloqueado durante N segundos. Nótese que al compartir la variable ''a'', ambos hilos modifican su valor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 10;&lt;br /&gt;
&lt;br /&gt;
void *codigo_hilo1(void *arg)&lt;br /&gt;
{&lt;br /&gt;
	sleep(10);&lt;br /&gt;
	a = a - 2;&lt;br /&gt;
	printf(&amp;quot;Soy el hilo 1 y la variable a vale %d\n&amp;quot;, a);&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *codigo_hilo2(void *arg)&lt;br /&gt;
{&lt;br /&gt;
	sleep(5);&lt;br /&gt;
	a++;&lt;br /&gt;
	printf(&amp;quot;Soy el hilo 2 y la variable a vale %d\n&amp;quot;, a);&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
	pthread_create(&amp;amp;hilo1, NULL, codigo_hilo1, NULL);&lt;br /&gt;
	pthread_create(&amp;amp;hilo2, NULL, codigo_hilo2, NULL);&lt;br /&gt;
&lt;br /&gt;
	pthread_join(hilo1, NULL);&lt;br /&gt;
	pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este ejemplo se compila en un terminal escribiendo: '''gcc -lpthread archivo.c'''&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2463</id>
		<title>Multiprogramación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2463"/>
				<updated>2012-01-29T12:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: reducir tamaño de la imagen porque se veía muy grande y descuadraba la wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=3.1 La Multiprogramación =&lt;br /&gt;
&lt;br /&gt;
La multiprogramación es una técnica de multiplexación que permite la ejecución simultánea de múltiples procesos en un único procesador. En realidad, esta técnica produce una ilusión de paralelismo, de manera que parece que todos los procesos se están ejecutando a la vez. Sin embargo, hay un único proceso ejecutándose en el procesador a la vez.&lt;br /&gt;
&lt;br /&gt;
Un método para la multiprogramación es el Foreground/Background (o ejecución jerarquizada) (usado en sistemas por tandas, nunca en interactivos), en él hay un proceso prioritario (el foreground (FG)) que se ejecuta con preferencia de todos los demás, cuando este proceso solicita una operación L/E, mientras el s.o. la realiza, el proceso FG estará bloqueado por esta operación y le cede el control al proceso background 1 (BG), y si éste realiza una operación L/E, al BG2,… Cuando uno de los procesos bloqueados se desbloquea, recibe el control del procesador. Para que este método funcione de forma óptima la mejor forma es colocar los procesos ordenados de mayor a menor cantidad de operaciones L/E.&lt;br /&gt;
&lt;br /&gt;
El siguiente diagrama de ejemplo representa el uso del procesador por tres procesos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Uso_del_procesador_general.svg|500px]]&lt;br /&gt;
&lt;br /&gt;
Como se puede observar en el ejemplo anterior, los procesos '''alternan periodos''' en los que '''progresan''' en su actividad, cuando están asignados al procesador, con periodos de inactividad, en los que '''no progresan''' en absoluto.&lt;br /&gt;
&lt;br /&gt;
Si los periodos de inactividad son los suficientemente pequeños como para que el usuario del sistema operativo no los note, que en práctica se traduce a periodos de inactividad de menos de 100ms, el efecto causado es una ilusión de paralelismo. En caso contrario dará una sensación de que se producen &amp;quot;saltos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
El [[planificador de procesos|planificador de procesos]] es la parte del sistema operativo que se encarga de decidir qué proceso emplea el procesador en cada instante, por tanto, es el encargado de implementar la multiprogramación.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Estados_de_los_procesos&amp;diff=2462</id>
		<title>Estados de los procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Estados_de_los_procesos&amp;diff=2462"/>
				<updated>2012-01-29T12:57:40Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: poner titulo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 3.2 Estados de los procesos =&lt;br /&gt;
&lt;br /&gt;
Todo proceso en un sistema operativo presenta un estado que indica la situación de la ejecución en que se encuentra. El número de posibles estados varía de un sistema operativo a otro.&lt;br /&gt;
&lt;br /&gt;
== Diagrama de estados simplificado ==&lt;br /&gt;
&lt;br /&gt;
Consideramos que todo proceso puede estar, como mínimo, en uno de los siguientes tres estados:&lt;br /&gt;
&lt;br /&gt;
* '''Activo''': el proceso está empleando la CPU, por tanto, está ejecutándose. Pueden haber tantos procesos activos como procesadores haya disponibles. Por tanto, si el sistema dispone de un único procesador, únicamente puede haber un proceso activo a la vez.&lt;br /&gt;
* '''Preparado''': el proceso no está ejecutándose pero es candidato a pasar a estado activo. Es el planificador el que, en base a un criterio de planificación, decide qué proceso selecciona de la lista de procesos preparados para pasar a estado activo.&lt;br /&gt;
* '''Bloqueado''': el proceso está pendiente de un evento externo que le ha hecho bloquear, tales como una operación de lectura/escritura, la espera de finalización de un proceso hijo, una señal o una operación sobre un semáforo. El dispositivo/hecho externo &amp;quot;avisa&amp;quot; al S.O. cuando ha terminado la acción que realizaba mediante una INTERRUPCIÓN, dejando el S.O. lo que está haciendo para atender a esta última. Tras esto, el S.O. comprueba cuales son los procesos que fueron bloqueados por ese evento externo, cambiándolos al estado de preparado.&lt;br /&gt;
&lt;br /&gt;
La transición de activo a preparado y viceversa depende de decisiones tomadas por el '''planificador del sistema operativo''' en base a un cierto criterio. La transición de activo a bloqueado, y de bloqueado a preparado puede inducirlas el programador mediante llamadas al sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                            [[Archivo:SSOO2.jpg]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hay tres posibles situaciones en las que se ejecutará el planificador del sistema operativo:&lt;br /&gt;
* El proceso que se encuentra en el estado activo hace una llamada al sistema que, por su naturaleza, resulta en una transición al estado bloqueado. Este es el caso de las llamadas read(), write(), wait(), pause(), entre muchas otras. Al pasar a estado bloqueado, se invoca al planificador para que decida que otro proceso se asignará al procesador.&lt;br /&gt;
* Si el proceso que se encuentra en el estado activo excede el tiempo máximo de asignación, en caso de que lo hubiere.&lt;br /&gt;
* Si el proceso que hasta ese momento se encontraba en estado activo termina de ejecutar su código.&lt;br /&gt;
&lt;br /&gt;
Además, algunos sistemas operativos disponen de un estado terminado en el que los procesos pasan antes de terminar su ejecución.&lt;br /&gt;
&lt;br /&gt;
En el caso del núcleo de Linux, existen tres tipos de estados bloqueado y dos estados terminado: http://www.ibm.com/developerworks/linux/library/l-task-killable/&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2461</id>
		<title>Multiprogramación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2461"/>
				<updated>2012-01-29T12:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: poner titulos y resaltar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=3.1 La Multiprogramación =&lt;br /&gt;
&lt;br /&gt;
La multiprogramación es una técnica de multiplexación que permite la ejecución simultánea de múltiples procesos en un único procesador. En realidad, esta técnica produce una ilusión de paralelismo, de manera que parece que todos los procesos se están ejecutando a la vez. Sin embargo, hay un único proceso ejecutándose en el procesador a la vez.&lt;br /&gt;
&lt;br /&gt;
Un método para la multiprogramación es el Foreground/Background (o ejecución jerarquizada) (usado en sistemas por tandas, nunca en interactivos), en él hay un proceso prioritario (el foreground (FG)) que se ejecuta con preferencia de todos los demás, cuando este proceso solicita una operación L/E, mientras el s.o. la realiza, el proceso FG estará bloqueado por esta operación y le cede el control al proceso background 1 (BG), y si éste realiza una operación L/E, al BG2,… Cuando uno de los procesos bloqueados se desbloquea, recibe el control del procesador. Para que este método funcione de forma óptima la mejor forma es colocar los procesos ordenados de mayor a menor cantidad de operaciones L/E.&lt;br /&gt;
&lt;br /&gt;
El siguiente diagrama de ejemplo representa el uso del procesador por tres procesos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Uso_del_procesador_general.svg]]&lt;br /&gt;
&lt;br /&gt;
Como se puede observar en el ejemplo anterior, los procesos '''alternan periodos''' en los que '''progresan''' en su actividad, cuando están asignados al procesador, con periodos de inactividad, en los que '''no progresan''' en absoluto.&lt;br /&gt;
&lt;br /&gt;
Si los periodos de inactividad son los suficientemente pequeños como para que el usuario del sistema operativo no los note, que en práctica se traduce a periodos de inactividad de menos de 100ms, el efecto causado es una ilusión de paralelismo. En caso contrario dará una sensación de que se producen &amp;quot;saltos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
El [[planificador de procesos|planificador de procesos]] es la parte del sistema operativo que se encarga de decidir qué proceso emplea el procesador en cada instante, por tanto, es el encargado de implementar la multiprogramación.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Conceptos_b%C3%A1sicos&amp;diff=2459</id>
		<title>Conceptos básicos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Conceptos_b%C3%A1sicos&amp;diff=2459"/>
				<updated>2012-01-29T12:10:01Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: añadir enlace y resaltar el proceso zombie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 2.1. Conceptos básicos = &lt;br /&gt;
A continuación se desarrollan conceptos básicos que se emplearán a lo largo de la asignatura.&lt;br /&gt;
&lt;br /&gt;
== Programa ==&lt;br /&gt;
&lt;br /&gt;
Un programa es una secuencia de instrucciones que, al ejecutarse, desarrolla algún tipo de actividad.&lt;br /&gt;
&lt;br /&gt;
Un programa, generalmente, se expresa en un lenguaje de programación de medio u alto nivel (tales como C, C++, Python, Java, Perl, Php, C#, etc) que, mediante un compilador o máquina virtual, se traduce a instrucciones de bajo nivel que corresponden al juego de instrucciones que ofrece el procesador.&lt;br /&gt;
&lt;br /&gt;
El juego de instrucciones del procesador viene determinado por el fabricante.&lt;br /&gt;
&lt;br /&gt;
== Proceso ==&lt;br /&gt;
&lt;br /&gt;
Un ''proceso'' es una instancia de un programa que está en ejecución. De partida todo proceso dispone de una única línea de ejecución. Se puede entender como la vista dinámica (en ejecución) de un programa.&lt;br /&gt;
&lt;br /&gt;
=== Procesos en sistemas operativos tipo Unix ===&lt;br /&gt;
&lt;br /&gt;
* Todo proceso en un sistema operativo tipo Unix tiene un proceso padre y a su vez puede disponer uno o más de un proceso hijo.&lt;br /&gt;
&lt;br /&gt;
* Todo proceso en un sistema operativo tipo Unix tiene un propietario, que se trata del usuario que ha lanzado dicho proceso.&lt;br /&gt;
&lt;br /&gt;
* El proceso ''init'' es el padre de todos los procesos. Es la excepción a la norma general, pues no tiene padre.&lt;br /&gt;
&lt;br /&gt;
* La informacion necesaria para administrar un proceso se guarda en una estructura controlada por el S.O. llamada Bloque de Control de * Procesos o PCB (Process Control Block)&lt;br /&gt;
&lt;br /&gt;
* Para mostrar la relación actual de procesos en el sistema se puede emplear la orden ''ps''.&lt;br /&gt;
&lt;br /&gt;
* Para identificar los procesos el sistema operativo Unix asigna un numero de identificacion del proceso, o pid(Process IDentification).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ps -ef&lt;br /&gt;
UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
root         1     0  0 11:48 ?        00:00:00 /sbin/init&lt;br /&gt;
...&lt;br /&gt;
practica  1712     1 18 12:08 ?        00:00:00 gnome-terminal&lt;br /&gt;
practica  1713  1712  0 12:08 ?        00:00:00 gnome-pty-helper&lt;br /&gt;
practica  1714  1712 20 12:08 pts/0    00:00:00 bash&lt;br /&gt;
practica  1731  1714  0 12:08 pts/0    00:00:00 ps -ef&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera columna indica el UID del proceso, la segunda el PID, la tercera el PID del proceso padre. Por último, aparece el nombre del proceso en cuestión.&lt;br /&gt;
&lt;br /&gt;
=== Procesos padre e hijo ===&lt;br /&gt;
&lt;br /&gt;
* Todo proceso (padre) puede lanzar un proceso hijo en cualquier momento, para ello el sistema operativo nos ofrece una llamada al sistema que se denomina ''fork''.&lt;br /&gt;
&lt;br /&gt;
* Un proceso hijo es un proceso clon del padre. Sin embargo, procesos padre e hijo no comparten memoria, son completamente independientes.&lt;br /&gt;
&lt;br /&gt;
* Todo proceso padre es responsable de los procesos hijos que lanza, por ello, todo proceso padre debe recoger el resultado de la ejecución de los procesos hijos para que estos finalicen adecuadamente. Para ello, el sistema operativo ofrece la llamada ''wait'' que nos permite obtener el resultado de la ejecución de uno o varios procesos hijo.&lt;br /&gt;
&lt;br /&gt;
* Si un proceso padre no recupera el resultado de la ejecución de su hijo, se dice que el proceso queda en estado '''zombi'''. Un proceso hijo zombi es un proceso que ha terminado su ejecución y que está pendiente de que su padre recoja el resultado de su ejecución.&lt;br /&gt;
&lt;br /&gt;
== [[Llamadas_al_sistema|Llamadas a sistema ]]==&lt;br /&gt;
&lt;br /&gt;
* Se implementan a través de una interfaz (o API) que ofrece el Sistema Operativo. Son mecanismos que el S.O. pone a disposición de los procesos para solicitar un servicio o recurso. (Otra definición, según Wikipedia: Llamadas que ejecutan los programas de aplicación para pedir algún servicio al SO.) Estas llamadas a sistema evitan que el proceso acceda directamente a los recursos del hardware.&lt;br /&gt;
En el caso de Linux tiene aproximadamente 350 llamadas al sistema en la versión 3.0.0.&lt;br /&gt;
La mayor parte de los Sistemas Operativos suelen implementar la API POSIX por razones de portabilidad.&lt;br /&gt;
&lt;br /&gt;
== Usuario ==&lt;br /&gt;
&lt;br /&gt;
* Sujeto que interactúa con la computadora. Puede ser un humano o un autómata (software). &lt;br /&gt;
&lt;br /&gt;
* En sistemas UNIX encontramos un código único para cada uno, el UID (User IDentifier). A su vez debe pertenecer a un grupo, definido por el GID (Group IDentifier).&lt;br /&gt;
&lt;br /&gt;
== [[Introducción_en_la_administración_de_archivos#Fichero|Fichero ]]==&lt;br /&gt;
&lt;br /&gt;
* Estructura de datos que almacena información.&lt;br /&gt;
&lt;br /&gt;
Los ficheros se identifican mediante su nombre y su extension (un apendice que se utiliza para indicar el tipo de informacion que contiene el fichero).&lt;br /&gt;
&lt;br /&gt;
El lugar donde se encuentra un fichero viene dado por su directorio. Dentro de un directorio pueden existir otros directorios (llamados subdirectorios) lo que da lugar a una organizacion en forma de arbol.&lt;br /&gt;
&lt;br /&gt;
Al camino que debemos seguir para encontrar un fichero lo llamamos '''camino absoluto (absolute path)''', y al camino que debemos seguir para encontrar el fichero en relación a otro fichero, que no sea el fichero raíz, se le conoce cómo '''camino relativo (relative path)'''.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Componentes_b%C3%A1sicos_de_un_sistema_operativo&amp;diff=2458</id>
		<title>Componentes básicos de un sistema operativo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Componentes_b%C3%A1sicos_de_un_sistema_operativo&amp;diff=2458"/>
				<updated>2012-01-29T12:02:26Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* 2.2. Componentes básicos de un Sistema Operativo */ ponerlo un poco más estudiable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=2.2. Componentes básicos de un Sistema Operativo =&lt;br /&gt;
&lt;br /&gt;
Los componentes básicos de un sistema operativo son los siguientes:&lt;br /&gt;
&lt;br /&gt;
===[[Planificador_de_procesos|Gestión de procesos]]=== &lt;br /&gt;
&lt;br /&gt;
Un procesador se dedica exclusivamente a un proceso, con todos sus recursos, no puede dedicar unos recursos a un proceso y el resto a otro proceso simultáneamente. Incluye:&lt;br /&gt;
* Planificación de procesos: se trata de la parte del sistema operativo que decide qué proceso emplea el procesador en cada instante de tiempo.&lt;br /&gt;
* Mecanismos de comunicación entre procesos: permiten comunicar a dos procesos del sistema operativo, tales como la mensajería.&lt;br /&gt;
* Mecanismos de sincronización: permiten coordinar a procesos que realizan accesos concurrentes a un cierto recurso.&lt;br /&gt;
&lt;br /&gt;
===[[Introducción| Administración de memoria principal]]===&lt;br /&gt;
&lt;br /&gt;
Tiene como objetivo la gestión de la memoria principal, lo que incluye la gestión del espacio de memoria principal libre y ocupada, así como la asignación de memoria principal a los procesos.&lt;br /&gt;
&lt;br /&gt;
===[[Introducción_en_la_administración_de_archivos| Administración de ficheros]]===&lt;br /&gt;
&lt;br /&gt;
Gestiona la manera en que la información se almacena en dispositivos de entrada/salida que permiten el almacenamiento estable.&lt;br /&gt;
&lt;br /&gt;
===[[GestionES|Gestión de los dispositivos de entrada/salida (driver)]]===&lt;br /&gt;
&lt;br /&gt;
Parte del sistema operativo que conoce los detalles específicos de cada dispositivo, lo que permite poder operar con él. &lt;br /&gt;
&lt;br /&gt;
Además, el sistema operativo ofrece una serie interfaces:&lt;br /&gt;
&lt;br /&gt;
* Llamadas al sistema: conjunto de servicios que los procesos pueden solicitar al sistema operativo.&lt;br /&gt;
* Lanzador de aplicaciones: permite el lanzamiento de un programa. Esto incluye los intérpretes de órdenes textuales y los basados en gestores de ventanas.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Tipos_de_Sistemas_Operativos&amp;diff=2457</id>
		<title>Tipos de Sistemas Operativos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Tipos_de_Sistemas_Operativos&amp;diff=2457"/>
				<updated>2012-01-29T11:39:49Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* 1.3.1. Según cuántas aplicaciones pueda ejecutar a la vez */ poner en negrita parte del texto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.3. Tipos de Sistemas Operativos =&lt;br /&gt;
== 1.3.1. Según cuántas aplicaciones pueda ejecutar a la vez ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== '''Monoprogramables'''===&lt;br /&gt;
*En un determinado instante de tiempo, '''sólo hay un único proceso en ejecución que monopoliza todos los recursos''' del sistema.&lt;br /&gt;
*Principal ventaja: su sencillez.&lt;br /&gt;
* Generalmente, no tienen mecanismos de protección de memoria (esta característica los hace más proclives a virus).&lt;br /&gt;
*Dos subtipos:&lt;br /&gt;
**Ofrece intérprete de órdenes.&lt;br /&gt;
**Ofrece entrada a través de cinta/switches (SSOO históricos).&lt;br /&gt;
*Ejemplo: DOS.&lt;br /&gt;
&lt;br /&gt;
=== '''Multiprogramables''' ===&lt;br /&gt;
*Permiten ejecutar '''múltiples procesos en un único procesador'''. Se tienen varios programas cargados simultáneamente en la memoria, así que el SO debe controlar los accesos y los espacios de la misma.&lt;br /&gt;
*Tienen mecanismos de protección del espacio de memoria (el SO impide que una aplicación acceda al espacio de memoria de otra).&lt;br /&gt;
====Características que pueden presentar:====&lt;br /&gt;
**Multiprogramación: se ejecutan varios procesos simultáneamente de manera que se reparte el uso del procesador. A esta característica también se le llama (de forma imprecisa) &amp;quot;Multitarea&amp;quot;.&lt;br /&gt;
**Multiusuario: admite múltiples usuarios trabajando simultáneamente.&lt;br /&gt;
**Multiacceso: el sistema ofrece varios terminales (mecanismos) para acceso concurrente a él.&lt;br /&gt;
**Multiprocesamiento o multiprocesadores: soporta más de un procesador y hace uso de todos ellos.&lt;br /&gt;
***Tipos de sistemas multiprocesadores: Podemos diferencias 3 tipos: especializados, con acoplamiento débil y con acoplamiento fuerte:&lt;br /&gt;
****Sistemas multiprocesadores con procesadores especializados: Son sistemas que cuentan con un procesador de propósito general y varios procesadores especializados (como por ejemplo coprocesadores aritméticos o el procesador de una tarjeta gráfica). Dichos procesadores especializados solo son capaces de ejecutar un conjunto de operaciones especificas y funcionan únicamente cuando el procesador general se lo solicita, en ese momento colaboran con el procesador general.&lt;br /&gt;
****Sistemas multiprocesadores con acoplamiento débil: Son sistemas con procesadores relativamente independientes, cada uno tiene su propia memoria y sus propios canales de E/S.&lt;br /&gt;
****Sistemas multiprocesadores con acoplamiento fuerte: Son sistemas con varios procesadores de propósito general independientes entre sí pero que comparten la memoria y trabajan bajo un sistema operativo común. &lt;br /&gt;
**Tiempo real: intenta garantizar que determinadas tareas se ejecuten en un plazo de tiempo determinado. Atendiendo al nivel de exigencia, se subdividirían en dos: soft (suave) o '''flexible''' y hard(duro) o '''estricto'''. Un ejemplo puede ser el sistema operativo de tiempo real instalado en el procesador de un teléfono móvil; si llega una llamada tiene que pasarla en ese momento, sino ese proceso deja de ser importante.&lt;br /&gt;
**Distribuido: permite la ejecución de múltiples procesos en diferentes máquinas comunicadas por un enlace de red. El primer SO en soportar esta característica fue [http://es.wikipedia.org/wiki/Plan_9_from_Bell_Labs Plan 9] de ''Bell Labs''.&lt;br /&gt;
&lt;br /&gt;
== 1.3.2. Según cómo se presta el servicio ==&lt;br /&gt;
&lt;br /&gt;
*a. Por tanda&lt;br /&gt;
**Actividades que se realizan por lote y en serie (una detrás de otra).&lt;br /&gt;
&lt;br /&gt;
*b. Interactivos&lt;br /&gt;
**Varias actividades en ejecución intercalándose.&lt;br /&gt;
&lt;br /&gt;
*c. Tiempo Real&lt;br /&gt;
**Actividades o sucesos externos al sistema, que se atienden por interrupción y que se deben de procesar en tiempo breve y limitado,  **produciendose una degradación de la información. Ejemplo Control de la temperatura en procesos industriales.&lt;br /&gt;
&lt;br /&gt;
*d. Combinados&lt;br /&gt;
**En los combinados se combinan los dos primeros, en los que dependerá del proceso que se esté ejecutando.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Qu%C3%A9_es_un_Sistema_Operativo&amp;diff=2456</id>
		<title>Qué es un Sistema Operativo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Qu%C3%A9_es_un_Sistema_Operativo&amp;diff=2456"/>
				<updated>2012-01-29T11:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* 1.1.1. ¿Qué es un Sistema Operativo? */  reordenar, aclarar, poner tildes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 1.1. ¿Qué es un Sistema Operativo? =&lt;br /&gt;
== 1.1.1. ¿Qué es un Sistema Operativo? ==&lt;br /&gt;
Es el programa o conjunto de programas que:&lt;br /&gt;
&lt;br /&gt;
*Efectúan la '''gestión de los recursos''' que ofrece un sistema informático:&lt;br /&gt;
**La [http://es.wikipedia.org/wiki/Unidad_central_de_procesamiento CPU] (unidad central de procesamiento o procesador).&lt;br /&gt;
**La [http://es.wikipedia.org/wiki/Memoria_principal Memoria principal] o memoria RAM.&lt;br /&gt;
**Los [http://es.wikipedia.org/wiki/Entrada/salida#Dispositivos_de_entrada_y_salida dispositivos de Entrada/Salida], tales como la tarjeta de vídeo, la tarjeta de red, los dispositivos de almacenamiento masivo (disco duro, memoria flash), los dispositivos USB, teclado, ratón...&lt;br /&gt;
&lt;br /&gt;
*Ofrece un '''lanzador de aplicaciones''', que puede ser de dos tipos:&lt;br /&gt;
**Intérprete de órdenes/comandos (traducción defectuosa del original inglés ''command'', que significa orden), también llamado ''shell''. Las órdenes se escriben con el teclado.&lt;br /&gt;
**Gestor de ventanas: las órdenes se dan con el ratón. &amp;lt;br&amp;gt;Los sistemas operativos de hoy en día ofrecen ambos tipos de lanzadores de aplicaciones, pero la más utilizada es el gestor de ventanas.&lt;br /&gt;
&lt;br /&gt;
*Ofrece una '''interfaz (API)''' a las aplicaciones para solicitar recursos. El SO hace de intermediario, el programa no accede al hardware directamente  a obtener los recursos, sino que se los solicita al SO. Esta interfaz ha de ser estable (es decir, que no cambie con el tiempo) y homogénea.&lt;br /&gt;
&lt;br /&gt;
== 1.1.2. Principios de diseño de un buen Sistema Operativo ==&lt;br /&gt;
&lt;br /&gt;
Los aspectos a tener en cuenta respecto a la gestión de recursos son:&lt;br /&gt;
&lt;br /&gt;
* Realizar una gestión eficiente de los recursos.&lt;br /&gt;
* Coordinar la asignación de los mismos (como un moderador en un debate, asignando el turno de palabra).&lt;br /&gt;
* Hacer un reparto equitativo de ellos.&lt;br /&gt;
* No permitir que las aplicaciones accedan directamente a los recursos sino que sea a través del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
Respecto a la API, debe:&lt;br /&gt;
&lt;br /&gt;
* Ser estable, no debe cambiar con el tiempo.&lt;br /&gt;
* Ser homogénea.&lt;br /&gt;
* Ocultar los detalles de bajo nivel de los componentes, ofreciendo una capa de abstracción sobre el material (hardware).&lt;br /&gt;
&lt;br /&gt;
Además, otro criterio a tener en cuenta por un buen sistema operativo es la portabilidad, es decir, que soporte diferentes arquitecturas, como por ejemplo la ARM (teléfonos móviles), la x86 de Intel(32 bits), los actuales Intel64 y AMD64(64 bits), la SPARC (desarrollada por Sun Microsystems, ahora adquirida por Oracle), la PowerPC (creada por la alianza AIM: Apple-IBM-Motorola)...&lt;br /&gt;
&lt;br /&gt;
== 1.1.3. Resumen ==&lt;br /&gt;
&lt;br /&gt;
En resumen, un sistema operativo debe tener las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* '''Conveniencia:''' un sistema operativo hace más conveniente el uso de una computadora.&lt;br /&gt;
* '''Eficiencia:''' el sistema operativo permite que los recursos de la computadora se usen de manera correcta y eficiente.&lt;br /&gt;
* '''Habilidad para evolucionar:''' un sistema operativo debe de ser capaz de aceptar nuevas funciones sin que tenga problemas.&lt;br /&gt;
* '''Encargado de administrar el hardware:''' el sistema operativo debe de ser eficaz.&lt;br /&gt;
* '''Relacionar dispositivos'''&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer3-planif-procesos&amp;diff=2454</id>
		<title>Sol-ejer3-planif-procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer3-planif-procesos&amp;diff=2454"/>
				<updated>2012-01-28T19:17:37Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Nueva Duda: */  proceso que termina antes de bloquearse.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ejercicio 3 =&lt;br /&gt;
&lt;br /&gt;
 Datos del problema:&lt;br /&gt;
                         | Pa | Pb | Pc  | Pd |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      H0 | 0  | 1  |  2  | 3  |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      t  | 4  | 4  |  12 | 12 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
 &lt;br /&gt;
                  Pa y Pb bloquean por operación de E/S tras 1 unidad de ejecución&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                       ↑ = promociona porque ha consumido el quantum.&lt;br /&gt;
                       B = Bloquea.&lt;br /&gt;
                      !!!= Indica que la cola sobre la que se itera ha cambiado&lt;br /&gt;
 &lt;br /&gt;
       | 1 |   |   |   |   |   | 2 |   |   |   |   |   |   |   |   |   | 1 |   | 2 |   |&lt;br /&gt;
 Pa    &amp;lt;---B   |   |   |   |   |---B   |   |   |   |   |   |   |   |   |---B   |---&amp;gt;   |&lt;br /&gt;
       |   | 1 |   |   |   |   |   | 2 |   |   |   |   |   |   |   |   |   | 1 |   | 2 |&lt;br /&gt;
 Pb    |   &amp;lt;---B   |   |   |   |   |---B   |   |   |   |   |   |   |   |   |---B   |---&amp;gt;&lt;br /&gt;
       |   |   | 1 | ↑ |   |   |   |   |   |   | 1 |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pc    |   |   &amp;lt;---|---|   |   |   |   |---|---|---|---|   |   |   |   |   |   |   |   |&lt;br /&gt;
       |   |   |   |   | 1 | ↑ |   |   |   |   |   |   |   |   | 1 |   |   |   |   |   |&lt;br /&gt;
 Pd    |   |   |   &amp;lt;   |---|---|   |   |   |   |   |   |---|---|---|---|   |   |   |   |&lt;br /&gt;
 Plnf  X   X   X   |   X   |   X   X   X   |   |   |   X   |   |   |   X   |   |   |   X&lt;br /&gt;
       |___|___|___|___|___|___|___|__!!!__|___|___|___|___|___|___|__!!!__|___|___|__!!!&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;
 ... continuación ...&lt;br /&gt;
 &lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pb    |   |   | 1 |   |   |   |   |   |   | 1 |   |   |&lt;br /&gt;
 Pc    |---|---|---|---|   |   | 1 |   |---|---&amp;gt;   | 1 |&lt;br /&gt;
 Pd    |   |   |   |   |---|---|---|---|   |   |---|---&amp;gt;&lt;br /&gt;
 Plnf  |   |   |   |   X   |   |   |   X   |   X   |   | &lt;br /&gt;
       |___|___|___|___|___|___|___|__!!!__|___|___|___|&lt;br /&gt;
       20  21  22  23  24  25  26  27  28  29  30  31  32&lt;br /&gt;
 &lt;br /&gt;
 Cálculo de índices:&lt;br /&gt;
 &lt;br /&gt;
                         | Pa | Pb |  Pc | Pd |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      t  | 4  | 4  |  12 | 12 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      T  | 19 | 20 |  30 | 32 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                    T/t  |4.75| 5  | 2.5 |2.66|&lt;br /&gt;
                     --------------------------&lt;br /&gt;
&lt;br /&gt;
*He añadido sobre cada proceso el número de vez de iteración de la cola a la que pertenece. Así se puede ver que por cada dos iteraciones de una cola, se hace una iteración de la otra.&lt;br /&gt;
* Notese que en el instante 28, se itera sobre la cola 2 dos veces, pero al no contener elementos la iteración es nula, y se pasa a la siguiente cola prevista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Explicación:&lt;br /&gt;
&lt;br /&gt;
Todos los procesos empiezan inicialmente en la segunda cola. Pa y Pb reciben una oportunidad de ejecución sin consumir su quantum debido a bloqueo, por tanto, permanecen en la segunda cola. Pc y Pd consumen todo su quantum, por tanto, promocionan a la primera cola. Los procesos Pa y Pb se ejecutan otra vez, pues los procesos que se encuentran en la segunda cola reciben dos oportunidades de ejecución. Tras esto, los procesos recién ascendidos a la primera cola, que son Pc y Pd, reciben su oportunidad de ejecución, en este caso con quantum de 4 unidades. De nuevo, se le da oportunidad de ejecución a los procesos de la segunda cola, que terminan su ejecución. Como no hay más procesos en la segunda cola, se le da una oportunidad de ejecución a los de la primera. --[[Usuario:Pneira|Pneira]] 18:36 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
= Dudas =&lt;br /&gt;
&lt;br /&gt;
No entiendo por qué en la unidad de tiempo 18 no aparece el proceso c y d y posteriormente a b c y d.Esto es a lo que me refiero --[[Usuario:Jherrera|Jherrera]]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    |   |   |   |   |   |   |   |   |---&amp;gt;   |   |   |&lt;br /&gt;
 Pb    |   |   |   |   |   |   |   |   |   |---&amp;gt;   |   |&lt;br /&gt;
 Pc    |---|---|---|---|   |   |   |   |   |   |-------&amp;gt;&lt;br /&gt;
 Pd    |   |   |   |   |---|---|---|---|   |   |   |   |------&amp;gt;&lt;br /&gt;
 Plnf  |   |   |   |   X   |   |   |   X   |   X   |   X &lt;br /&gt;
       |___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
       18  19  20  21  22  23  24  25  26  27  28  29  30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Solucion: Por que en la 2ª cola estan los procesos A y B, por que nunca consumen los quantums, y la 2ª cola siempre se itera 2 veces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
¿No se supone que la cola 1 posee mayor prioridad que la 2? siendo asi, mientras C y D esten en la 1ª cola no se le debería volver a dar oportunidad a la cola 2 no?¿--[[Usuario:DvS 013|DvS 013]]&lt;br /&gt;
&lt;br /&gt;
Creo que se lo que dices. Aunque C y D esten en la primera cola, se pasa a la segunda. Esto es porque la primera cola no tiene mas prioridad, sino solo un quantum más ancho. Entonces se mira la primera cola, luego 2 veces la segunda, y vuelta a empezar --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
El problema creo yo es que el enunciado ha sido modificado de esta mañana para acá, porque yo también hice el ejercicio para subirlo a la wiki, pero se me adelantaron, y esta mañana en el enunciado ponia que la cola 1 tenia más prioridad que la 2, y ademas no ponia el tiempo que estaban en estado bloqueado los procesos, ahora si lo pone, y no pone lo de la prioridad. Yo estoy de acuerdo con la solucion propuesta arriba. --[[Usuario:Josmorgav1|Josmorgav1]] 21:42 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vaya caos! Podemos poner ambos ejercicios --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
Con respecto  a la prioridad de las colas multinivel realimentadas, creo que carecen de prioridad, simplemente basta con saber cuantas veces se ejecutan cada una y en cual de ellas se meten los procesos que van llegando.--[[Usuario:Jmf bsk|Jmf bsk]] 23:10 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DUDA: Creo que este ejercicio está hecho para tiempos de bloqueo de 2 unidades, mientras que en el enunciado los tiempos de bloqueo es de 1 t. Si fuera para tiempos de bloqueo = 1 en el instante 2 Pa regresa a la cola 2 de preparados, luego pasaría a estado activo antes que Pd , por lo que en t=4 Pa pasaría a estado activo,después iría Pd y después la segunda ejecución de Pb. Lo escribo para aclararlo: &lt;br /&gt;
&lt;br /&gt;
Pa y Pb bloquean cada unidad de tiempo, durante una unidad de tiempo de bloqueo.&lt;br /&gt;
&lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    &amp;lt;---|   |   |   |---|   |   |   |   |   |   |   |   |   |   |   |---|   |---&amp;gt;   |&lt;br /&gt;
 Pb    |   &amp;lt;---|   |   |   |   |   |---|   |   |   |   |   |   |   |   |   |---|   |---&amp;gt;&lt;br /&gt;
 Pc    |   |   &amp;lt;---|---|   |   |   |   |---|---|---|---|   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pd    |   |   |   &amp;lt;   |   |---|---|   |   |   |   |   |---|---|---|---|   |   |   |   |&lt;br /&gt;
 Plnf  X   X   X   |   X   X   |   X   X   |   |   |   X   |   |   |   X   |   |   |   X&lt;br /&gt;
       |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&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;
¿es correcta la solución que planteo para una unidad de tiempo de bloqueo?&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''Nueva Duda:'''===&lt;br /&gt;
&lt;br /&gt;
Si sobre la cola 2 se itera dos veces, porque no se vuelve al Pa y Pb en el instante de tiempo 8? Como sucede en el instante 18.&lt;br /&gt;
&lt;br /&gt;
R:&lt;br /&gt;
Fijate que en el instante de tiempo t=6 ya es la 2ª vez que se itera sobre Pa y Pb, la diferencia radica en que en la cola 2 inicialmente existian cuatro procesos que había que atenderlos en RR, añadiendo que Pa y Pb bloquean cada 1 UT, a diferencia del intante t=18 solo existen Pa y Pb y como dice el enunciado se les da dos oportunidades de ejecucion si no consumen su quantum.&lt;br /&gt;
--[[Usuario:Albsolnog|Albsolnog]] 11:53 13 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
R1:&lt;br /&gt;
Añado para mayor comprensión del ejercicio que en el instante t=6 empieza la segunda iteración de la cola 2, lo que pasa es que en esta iteración nada más que entran Pa y Pb, ya que los procesos Pc y Pd han consumido su quantum entero y han promocionado a la cola 1. --[[Usuario:Josazcrom|Josazcrom]] 18:55 22 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
P:No terminaría el proceso A y el B justo después de hacer el bloqueo? Porqué en el ejercicio termina justo antes de ser bloqueado incluso?&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer3-planif-procesos&amp;diff=2453</id>
		<title>Sol-ejer3-planif-procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer3-planif-procesos&amp;diff=2453"/>
				<updated>2012-01-28T19:15:52Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 3 */ aclarar cosas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ejercicio 3 =&lt;br /&gt;
&lt;br /&gt;
 Datos del problema:&lt;br /&gt;
                         | Pa | Pb | Pc  | Pd |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      H0 | 0  | 1  |  2  | 3  |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      t  | 4  | 4  |  12 | 12 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
 &lt;br /&gt;
                  Pa y Pb bloquean por operación de E/S tras 1 unidad de ejecución&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                       ↑ = promociona porque ha consumido el quantum.&lt;br /&gt;
                       B = Bloquea.&lt;br /&gt;
                      !!!= Indica que la cola sobre la que se itera ha cambiado&lt;br /&gt;
 &lt;br /&gt;
       | 1 |   |   |   |   |   | 2 |   |   |   |   |   |   |   |   |   | 1 |   | 2 |   |&lt;br /&gt;
 Pa    &amp;lt;---B   |   |   |   |   |---B   |   |   |   |   |   |   |   |   |---B   |---&amp;gt;   |&lt;br /&gt;
       |   | 1 |   |   |   |   |   | 2 |   |   |   |   |   |   |   |   |   | 1 |   | 2 |&lt;br /&gt;
 Pb    |   &amp;lt;---B   |   |   |   |   |---B   |   |   |   |   |   |   |   |   |---B   |---&amp;gt;&lt;br /&gt;
       |   |   | 1 | ↑ |   |   |   |   |   |   | 1 |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pc    |   |   &amp;lt;---|---|   |   |   |   |---|---|---|---|   |   |   |   |   |   |   |   |&lt;br /&gt;
       |   |   |   |   | 1 | ↑ |   |   |   |   |   |   |   |   | 1 |   |   |   |   |   |&lt;br /&gt;
 Pd    |   |   |   &amp;lt;   |---|---|   |   |   |   |   |   |---|---|---|---|   |   |   |   |&lt;br /&gt;
 Plnf  X   X   X   |   X   |   X   X   X   |   |   |   X   |   |   |   X   |   |   |   X&lt;br /&gt;
       |___|___|___|___|___|___|___|__!!!__|___|___|___|___|___|___|__!!!__|___|___|__!!!&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;
 ... continuación ...&lt;br /&gt;
 &lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pb    |   |   | 1 |   |   |   |   |   |   | 1 |   |   |&lt;br /&gt;
 Pc    |---|---|---|---|   |   | 1 |   |---|---&amp;gt;   | 1 |&lt;br /&gt;
 Pd    |   |   |   |   |---|---|---|---|   |   |---|---&amp;gt;&lt;br /&gt;
 Plnf  |   |   |   |   X   |   |   |   X   |   X   |   | &lt;br /&gt;
       |___|___|___|___|___|___|___|__!!!__|___|___|___|&lt;br /&gt;
       20  21  22  23  24  25  26  27  28  29  30  31  32&lt;br /&gt;
 &lt;br /&gt;
 Cálculo de índices:&lt;br /&gt;
 &lt;br /&gt;
                         | Pa | Pb |  Pc | Pd |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      t  | 4  | 4  |  12 | 12 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                      T  | 19 | 20 |  30 | 32 |&lt;br /&gt;
                     --------------------------&lt;br /&gt;
                    T/t  |4.75| 5  | 2.5 |2.66|&lt;br /&gt;
                     --------------------------&lt;br /&gt;
&lt;br /&gt;
*He añadido sobre cada proceso el número de vez de iteración de la cola a la que pertenece. Así se puede ver que por cada dos iteraciones de una cola, se hace una iteración de la otra.&lt;br /&gt;
* Notese que en el instante 28, se itera sobre la cola 2 dos veces, pero al no contener elementos la iteración es nula, y se pasa a la siguiente cola prevista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Explicación:&lt;br /&gt;
&lt;br /&gt;
Todos los procesos empiezan inicialmente en la segunda cola. Pa y Pb reciben una oportunidad de ejecución sin consumir su quantum debido a bloqueo, por tanto, permanecen en la segunda cola. Pc y Pd consumen todo su quantum, por tanto, promocionan a la primera cola. Los procesos Pa y Pb se ejecutan otra vez, pues los procesos que se encuentran en la segunda cola reciben dos oportunidades de ejecución. Tras esto, los procesos recién ascendidos a la primera cola, que son Pc y Pd, reciben su oportunidad de ejecución, en este caso con quantum de 4 unidades. De nuevo, se le da oportunidad de ejecución a los procesos de la segunda cola, que terminan su ejecución. Como no hay más procesos en la segunda cola, se le da una oportunidad de ejecución a los de la primera. --[[Usuario:Pneira|Pneira]] 18:36 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
= Dudas =&lt;br /&gt;
&lt;br /&gt;
No entiendo por qué en la unidad de tiempo 18 no aparece el proceso c y d y posteriormente a b c y d.Esto es a lo que me refiero --[[Usuario:Jherrera|Jherrera]]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    |   |   |   |   |   |   |   |   |---&amp;gt;   |   |   |&lt;br /&gt;
 Pb    |   |   |   |   |   |   |   |   |   |---&amp;gt;   |   |&lt;br /&gt;
 Pc    |---|---|---|---|   |   |   |   |   |   |-------&amp;gt;&lt;br /&gt;
 Pd    |   |   |   |   |---|---|---|---|   |   |   |   |------&amp;gt;&lt;br /&gt;
 Plnf  |   |   |   |   X   |   |   |   X   |   X   |   X &lt;br /&gt;
       |___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
       18  19  20  21  22  23  24  25  26  27  28  29  30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Solucion: Por que en la 2ª cola estan los procesos A y B, por que nunca consumen los quantums, y la 2ª cola siempre se itera 2 veces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
¿No se supone que la cola 1 posee mayor prioridad que la 2? siendo asi, mientras C y D esten en la 1ª cola no se le debería volver a dar oportunidad a la cola 2 no?¿--[[Usuario:DvS 013|DvS 013]]&lt;br /&gt;
&lt;br /&gt;
Creo que se lo que dices. Aunque C y D esten en la primera cola, se pasa a la segunda. Esto es porque la primera cola no tiene mas prioridad, sino solo un quantum más ancho. Entonces se mira la primera cola, luego 2 veces la segunda, y vuelta a empezar --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
El problema creo yo es que el enunciado ha sido modificado de esta mañana para acá, porque yo también hice el ejercicio para subirlo a la wiki, pero se me adelantaron, y esta mañana en el enunciado ponia que la cola 1 tenia más prioridad que la 2, y ademas no ponia el tiempo que estaban en estado bloqueado los procesos, ahora si lo pone, y no pone lo de la prioridad. Yo estoy de acuerdo con la solucion propuesta arriba. --[[Usuario:Josmorgav1|Josmorgav1]] 21:42 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vaya caos! Podemos poner ambos ejercicios --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
Con respecto  a la prioridad de las colas multinivel realimentadas, creo que carecen de prioridad, simplemente basta con saber cuantas veces se ejecutan cada una y en cual de ellas se meten los procesos que van llegando.--[[Usuario:Jmf bsk|Jmf bsk]] 23:10 22 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DUDA: Creo que este ejercicio está hecho para tiempos de bloqueo de 2 unidades, mientras que en el enunciado los tiempos de bloqueo es de 1 t. Si fuera para tiempos de bloqueo = 1 en el instante 2 Pa regresa a la cola 2 de preparados, luego pasaría a estado activo antes que Pd , por lo que en t=4 Pa pasaría a estado activo,después iría Pd y después la segunda ejecución de Pb. Lo escribo para aclararlo: &lt;br /&gt;
&lt;br /&gt;
Pa y Pb bloquean cada unidad de tiempo, durante una unidad de tiempo de bloqueo.&lt;br /&gt;
&lt;br /&gt;
       |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pa    &amp;lt;---|   |   |   |---|   |   |   |   |   |   |   |   |   |   |   |---|   |---&amp;gt;   |&lt;br /&gt;
 Pb    |   &amp;lt;---|   |   |   |   |   |---|   |   |   |   |   |   |   |   |   |---|   |---&amp;gt;&lt;br /&gt;
 Pc    |   |   &amp;lt;---|---|   |   |   |   |---|---|---|---|   |   |   |   |   |   |   |   |&lt;br /&gt;
 Pd    |   |   |   &amp;lt;   |   |---|---|   |   |   |   |   |---|---|---|---|   |   |   |   |&lt;br /&gt;
 Plnf  X   X   X   |   X   X   |   X   X   |   |   |   X   |   |   |   X   |   |   |   X&lt;br /&gt;
       |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&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;
¿es correcta la solución que planteo para una unidad de tiempo de bloqueo?&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''Nueva Duda:'''===&lt;br /&gt;
&lt;br /&gt;
Si sobre la cola 2 se itera dos veces, porque no se vuelve al Pa y Pb en el instante de tiempo 8? Como sucede en el instante 18.&lt;br /&gt;
&lt;br /&gt;
R:&lt;br /&gt;
Fijate que en el instante de tiempo t=6 ya es la 2ª vez que se itera sobre Pa y Pb, la diferencia radica en que en la cola 2 inicialmente existian cuatro procesos que había que atenderlos en RR, añadiendo que Pa y Pb bloquean cada 1 UT, a diferencia del intante t=18 solo existen Pa y Pb y como dice el enunciado se les da dos oportunidades de ejecucion si no consumen su quantum.&lt;br /&gt;
--[[Usuario:Albsolnog|Albsolnog]] 11:53 13 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
R1:&lt;br /&gt;
Añado para mayor comprensión del ejercicio que en el instante t=6 empieza la segunda iteración de la cola 2, lo que pasa es que en esta iteración nada más que entran Pa y Pb, ya que los procesos Pc y Pd han consumido su quantum entero y han promocionado a la cola 1. --[[Usuario:Josazcrom|Josazcrom]] 18:55 22 nov 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=2452</id>
		<title>Criterios de planificación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=2452"/>
				<updated>2012-01-28T18:53:00Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Colas multinivel con realimentación (feedback) */  añadir un comentario para una posible errata.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=4.3.1 Métodos no apropiativos =&lt;br /&gt;
&lt;br /&gt;
El procesador es asignado al proceso hasta fin de ejecución. Suele darse en sistemas operativos monoprogramables y sistemas de tiempo real.&lt;br /&gt;
En los métodos no apropiativos, si el proceso se bloquea  o entra en estado bloqueado, el procesador quedará sin uso durante todo ese tiempo, pues estaba dedicado/reservado para ése proceso.&lt;br /&gt;
&lt;br /&gt;
== Estocástico ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona aleatoriamente el proceso a ser asignado al procesador. No cumple varios [[Planificación de procesos#Aspectos para diseñar un buen planificador|aspectos de diseño de un buen planificador]], como repetitividad o predecibilidad. Es un criterio de planificación teórico que sirve de referencia, si se emplea un criterio de planificación que ofrece resultados peores que la planificación de procesos estocástica, entonces es que no se trata de un buen criterio de planificación.&lt;br /&gt;
&lt;br /&gt;
No se ofrece un ejemplo, puesto que para un conjunto de procesos existen tantas trazas de ejecución como posible combinaciones aleatorias.&lt;br /&gt;
&lt;br /&gt;
== Con conocimiento del futuro ==&lt;br /&gt;
&lt;br /&gt;
En base al conocimiento del futuro se asignan los procesos. Se trata también de un criterio de planificación teórico. Si un criterio de planificación se acerca al criterio de planificación con conocimiento de futuro, entonces es que se trata de un buen planificador.&lt;br /&gt;
&lt;br /&gt;
     Ejemplo:&lt;br /&gt;
 &lt;br /&gt;
                      ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
           Datos del  _H0_|_0__|_1__|_3__|_6__|_7__|&lt;br /&gt;
            problema  _t__|_3__|_5__|_2__|_3__|_1__|&lt;br /&gt;
 &lt;br /&gt;
                        &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                        &amp;gt; = finalización del proceso                                                                       &lt;br /&gt;
                        x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
         |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pa  &amp;lt;xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pb  |---&amp;lt;---|---|---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pc  |---|---|---&amp;lt;xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pd  |---|---|---|---|---|---&amp;lt;---|---|---|---|---|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|&lt;br /&gt;
     Pe  |---|---|---|---|---|---|---&amp;lt;---|---|---|xxx&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;
 &lt;br /&gt;
                    ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_2__|_3__|_1__|&lt;br /&gt;
       de tiempos   _T__|_3__|_9__|_2__|_8__|_4__|      z = índice de penalización&lt;br /&gt;
                    _z__|_1__|_9/5|_1__|_8/3|_4/1|&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, al conocer los tiempos en los que llegará cada proceso, y el tiempo de proceso, podemos buscar la forma de asignarlos de forma que, por ejemplo, consigamos la mínima penalización.&lt;br /&gt;
&lt;br /&gt;
== Por orden de llegada (First In, First Out: FIFO) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso por orden de llegada al sistema, cuando un proceso está preparado se añade al final de la cola y se ejecuta según el orden de incorporacion. Su principales ventajas son su facilidad de implementación, consume muy poco tiempo de procesador (casi ninguno) y su orden de complejidad, O(1). Su desventaja es que los procesos de corta duración pueden quedar a la espera de procesos muy prolongados, así que presentarán un alto índice de penalización.&lt;br /&gt;
&lt;br /&gt;
     Ejemplo:&lt;br /&gt;
 &lt;br /&gt;
                      ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
           Datos del  _H0_|_0__|_1__|_3__|_9__|_12_|&lt;br /&gt;
            problema  _t__|_3__|_5__|_2__|_5__|_5__|&lt;br /&gt;
 &lt;br /&gt;
                        &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                        &amp;gt; = finalización del proceso&lt;br /&gt;
                        x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---|---&amp;lt;---|---|---|---|---|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---|---|---|---|---|---|---&amp;lt;---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&gt;
    Pe  |---|---|---|---|---|---|---|---|---|---|---|---&amp;lt;---|---|---|xxx|xxx|xxx|xxx|xxx&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;
                    ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|        t = tiempo de ejecución&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_2__|_5__|_5__|        T = tiempo de terminación (Instante de&lt;br /&gt;
       de tiempos   _T__|_3__|_7__|_7__|_6__|_8__|        terminación - Instante de lanzamiento)&lt;br /&gt;
                    _z__|_1__|_7/5|_7/2|_6/5|_8/5|        z = índice de penalización&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución de entre todos los que están listos para ejecutarse. Se necesita conocer con antelación el tiempo de ejecucion de cada proceso, algo que es muy dificil en muchas ocasiones.&lt;br /&gt;
Para procesos largos puede presentar un índice de penalización elevado: Si se tienen muchos procesos cortos, el de mayor duración puede quedar en espera indefinidamente. Otro inconveniente es que todo trabajo corto que llegue cuando ya ha comenzado un trabajo largo tiene un gran retraso. Su orden de complejidad es O(n).&lt;br /&gt;
&lt;br /&gt;
    Ejemplo:&lt;br /&gt;
 &lt;br /&gt;
                     ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_3__|_9__|_12_|&lt;br /&gt;
           problema  _t__|_3__|_5__|_2__|_5__|_5__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = finalización del proceso&lt;br /&gt;
                       x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                       &amp;amp; = se ejecuta el planficador&lt;br /&gt;
         |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pa  &amp;lt;xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pb  |---&amp;lt;---|---|---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pc  |---|---|---&amp;lt;xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pd  |---|---|---|---|---|---|---|---|---&amp;lt;---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&gt;
     Pe  |---|---|---|---|---|---|---|---|---|---|---|---&amp;lt;---|---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;&lt;br /&gt;
 planif. &amp;amp;---|---|---&amp;amp;---|---&amp;amp;---|---|---|---|---&amp;amp;---|---|---|---|---&amp;amp;---|---|---|---|---&amp;amp;&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;
                    ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_2__|_5__|_5__|&lt;br /&gt;
       de tiempos   _T__|_3__|_9__|_2__|_6__|_8__|      z = índice de penalización&lt;br /&gt;
                    _z__|_1__|_9/5|_1__|_6/5|_8/5|&lt;br /&gt;
&lt;br /&gt;
== Basado en índice de penalización ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que tendrá el índice de penalización &amp;lt;math&amp;gt;I_p=\frac{T}{t}=\frac{H_f-H_0}{t}&amp;lt;/math&amp;gt; de mayor valor. Este método puede producir aplazamientos de ejecución de procesos,pero no son indefinidos. Su orden de complejidad es &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
     Ejemplo:&lt;br /&gt;
 &lt;br /&gt;
                      ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
           Datos del  _H0_|_0__|_1__|_3__|_7__|_6__|&lt;br /&gt;
            problema  _t__|_3__|_5__|_4__|_3__|_5__|&lt;br /&gt;
 &lt;br /&gt;
                        &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                        &amp;gt; = finalización del proceso&lt;br /&gt;
                        x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                        &amp;amp; = se ejecuta el planficador&lt;br /&gt;
   &lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---|---&amp;lt;---|---|---|---|---|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---|---|---|---|---&amp;lt;---|---|---|---|---|xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&gt;
    Pe  |---|---|---|---|---|---&amp;lt;---|---|---|---|---|---|---|---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;&lt;br /&gt;
 planif.&amp;amp;---|---|---&amp;amp;---|---|---|---|---&amp;amp;---|---|---|---&amp;amp;---|---|---&amp;amp;---|---|---|---|---&amp;amp;&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;
                    ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_4__|_3__|_5__|&lt;br /&gt;
       de tiempos   _T__|_3__|_7__|_9__|_13_|_11_|&lt;br /&gt;
                    z(3)|_1__|_'''7/5'''|_1__|____|____|&lt;br /&gt;
                    z(8)|_1__|_7/5|_'''9/4'''|_4/3|_7/5|&lt;br /&gt;
                   z(12)|_1__|_7/5|_9/4|_'''8/3'''|11/5|      z = índice de penalización&lt;br /&gt;
                   z(15)|_1__|_7/5|_9/4|_8/3|'''14/5'''|&lt;br /&gt;
                   z(20)|_1__|_7/5|_9/4|_8/3|14/5|&lt;br /&gt;
&lt;br /&gt;
=4.3.2 Métodos apropiativos =&lt;br /&gt;
&lt;br /&gt;
El planificador puede retirar el procesador en cualquier momento al proceso activo. Se emplea fundamentalmente en sistemas operativos [[Multiprogramación|multiprogramables]].&lt;br /&gt;
&lt;br /&gt;
Con métodos apropiativos, la decisión de planificación tiene lugar si:&lt;br /&gt;
&lt;br /&gt;
* El proceso activo pasa a estado bloqueado.&lt;br /&gt;
* El proceso activo termina su ejecución.&lt;br /&gt;
* Se lanza un nuevo proceso.&lt;br /&gt;
* El proceso activo agota el tiempo máximo de asignación del procesador (veáse ''Turno Rotatorio'').&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución. Si hay un proceso en estado preparado que requiere menos tiempo de ejecución del que le falta al actual, se le retira el procesador al actual proceso y se le asigna al nuevo. Su orden de complejidad es O(n), pero, a diferencia del no apropiativo, cuando entra un proceso en la lista de procesos, se ejecuta código de planificador.Con este método los procesos más largos se ven perjudicados, pues se puede retrasar tanto su tiempo de inicio, como el de finalización.&lt;br /&gt;
&lt;br /&gt;
     Ejemplo:&lt;br /&gt;
 &lt;br /&gt;
                      ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
           Datos del  _H0_|_0__|_1__|_4__|_6__|_12_|&lt;br /&gt;
            problema  _t__|_3__|_5__|_1__|_8__|_3__|&lt;br /&gt;
 &lt;br /&gt;
                        &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                        &amp;gt; = finalización del proceso&lt;br /&gt;
                        x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                        $ = indica la ejecución del planificador para retirar un&lt;br /&gt;
                            proceso y establecer otro según el criterio&lt;br /&gt;
                        &amp;amp; = se ejecuta el código del planificador&lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|xxx|xxx&amp;gt;---$---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;---|---|xxx|---|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---|---|---&amp;lt;xxx&amp;gt;---|---|---|---|---|---|---$---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---|---|---|---&amp;lt;---|---|---|xxx|xxx|xxx|---|---|---|xxx|xxx|xxx|xxx|xxx&amp;gt;&lt;br /&gt;
    Pe  |---|---|---|---|---|---|---|---|---|---|---|---&amp;lt;xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&gt;
 Planif.|---&amp;amp;---|---&amp;amp;---&amp;amp;---&amp;amp;---&amp;amp;---|---|---&amp;amp;---|---|---&amp;amp;---|---|---&amp;amp;---|---|---|---|---&amp;amp;&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;
                    ____|_Pa_|_Pb_|_Pc_|_Pd_|_Pe_|&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_1__|_8__|_3__|&lt;br /&gt;
       de tiempos   _T__|_3__|_8__|_1__|_11_|_3__|        z = índice de penalización&lt;br /&gt;
                    _z__|_1__|_8/5|_1__|11/8|_1__|&lt;br /&gt;
&lt;br /&gt;
== Por prioridades ==&lt;br /&gt;
&lt;br /&gt;
Se establecen índices de prioridad a cada proceso:&lt;br /&gt;
&lt;br /&gt;
* '''Índice estático''': Establecido por el usuario. En el caso de sistemas operativos tipo Unix, se dispone de una índice denominado ''nice value'' cuyos valores están entre -20 (máxima prioridad) y 19 (mínima prioridad).&lt;br /&gt;
* '''Índice dinámico''': Establecido por el planificador, inicialmente basado en el índice estático, después se va recalculando en base a las observaciones que realiza el planificador sobre el comportamiento de los procesos, aumentándola cuando un proceso está a la espera o disminuyéndola cuando tiene adjudicado el procesador.&lt;br /&gt;
&lt;br /&gt;
El método funciona de la siguiente manera: El planificador mantiene ordenada la cola de procesos preparados, según prioridades decrecientes. Si el proceso en ejecución se bloquea, el planificador selecciona el primero de la lista. Cuando un proceso pasa a la situación de preparado, comprueba si su prioridad es mayor que la del proceso activo. En tal caso, suspende la ejecución de éste, colocándolo al principio de la cola de preparados, y elige al recién llegado; si no, lo inserta en la cola según su prioridad.&lt;br /&gt;
Cuando hay varios procesos con la misma prioridad se pueden aplicar diversos criterios, como seguir el orden de llegada a la cola de preparados, o el que necesite menos tiempo para acabar entre otros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El orden es siempre O(n).&lt;br /&gt;
&lt;br /&gt;
    Ejemplo:&lt;br /&gt;
                                                                                         &lt;br /&gt;
                     ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|&lt;br /&gt;
           problema  _t__|_2__|_4__|_2__|_7__|    p = prioridad estática&lt;br /&gt;
                     _p__|_0__|-20_|_4__|_10_|&lt;br /&gt;
                                                       &lt;br /&gt;
                       &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = finalización del proceso&lt;br /&gt;
                       x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                       $ = indica la ejecución del planificador para retirar un&lt;br /&gt;
                           proceso y establecer otro según el criterio&lt;br /&gt;
                       &amp;amp; = se ejecuta el código del planificador&lt;br /&gt;
         |---$---|---|---|---$---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pa  &amp;lt;xxx|---|---|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pb  |---&amp;lt;xxx|xxx|xxx|xxx&amp;gt;---$---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pc  |---|---&amp;lt;---|---|---|---|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
     Pd  |---|---|---&amp;lt;---|---|---|---|---|xxx|xxx|xxx|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&gt;
 Planif. |---&amp;amp;---&amp;amp;---&amp;amp;---|---&amp;amp;---&amp;amp;---|---&amp;amp;---|---|---|---|---|---|---&amp;amp;---|---|---|---|---|&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;
                   ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
       Cálculos    _t__|_2__|_4__|_2__|_7__|&lt;br /&gt;
      de tiempos   _T__|_6__|_4__|_6__|_12_|        z = índice de penalización&lt;br /&gt;
                   _z__|_3__|_1__|_3__|12/7|&lt;br /&gt;
&lt;br /&gt;
== Turno rotatorio ==&lt;br /&gt;
&lt;br /&gt;
=== Turno rotatorio estricto (Round Robin: RR) ===&lt;br /&gt;
&lt;br /&gt;
En este criterio, todo proceso es asignado al procesador durante un tiempo establecido denominado ''quantum'', tras el cual se le retira y se asigna a otro proceso rotatoriamente. De esta manera, los procesos acceden al procesador por turnos.&lt;br /&gt;
&lt;br /&gt;
El tamaño del ''quantum'' es fundamental para determinar el comportamiento de este criterio de planificación. &lt;br /&gt;
Si el ''quantum'' empleado es pequeño, por ejemplo de 10 ms, suponiendo que la conmutación de procesos requiere 10ms, el 50% del tiempo se empleará el procesador para ejecutar el código que permite conmutar entre procesos. Sin embargo, si el ''quantum'' empleado es grande, por ejemplo de 5 s, la latencia será mayor, degradando la experiencia del usuario que notará como sus procesos progresan ''a saltos'', puesto que, en el peor de los casos, hasta pasados 5 s no se le asignará el procesador a otro proceso .&lt;br /&gt;
&lt;br /&gt;
Si un proceso bloquea antes de consumir su ''quantum'' '''se le retira el procesador''' y se añade al final de la cola. Esto beneficia a los procesos por lotes, cuyo comportamiento está limitado por el procesador, pues se pasan más tiempo asignados al procesador.&lt;br /&gt;
&lt;br /&gt;
Puesto que el reparto del procesador es estricto, los procesos recién lanzados deben acceder al procesador lo antes posible, por tanto, se les da oportunidad de ejecución por orden de llegada por delante de los procesos en la cola de procesos preparados. De esta manera, se evita que los procesos recién lanzados queden postergados indefinidamente.&lt;br /&gt;
&lt;br /&gt;
Este criterio se puede implementar con una cola, de manera que el orden de complejidad en la selección del proceso que pasa a estado activo es &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Nótese que a mayor número de procesos preparados, mayor tiempo tardará un proceso en volver a pasar a estado activo.&lt;br /&gt;
&lt;br /&gt;
    Ejemplo:&lt;br /&gt;
                                                                                         &lt;br /&gt;
                     ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|&lt;br /&gt;
           problema  _t__|_2__|_4__|_2__|_7__|    quantum = 1 unidad de tiempo&lt;br /&gt;
                                                       &lt;br /&gt;
                       &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = finalización del proceso&lt;br /&gt;
                       x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                       $ = indica la ejecución del planificador para retirar un&lt;br /&gt;
                           proceso y establecer otro según el criterio&lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|---|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;xxx|---|---|---|xxx|---|---|xxx|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---&amp;lt;xxx|---|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---&amp;lt;xxx|---|---|---|xxx|---|xxx|---|xxx|xxx|xxx|xxx&amp;gt;---|---|---|---|---|&lt;br /&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;
                   ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
       Cálculos    _t__|_2__|_4__|_2__|_7__|&lt;br /&gt;
      de tiempos   _T__|_5__|_10_|_5__|_12_|        z = índice de penalización&lt;br /&gt;
                   _z__|_5/2|10/4|_5/2|12/7|&lt;br /&gt;
&lt;br /&gt;
=== Turno rotatorio con compensación ===&lt;br /&gt;
&lt;br /&gt;
Es una variante del anterior. Para no perjudicar a los procesos cuyo comportamiento está limitado por operaciones de entrada/salida, se reinsertan en la cola en proporción al tiempo consumido. Es decir, que si un cierto proceso ha consumido el 25% de su '''quantum''', se reinserta en el 25% de la cola, contando desde el principio (dispondrá de otro quantum completo).&lt;br /&gt;
Este tipo de criterio tiene un problema y es que se pueden posponer indefinidamente algunos procesos si hay varios procesos que bloqueen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Ejemplo:&lt;br /&gt;
                                                                                         &lt;br /&gt;
                     ____|_Pa_|_Pb_|_Pc_|_Pd_|    Pa y Pc bloquean cada 1 unidad de tiempo&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|    El bloqueo se resuelve tras 2 unidades de tiempo&lt;br /&gt;
           problema  _t__|_2__|_4__|_2__|_7__|    quantum = 2 unidad de tiempo&lt;br /&gt;
                                                       &lt;br /&gt;
                       &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = finalización del proceso&lt;br /&gt;
                       x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                       $ = indica la ejecución del planificador para retirar un&lt;br /&gt;
                           proceso y establecer otro según el criterio&lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|---|---|---|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;xxxxxxx|---|---|---|---|---|xxx|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---&amp;lt;---|xxx|---|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---&amp;lt;---|xxx|xxx|---|---|---|---|xxxxxxxxxxxxxxxxxxx&amp;gt;---|---|---|---|---|&lt;br /&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;
                   ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
       Cálculos    _t__|_2__|_4__|_2__|_7__|&lt;br /&gt;
      de tiempos   _T__|_7__|_9__|_6__|_12_|        z = índice de penalización&lt;br /&gt;
                   _z__|_7/2|_9/4|_6/2|12/7|&lt;br /&gt;
&lt;br /&gt;
=== Turno rotatorio con quantum dependiente del número de procesos ===&lt;br /&gt;
&lt;br /&gt;
Otra variante se trata de emplear un '''quantum''' proporcional al número de procesos que haya en estado preparado. De esta forma se obtiene una progresión más uniforme, y por tanto una mejor experiencia para el usuario. Sin embargo, esto aumenta el número de conmutaciones entre procesos. Para evitar la degradación del rendimiento por un exceso de conmutaciones, se establece un mínimo de manera que el quantum no puede ser menor a éste.&lt;br /&gt;
&lt;br /&gt;
== Colas multinivel ==&lt;br /&gt;
&lt;br /&gt;
En este tipo de criterio se mantienen múltiples colas con los procesos en estado preparado. Los procesos se clasifican en las colas según sus características, cada cola recibe un tratamiento distinto.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo sería el siguiente, compuesto de cuatro colas:&lt;br /&gt;
&lt;br /&gt;
# Esta primera cola es para procesos que poseen menor tiempo de ejecución, son los gestores de interrupción y los gestores de dispositivos (drivers). Hay que tomar los datos y almacenarlos en memoria lo antes posible para poder recoger más, aunque se posponga el procesamiento de dichos datos.&lt;br /&gt;
# En esta cola se almacenan los procesos del servidor, tales como : proceso administrador de memoria, administrador de ficheros, administrador de red, etc.&lt;br /&gt;
# Esta cola esta reservada a los procesos de usuario (procesos útiles para el usuario). Esta se divide a su vez en dos colas:&lt;br /&gt;
## Cola de procesos interactivos, limitados por E/S.&lt;br /&gt;
## Cola de procesos por lotes, limitados por el procesador.&lt;br /&gt;
&lt;br /&gt;
Las colas tienen prioridad según su número, por ejemplo mientras que haya procesos preparados en la primera cola, no se mira la segunda. Esto puede dar lugar a que si hay muchos procesos de gestión de dispositivos se degrade la eficiencia del sistema.&lt;br /&gt;
&lt;br /&gt;
La primera cola esta implementada con una FIFO(no apropiativo), mientras que las colas 2 y 3 se basan en un sistema de RR (turno rotatorio).&lt;br /&gt;
&lt;br /&gt;
=== Colas multinivel con realimentación (feedback)===&lt;br /&gt;
&lt;br /&gt;
Es una variante de las colas multinivel en las que los procesos pasan de una cola a otra según su comportamiento, de manera que:&lt;br /&gt;
&lt;br /&gt;
* Los procesos interactivos tienen más oportunidades de emplear el procesador.&lt;br /&gt;
* Los procesos por lotes disponen del procesador durante más tiempo.&lt;br /&gt;
&lt;br /&gt;
Los procesos se asignan al procesador por turnos rotatorios, empleando un ''quantum'' dependiente de la cola en la que se encuentren. Los procesos que consumen el ''quantum'' asignado completamente un número determinado de veces pasan a colas en las que se asignan ''quantum'' mayores. Nótese que los procesos que no consumen su ''quantum'' muestran un comportamiento interactivo. Para no discriminar a los procesos que se encuentran en las colas con ''quantum'' menores, se les dan más oportunidades de ejecución. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en un sencillo planificador de colas multinivel con realimentación compuesto por dos colas:&lt;br /&gt;
&lt;br /&gt;
* En la primera cola se le asignan un ''quantum'' de 2 unidades de tiempo a los procesos.&lt;br /&gt;
* En la segunda cola se le asignan un ''quantum'' de 1 unidad de tiempo a los procesos.&lt;br /&gt;
&lt;br /&gt;
Si un proceso no consume el ''quantum'' asignado dos veces, pasa a la cola en la que en la se le asignan ''quantum'' de 1 unidad de tiempo.&lt;br /&gt;
&lt;br /&gt;
Para que los procesos interactivos no salgan perjudicados, en aras de hacer un reparto del procesador más equitativo, se le dan dos oportunidades de ejecución a los procesos situados en la cola con ''quantum'' de 1 unidad de tiempo. De esta manera, los procesos de la primera cola reciben una oportunidad de ejecución con un ''quantum'' de 2 unidades de tiempo y los de la segunda reciben dos oportunidades de ejecución con un ''quantum'' de 1 unidad de tiempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 Pa y Pc bloquean cada 1 unidad de tiempo&lt;br /&gt;
 El bloqueo se resuelve tras 2 unidades de tiempo&lt;br /&gt;
 Colas multinivel:  1. Procesos interactivos (quantum = 1 unidad de tiempo)&lt;br /&gt;
                    2. Procesos por lotes    (quantum = 2 unidad de tiempo)    &lt;br /&gt;
 Inicialmente todos los procesos van a la cola 2&lt;br /&gt;
 Los procesos que no consuman su quantum al menos una vez pasan a la cola 1&lt;br /&gt;
 Las colas implementan turno rotatorio estricto.&lt;br /&gt;
 Siempre que haya procesos en la cola 1, debe ser atendidos de manera preferente frente a la cola 2.&lt;br /&gt;
                                                                                         &lt;br /&gt;
                     ____|_Pa_|_Pb_|_Pc_|_Pd_|   &lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|_3__|   &lt;br /&gt;
           problema  _t__|_2__|_4__|_2__|_7__|                      &lt;br /&gt;
                                               &lt;br /&gt;
                                                       &lt;br /&gt;
                       &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = finalización del proceso&lt;br /&gt;
                       x = indica que el proceso está asignado al procesador en ese momento&lt;br /&gt;
                       $ = indica la ejecución del planificador para retirar un&lt;br /&gt;
                           proceso y establecer otro según el criterio&lt;br /&gt;
        |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pa  &amp;lt;xxx|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pb  |---&amp;lt;xxxxxxx|---|---|---|---|---|xxxxxxx&amp;gt;---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pc  |---|---&amp;lt;---|---|xxx|---|---|xxx&amp;gt;---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
    Pd  |---|---|---&amp;lt;---|---|xxxxxxx|---|---|---|xxxxxxxxxxxxxxxxxxx&amp;gt;---|---|---|---|---|&lt;br /&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;
                   ____|_Pa_|_Pb_|_Pc_|_Pd_|&lt;br /&gt;
       Cálculos    _t__|_2__|_4__|_2__|_7__|&lt;br /&gt;
      de tiempos   _T__|_4__|_9__|_6__|_12_|        z = índice de penalización&lt;br /&gt;
                   _z__|_4/2|_9/4|_6/2|12/7|&lt;br /&gt;
&lt;br /&gt;
* Si bloquea cada una unidad de tiempo, tanto el proceso A como el proceso C bloquean, entonces no pueden finalizar donde finalizan, si no tras haber procesado el bloqueo, dos unidades de tiempo después.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=2451</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=2451"/>
				<updated>2012-01-28T18:43:40Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: Pasar imagn ascii a svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Hilo = &amp;quot;proceso ligero&amp;quot; = línea de ejecución&lt;br /&gt;
&lt;br /&gt;
* En general, el planificador de procesos da el mismo tratamiento a los hilos y a los procesos.&lt;br /&gt;
&lt;br /&gt;
* Proceso inicialmente parte con un único hilo&lt;br /&gt;
&lt;br /&gt;
* El sistema operativo ofrece llamadas al sistema para crear/destruir hilos. Desde el código del programa, puedo hacer uso de estas llamadas al sistema.&lt;br /&gt;
&lt;br /&gt;
* Cuando se crea un hilo, se le indica qué código se quiere que ejecute.&lt;br /&gt;
&lt;br /&gt;
* Dos o más hilos, de un mismo proceso, comparten espacio de memoria.&lt;br /&gt;
&lt;br /&gt;
* La conmutación de hilos es menos costosa que la conmutación de procesos.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Uso_del_procesador_hilos.svg]]&lt;br /&gt;
&lt;br /&gt;
Con multiprocesamiento podemos ejecutar diferentes procesos a la vez. Si tenemos uno solo podemos desdoblarlo en hilos, usando técnicas de programación apoyadas en APIS (como POSIX threads).&lt;br /&gt;
&lt;br /&gt;
Para aumentar su eficiencia, un programa en ejecución debe crear tantos hilos como el doble del número de procesadores del los que disponga el sistema. Por ejemplo: 4 hilos para un programa ejecutado con 2 procesadores.&lt;br /&gt;
&lt;br /&gt;
Las principales ventajas del uso de hilos son:&lt;br /&gt;
&lt;br /&gt;
*Menor penalización en cuanto a conmutación.&lt;br /&gt;
&lt;br /&gt;
*Dos hilos de un mismo proceso pueden compartir memoria aprovechando mejor los recursos y eliminando los mecanismos de comunicación necesarios para soluciones implementadas en varios procesos.&lt;br /&gt;
&lt;br /&gt;
*Con un solo procesador es posible que una línea de proceso haga uso de una llamada al sistema bloqueante. En este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso externo, ahorrando así tiempo de conmutación asociado a la ejecución del planificador de procesos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejemplo =&lt;br /&gt;
&lt;br /&gt;
El siguiente es un código en C de ejemplo en el que se muestra la creación de dos hilos. Se hace uso de la llamada al sistema ''sleep'' que hace que el proceso pase a estado bloqueado durante N segundos. Nótese que al compartir la variable ''a'', ambos hilos modifican su valor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a = 10;&lt;br /&gt;
&lt;br /&gt;
void *codigo_hilo1(void *arg)&lt;br /&gt;
{&lt;br /&gt;
	sleep(10);&lt;br /&gt;
	a = a - 2;&lt;br /&gt;
	printf(&amp;quot;Soy el hilo 1 y la variable a vale %d\n&amp;quot;, a);&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *codigo_hilo2(void *arg)&lt;br /&gt;
{&lt;br /&gt;
	sleep(5);&lt;br /&gt;
	a++;&lt;br /&gt;
	printf(&amp;quot;Soy el hilo 2 y la variable a vale %d\n&amp;quot;, a);&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
	pthread_create(&amp;amp;hilo1, NULL, codigo_hilo1, NULL);&lt;br /&gt;
	pthread_create(&amp;amp;hilo2, NULL, codigo_hilo2, NULL);&lt;br /&gt;
&lt;br /&gt;
	pthread_join(hilo1, NULL);&lt;br /&gt;
	pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este ejemplo se compila en un terminal escribiendo: '''gcc -lpthread archivo.c'''&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Uso_del_procesador_hilos.svg&amp;diff=2450</id>
		<title>Archivo:Uso del procesador hilos.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Uso_del_procesador_hilos.svg&amp;diff=2450"/>
				<updated>2012-01-28T18:42:30Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=2449</id>
		<title>Sol-ejer2-planif-procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol-ejer2-planif-procesos&amp;diff=2449"/>
				<updated>2012-01-28T18:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Turno rotatorio proporcional al número de procesos */  otro fallo más en el problema.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Turno rotatorio estricto =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               Pa  &amp;lt;---|   |   |   |   |---|   |   |   |---|   |   &amp;gt;   |   |   |   |   |   |   |   &lt;br /&gt;
               Pb  |   &amp;lt;---|---|   |   |   |---|   |   |   |---|---&amp;gt;   |   |   |   |   |   |   |   &lt;br /&gt;
               Pc  |   |   &amp;lt;   |---|---|   |   |---|---|   |   |   |---|---&amp;gt;   |   |   |   |   |   &lt;br /&gt;
     Planificador  X   X   |   X   |   X   X   X   |   X   X   |   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__&amp;gt; t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_Pa_|_Pb_|_Pc_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_10_|_11_|_12_|&lt;br /&gt;
                   _T/t_|3.3_|2.2_|_2__|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notése que el proceso A no llega a emplear el ''quantum'' que tiene asignado, en ese caso, como indica la [[Criterios_de_planificación|teoría]], se le retira el procesador y el planificador selecciona a otro proceso. Dejar el procesador sin proceso asignado, es decir, ocioso, va contra la lógica del máximo aprovechamiento del procesador. Por ello, he retirado una solución incorrecta que aparecía en esta sección. --[[Usuario:Pneira|Pneira]] 21:15 21 mar 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tengo una duda en este ejercicio, en la unidad de tiempo 6 cuando el planificador activa el proceso Pb, porque motivo solo le asigna una unidad de tiempo?, podria asignarle 2 no? teniendo en cuenta que el quantum = 2. Ademas el proceso B bloquea cada 3 unidades de tiempo, no entiendo porque solo le asigna una unidad y luego activa en la unidad de tiempo 7 el proceso C.  LFE (Luis Fernandez Esteban)&lt;br /&gt;
&lt;br /&gt;
Pues yo diría que es porque se bloquea cada 3, al igual que el A se bloquea a cada unidad. Ya llevaba 1, y con esa actividad, +2 --[[Usuario:PCamino|PCamino]]&lt;br /&gt;
&lt;br /&gt;
Gracias, tienes razon ya lo entendi. LFE (Luis Fernandez Esteban)&lt;br /&gt;
&lt;br /&gt;
DUDA &lt;br /&gt;
En t=3 llegaría el proceso Pa y el proceso Pb a la cola de estado preparado. Como dice en teroía, un proceso que se bloquea sin llegar a agotar su quantum, pasaría al final de  la cola de estados preparados. Por tanto, el siguiente en ejecutarse sería Pb, puesto que Pa viene de estar bloqueado sin agotar su quantum luego pasaría al final de la cola de preparados. ¿Estoy en lo cierto?&lt;br /&gt;
--[[Usuario:josvaldia|josvaldia]]&lt;br /&gt;
&lt;br /&gt;
-esto es estricto no por compensación por tanto no estas en lo cierto. --[[Usuario:juacordia|juacordia]]&lt;br /&gt;
&lt;br /&gt;
DUDA: ¿En t=10 el proceso A no bloquearia y terminaria de ejecutarse cuando vuelva del bloqueo?  --[[Usuario:jesgonbel|jesgonbel]]&lt;br /&gt;
&lt;br /&gt;
RESP: En t=10, el proceso A no entra en bloqueo, sino que directamente finaliza su ejecución.&lt;br /&gt;
--[[Usuario:framorexp|framorexp]]&lt;br /&gt;
&lt;br /&gt;
RESP2: jesgonbel, el proceso terminaría cuando vuelve del bloqueo, no finaliza en el 10, lo haría en el 12 lo dijo pablo en clase creo recordar --[[Usuario:fercarort|fercarort]]&lt;br /&gt;
&lt;br /&gt;
RESP3: Vale, puede ser, pero a efectos prácticos es como si finalizara en el 10, porque tras el bloqueo no necesita ningún tipo de procesamiento. No se si este caso merece algún trato especial, pero creo que no. --[[Usuario:framorexp|framorexp]]&lt;br /&gt;
&lt;br /&gt;
= Por prioridades =&lt;br /&gt;
&lt;br /&gt;
Suponiendo que la prioridad de los procesos es la siguiente: A&amp;lt;B&amp;lt;C&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
    P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; bloquea por E/S cada 1 unidad de tiempo&lt;br /&gt;
    P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; bloquea por E/S cada 3 unidades de tiempo&lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                                                                 &lt;br /&gt;
                   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &amp;lt;---|   |   |   |   |   |   |   |   |   |---|   |   |   |---|   |   &amp;gt;   |   |   &lt;br /&gt;
               P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  |   &amp;lt;---|   |   |   |   |   |   |---|---|   |   |---|---&amp;gt;   |   |   |   |   |            &lt;br /&gt;
               P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  |   |   &amp;lt;---|---|---|---|---|---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |    &lt;br /&gt;
     Planificador  X   X   X   |   |   |   |   |   X   |   X   X   X   |   X   |   |   |   |   |      &lt;br /&gt;
               ____|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|__t&lt;br /&gt;
                   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  &lt;br /&gt;
 &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_15_|_13_|_6_|&lt;br /&gt;
                   _T/t_|__5_|_2.6|_1__|&lt;br /&gt;
&lt;br /&gt;
Nota: Del 11 al 12 no se procesa nada porque sólo quedan los procesos A y B, pero en esa unidad de tiempo ambos están bloqueados (los bloqueos de A y B duran 2 uds. de tiempo) --[[Usuario:Pneira|Pneira]] 19:23 8 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
= Turno rotatorio proporcional al número de procesos =&lt;br /&gt;
&lt;br /&gt;
                     ____|_P&amp;lt;sub&amp;gt;A &amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C &amp;lt;/sub&amp;gt;_|&lt;br /&gt;
          Datos del  _H0_|_0__|_1__|_2__|&lt;br /&gt;
           problema  _t__|_3__|_5__|_6__|&lt;br /&gt;
 &lt;br /&gt;
                       &amp;lt; = indica el instante de lanzamiento del proceso&lt;br /&gt;
                       &amp;gt; = indica el instante de finalización del proceso&lt;br /&gt;
                       X = se ejecuta el código del planificador&lt;br /&gt;
                       B = bloquea&lt;br /&gt;
                       P = preparado&lt;br /&gt;
 &lt;br /&gt;
                      q=2 q=2     q=1 q=1 q=1 q=2     q=1 q=1 q=1 q=1 q=2                &lt;br /&gt;
                       |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               Pa      &amp;lt;---B   |   P   |---B   |   P   |---&amp;gt;   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
               Pb      |   &amp;lt;---|---P   |   |---B   |   P   |---P   |---&amp;gt;   |   |   |   |   |   |   |   |&lt;br /&gt;
               Pc      |   |   &amp;lt;   |---P   |   |---|---P   |   |---P   |---|---&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;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5__|_6__|&lt;br /&gt;
       de tiempos  __T__|_12_|_15_|_17_|&lt;br /&gt;
                   _T/t_|_4__|2.80|_2.5|&lt;br /&gt;
&lt;br /&gt;
Nota: Fíjese en que el quantum se calcula en base al número de procesos que están en estado preparado cada vez que hay que tomar una decisión de planificación --[[Usuario:Pneira|Pneira]] 19:34 8 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Los índices de penalización de este ejercicio son erróneos, la solución correcta creo que sería la siguiente:&lt;br /&gt;
            &lt;br /&gt;
                   _____|_P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;_|_P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;_|&lt;br /&gt;
        Cálculos   __t__|_3__|_5___|_6__|&lt;br /&gt;
       de tiempos  __T__|_9__|_11__|_12_|&lt;br /&gt;
                   _T/t_|_3__|_2.2_|__2_|--[[Usuario:Josazcrom|Josazcrom]] 17:28 22 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Aparte de que los índices parecen estar mal, el proceso A no debería terminar donde termina, si no dos unidades de tiempo después, tras terminar el bloqueo.&lt;br /&gt;
&lt;br /&gt;
PREGUNTA:Pienso que en el instante 11 el proceso que se ejecuta es el C ya que en el 10 en la cola de preparado había 1 proceso en estado preparado, por tanto, el quantum vuelve a cambiar a 2 y el proceso C se ejecuta del 10 a 12. &lt;br /&gt;
¿Alguién puede confirmarme esta &amp;quot;pregunta&amp;quot;?.&lt;br /&gt;
--[[Usuario:Raflopseg|Raflopseg]] 18:20 23 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Probablemente no te sea de ayuda ahora pero por si le sirve a alguien:&lt;br /&gt;
En el instante 9 B usa solo uno porque C esta activo y por tanto el quantum es 1. &lt;br /&gt;
B no pasa a estar bloqueado(se bloquea en el 6 y no se vuelve a usar hasta el 9 por lo tanto esta activo por tres intervalos)&lt;br /&gt;
Al estar B activo C solo se puede ejecutar de 10 a 11&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos&amp;diff=2434</id>
		<title>Planificación de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos&amp;diff=2434"/>
				<updated>2012-01-28T16:15:58Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: Falta título&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Planificación de procesos = &lt;br /&gt;
Todo planificador de procesos emplea uno o varios criterios (''scheduling policy'', en inglés) que determinan el criterio de selección del proceso que empleará el procesador.&lt;br /&gt;
&lt;br /&gt;
== Aspectos para diseñar un buen criterio de planificación ==&lt;br /&gt;
&lt;br /&gt;
Además de ofrecer una alta ''tasa de transferencia'' (throughput) y una baja latencia (latency), es deseable que un planificador implemente las siguientes características:&lt;br /&gt;
&lt;br /&gt;
*'''Repetitividad''' : con cargas de trabajo similares(cantidad de procesos a atender) , el procesador debe tener comportamientos similares.&lt;br /&gt;
*'''Predecibilidad''' : hace referencia al tiempo de terminación de un proceso para cierta carga de trabajo, que debe ser similar para cargas de trabajo parecidas.&lt;br /&gt;
*'''Eficiencia''' : debe tomar decisiones rápidas para aumentar el rendimiento.&lt;br /&gt;
*'''Reducción del número de conmutaciones''' : de nuevo, para aumentar el rendimiento y reducir la penalización asociada.&lt;br /&gt;
*'''Atención de  prioridades''': uso de criterios de selección basados en prioridades&lt;br /&gt;
*'''Degradación uniforme del rendimiento''': a mayores cargas de trabajo el rendimiento debe degradarse uniformemente.&lt;br /&gt;
*'''Capacidad de respuesta instantánea''': los tiempos de espera para atender a un proceso deben ser aceptables de cara al usuario, generalmente &amp;lt;100ms para seres humanos.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_Procesos&amp;diff=2433</id>
		<title>Ejercicios Procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_Procesos&amp;diff=2433"/>
				<updated>2012-01-28T15:39:53Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 2 */  editar fecha&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se muestran a continuación una serie de ejercicios relacionados con el temario de procesos.&lt;br /&gt;
&lt;br /&gt;
Para ver las soluciones a los ejercicios, ir hacia [[solución de los ejercicios de procesos]].&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 1 ==&lt;br /&gt;
''[Este ejercicio fue parte del Primer Control de Evaluación Contínua en el curso 2010/11, del 23 de marzo de 2011]''&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! width=&amp;quot;50&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | Proceso&lt;br /&gt;
! width=&amp;quot;50&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | H&amp;lt;sub&amp;gt;0&lt;br /&gt;
! width=&amp;quot;50&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | t&lt;br /&gt;
|-&lt;br /&gt;
| P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; &lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| P&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; &lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt; &lt;br /&gt;
| 2&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Considerando que una unidad de tiempo es de 50 ms, P&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; cada unidad de tiempo pasa a estado bloqueante por dos unidades y P&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt; cada dos unidades de tiempo pasa a bloqueante una unidad, catalogue los procesos A,B y C según su comportamiento (en base a la clasificación de tipos de procesos vista en clase). (''[[Solución de los ejercicios de procesos#Ejercicio 1|Ver solución]]'')&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 2 ==&lt;br /&gt;
''[Este ejercicio fue parte del Primer Control de Evaluación Contínua en el curso 2011/12, del 8 de Noviembre de 2011]''&lt;br /&gt;
&lt;br /&gt;
Definición de hilo y sus propiedades. Ventajas del uso de hilos.(''[[Solución de los ejercicios de procesos#Ejercicio 2|Ver solución]]'')&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Comportamiento_de_los_procesos&amp;diff=2432</id>
		<title>Comportamiento de los procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Comportamiento_de_los_procesos&amp;diff=2432"/>
				<updated>2012-01-28T15:32:03Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejemplo */  reordenar contenido&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tipos de procesos =&lt;br /&gt;
&lt;br /&gt;
Un proceso, según su comportamiento, se puede catalogar en dos tipos:&lt;br /&gt;
&lt;br /&gt;
* '''Procesos interactivos''': Son procesos cuyo comportamiento está limitado por operaciones de Entrada/Salida (I/O-bounded, en inglés). Este tipo de proceso realiza operaciones de Entrada/Salida con frecuencia. Por tanto, el proceso suele pasar a estado bloqueado al poco tiempo de estar asignado al procesador. Un ejemplo de este tipo de proceso es un editor de texto que solicita datos del teclado de manera continuada.&lt;br /&gt;
* '''Procesos por lotes''': Son procesos cuyo comportamiento está limitado por el procesador (processor-bounded, en inglés). Un ejemplo es un conversor de formato de vídeo MPG, este proceso ejecuta código de manera continuada hasta que el planificador decida retirarle el procesador. Por oposición, un ''proceso por lotes'' es un ''proceso no interactivo''.&lt;br /&gt;
&lt;br /&gt;
Esta categorización debe entenderse como gradual, es decir, un proceso presenta un comportamiento interactivo en mayor o menor grado, o incluso su comportamiento puede variar a lo largo del tiempo, presentando un comportamiento interactivo inicialmente para, posteriormente, adoptar un comportamiento no interactivo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Procesos.jpg]]&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, podemos decir que el proceso Pa muestra un comportamiento '''interactivo''', ya que bloquea mucho, mientras que el proceso Pb muestra es un proceso '''por lotes''', ya que emplea el procesador hasta que el planificador se lo retira.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificador_de_procesos&amp;diff=2431</id>
		<title>Planificador de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificador_de_procesos&amp;diff=2431"/>
				<updated>2012-01-28T15:30:58Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejemplo */  reordenar contenido&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ¿Qué es el planificador de procesos? =&lt;br /&gt;
&lt;br /&gt;
El planificador de procesos (''process scheduler'', en inglés) es la parte del sistema operativo que se encarga de seleccionar a qué proceso se asigna el recurso procesador y durante cuánto tiempo.&lt;br /&gt;
&lt;br /&gt;
= ¿Qué funciones tiene el planificador de procesos? =&lt;br /&gt;
&lt;br /&gt;
El planificador de procesos tiene como funciones principales:&lt;br /&gt;
&lt;br /&gt;
* Llevar el control del estado de cada proceso.&lt;br /&gt;
* Decidir qué proceso usará el procesador y durante cuanto tiempo, para ello empleará un cierto criterio en base al cual tomará las decisiones. Si implementa multiprogramación, deberá emplear un criterio que evite que un proceso monopolice el procesador.&lt;br /&gt;
* Asignar el procesador al proceso, restableciendo el contexto de la ejecución del proceso por donde fuere. El contexto de la ejecución se encuentra almacenado en el PCB del proceso asignado.&lt;br /&gt;
* Retirar el procesador al proceso, salvando el contexto de la ejecución del proceso, para poder restablecerlo posteriormente una vez que vuelva a ser asignado. El contexto de la ejecución se almacenará en el PCB del proceso retirado.&lt;br /&gt;
&lt;br /&gt;
El planificador de procesos es software, por tanto, requiere emplear el recurso procesador para ejecutar su código.&lt;br /&gt;
&lt;br /&gt;
= Ejemplo = &lt;br /&gt;
&lt;br /&gt;
Para la siguiente configuración de procesos:&lt;br /&gt;
&lt;br /&gt;
* Proceso Pa: Llega en el instante de tiempo 0. Realiza una llamada al sistema bloqueante cada 1 unidad de tiempo, la operación bloqueante se resuelve tras 2 unidades de tiempo. Para finalizar su ejecución requiere 4 unidades de ejecución.&lt;br /&gt;
* Proceso Pb: Llega en el instante de tiempo 1. Para finalizar su ejecución requiere 4 unidades de ejecución.&lt;br /&gt;
* Suponga que el proceso Pa tiene mayor prioridad que el proceso Pb, por tanto, el planificador debe de dejar paso al proceso Pa siempre que éste esté en estado preparado.&lt;br /&gt;
&lt;br /&gt;
La evolución de la asignación del procesador que realizaría el planificador es la siguiente:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Procesos.jpg]]&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2430</id>
		<title>Multiprogramación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Multiprogramaci%C3%B3n&amp;diff=2430"/>
				<updated>2012-01-28T14:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: He cambiado el modo texto por el modo svg.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La multiprogramación es una técnica de multiplexación que permite la ejecución simultánea de múltiples procesos en un único procesador. En realidad, esta técnica produce una ilusión de paralelismo, de manera que parece que todos los procesos se están ejecutando a la vez. Sin embargo, hay un único proceso ejecutándose en el procesador a la vez.&lt;br /&gt;
&lt;br /&gt;
Un método para la multiprogramación es el Foreground/Background (o ejecución jerarquizada) (usado en sistemas por tandas, nunca en interactivos), en él hay un proceso prioritario (el foreground (FG)) que se ejecuta con preferencia de todos los demás, cuando este proceso solicita una operación L/E, mientras el s.o. la realiza, el proceso FG estará bloqueado por esta operación y le cede el control al proceso background 1 (BG), y si éste realiza una operación L/E, al BG2,… Cuando uno de los procesos bloqueados se desbloquea, recibe el control del procesador. Para que este método funcione de forma óptima la mejor forma es colocar los procesos ordenados de mayor a menor cantidad de operaciones L/E.&lt;br /&gt;
&lt;br /&gt;
El siguiente diagrama de ejemplo representa el uso del procesador por tres procesos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Uso_del_procesador_general.svg]]&lt;br /&gt;
&lt;br /&gt;
Como se puede observar en el ejemplo anterior, los procesos alternan periodos en los que progresan en su actividad, cuando están asignados al procesador, con periodos de inactividad, en los que no progresan en absoluto.&lt;br /&gt;
&lt;br /&gt;
Si los periodos de inactividad son los suficientemente pequeños como para que el usuario del sistema operativo no los note, que en práctica se traduce a periodos de inactividad de menos de 100ms, el efecto causado es una ilusión de paralelismo. En caso contrario dará una sensación de que se producen &amp;quot;saltos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
El [[planificador de procesos|planificador de procesos]] es la parte del sistema operativo que se encarga de decidir qué proceso emplea el procesador en cada instante, por tanto, es el encargado de implementar la multiprogramación.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Uso_del_procesador_general.svg&amp;diff=2429</id>
		<title>Archivo:Uso del procesador general.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Uso_del_procesador_general.svg&amp;diff=2429"/>
				<updated>2012-01-28T14:42:20Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_fundamentos&amp;diff=2427</id>
		<title>Solución de los ejercicios de fundamentos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_fundamentos&amp;diff=2427"/>
				<updated>2012-01-28T13:35:49Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 1 */  responder a la pregunta y darle formato&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicio 1 ==&lt;br /&gt;
&lt;br /&gt;
Se puede responder a esta pregunta con el contenido de [[Modelos_de_Diseño_de_Sistemas_Operativos|este artículo]]. --[[Usuario:Pneira|Pneira]] 17:05 1 dic 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
*Monolíticos: son núcleos de '''gran tamaño''' (muchas líneas de código) con un '''alto número de funcionalidades'''.&lt;br /&gt;
&lt;br /&gt;
*Micronúcleos: son núcleos de '''pequeño tamañ'''o que fueron compilados sólo con las '''necesidades más básicas''' del sistema operativo&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 2 ==&lt;br /&gt;
&lt;br /&gt;
Se puede responder a esta pregunta con el contenido de [[Componentes básicos de un sistema operativo|este artículo]]. --[[Usuario:Pneira|Pneira]] 17:05 1 dic 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_fundamentos&amp;diff=2426</id>
		<title>Solución de los ejercicios de fundamentos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_de_los_ejercicios_de_fundamentos&amp;diff=2426"/>
				<updated>2012-01-28T13:29:01Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 1 */  responder a la pregunta.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicio 1 ==&lt;br /&gt;
&lt;br /&gt;
Se puede responder a esta pregunta con el contenido de [[Modelos_de_Diseño_de_Sistemas_Operativos|este artículo]]. --[[Usuario:Pneira|Pneira]] 17:05 1 dic 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Monolíticos: son núcleos de gran tamaño (muchas líneas de código) con un alto número de funcionalidades.&lt;br /&gt;
Micronúcleos: son núcleos de pequeño tamaño que fueron compilados sólo con las necesidades más básicas del sistema operativo&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 2 ==&lt;br /&gt;
&lt;br /&gt;
Se puede responder a esta pregunta con el contenido de [[Componentes básicos de un sistema operativo|este artículo]]. --[[Usuario:Pneira|Pneira]] 17:05 1 dic 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=2424</id>
		<title>Llamadas al sistema</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=2424"/>
				<updated>2012-01-28T13:04:19Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* 2.4. Llamadas al sistema */  faltaba contenido que tenia yo en los apuntes :s no se a donde habrá ido a parar.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 2.4. Llamadas al sistema =&lt;br /&gt;
&lt;br /&gt;
== Definición ==&lt;br /&gt;
&lt;br /&gt;
Una llamada al sistema es el mecanismo que puede emplear un proceso para solicitar un cierto servicio al sistema operativo. Todo sistema operativo ofrece un conjunto de llamadas al sistema que viene determinado por una cierta API. En el caso de Linux, su version 3.0, ofrece un total de 345 llamadas al sistema. Toda llamada al sistema se identifica de manera unívoca mediante un valor numérico que debe permanecer el mismo a lo largo de la vida del sistema operativo para evitar que se rompa la compatibilidad hacia atrás.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de llamadas al sistema son las siguientes:&lt;br /&gt;
&lt;br /&gt;
* '''time''', que permite obtener la fecha y hora del sistema.&lt;br /&gt;
* '''write''', que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.&lt;br /&gt;
* '''read''', que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.&lt;br /&gt;
&lt;br /&gt;
=== Api ===&lt;br /&gt;
&lt;br /&gt;
Cada sistema operativo implementa su propia API, por eso normalmente un programa diseñado para un cierto sistema operativo no funciona en otro sistema operativo diferente. No obstante, existen APIs estandarizadas, como [http://es.wikipedia.org/wiki/POSIX POSIX], que tienden a ser implementadas por los fabricantes de sistemas operativos.&lt;br /&gt;
&lt;br /&gt;
=== Compatibilidad de Apis ===&lt;br /&gt;
&lt;br /&gt;
La interfaz de la llamada al sistema ha de ser estable a lo largo del tiempo. Además las llamadas en desuso u obsoletas deben permanecer para asegurar el funcionamiento de programas antiguos.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de llamada al sistema ==&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código en ensamblador de x86 para invocar a la llamada al sistema '''write''' que permite escribir un dato en cualquier dispositivo. En concreto, se va a escribir una cadena por el dispositivo de salida '''pantalla''', que se identifica mediante el descriptor de fichero número 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
section .text&lt;br /&gt;
    global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov eax, 4         ;cargamos el número de la llamada al sistema en el regitro eax&lt;br /&gt;
    mov ebx, 1         ;cargamos el descriptor de fichero sobre el que queremos escribir&lt;br /&gt;
    mov ecx, string    ;cargamos en ecx la dirección de la cadena a imprimir&lt;br /&gt;
    mov edx, lenght    ;cargamos en edx el tamaño de la cadena a imprimir&lt;br /&gt;
    int 80h            ;se invoca al de&lt;br /&gt;
&lt;br /&gt;
    mov eax, 1&lt;br /&gt;
    mov ebx, 0&lt;br /&gt;
    int 80h&lt;br /&gt;
&lt;br /&gt;
section .data&lt;br /&gt;
    string: db &amp;quot;Hola Mundo&amp;quot;, 0x0A&lt;br /&gt;
    lenght: equ 13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La instrucción ''int'' forma parte del conjunto de instrucciones de procesadores x86. Esta instrucción emite una interrupción por software cuyo tratamiento es realizado por una rutina. En el caso de las llamadas al sistema, la rutina que se encarga del tratamiento de la interrupción por software número 80 es el ''dispatcher''.&lt;br /&gt;
&lt;br /&gt;
== El ''dispatcher'' ==&lt;br /&gt;
&lt;br /&gt;
El dispatcher, que forma parte del SO, se ejecuta cuando se invoca una llamada al sistema. &lt;br /&gt;
Cuando un proceso hace una llamada al sistema, el dispatcher, se encarga de invocar la llamada que el proceso ha solicitado. &lt;br /&gt;
&lt;br /&gt;
En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración.&lt;br /&gt;
&lt;br /&gt;
== El punto de entrada == &lt;br /&gt;
&lt;br /&gt;
Es la posición de memoria desde la cual es posible solicitarle servicios al sistema operativo. Normalmente hay un único punto de entrada.&lt;br /&gt;
En algunos SO se realiza mediante llamadas a subprogramas. La dirección de memoria del punto de entrada puede cambiar si se modifica el SO. En algunos SO éste problema lo solucionan usando una dirección fija, mientras en otros han preferido usar una referencia a dicha dirección&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=2423</id>
		<title>Llamadas al sistema</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=2423"/>
				<updated>2012-01-28T12:51:12Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* El dispatcher */  reestructurar la frase para que sea más sencilla de entender.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 2.4. Llamadas al sistema =&lt;br /&gt;
&lt;br /&gt;
== Definición ==&lt;br /&gt;
&lt;br /&gt;
Una llamada al sistema es el mecanismo que puede emplear un proceso para solicitar un cierto servicio al sistema operativo. Todo sistema operativo ofrece un conjunto de llamadas al sistema que viene determinado por una cierta API. En el caso de Linux, su version 3.0, ofrece un total de 345 llamadas al sistema. Toda llamada al sistema se identifica de manera unívoca mediante un valor numérico que debe permanecer el mismo a lo largo de la vida del sistema operativo para evitar que se rompa la compatibilidad hacia atrás.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de llamadas al sistema son las siguientes:&lt;br /&gt;
&lt;br /&gt;
* '''time''', que permite obtener la fecha y hora del sistema.&lt;br /&gt;
* '''write''', que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.&lt;br /&gt;
* '''read''', que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.&lt;br /&gt;
&lt;br /&gt;
Cada sistema operativo implementa su propia API, por eso normalmente un programa diseñado para un cierto sistema operativo no funciona en otro sistema operativo diferente. No obstante, existen APIs estandarizadas, como [http://es.wikipedia.org/wiki/POSIX POSIX], que tienden a ser implementadas por los fabricantes de sistemas operativos.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de llamada al sistema ==&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código en ensamblador de x86 para invocar a la llamada al sistema '''write''' que permite escribir un dato en cualquier dispositivo. En concreto, se va a escribir una cadena por el dispositivo de salida '''pantalla''', que se identifica mediante el descriptor de fichero número 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
section .text&lt;br /&gt;
    global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov eax, 4         ;cargamos el número de la llamada al sistema en el regitro eax&lt;br /&gt;
    mov ebx, 1         ;cargamos el descriptor de fichero sobre el que queremos escribir&lt;br /&gt;
    mov ecx, string    ;cargamos en ecx la dirección de la cadena a imprimir&lt;br /&gt;
    mov edx, lenght    ;cargamos en edx el tamaño de la cadena a imprimir&lt;br /&gt;
    int 80h            ;se invoca al de&lt;br /&gt;
&lt;br /&gt;
    mov eax, 1&lt;br /&gt;
    mov ebx, 0&lt;br /&gt;
    int 80h&lt;br /&gt;
&lt;br /&gt;
section .data&lt;br /&gt;
    string: db &amp;quot;Hola Mundo&amp;quot;, 0x0A&lt;br /&gt;
    lenght: equ 13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La instrucción ''int'' forma parte del conjunto de instrucciones de procesadores x86. Esta instrucción emite una interrupción por software cuyo tratamiento es realizado por una rutina. En el caso de las llamadas al sistema, la rutina que se encarga del tratamiento de la interrupción por software número 80 es el ''dispatcher''.&lt;br /&gt;
&lt;br /&gt;
== El ''dispatcher'' ==&lt;br /&gt;
&lt;br /&gt;
El dispatcher, que forma parte del SO, se ejecuta cuando se invoca una llamada al sistema. &lt;br /&gt;
Cuando un proceso hace una llamada al sistema, el dispatcher, se encarga de invocar la llamada que el proceso ha solicitado. &lt;br /&gt;
&lt;br /&gt;
En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=P%C3%A1gina_con_listado_de_personas_que_han_contribuido&amp;diff=2422</id>
		<title>Página con listado de personas que han contribuido</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=P%C3%A1gina_con_listado_de_personas_que_han_contribuido&amp;diff=2422"/>
				<updated>2012-01-28T11:54:43Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A continuación, la lista de usuarios/as de la Universidad de Sevilla que han contribuido a la wiki. Si ponéis tu usuario/a estás solicitando al profesor que evalúe tus contribuciones a la wiki para la subida de notas de hasta 2 puntos posible:&lt;br /&gt;
&lt;br /&gt;
* luigarhor&lt;br /&gt;
* rafperper&lt;br /&gt;
* sergaralo&lt;br /&gt;
* josalgrod1&lt;br /&gt;
* felgaroje&lt;br /&gt;
* luimunlei&lt;br /&gt;
* [https://1984.lsi.us.es/wiki-ssoo/index.php/Usuario:Lorruimor Lorruimor]&lt;br /&gt;
* albsolnog&lt;br /&gt;
* framorexp&lt;br /&gt;
* javgarang&lt;br /&gt;
* FerGuaTol&lt;br /&gt;
* jesgonbel&lt;br /&gt;
* fraperdom&lt;br /&gt;
* antdomflo&lt;br /&gt;
* antmorzam&lt;br /&gt;
* migoligon&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Dise%C3%B1o_modular_E/S&amp;diff=2354</id>
		<title>Diseño modular E/S</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Dise%C3%B1o_modular_E/S&amp;diff=2354"/>
				<updated>2012-01-21T01:47:58Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: Pasar imagn ascii a svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La idea clave de esta arquitectura en capas es hacer independiente al proceso del dispositivo. Por lo general, en ingeniería del software, la independencia del proveedor es una propiedad muy deseable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:disenomodular.svg]]&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
Esta abstracción permite:&lt;br /&gt;
&lt;br /&gt;
* Hacer a los procesos independientes de los dispositivos de E/S. Esto es deseable en cuanto a que el fabricante del dispositivo podría dejar de fabricar el dispositivo, por tanto, el proceso tendría que ser reescrito para soportar el nuevo dispositivo. De igual manera, si el dispositivo para el que está diseñado el proceso que conoce los detalles de bajo nivel no está disponible en el sistema, nuestro proceso quedaría inservible.&lt;br /&gt;
* Forzar a que un proceso tenga que pasar por el sistema operativo, que es quien garantiza que el reparto de recursos es equitativo. Si un proceso dispone de acceso directo a un dispositivo, podría adoptar un comportamiento ''abusón'' de manera que no permitiera a otros procesos emplearlo.&lt;br /&gt;
&lt;br /&gt;
'''Nota''': el SSI es una subrutina de manejo de interrupciones.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Disenomodular.svg&amp;diff=2353</id>
		<title>Archivo:Disenomodular.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Disenomodular.svg&amp;diff=2353"/>
				<updated>2012-01-21T01:45:54Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Estructura_t%C3%ADpica_de_dispositivo_E/S&amp;diff=2349</id>
		<title>Estructura típica de dispositivo E/S</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Estructura_t%C3%ADpica_de_dispositivo_E/S&amp;diff=2349"/>
				<updated>2012-01-20T20:41:38Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: He cambiado el modo texto por el modo svg, tras muchos intentos por hacer un svg bien.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En general, la estructura típica de un dispositivo de entrada/salida está dividida en tres partes:&lt;br /&gt;
&lt;br /&gt;
* '''Adaptador de Entrada/Salida del ordenador, o interfaz del bus:''' Se encarga de traducir las señales al dialecto empleado por el bus del ordenador. Algunos ejemplos de interfaces de este tipo son los buses PCI, PCMCIA, USB, PCI-express o SATA entre muchos otros.&lt;br /&gt;
* '''Adaptador de Entrada/Salida del dispositivo, o interfaz del dispositivo:''' Se encarga de traducir las señales al dialecto empleado por el dispositivo.&lt;br /&gt;
* '''Control del dispositivo, o puerto de lectura/escritura:''' Ofrece una interfaz que es empleada por el gestor de dispositivos para gobernar el dispositivo, que dispone de:&lt;br /&gt;
**Registros de órdenes&lt;br /&gt;
**Registros de estado&lt;br /&gt;
**Registros de lectura/escritura, o alternativamente una pequeña memoria propia.&lt;br /&gt;
&lt;br /&gt;
Cuanto más elaborado sea el puerto de lectura/escritura, mayor rendimiento se puede llegar a alcanzar, puesto que el gestor de dispositivo será más sencillo (y eso implica menor número de instrucciones a ejecutar en el gestor de dispositivo).&lt;br /&gt;
&lt;br /&gt;
La conexión existente entre el procesador y el dispositivo de E/S queda resumida de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Dispositivos ES.svg|Estructura del dispositivo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Gestor de dispositivos =&lt;br /&gt;
&lt;br /&gt;
El gestor de dispositivo, popularmente conocido por la palabra inglesa ''driver'', es la parte del sistema operativo que se encarga de gobernar un cierto dispositivo o una familia de dispositivos de naturaleza similar. El gestor de dispositivo se trata de una pieza de software que conoce los detalles de bajo nivel del dispositivo. De esta manera el driver hace uso del conjunto de instrucciones que ofrece el puerto de E/S, los registros de estado y de lectura&lt;br /&gt;
y escritura, para gobernar el dispositivo. Si el fabricante del dispositivo no ofrece un ''driver'' para un cierto sistema operativo, el dispositivo y los recursos que ofrece no puede ser gestionado por el sistema operativo. Por lo general el fabricante de un dispositivo desarrolla el gestor de dispositivo para los sistemas operativos mayoritarios (i.e. Windows y Linux) para asegurar que su dispositivo alcanza la mayor cuota de usuarios posibles.&lt;br /&gt;
&lt;br /&gt;
Los gestores de dispositivos representan en torno al 70% de los sistemas operativos&amp;lt;ref&amp;gt;Construction of a Highly Dependable Operating System, Proc. 6th European Dependable Computing Conference (EDCC-6), pp. 3-12, Oct. 2006&amp;lt;/ref&amp;gt;. Por lo general, en los sistemas operativos monolíticos se ejecutan en el espacio del núcleo del sistema operativo por razones de rendimiento. Por tanto, se ejecutan en modo privilegiado, así un error de programación en un ''driver'' lleve a un cuelgue completo del sistema con casi total seguridad. Se estima que en torno al 85% de cuelgues de Microsoft Windows XP &amp;lt;ref&amp;gt;Recovering Device Drivers, Proc. OSDI '04, pp. 1-16, 2004&amp;lt;/ref&amp;gt;se debe a errores de programación en ''drivers''.&lt;br /&gt;
&lt;br /&gt;
No obstante, en sistemas operativos convencionales como Windows, Linux y Mac, existen mecanismos que permiten ejecutar ''drivers'' como procesos de usuario, tal y como sucede en sistemas operativo de tipo micronúcleo. De esta manera, un error de programación no produce el cuelgue del sistema completo. No obstante, dichos gestores de dispositivos se limitan a dispositivos particularmente lentos en los que la tasa de transferencia de datos es baja y los tiempos de respuesta del dispositivo son altos, por ejemplo, los gestores de dispositivos para lectores de tarjetas inteligentes (smartcards, lo que incluye las tarjetas SIM que se emplean en telefonía móvil) en Linux funcionan en espacio de usuario.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2348</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2348"/>
				<updated>2012-01-20T20:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;Es mejor si lo reviso y pongo el dibujo según los apuntes y no según yo me quiera inventar. Ahora está bien el dibujo hecho según lo que pone en la wiki.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2347</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2347"/>
				<updated>2012-01-20T20:33:07Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;Ahora da la lata la tipografía, que el servidor no tiene la que me venia en el inkspace y por eso sale descuadrado -.-&amp;quot; espero que ahora ya si salga bonito el dibujo afú!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2346</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2346"/>
				<updated>2012-01-20T20:29:36Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;no tiene previsualización&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2345</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2345"/>
				<updated>2012-01-20T20:25:44Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;Definitiva? Vaya tela la que me está dando el programita de svg.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2344</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2344"/>
				<updated>2012-01-20T20:11:04Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;Creo que esta vez si es la buena&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2343</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2343"/>
				<updated>2012-01-20T19:50:59Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2342</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2342"/>
				<updated>2012-01-20T19:42:53Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2341</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2341"/>
				<updated>2012-01-20T19:33:01Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: subió una nueva versión de «Archivo:Dispositivos ES.svg»:&amp;amp;#32;Probando si ahora si se ve bien&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2340</id>
		<title>Archivo:Dispositivos ES.svg</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Dispositivos_ES.svg&amp;diff=2340"/>
				<updated>2012-01-20T19:19:48Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: Diagrama de estructura de los dispositivos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de estructura de los dispositivos&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2075</id>
		<title>Mensajería</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2075"/>
				<updated>2011-12-07T18:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Denominación Indirecta */  añadir contenido&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un mensaje es un contenedor que se emplea para intercambiar información entre dos o más procesos. Los mensajes tienen un cierto formato generalmente compuesto por una cabecera, que contiene información sobre la fuente y el destinatario, y un cuerpo, que contiene información específica.&lt;br /&gt;
&lt;br /&gt;
Los mecanismos de mensajería se refiere al conjunto de funcionalidades que permiten al sistema operativo realizar la entrega de un mensaje a uno o varios procesos. Mediante dicho mecanismo también es posible resolver problemas de concurrencia.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema para que un proceso pueda enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* '''send(mensaje, destino)''': Para enviar un mensaje&lt;br /&gt;
* '''recv(mensaje)'''': Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
Cualquier proceso que necesite comprobar si tiene mensajes para ser procesados por él debe invocar la llamada al sistema '''recv'''.&lt;br /&gt;
&lt;br /&gt;
== Formas de identificación ==&lt;br /&gt;
&lt;br /&gt;
Para identificar la fuente y el destino de nuestro mensaje se pueden emplear dos estrategias.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Directa ===&lt;br /&gt;
&lt;br /&gt;
En este caso se emplea un ID que permite identificar a la fuente y al destinatario de manera unívoca en el sistema, por ejemplo, el PID de un proceso. La denominación directa permite tres configuraciones:&lt;br /&gt;
&lt;br /&gt;
* ''Unicast'', de manera que la comunicación sucede entre una fuente y un destinatario.&lt;br /&gt;
* ''Broadcast'', el emisor envía un mensaje a '''todos''' los procesos existentes en el sistema.&lt;br /&gt;
* ''Multicast'', el emisor envía un mensaje a un grupo de procesos, siendo un grupo un subconjunto de procesos existentes en el sistema. El sistema operativo debe ofrecer llamadas al sistema que permitan a los procesos crear grupos y suscribirse a ellos. Un proceso puede suscribirse a tantos grupos como le sea necesario.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente de la denominación directa es que se pierde el mensaje si el destino no se encuentra.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Indirecta ===&lt;br /&gt;
&lt;br /&gt;
Se emplea un elemento intermediario denominado ''buzón''. El sistema operativo ofrece llamadas al sistema que permiten la creación y destrucción de buzones, por ejemplo, '''CreateMailbox''' y '''DestroyMailbox'''. Una vez creado el buzón, se emplea éste para realizar la comunicación entre procesos.&lt;br /&gt;
&lt;br /&gt;
Con los buzones se pueden emplear cuatro formas diferentes de comunicación:&lt;br /&gt;
*Buzón limitado : De un proceso a otro.&lt;br /&gt;
*Buzón de entrada: De varios a uno.&lt;br /&gt;
*Buzón de salida: De uno a varios.&lt;br /&gt;
*Buzón múltiple: Varios procesos entre sí con el mismo buzón.&lt;br /&gt;
&lt;br /&gt;
El receptor no conoce la identidad de quien envía el mensaje, a menos que el SO se haya encargado de ello. El problema surje cuando un proceso intruso y éste lee los mensajes de los buzones. Para remediarlo el SO establece permisos de acceso o contraseñas. O para evitar que el proceso infiltrado manupule los mensajes se puede también implementar firmas de certificación. y así garantizar la identidad de los remitentes.&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
Distinguimos tres formas de transmisión: Transmisión por copia, transmisión por referencia y transmisión por copia en caso de escritura.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia ===&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación directa'', al invocar el receptor la llamada ''recv'', el mensaje se copia del espacio de memoria del emisor al espacio de receptor. Esta forma de implementar la transmisión tiene un coste de orden lineal &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación indirecta'', al invocar ''send'' el emisor, el mensaje se copia del espacio de emisor al espacio del buzón, que se encuentra en el espacio de memoria del sistema operativo. Una vez que el receptor invoca ''receive'', se copia el mensaje al espacio de memoria que el receptor ha habilitado para almacenar el mensaje.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por referencia ===&lt;br /&gt;
&lt;br /&gt;
Es una mejora frente al mecanismo de transmisión por copia. Básicamente, en lugar de copiar el mensaje, lo que supone un coste de &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, se le devuelve al receptor una dirección de memoria en la que se encuentra el mensaje, lo que supone únicamente 4 u 8 bytes dependiendo del tamaño de palabra del procesador (si es de 32-bits o 64-bits).&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación directa''', el sistema operativo le devuelve al receptor un puntero a la dirección en la que se encuentra el mensaje. Si el mensaje está en el espacio del emisor, son necesarios mecanismos explícitos de compartición de memoria entre procesos, ya que dos procesos cualquiera no comparten memoria. Si el mensaje está en el espacio del sistema operativo, éste debe ofrecer a los procesos mecanismos para acceder a su espacio de memoria-&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación indirecta''', el emisor crea un mensaje en el espacio del sistema operativo y se le ofrece un puntero al receptor.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia de escritura ===&lt;br /&gt;
&lt;br /&gt;
El mensaje sólo se copia si se modifica por emisor o receptor.&lt;br /&gt;
&lt;br /&gt;
== Formas de comunicación ==&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del emisor, '''send()'''&lt;br /&gt;
** ''Síncrona'': el proceso emisor que realiza el send() queda bloqueado hasta que el receptor llama a recv() y el proceso bloqueado pasa a estado preparado.&lt;br /&gt;
** ''Asíncrona'': suponemos una estructura de datos con capacidad de almacenamiento limitada, dependiente del proceso destinatario o en el buzón del SO. Al ser enviados, los mensajes irán encolándose para que el proceso receptor pueda gestionarlos cuando pueda. De esta manera se aumenta el rendimiento pero se requiere de políticas adicionales de tratamiento de los mensajes si la capacidad de almacenamiento de la estructura de datos se ve sobrepasada(PE, eliminación de mensajes, realocalización de memoria, etc..)&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del receptor, '''recv()'''&lt;br /&gt;
** ''Bloqueante'': una llamada a recv() sin mensajes a procesar pasa el proceso llamante a estado bloqueado. Un send() de otro proceso que añada un mensaje a la cola del proceso bloqueado hace que éste pase a estado preparado.&lt;br /&gt;
** ''No bloqueante'': una llamada a recv() sin mensajes a procesar devuelve un mensaje de error, pero la ejecución del proceso llamante continúa.&lt;br /&gt;
&lt;br /&gt;
Entendemos por proceso llamante a aquel que hace uso de las llamadas send() y recv().&lt;br /&gt;
&lt;br /&gt;
== Formato de los mensajes ==&lt;br /&gt;
&lt;br /&gt;
=== Fijo ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear un formato fijo para sus mensajes.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Simple Network Time Protocol.&amp;lt;ref&amp;gt; Véase http://tools.ietf.org/html/rfc4330, sección 4, Message Format.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                           1                   2                   3&lt;br /&gt;
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  0  1&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision    |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                          Root  Delay                           |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                       Root  Dispersion                         |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                     Reference Identifier                       |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Reference Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Originate Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Receive Timestamp (64)                     |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Transmit Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                 Key Identifier (optional) (32)                 |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                 Message Digest (optional) (128)                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
=== Variable ===&lt;br /&gt;
&lt;br /&gt;
* Type-Length-Value&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Usado en Netlink para la codificación de atributos de un mensaje.&amp;lt;ref&amp;gt;Ver Communicating between the kernel and user-space in Linux using Netlink Sockets (http://1984.lsi.us.es/~pablo/docs/spae.pdf)&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;center&amp;quot; style=&amp;quot;background:DarkSlateBlue; color:white&amp;quot;|'''Type-Length-Value'''&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 0&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 1&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 2&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 3&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 4&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 5&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 6&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 7&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 8&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 9&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 10&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 11&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 12&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 13&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 14&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 15&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 16&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 17&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 18&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 19&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 20&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 21&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 22&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 23&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 24&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 25&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 26&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 27&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 28&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 29&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 30&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 31&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Length &lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Type&lt;br /&gt;
|-&lt;br /&gt;
| colspan=32, align=&amp;quot;center&amp;quot;| Value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Text-based human-readable.&lt;br /&gt;
&lt;br /&gt;
#Comma-Separated Value (CSV). http://en.wikipedia.org/wiki/Comma-separated_values&lt;br /&gt;
#Extensible Markup Language (XML). http://en.wikipedia.org/wiki/XML&lt;br /&gt;
#JavaScript Object Notation (JSON). http://en.wikipedia.org/wiki/JSON&lt;br /&gt;
&lt;br /&gt;
=== Mixto ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear mensaje con partes cuyo formato es fijo, como por ejemplo una cabecera inicial, seguido de partes de tamaño variable.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Internet Protocol (IPv4).&amp;lt;ref&amp;gt;Ver http://www.ietf.org/rfc/rfc791.txt, sección 3.1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
                                    &lt;br /&gt;
    0                   1                   2                   3   &lt;br /&gt;
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |Version|  IHL  |Type of Service|          Total Length         |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |         Identification        |Flags|      Fragment Offset    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |  Time to Live |    Protocol   |         Header Checksum       |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                       Source Address                          |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Destination Address                        |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Options                    |    Padding    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /                         Payload                               /&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
== Mensajería a través de la red ==&lt;br /&gt;
&lt;br /&gt;
* Unicidad del destinatario&lt;br /&gt;
* Fiabilidad en la transmisión&lt;br /&gt;
* Formato de los datos (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html): Enviar un entero a través de la red puede ser un problema debido a la forma en el que se representan los datos en la memoria dependiente de la arquitectura. Por ejemplo, un PC con arquitectura Intel x86 emplea formato little-endian, mientras que un SPARC de Sun Microsystems (ahora Oracle) emplea big-endian.&lt;br /&gt;
&lt;br /&gt;
** Little Endian: Bytes menos significativo al principio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        int a = 10, i;&lt;br /&gt;
        char *p = &amp;amp;a;&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;sizeof(a); i++) {&lt;br /&gt;
                printf(&amp;quot;posición %d: %.2x\n&amp;quot;, i, p[i]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muestra el siguiente resultado en un PC:&lt;br /&gt;
&lt;br /&gt;
 posición 0: 0a (n+3)&lt;br /&gt;
 posición 1: 00 (n+2)&lt;br /&gt;
 posición 2: 00 (n+1)&lt;br /&gt;
 posición 3: 00 (n)&lt;br /&gt;
&lt;br /&gt;
** Big Endian: Bytes menos significativo al final.&lt;br /&gt;
&lt;br /&gt;
 posición 0: 00 (n)&lt;br /&gt;
 posición 1: 00 (n+1)&lt;br /&gt;
 posición 2: 00 (n+2)&lt;br /&gt;
 posición 3: 0a (n+3)&lt;br /&gt;
&lt;br /&gt;
En Internet se sigue la convención de expresar datos en Big Endian, habría que hacer la conversión. Habría que usar '''ntohl''' (network to host long).&lt;br /&gt;
&lt;br /&gt;
En little-endian, la implementación de ntohl es la siguiente:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ___constant_swab32((__be32)(x)&lt;br /&gt;
&lt;br /&gt;
Ver /usr/include/linux/byteorder/little_endian.h &lt;br /&gt;
&lt;br /&gt;
mientras que en big-endian es:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ((__u32)(__be32)(x))&lt;br /&gt;
&lt;br /&gt;
Si empleamos formato textuales, como CSV, XML o JSON, que codifican la información en bytes, no tenemos este problema.&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2074</id>
		<title>Mensajería</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2074"/>
				<updated>2011-12-07T17:49:56Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: a por e&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un mensaje es un contenedor que se emplea para intercambiar información entre dos o más procesos. Los mensajes tienen un cierto formato generalmente compuesto por una cabecera, que contiene información sobre la fuente y el destinatario, y un cuerpo, que contiene información específica.&lt;br /&gt;
&lt;br /&gt;
Los mecanismos de mensajería se refiere al conjunto de funcionalidades que permiten al sistema operativo realizar la entrega de un mensaje a uno o varios procesos. Mediante dicho mecanismo también es posible resolver problemas de concurrencia.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema para que un proceso pueda enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* '''send(mensaje, destino)''': Para enviar un mensaje&lt;br /&gt;
* '''recv(mensaje)'''': Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
Cualquier proceso que necesite comprobar si tiene mensajes para ser procesados por él debe invocar la llamada al sistema '''recv'''.&lt;br /&gt;
&lt;br /&gt;
== Formas de identificación ==&lt;br /&gt;
&lt;br /&gt;
Para identificar la fuente y el destino de nuestro mensaje se pueden emplear dos estrategias.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Directa ===&lt;br /&gt;
&lt;br /&gt;
En este caso se emplea un ID que permite identificar a la fuente y al destinatario de manera unívoca en el sistema, por ejemplo, el PID de un proceso. La denominación directa permite tres configuraciones:&lt;br /&gt;
&lt;br /&gt;
* ''Unicast'', de manera que la comunicación sucede entre una fuente y un destinatario.&lt;br /&gt;
* ''Broadcast'', el emisor envía un mensaje a '''todos''' los procesos existentes en el sistema.&lt;br /&gt;
* ''Multicast'', el emisor envía un mensaje a un grupo de procesos, siendo un grupo un subconjunto de procesos existentes en el sistema. El sistema operativo debe ofrecer llamadas al sistema que permitan a los procesos crear grupos y suscribirse a ellos. Un proceso puede suscribirse a tantos grupos como le sea necesario.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente de la denominación directa es que se pierde el mensaje si el destino no se encuentra.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Indirecta ===&lt;br /&gt;
&lt;br /&gt;
Se emplea un elemento intermediario denominado ''buzón''. El sistema operativo ofrece llamadas al sistema que permiten la creación y destrucción de buzones, por ejemplo, '''CreateMailbox''' y '''DestroyMailbox'''. Una vez creado el buzón, se emplea éste para realizar la comunicación entre procesos.&lt;br /&gt;
&lt;br /&gt;
El sistema operativo debe de comprobar que la identidad de la fuente de un mensaje es correcta, de lo contrario un proceso podría suplantar la identidad de otro.&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
Distinguimos tres formas de transmisión: Transmisión por copia, transmisión por referencia y transmisión por copia en caso de escritura.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia ===&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación directa'', al invocar el receptor la llamada ''recv'', el mensaje se copia del espacio de memoria del emisor al espacio de receptor. Esta forma de implementar la transmisión tiene un coste de orden lineal &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación indirecta'', al invocar ''send'' el emisor, el mensaje se copia del espacio de emisor al espacio del buzón, que se encuentra en el espacio de memoria del sistema operativo. Una vez que el receptor invoca ''receive'', se copia el mensaje al espacio de memoria que el receptor ha habilitado para almacenar el mensaje.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por referencia ===&lt;br /&gt;
&lt;br /&gt;
Es una mejora frente al mecanismo de transmisión por copia. Básicamente, en lugar de copiar el mensaje, lo que supone un coste de &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, se le devuelve al receptor una dirección de memoria en la que se encuentra el mensaje, lo que supone únicamente 4 u 8 bytes dependiendo del tamaño de palabra del procesador (si es de 32-bits o 64-bits).&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación directa''', el sistema operativo le devuelve al receptor un puntero a la dirección en la que se encuentra el mensaje. Si el mensaje está en el espacio del emisor, son necesarios mecanismos explícitos de compartición de memoria entre procesos, ya que dos procesos cualquiera no comparten memoria. Si el mensaje está en el espacio del sistema operativo, éste debe ofrecer a los procesos mecanismos para acceder a su espacio de memoria-&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación indirecta''', el emisor crea un mensaje en el espacio del sistema operativo y se le ofrece un puntero al receptor.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia de escritura ===&lt;br /&gt;
&lt;br /&gt;
El mensaje sólo se copia si se modifica por emisor o receptor.&lt;br /&gt;
&lt;br /&gt;
== Formas de comunicación ==&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del emisor, '''send()'''&lt;br /&gt;
** ''Síncrona'': el proceso emisor que realiza el send() queda bloqueado hasta que el receptor llama a recv() y el proceso bloqueado pasa a estado preparado.&lt;br /&gt;
** ''Asíncrona'': suponemos una estructura de datos con capacidad de almacenamiento limitada, dependiente del proceso destinatario o en el buzón del SO. Al ser enviados, los mensajes irán encolándose para que el proceso receptor pueda gestionarlos cuando pueda. De esta manera se aumenta el rendimiento pero se requiere de políticas adicionales de tratamiento de los mensajes si la capacidad de almacenamiento de la estructura de datos se ve sobrepasada(PE, eliminación de mensajes, realocalización de memoria, etc..)&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del receptor, '''recv()'''&lt;br /&gt;
** ''Bloqueante'': una llamada a recv() sin mensajes a procesar pasa el proceso llamante a estado bloqueado. Un send() de otro proceso que añada un mensaje a la cola del proceso bloqueado hace que éste pase a estado preparado.&lt;br /&gt;
** ''No bloqueante'': una llamada a recv() sin mensajes a procesar devuelve un mensaje de error, pero la ejecución del proceso llamante continúa.&lt;br /&gt;
&lt;br /&gt;
Entendemos por proceso llamante a aquel que hace uso de las llamadas send() y recv().&lt;br /&gt;
&lt;br /&gt;
== Formato de los mensajes ==&lt;br /&gt;
&lt;br /&gt;
=== Fijo ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear un formato fijo para sus mensajes.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Simple Network Time Protocol.&amp;lt;ref&amp;gt; Véase http://tools.ietf.org/html/rfc4330, sección 4, Message Format.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                           1                   2                   3&lt;br /&gt;
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  0  1&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision    |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                          Root  Delay                           |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                       Root  Dispersion                         |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                     Reference Identifier                       |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Reference Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Originate Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Receive Timestamp (64)                     |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Transmit Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                 Key Identifier (optional) (32)                 |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                 Message Digest (optional) (128)                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
=== Variable ===&lt;br /&gt;
&lt;br /&gt;
* Type-Length-Value&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Usado en Netlink para la codificación de atributos de un mensaje.&amp;lt;ref&amp;gt;Ver Communicating between the kernel and user-space in Linux using Netlink Sockets (http://1984.lsi.us.es/~pablo/docs/spae.pdf)&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;center&amp;quot; style=&amp;quot;background:DarkSlateBlue; color:white&amp;quot;|'''Type-Length-Value'''&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 0&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 1&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 2&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 3&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 4&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 5&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 6&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 7&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 8&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 9&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 10&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 11&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 12&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 13&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 14&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 15&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 16&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 17&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 18&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 19&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 20&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 21&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 22&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 23&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 24&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 25&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 26&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 27&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 28&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 29&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 30&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 31&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Length &lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Type&lt;br /&gt;
|-&lt;br /&gt;
| colspan=32, align=&amp;quot;center&amp;quot;| Value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Text-based human-readable.&lt;br /&gt;
&lt;br /&gt;
#Comma-Separated Value (CSV). http://en.wikipedia.org/wiki/Comma-separated_values&lt;br /&gt;
#Extensible Markup Language (XML). http://en.wikipedia.org/wiki/XML&lt;br /&gt;
#JavaScript Object Notation (JSON). http://en.wikipedia.org/wiki/JSON&lt;br /&gt;
&lt;br /&gt;
=== Mixto ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear mensaje con partes cuyo formato es fijo, como por ejemplo una cabecera inicial, seguido de partes de tamaño variable.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Internet Protocol (IPv4).&amp;lt;ref&amp;gt;Ver http://www.ietf.org/rfc/rfc791.txt, sección 3.1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
                                    &lt;br /&gt;
    0                   1                   2                   3   &lt;br /&gt;
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |Version|  IHL  |Type of Service|          Total Length         |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |         Identification        |Flags|      Fragment Offset    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |  Time to Live |    Protocol   |         Header Checksum       |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                       Source Address                          |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Destination Address                        |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Options                    |    Padding    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /                         Payload                               /&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
== Mensajería a través de la red ==&lt;br /&gt;
&lt;br /&gt;
* Unicidad del destinatario&lt;br /&gt;
* Fiabilidad en la transmisión&lt;br /&gt;
* Formato de los datos (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html): Enviar un entero a través de la red puede ser un problema debido a la forma en el que se representan los datos en la memoria dependiente de la arquitectura. Por ejemplo, un PC con arquitectura Intel x86 emplea formato little-endian, mientras que un SPARC de Sun Microsystems (ahora Oracle) emplea big-endian.&lt;br /&gt;
&lt;br /&gt;
** Little Endian: Bytes menos significativo al principio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        int a = 10, i;&lt;br /&gt;
        char *p = &amp;amp;a;&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;sizeof(a); i++) {&lt;br /&gt;
                printf(&amp;quot;posición %d: %.2x\n&amp;quot;, i, p[i]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muestra el siguiente resultado en un PC:&lt;br /&gt;
&lt;br /&gt;
 posición 0: 0a (n+3)&lt;br /&gt;
 posición 1: 00 (n+2)&lt;br /&gt;
 posición 2: 00 (n+1)&lt;br /&gt;
 posición 3: 00 (n)&lt;br /&gt;
&lt;br /&gt;
** Big Endian: Bytes menos significativo al final.&lt;br /&gt;
&lt;br /&gt;
 posición 0: 00 (n)&lt;br /&gt;
 posición 1: 00 (n+1)&lt;br /&gt;
 posición 2: 00 (n+2)&lt;br /&gt;
 posición 3: 0a (n+3)&lt;br /&gt;
&lt;br /&gt;
En Internet se sigue la convención de expresar datos en Big Endian, habría que hacer la conversión. Habría que usar '''ntohl''' (network to host long).&lt;br /&gt;
&lt;br /&gt;
En little-endian, la implementación de ntohl es la siguiente:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ___constant_swab32((__be32)(x)&lt;br /&gt;
&lt;br /&gt;
Ver /usr/include/linux/byteorder/little_endian.h &lt;br /&gt;
&lt;br /&gt;
mientras que en big-endian es:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ((__u32)(__be32)(x))&lt;br /&gt;
&lt;br /&gt;
Si empleamos formato textuales, como CSV, XML o JSON, que codifican la información en bytes, no tenemos este problema.&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2047</id>
		<title>Mensajería</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2047"/>
				<updated>2011-12-04T19:06:44Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Formas de comunicación */  activo o preparado? RESUELTO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un mensaje es un contenedor que se emplea para intercambiar información entre dos o más procesos. Los mensajes tienen un cierto formato generalmente compuesto por una cabecera, que contiene información sobre la fuente y el destinatario, y un cuerpo, que contiene información específica.&lt;br /&gt;
&lt;br /&gt;
Los mecanismos de mensajería se refiere al conjunto de funcionalidades que permiten al sistema operativo realizar la entrega de un mensaje a uno o varios procesos. Mediante dicho mecanismo también es posible resolver problemas de concurrencia.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema para que un proceso pueda enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* '''send(mensaje, destino)''': Para enviar un mensaje&lt;br /&gt;
* '''recv(mensaje)'''': Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
Cualquier proceso que necesita comprobar si tiene mensajes para ser procesados por él debe invocar la llamada al sistema '''recv'''.&lt;br /&gt;
&lt;br /&gt;
== Formas de identificación ==&lt;br /&gt;
&lt;br /&gt;
Para identificar la fuente y el destino de nuestro mensaje se pueden emplear dos estrategias.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Directa ===&lt;br /&gt;
&lt;br /&gt;
En este caso se emplea un ID que permite identificar a la fuente y al destinatario de manera unívoca en el sistema, por ejemplo, el PID de un proceso. La denominación directa permite tres configuraciones:&lt;br /&gt;
&lt;br /&gt;
* ''Unicast'', de manera que la comunicación sucede entre una fuente y un destinatario.&lt;br /&gt;
* ''Broadcast'', el emisor envía un mensaje a '''todos''' los procesos existentes en el sistema.&lt;br /&gt;
* ''Multicast'', el emisor envía un mensaje a un grupo de procesos, siendo un grupo un subconjunto de procesos existentes en el sistema. El sistema operativo debe ofrecer llamadas al sistema que permitan a los procesos crear grupos y suscribirse a ellos. Un proceso puede suscribirse a tantos grupos como le sea necesario.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente de la denominación directa es que se pierde el mensaje si el destino no se encuentra.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Indirecta ===&lt;br /&gt;
&lt;br /&gt;
Se emplea un elemento intermediario denominado ''buzón''. El sistema operativo ofrece llamadas al sistema que permiten la creación y destrucción de buzones, por ejemplo, '''CreateMailbox''' y '''DestroyMailbox'''. Una vez creado el buzón, se emplea éste para realizar la comunicación entre procesos.&lt;br /&gt;
&lt;br /&gt;
El sistema operativo debe de comprobar que la identidad de la fuente de un mensaje es correcta, de lo contrario un proceso podría suplantar la identidad de otro.&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
Distinguimos tres formas de transmisión: Transmisión por copia, transmisión por referencia y transmisión por copia en caso de escritura.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia ===&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación directa'', al invocar el receptor la llamada ''recv'', el mensaje se copia de espacio de memoria del emisor al espacio de receptor. Esta forma de implementar la transmisión tiene un coste de orden lineal &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación indirecta'', al invocar ''send'' el emisor, el mensaje se copia del espacio de emisor al espacio del buzón, que se encuentra en el espacio de memoria del sistema operativo. Una vez que el receptor invoca ''receive'', se copia el mensaje al espacio de memoria que el receptor ha habilitado para almacenar el mensaje.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por referencia ===&lt;br /&gt;
&lt;br /&gt;
Es una mejora frente al mecanismo de transmisión por copia. Básicamente, en lugar de copiar el mensaje, lo que supone un coste de &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, se le devuelve al receptor una dirección de memoria en la que se encuentra el mensaje, lo que supone únicamente 4 u 8 bytes dependiendo del tamaño de palabra del procesador (si es de 32-bits o 64-bits).&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación directa''', el sistema operativo le devuelve al receptor un puntero a la dirección en la que se encuentra el mensaje. Si el mensaje está en el espacio del emisor, son necesarios mecanismos explícitos de compartición de memoria entre procesos, ya que dos procesos cualquiera no comparten memoria. Si el mensaje está en el espacio del sistema operativo, éste debe ofrecer a los procesos mecanismos para acceder a su espacio de memoria-&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación indirecta''', el emisor crea un mensaje en el espacio del sistema operativo y se le ofrece un puntero al receptor.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia de escritura ===&lt;br /&gt;
&lt;br /&gt;
El mensaje sólo se copia si se modifica por emisor o receptor.&lt;br /&gt;
&lt;br /&gt;
== Formas de comunicación ==&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del emisor, '''send()'''&lt;br /&gt;
** ''Síncrona'': el proceso emisor que realiza el send() queda bloqueado hasta que el receptor llama a recv() y el proceso bloqueado pasa a estado preparado.&lt;br /&gt;
** ''Asíncrona'': suponemos una estructura de datos con capacidad de almacenamiento limitada, dependiente del proceso destinatario o en el buzón del SO. Al ser enviados, los mensajes irán encolándose para que el proceso receptor pueda gestionarlos cuando pueda. De esta manera se aumenta el rendimiento pero se requiere de políticas adicionales de tratamiento de los mensajes si la capacidad de almacenamiento de la estructura de datos se ve sobrepasada(PE, eliminación de mensajes, realocalización de memoria, etc..)&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del receptor, '''recv()'''&lt;br /&gt;
** ''Bloqueante'': una llamada a recv() sin mensajes a procesar pasa el proceso llamante a estado bloqueado. Un send() de otro proceso que añada un mensaje a la cola del proceso bloqueado hace que éste pase a estado preparado.&lt;br /&gt;
** ''No bloqueante'': una llamada a recv() sin mensajes a procesar devuelve un mensaje de error, pero la ejecución del proceso llamante continúa.&lt;br /&gt;
&lt;br /&gt;
Entendemos por proceso llamante a aquel que hace uso de las llamadas send() y recv().&lt;br /&gt;
&lt;br /&gt;
== Formato de los mensajes ==&lt;br /&gt;
&lt;br /&gt;
=== Fijo ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear un formato fijo para sus mensajes.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Simple Network Time Protocol.&amp;lt;ref&amp;gt; Véase http://tools.ietf.org/html/rfc4330, sección 4, Message Format.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                           1                   2                   3&lt;br /&gt;
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  0  1&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision    |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                          Root  Delay                           |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                       Root  Dispersion                         |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                     Reference Identifier                       |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Reference Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Originate Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Receive Timestamp (64)                     |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Transmit Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                 Key Identifier (optional) (32)                 |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                 Message Digest (optional) (128)                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
=== Variable ===&lt;br /&gt;
&lt;br /&gt;
* Type-Length-Value&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Usado en Netlink para la codificación de atributos de un mensaje.&amp;lt;ref&amp;gt;Ver Communicating between the kernel and user-space in Linux using Netlink Sockets (http://1984.lsi.us.es/~pablo/docs/spae.pdf)&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;center&amp;quot; style=&amp;quot;background:DarkSlateBlue; color:white&amp;quot;|'''Type-Length-Value'''&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 0&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 1&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 2&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 3&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 4&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 5&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 6&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 7&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 8&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 9&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 10&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 11&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 12&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 13&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 14&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 15&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 16&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 17&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 18&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 19&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 20&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 21&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 22&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 23&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 24&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 25&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 26&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 27&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 28&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 29&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 30&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 31&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Length &lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Type&lt;br /&gt;
|-&lt;br /&gt;
| colspan=32, align=&amp;quot;center&amp;quot;| Value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Text-based human-readable.&lt;br /&gt;
&lt;br /&gt;
#Comma-Separated Value (CSV). http://en.wikipedia.org/wiki/Comma-separated_values&lt;br /&gt;
#Extensible Markup Language (XML). http://en.wikipedia.org/wiki/XML&lt;br /&gt;
#JavaScript Object Notation (JSON). http://en.wikipedia.org/wiki/JSON&lt;br /&gt;
&lt;br /&gt;
=== Mixto ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear mensaje con partes cuyo formato es fijo, como por ejemplo una cabecera inicial, seguido de partes de tamaño variable.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Internet Protocol (IPv4).&amp;lt;ref&amp;gt;Ver http://www.ietf.org/rfc/rfc791.txt, sección 3.1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
                                    &lt;br /&gt;
    0                   1                   2                   3   &lt;br /&gt;
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |Version|  IHL  |Type of Service|          Total Length         |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |         Identification        |Flags|      Fragment Offset    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |  Time to Live |    Protocol   |         Header Checksum       |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                       Source Address                          |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Destination Address                        |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Options                    |    Padding    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /                         Payload                               /&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
== Mensajería a través de la red ==&lt;br /&gt;
&lt;br /&gt;
* Unicidad del destinatario&lt;br /&gt;
* Fiabilidad en la transmisión&lt;br /&gt;
* Formato de los datos (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html): Enviar un entero a través de la red puede ser un problema debido a la forma en el que se representan los datos en la memoria dependiente de la arquitectura. Por ejemplo, un PC con arquitectura Intel x86 emplea formato little-endian, mientras que un SPARC de Sun Microsystems (ahora Oracle) emplea big-endian.&lt;br /&gt;
&lt;br /&gt;
** Little Endian: Bytes menos significativo al principio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        int a = 10, i;&lt;br /&gt;
        char *p = &amp;amp;a;&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;sizeof(a); i++) {&lt;br /&gt;
                printf(&amp;quot;posición %d: %.2x\n&amp;quot;, i, p[i]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muestra el siguiente resultado en un PC:&lt;br /&gt;
&lt;br /&gt;
 posición 0: 0a (n+3)&lt;br /&gt;
 posición 1: 00 (n+2)&lt;br /&gt;
 posición 2: 00 (n+1)&lt;br /&gt;
 posición 3: 00 (n)&lt;br /&gt;
&lt;br /&gt;
** Big Endian: Bytes menos significativo al final.&lt;br /&gt;
&lt;br /&gt;
 posición 0: 00 (n)&lt;br /&gt;
 posición 1: 00 (n+1)&lt;br /&gt;
 posición 2: 00 (n+2)&lt;br /&gt;
 posición 3: 0a (n+3)&lt;br /&gt;
&lt;br /&gt;
En Internet se sigue la convención de expresar datos en Big Endian, habría que hacer la conversión. Habría que usar '''ntohl''' (network to host long).&lt;br /&gt;
&lt;br /&gt;
En little-endian, la implementación de ntohl es la siguiente:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ___constant_swab32((__be32)(x)&lt;br /&gt;
&lt;br /&gt;
Ver /usr/include/linux/byteorder/little_endian.h &lt;br /&gt;
&lt;br /&gt;
mientras que en big-endian es:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ((__u32)(__be32)(x))&lt;br /&gt;
&lt;br /&gt;
Si empleamos formato textuales, como CSV, XML o JSON, que codifican la información en bytes, no tenemos este problema.&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2046</id>
		<title>Mensajería</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=2046"/>
				<updated>2011-12-04T19:02:55Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Formas de comunicación */  activo o preparado?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un mensaje es un contenedor que se emplea para intercambiar información entre dos o más procesos. Los mensajes tienen un cierto formato generalmente compuesto por una cabecera, que contiene información sobre la fuente y el destinatario, y un cuerpo, que contiene información específica.&lt;br /&gt;
&lt;br /&gt;
Los mecanismos de mensajería se refiere al conjunto de funcionalidades que permiten al sistema operativo realizar la entrega de un mensaje a uno o varios procesos. Mediante dicho mecanismo también es posible resolver problemas de concurrencia.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema para que un proceso pueda enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* '''send(mensaje, destino)''': Para enviar un mensaje&lt;br /&gt;
* '''recv(mensaje)'''': Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
Cualquier proceso que necesita comprobar si tiene mensajes para ser procesados por él debe invocar la llamada al sistema '''recv'''.&lt;br /&gt;
&lt;br /&gt;
== Formas de identificación ==&lt;br /&gt;
&lt;br /&gt;
Para identificar la fuente y el destino de nuestro mensaje se pueden emplear dos estrategias.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Directa ===&lt;br /&gt;
&lt;br /&gt;
En este caso se emplea un ID que permite identificar a la fuente y al destinatario de manera unívoca en el sistema, por ejemplo, el PID de un proceso. La denominación directa permite tres configuraciones:&lt;br /&gt;
&lt;br /&gt;
* ''Unicast'', de manera que la comunicación sucede entre una fuente y un destinatario.&lt;br /&gt;
* ''Broadcast'', el emisor envía un mensaje a '''todos''' los procesos existentes en el sistema.&lt;br /&gt;
* ''Multicast'', el emisor envía un mensaje a un grupo de procesos, siendo un grupo un subconjunto de procesos existentes en el sistema. El sistema operativo debe ofrecer llamadas al sistema que permitan a los procesos crear grupos y suscribirse a ellos. Un proceso puede suscribirse a tantos grupos como le sea necesario.&lt;br /&gt;
&lt;br /&gt;
El principal inconveniente de la denominación directa es que se pierde el mensaje si el destino no se encuentra.&lt;br /&gt;
&lt;br /&gt;
=== Denominación Indirecta ===&lt;br /&gt;
&lt;br /&gt;
Se emplea un elemento intermediario denominado ''buzón''. El sistema operativo ofrece llamadas al sistema que permiten la creación y destrucción de buzones, por ejemplo, '''CreateMailbox''' y '''DestroyMailbox'''. Una vez creado el buzón, se emplea éste para realizar la comunicación entre procesos.&lt;br /&gt;
&lt;br /&gt;
El sistema operativo debe de comprobar que la identidad de la fuente de un mensaje es correcta, de lo contrario un proceso podría suplantar la identidad de otro.&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
Distinguimos tres formas de transmisión: Transmisión por copia, transmisión por referencia y transmisión por copia en caso de escritura.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia ===&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación directa'', al invocar el receptor la llamada ''recv'', el mensaje se copia de espacio de memoria del emisor al espacio de receptor. Esta forma de implementar la transmisión tiene un coste de orden lineal &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Si se emplea ''denominación indirecta'', al invocar ''send'' el emisor, el mensaje se copia del espacio de emisor al espacio del buzón, que se encuentra en el espacio de memoria del sistema operativo. Una vez que el receptor invoca ''receive'', se copia el mensaje al espacio de memoria que el receptor ha habilitado para almacenar el mensaje.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por referencia ===&lt;br /&gt;
&lt;br /&gt;
Es una mejora frente al mecanismo de transmisión por copia. Básicamente, en lugar de copiar el mensaje, lo que supone un coste de &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, se le devuelve al receptor una dirección de memoria en la que se encuentra el mensaje, lo que supone únicamente 4 u 8 bytes dependiendo del tamaño de palabra del procesador (si es de 32-bits o 64-bits).&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación directa''', el sistema operativo le devuelve al receptor un puntero a la dirección en la que se encuentra el mensaje. Si el mensaje está en el espacio del emisor, son necesarios mecanismos explícitos de compartición de memoria entre procesos, ya que dos procesos cualquiera no comparten memoria. Si el mensaje está en el espacio del sistema operativo, éste debe ofrecer a los procesos mecanismos para acceder a su espacio de memoria-&lt;br /&gt;
&lt;br /&gt;
Si se emplea junto a la '''denominación indirecta''', el emisor crea un mensaje en el espacio del sistema operativo y se le ofrece un puntero al receptor.&lt;br /&gt;
&lt;br /&gt;
=== Transmisión por copia de escritura ===&lt;br /&gt;
&lt;br /&gt;
El mensaje sólo se copia si se modifica por emisor o receptor.&lt;br /&gt;
&lt;br /&gt;
== Formas de comunicación ==&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del emisor, '''send()'''&lt;br /&gt;
** ''Síncrona'': el proceso emisor que realiza el send() queda bloqueado hasta que el receptor llama a recv()&lt;br /&gt;
[[Usuario:Migoligon|Migoligon]] 19:02 4 dic 2011 (UTC)No especifica si el proceso bloqueado se pone en activo o preparado. Supongo que pasa a preparado.&lt;br /&gt;
** ''Asíncrona'': suponemos una estructura de datos con capacidad de almacenamiento limitada, dependiente del proceso destinatario o en el buzón del SO. Al ser enviados, los mensajes irán encolándose para que el proceso receptor pueda gestionarlos cuando pueda. De esta manera se aumenta el rendimiento pero se requiere de políticas adicionales de tratamiento de los mensajes si la capacidad de almacenamiento de la estructura de datos se ve sobrepasada(PE, eliminación de mensajes, realocalización de memoria, etc..)&lt;br /&gt;
&lt;br /&gt;
* Comportamiento del receptor, '''recv()'''&lt;br /&gt;
** ''Bloqueante'': una llamada a recv() sin mensajes a procesar pasa el proceso llamante a estado bloqueado. Un send() de otro proceso que añada un mensaje a la cola del proceso bloqueado hace que éste pase a estado preparado.&lt;br /&gt;
** ''No bloqueante'': una llamada a recv() sin mensajes a procesar devuelve un mensaje de error, pero la ejecución del proceso llamante continúa.&lt;br /&gt;
&lt;br /&gt;
Entendemos por proceso llamante a aquel que hace uso de las llamadas send() y recv().&lt;br /&gt;
&lt;br /&gt;
== Formato de los mensajes ==&lt;br /&gt;
&lt;br /&gt;
=== Fijo ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear un formato fijo para sus mensajes.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Simple Network Time Protocol.&amp;lt;ref&amp;gt; Véase http://tools.ietf.org/html/rfc4330, sección 4, Message Format.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                           1                   2                   3&lt;br /&gt;
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  0  1&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision    |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                          Root  Delay                           |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                       Root  Dispersion                         |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                     Reference Identifier                       |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Reference Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                    Originate Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Receive Timestamp (64)                     |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                     Transmit Timestamp (64)                    |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                 Key Identifier (optional) (32)                 |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                 Message Digest (optional) (128)                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      |                                                                |&lt;br /&gt;
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
=== Variable ===&lt;br /&gt;
&lt;br /&gt;
* Type-Length-Value&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Usado en Netlink para la codificación de atributos de un mensaje.&amp;lt;ref&amp;gt;Ver Communicating between the kernel and user-space in Linux using Netlink Sockets (http://1984.lsi.us.es/~pablo/docs/spae.pdf)&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;center&amp;quot; style=&amp;quot;background:DarkSlateBlue; color:white&amp;quot;|'''Type-Length-Value'''&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 0&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 1&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 2&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 3&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 4&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 5&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 6&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 7&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 8&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 9&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 10&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 11&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 12&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 13&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 14&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 15&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 16&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 17&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 18&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 19&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 20&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 21&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 22&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 23&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 24&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 25&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 26&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 27&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 28&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 29&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 30&lt;br /&gt;
! width=&amp;quot;15 px&amp;quot; style=&amp;quot;background:#efefef;&amp;quot; | 31&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Length &lt;br /&gt;
| colspan=16, align=&amp;quot;center&amp;quot;| Type&lt;br /&gt;
|-&lt;br /&gt;
| colspan=32, align=&amp;quot;center&amp;quot;| Value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Text-based human-readable.&lt;br /&gt;
&lt;br /&gt;
#Comma-Separated Value (CSV). http://en.wikipedia.org/wiki/Comma-separated_values&lt;br /&gt;
#Extensible Markup Language (XML). http://en.wikipedia.org/wiki/XML&lt;br /&gt;
#JavaScript Object Notation (JSON). http://en.wikipedia.org/wiki/JSON&lt;br /&gt;
&lt;br /&gt;
=== Mixto ===&lt;br /&gt;
&lt;br /&gt;
Los procesos acuerdan emplear mensaje con partes cuyo formato es fijo, como por ejemplo una cabecera inicial, seguido de partes de tamaño variable.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''': Internet Protocol (IPv4).&amp;lt;ref&amp;gt;Ver http://www.ietf.org/rfc/rfc791.txt, sección 3.1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
                                    &lt;br /&gt;
    0                   1                   2                   3   &lt;br /&gt;
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |Version|  IHL  |Type of Service|          Total Length         |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |         Identification        |Flags|      Fragment Offset    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |  Time to Live |    Protocol   |         Header Checksum       |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                       Source Address                          |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Destination Address                        |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   |                    Options                    |    Padding    |&lt;br /&gt;
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /                         Payload                               /&lt;br /&gt;
   /                                                               /&lt;br /&gt;
   /////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
== Mensajería a través de la red ==&lt;br /&gt;
&lt;br /&gt;
* Unicidad del destinatario&lt;br /&gt;
* Fiabilidad en la transmisión&lt;br /&gt;
* Formato de los datos (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html): Enviar un entero a través de la red puede ser un problema debido a la forma en el que se representan los datos en la memoria dependiente de la arquitectura. Por ejemplo, un PC con arquitectura Intel x86 emplea formato little-endian, mientras que un SPARC de Sun Microsystems (ahora Oracle) emplea big-endian.&lt;br /&gt;
&lt;br /&gt;
** Little Endian: Bytes menos significativo al principio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        int a = 10, i;&lt;br /&gt;
        char *p = &amp;amp;a;&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;sizeof(a); i++) {&lt;br /&gt;
                printf(&amp;quot;posición %d: %.2x\n&amp;quot;, i, p[i]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muestra el siguiente resultado en un PC:&lt;br /&gt;
&lt;br /&gt;
 posición 0: 0a (n+3)&lt;br /&gt;
 posición 1: 00 (n+2)&lt;br /&gt;
 posición 2: 00 (n+1)&lt;br /&gt;
 posición 3: 00 (n)&lt;br /&gt;
&lt;br /&gt;
** Big Endian: Bytes menos significativo al final.&lt;br /&gt;
&lt;br /&gt;
 posición 0: 00 (n)&lt;br /&gt;
 posición 1: 00 (n+1)&lt;br /&gt;
 posición 2: 00 (n+2)&lt;br /&gt;
 posición 3: 0a (n+3)&lt;br /&gt;
&lt;br /&gt;
En Internet se sigue la convención de expresar datos en Big Endian, habría que hacer la conversión. Habría que usar '''ntohl''' (network to host long).&lt;br /&gt;
&lt;br /&gt;
En little-endian, la implementación de ntohl es la siguiente:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ___constant_swab32((__be32)(x)&lt;br /&gt;
&lt;br /&gt;
Ver /usr/include/linux/byteorder/little_endian.h &lt;br /&gt;
&lt;br /&gt;
mientras que en big-endian es:&lt;br /&gt;
&lt;br /&gt;
#define __constant_ntohl(x) ((__u32)(__be32)(x))&lt;br /&gt;
&lt;br /&gt;
Si empleamos formato textuales, como CSV, XML o JSON, que codifican la información en bytes, no tenemos este problema.&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_sincronizaci%C3%B3n_y_comunicaci%C3%B3n&amp;diff=2045</id>
		<title>Ejercicios sincronización y comunicación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_sincronizaci%C3%B3n_y_comunicaci%C3%B3n&amp;diff=2045"/>
				<updated>2011-12-04T17:57:27Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 7 */  aqui hay algo extraño&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ejercicio 1 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    down(s1);              /* #2 */&lt;br /&gt;
    f1();                  /* #3 */&lt;br /&gt;
    if (get(s1) == 0)      /* #4 */&lt;br /&gt;
        up(s2);            /* #5 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    down(s2);              /* #2 */&lt;br /&gt;
    f2();                  /* #3 */&lt;br /&gt;
    up(s1);                /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P2 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las líneas de código toman el mismo tiempo de ejecución.&lt;br /&gt;
* La función get(semáforo s) devuelve el valor del contador del semáforo.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué línea de código se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 1|Ver solución del ejercicio 1]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 2 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s1);             /* #2 */&lt;br /&gt;
    f1();                 /* #3 */&lt;br /&gt;
    up(s2);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s2);             /* #2 */&lt;br /&gt;
    f2();                 /* #3 */&lt;br /&gt;
    up(s1);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 2|Ver solución del ejercicio 2]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 3 =&lt;br /&gt;
&lt;br /&gt;
En un exámen de sistemas operativos, un estudiante plantea la siguiente solución basada en dos procesos, un proceso P1 productor y un proceso P2 consumidor, en el que el contador de los semáforos s1 y s2 valen inicialmente 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
    down(s1);&lt;br /&gt;
    produce();&lt;br /&gt;
    up(s2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
    down(s2);&lt;br /&gt;
    consume();&lt;br /&gt;
    up(s1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Responda brevemente si la solución que propone es idónea justificando su respuesta. &lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 3|Ver solución del ejercicio 3]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 4 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    send(msg, P2);         /* #2 */&lt;br /&gt;
    recv(msg, P2);         /* #3 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    recv(msg, P1);         /* #2 */&lt;br /&gt;
    send(msg, P1);         /* #3 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
* El comportamiento de la primitiva send() es síncrono y el la primitiva recv() es bloqueante.&lt;br /&gt;
* Suponga que msg contiene un mensaje que se emplea como testigo y cuyo contenido no tiene relevancia.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 4|Ver solución del ejercicio 4]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 5 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s1);             /* #2 */&lt;br /&gt;
    f1();                 /* #3 */&lt;br /&gt;
    up(s2);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s2);             /* #2 */&lt;br /&gt;
    f2();                 /* #3 */&lt;br /&gt;
    up(s1);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto, con quantum ilimitado, por tanto, un proceso se mantiene en estado activo hasta que realice una operación bloqueante.&lt;br /&gt;
* Se sabe que el proceso P2 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución. &lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 5|Ver solución del ejercicio 5]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 6 =&lt;br /&gt;
&lt;br /&gt;
Dado dos procesos P1 y P2 cuyos códigos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
Código del Proceso 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {   /* #1 */&lt;br /&gt;
    send(msg);              /* #2 */&lt;br /&gt;
    f(msg);                 /* #3 */&lt;br /&gt;
    recv(msg);              /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código del Proceso 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {   /* #1 */&lt;br /&gt;
    recv(msg);              /* #2 */&lt;br /&gt;
    f(msg);                 /* #3 */&lt;br /&gt;
    send(msg);              /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
* El comportamiento de la primitiva send() es asíncrono y el de la primitiva recv() es bloqueante.&lt;br /&gt;
* Suponga que msg contiene un mensaje inicialmente bien formado cuyo contenido no tiene relevancia&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 6|Ver solución del ejercicio 6]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 7 =&lt;br /&gt;
&lt;br /&gt;
En base a dos hilos h1 y h2 de un mismo proceso P cuyos codigos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
En el hilo h1 se ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i&amp;lt;2; i++){ //#1&lt;br /&gt;
   while(cerrojo_p2);      //#2&lt;br /&gt;
      cerrojo_p1 = 1;      //#3&lt;br /&gt;
      f();                 //#4&lt;br /&gt;
      cerrojo_p1 = 0;      //#5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i&amp;lt;2; i++){ //#1&lt;br /&gt;
   while(cerrojo_p1);      //#2&lt;br /&gt;
      cerrojo_p2 = 1;      //#3&lt;br /&gt;
      f();                 //#4&lt;br /&gt;
      cerrojo_p2 = 0;      //#5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Proponga una solución en la que se reemplacen los cerrojos por semáforos. Realice el cronograma temporal de ejecución de la solución que propone.&lt;br /&gt;
&lt;br /&gt;
Siendo cerrojo_p1 y cerrojo_p2 variables globales inicialmente a cero.&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Migoligon|Migoligon]] 17:57 4 dic 2011 (UTC)Creí que en el ejercicio 3 quedó claro que no debian iniciarse ambas a 0 porque era un error garrafal. Y ahora me encuentro esto y en las soluciones no diferencia s1 de s2, además de que la solución está preparada para que sea s1 = 1 y s2 = 0 no se de donde han sacado los datos para hacer la solución pero no creo que desde aqui.&lt;br /&gt;
&lt;br /&gt;
Supongamos que: &lt;br /&gt;
*El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
*Se sabe que el hilo h1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
*La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
el planificador&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 7|Ver solución del ejercicio 7]]&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_sincronizaci%C3%B3n_y_comunicaci%C3%B3n&amp;diff=2044</id>
		<title>Ejercicios sincronización y comunicación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicios_sincronizaci%C3%B3n_y_comunicaci%C3%B3n&amp;diff=2044"/>
				<updated>2011-12-04T17:44:16Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejercicio 7 */  un espacio&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ejercicio 1 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    down(s1);              /* #2 */&lt;br /&gt;
    f1();                  /* #3 */&lt;br /&gt;
    if (get(s1) == 0)      /* #4 */&lt;br /&gt;
        up(s2);            /* #5 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    down(s2);              /* #2 */&lt;br /&gt;
    f2();                  /* #3 */&lt;br /&gt;
    up(s1);                /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P2 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las líneas de código toman el mismo tiempo de ejecución.&lt;br /&gt;
* La función get(semáforo s) devuelve el valor del contador del semáforo.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué línea de código se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 1|Ver solución del ejercicio 1]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 2 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s1);             /* #2 */&lt;br /&gt;
    f1();                 /* #3 */&lt;br /&gt;
    up(s2);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s2);             /* #2 */&lt;br /&gt;
    f2();                 /* #3 */&lt;br /&gt;
    up(s1);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 2|Ver solución del ejercicio 2]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 3 =&lt;br /&gt;
&lt;br /&gt;
En un exámen de sistemas operativos, un estudiante plantea la siguiente solución basada en dos procesos, un proceso P1 productor y un proceso P2 consumidor, en el que el contador de los semáforos s1 y s2 valen inicialmente 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
    down(s1);&lt;br /&gt;
    produce();&lt;br /&gt;
    up(s2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
    down(s2);&lt;br /&gt;
    consume();&lt;br /&gt;
    up(s1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Responda brevemente si la solución que propone es idónea justificando su respuesta. &lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 3|Ver solución del ejercicio 3]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 4 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    send(msg, P2);         /* #2 */&lt;br /&gt;
    recv(msg, P2);         /* #3 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {  /* #1 */&lt;br /&gt;
    recv(msg, P1);         /* #2 */&lt;br /&gt;
    send(msg, P1);         /* #3 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
* El comportamiento de la primitiva send() es síncrono y el la primitiva recv() es bloqueante.&lt;br /&gt;
* Suponga que msg contiene un mensaje que se emplea como testigo y cuyo contenido no tiene relevancia.&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 4|Ver solución del ejercicio 4]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 5 =&lt;br /&gt;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución de dos procesos P1 y P2. El proceso P1 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s1);             /* #2 */&lt;br /&gt;
    f1();                 /* #3 */&lt;br /&gt;
    up(s2);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y el proceso P2 ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) { /* #1 */&lt;br /&gt;
    down(s2);             /* #2 */&lt;br /&gt;
    f2();                 /* #3 */&lt;br /&gt;
    up(s1);               /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el semáforo s1 el contador vale 1, mientras que para el semáforo s2 el contador vale 0.&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto, con quantum ilimitado, por tanto, un proceso se mantiene en estado activo hasta que realice una operación bloqueante.&lt;br /&gt;
* Se sabe que el proceso P2 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución. &lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 5|Ver solución del ejercicio 5]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 6 =&lt;br /&gt;
&lt;br /&gt;
Dado dos procesos P1 y P2 cuyos códigos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
Código del Proceso 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {   /* #1 */&lt;br /&gt;
    send(msg);              /* #2 */&lt;br /&gt;
    f(msg);                 /* #3 */&lt;br /&gt;
    recv(msg);              /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código del Proceso 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i=0; i&amp;lt;2; i++) {   /* #1 */&lt;br /&gt;
    recv(msg);              /* #2 */&lt;br /&gt;
    f(msg);                 /* #3 */&lt;br /&gt;
    send(msg);              /* #4 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suponga que:&lt;br /&gt;
&lt;br /&gt;
* El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
* Se sabe que el proceso P1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
* La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
* El comportamiento de la primitiva send() es asíncrono y el de la primitiva recv() es bloqueante.&lt;br /&gt;
* Suponga que msg contiene un mensaje inicialmente bien formado cuyo contenido no tiene relevancia&lt;br /&gt;
&lt;br /&gt;
El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 6|Ver solución del ejercicio 6]]&lt;br /&gt;
&lt;br /&gt;
= Ejercicio 7 =&lt;br /&gt;
&lt;br /&gt;
En base a dos hilos h1 y h2 de un mismo proceso P cuyos codigos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
En el hilo h1 se ejecuta el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i&amp;lt;2; i++){ //#1&lt;br /&gt;
   while(cerrojo_p2);      //#2&lt;br /&gt;
      cerrojo_p1 = 1;      //#3&lt;br /&gt;
      f();                 //#4&lt;br /&gt;
      cerrojo_p1 = 0;      //#5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i&amp;lt;2; i++){ //#1&lt;br /&gt;
   while(cerrojo_p1);      //#2&lt;br /&gt;
      cerrojo_p2 = 1;      //#3&lt;br /&gt;
      f();                 //#4&lt;br /&gt;
      cerrojo_p2 = 0;      //#5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Proponga una solución en la que se reemplacen los cerrojos por semáforos. Realice el cronograma temporal de ejecución de la solución que propone.&lt;br /&gt;
&lt;br /&gt;
Siendo cerrojo_p1 y cerrojo_p2 variables globales inicialmente a cero.&lt;br /&gt;
Supongamos que: &lt;br /&gt;
*El planificador emplea turno rotatorio estricto con quantum de 3 unidades de ejecución.&lt;br /&gt;
*Se sabe que el hilo h1 es seleccionado en primer lugar por el planificador para ejecutarse.&lt;br /&gt;
*La ejecución de cada línea de código representado anteriormente supone una unidad de ejecución, por tanto, todas las instrucciones toman el mismo tiempo de ejecución.&lt;br /&gt;
el planificador&lt;br /&gt;
&lt;br /&gt;
[[solución ejercicio 7|Ver solución del ejercicio 7]]&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Monitores&amp;diff=2043</id>
		<title>Monitores</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Monitores&amp;diff=2043"/>
				<updated>2011-12-04T16:51:23Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: /* Ejemplo del funcionamiento de una clase monitor */  añadir dudas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Idea desarrollada en los años 70 Brinch-Hansen y Hoare &amp;lt;ref&amp;gt;http://java.sun.com/developer/Books/performance2/chap4.pdf&amp;lt;/ref&amp;gt;que notaron los siguientes problemas con respecto al uso de los semáforos:&lt;br /&gt;
&lt;br /&gt;
* Los semáforos son difíciles de usar. Es frecuente que el programador cometa errores al emplearlos.&lt;br /&gt;
* El compilador no asiste al programador en el desarrollo de programas concurrentes mediante semáforos, pues no ofrece ningún tipo de validación en tiempo de compilación.&lt;br /&gt;
* No hay nada que obligue a usarlos. Puede suceder que el programador los necesite y lo desconozca&lt;br /&gt;
* Son independientes del recurso compartido&lt;br /&gt;
&lt;br /&gt;
Los monitores tienen que estar integrados en el lenguaje de programación.&lt;br /&gt;
&lt;br /&gt;
== Definición ==&lt;br /&gt;
Un monitor es una estructura del lenguaje cuyas principales características son:&lt;br /&gt;
&lt;br /&gt;
* Los datos son privados.&lt;br /&gt;
* Ofrecen una serie de métodos públicos para acceder a dichos datos.&lt;br /&gt;
* En cada momento sólo puede haber un proceso activo en algún método del monitor, es decir, ejecutando código de esos métodos públicos del monitor. Seria equivalente a decir que el recurso que queremos compartir se declara como monitor. Los procesos que usan el monitor son independientes unos de otros y cuando deseen usar el recurso, llamarán a los métodos del monitor que implementen la operación que se desea ejecutar. &lt;br /&gt;
&lt;br /&gt;
Permiten organizar procesos en espera mediante:&lt;br /&gt;
&lt;br /&gt;
* Variables de condición: lista de procesos inicialmente vacía.&lt;br /&gt;
* Primitivas: ''wait(c)'', añade el proceso p invocante a c y proceso p bloquea; ''signal(c)'', selecciona a uno de los procesos en c y lo pone en preparado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class recursoCompartido {&lt;br /&gt;
&lt;br /&gt;
    private int recursoCompartido;&lt;br /&gt;
    private Semaforo s = 1;&lt;br /&gt;
&lt;br /&gt;
    public int get(void){&lt;br /&gt;
        int ret;                   #1&lt;br /&gt;
        down(s);                   #2&lt;br /&gt;
        ret = recursoCompartido;   #3&lt;br /&gt;
        up(s);                     #4&lt;br /&gt;
        return ret;                #5&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void set(int valor){&lt;br /&gt;
        down(s);                   #1&lt;br /&gt;
        recursoCompartido = valor; #2&lt;br /&gt;
        up(s);                     #3&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, los monitores se implementan con semáforos, son una abstracción de los mismos.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo del funcionamiento de una clase monitor ==&lt;br /&gt;
&lt;br /&gt;
Dado un cierto recurso compartido protegido por una clase monitor denominada ''RecursoCompartido'' con los siguientes métodos:&lt;br /&gt;
&lt;br /&gt;
* '''get''', permite obtener el valor del recurso compartido, devuelve un entero.&lt;br /&gt;
* '''set''', permite establecer el valor del recurso compartido.&lt;br /&gt;
&lt;br /&gt;
Suponga ya creada un objeto RecursoCompartido para dos hilos h1 y h2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
RecursoCompartido r = new RecursoCompartido();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dichos hilos tienen el siguiente código:&lt;br /&gt;
&lt;br /&gt;
* Lector (h1):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int valor;&lt;br /&gt;
for(int j=0; j&amp;lt;2; j++) {     #1&lt;br /&gt;
  valor=r.get();             #2&lt;br /&gt;
  print(valor);              #3&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
* Escritor (h2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int i=0;&lt;br /&gt;
for(int j=0; j&amp;lt;2; j++) {     #1&lt;br /&gt;
  r.set();                   #2&lt;br /&gt;
  i++;                       #3&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suponiendo turno rotatorio estricto con quantum de 4 unidades de tiempo y que el planificador da paso en primer lugar al hilo h1. El cronograma con la representación de la ejecución sería el siguiente:&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt; = lanzamiento del proceso&lt;br /&gt;
                        &amp;gt; = finalización del proceso                                                                       &lt;br /&gt;
                        x = indica que el proceso está asignado al procesador en ese momento.&lt;br /&gt;
                        B = el proceso pasa a estado bloqueado&lt;br /&gt;
                        P = el proceso pasa a estado preparado&lt;br /&gt;
 &lt;br /&gt;
                               Asignación del recurso procesador&lt;br /&gt;
 &lt;br /&gt;
         | 1 |2.1|2.2|2.3|   |   |2.4|2.5| 3 | 1 |   |   |   |   |2.1|2.2|2.3|2.4|   |   |   |   |2.5| 3 | 1 |   |&lt;br /&gt;
     h1  &amp;lt;---|---|---|---P   |   |---|---|---|---P   |   |   |   |---|---|---|---|   |   |   |   |---|---|---&amp;gt;   |&lt;br /&gt;
         |   |   |   |   | 1 |2.1|   |   |   |   |2.2|2.3| 3 | 1 |   |   |   |   |2.1|2.2|2.3| 3 |   |   |   | 1 |&lt;br /&gt;
     h2  |   |   |   |   &amp;lt;---|---B   P   |   |   |---|---|---|---P   |   |   |   |---|---|---|---|   |   |   |---&amp;gt;&lt;br /&gt;
         ----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|&lt;br /&gt;
         0   1   2   3   4   5   6   7   8   9   10  11  12  13 14  15  16  17  18  19  20  21  22  23  24  25  26&lt;br /&gt;
  &lt;br /&gt;
          Nota: Los números de la parte superior a los guiones, indican el número de instrucción que &lt;br /&gt;
                se está ejecutando en dicho momento. En el caso de los 2.1, 2.2 y sucesivos se &lt;br /&gt;
                refieren al número de instrucción qué internamente se ejecutan en el get() y set() &lt;br /&gt;
                del monitor (Ver la implementación de la clase monitor de RecursoCompartido vista en clase).&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Migoligon|Migoligon]] 16:51 4 dic 2011 (UTC)Porqué h1 no tiene la P de preparado en el 2.4 ni h2 en el último 3, y porqué h2 no se bloquea en el 2º down??&lt;br /&gt;
 &lt;br /&gt;
En la página de [https://1984.lsi.us.es/wiki-ssoo/index.php/Discusi%C3%B3n:Monitores discusión] hay un ejemplo en java.&lt;br /&gt;
&lt;br /&gt;
== Fuentes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_Ejercicio_1&amp;diff=1964</id>
		<title>Solución Ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_Ejercicio_1&amp;diff=1964"/>
				<updated>2011-11-29T12:12:43Z</updated>
		
		<summary type="html">&lt;p&gt;Migoligon: ya está revisado el modo visual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Solucion=&lt;br /&gt;
&lt;br /&gt;
==Solucion Visual==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Discusión:Solución_Ejercicio_1|Solución con tablas]]  // [[Usuario:Migoligon|Migoligon]] 15:19 27 nov 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solución Texto==&lt;br /&gt;
Se sigue el algoritmo visto en clase:&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;
&lt;br /&gt;
Comprobamos si se puede ejecutar P1:&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=1 recDisp=1 --&amp;gt; recAsig + recDisp = 2 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=1 recDisp=0 --&amp;gt; recAsig + recDisp = 1 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=0 recDisp=1 --&amp;gt; recAsig + recDisp = 1 / recMax=2      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;lt;2 --&amp;gt; No se puede ejecutar&lt;br /&gt;
&lt;br /&gt;
Comprobamos si se puede ejecutar P2:&lt;br /&gt;
      &lt;br /&gt;
      R1: recAsig=0 recDisp=1 --&amp;gt; recAsig + recDisp = 1 / recMax=0      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;gt;=0 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=0 recDisp=0 --&amp;gt; recAsig + recDisp = 0 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  0&amp;lt;1 --&amp;gt; No se puede ejecutar&lt;br /&gt;
&lt;br /&gt;
Comprobamos si se puede ejecutar P3:&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=1 recDisp=1 --&amp;gt; recAsig + recDisp = 2 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=1 recDisp=0 --&amp;gt; recAsig + recDisp = 1 / recMax=1      ==&amp;gt; Dispone de los 3 recursos necesarios, por tanto  &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;gt;=1 --&amp;gt; ok                          se puede ejecutar.  &lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=0 recDisp=1 --&amp;gt; recAsig + recDisp = 1 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;gt;=1 --&amp;gt; ok &lt;br /&gt;
                  &lt;br /&gt;
===== Ejecutados = [P1]  / Disponibles = [ 2 1 1 ] =====&lt;br /&gt;
&lt;br /&gt;
Comprobamos si se puede ejecutar P1 (Hay nuevos recursos disponibles,los liberados por P3):&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=1 recDisp=2 --&amp;gt; recAsig + recDisp = 3 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  3&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=1 recDisp=1 --&amp;gt; recAsig + recDisp = 2 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=0 recDisp=1 --&amp;gt; recAsig + recDisp = 1 / recMax=2      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;lt;2 --&amp;gt; No se puede ejecutar&lt;br /&gt;
&lt;br /&gt;
Comprobamos si se puede ejecutar P2 (Hay nuevos recursos disponibles,los liberados por P3):&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=0 recDisp=2 --&amp;gt; recAsig + recDisp = 2 / recMax=0      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=0 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=0 recDisp=1 --&amp;gt; recAsig + recDisp = 1 / recMax=1      ==&amp;gt; Dispone de los 3 recursos necesarios,por tanto&lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  1&amp;gt;=1 --&amp;gt; ok                          se puede ejecutar.&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=1 recDisp=1 --&amp;gt; recAsig + recDisp = 2 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
                                       &lt;br /&gt;
===== Ejecutados = [P3,P2]  / Disponibles = [ 2 1 2 ]=====&lt;br /&gt;
&lt;br /&gt;
Comprobamos si se puede ejecutar P1 (Hay nuevos recursos disponibles,los liberados por P2):&lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=1 recDisp=2 --&amp;gt; recAsig + recDisp = 3 / recMax=1      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  3&amp;gt;=1 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
      R2: recAsig=1 recDisp=1 --&amp;gt; recAsig + recDisp = 2 / recMax=1     ==&amp;gt; Dispone de los 3 recursos necesarios,por tanto  &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=1 --&amp;gt; ok                         se puede ejecutar.  &lt;br /&gt;
&lt;br /&gt;
      R1: recAsig=0 recDisp=2 --&amp;gt; recAsig + recDisp = 2 / recMax=2      &lt;br /&gt;
          ¿recAsig+recDisp &amp;gt;= recMax?  2&amp;gt;=2 --&amp;gt; ok&lt;br /&gt;
&lt;br /&gt;
===== Ejecutados = [P3,P2,P1]  / Disponibles = [ 3 2 2 ]  =====&lt;br /&gt;
&lt;br /&gt;
                                         &lt;br /&gt;
Es una configuración de estado seguro ya que se ejecutan los 3 procesos sin dar lugar a interbloqueos.&lt;/div&gt;</summary>
		<author><name>Migoligon</name></author>	</entry>

	</feed>