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

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1&amp;diff=1270</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=1270"/>
				<updated>2011-06-13T08:36:55Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
&lt;br /&gt;
      |   |   | #1| #2| #3| #4| #5| #1|   |   |   | #2| #3| #4|   | #5| #1|   |   |   |&lt;br /&gt;
    p1|   |   |---|---|---|---|---|---|   |   |   |---|---|---|   |---|---&amp;gt;   |   |   |&lt;br /&gt;
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
      | #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |   | #2|   |   | #3| #4| #1|&lt;br /&gt;
    p2|---|---X   |   |   |   |   /   |---|---|---|   |   |   |---X   /   |---|---|---&amp;gt;&lt;br /&gt;
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Observaciones:&lt;br /&gt;
* El proceso P2 bloquea al hacer down sobre el semáforo s2 cuyo contador vale 0.&lt;br /&gt;
* En el instante 15, el proceso P2 bloquea de nuevo pues hace down sobre el semáforo s2 cuyo contador vale 0.&lt;br /&gt;
* En los semáforos no se vuelve a comprobar la condición que hizo que el proceso bloqueara, a difencia de los cerrojos.&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Pneira|Pneira]] 08:59 10 may 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=1268</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=1268"/>
				<updated>2011-06-12T11:49:53Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Precisión de políticas de recepción de mensajería&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es una unidad de información que se intercambia entre dos o más procesos. &lt;br /&gt;
&lt;br /&gt;
Mediante los mensajes podemos transmitir información y sincronizar procesos (mediante la espera de un cierto mensaje).&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema (o primitivas básicas) para los procesos, enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;send (mensaje)&amp;lt;/tt&amp;gt;: Para enviar un mensaje&lt;br /&gt;
* &amp;lt;tt&amp;gt;receive (mensaje)&amp;lt;/tt&amp;gt;: Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
== Destino y fuente ==&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Directa'''&lt;br /&gt;
** Se emplea ID para identificar al destinatario. &lt;br /&gt;
** Valores especiales: BROADCAST (a todos), MULTICAST (a un grupo).&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Indirecta'''&lt;br /&gt;
** Se emplea un elemento intermediario. &lt;br /&gt;
** Recurso compartido especial en el sistema: BUZÓN.&lt;br /&gt;
** Habiendo intermediarios, hay que comprobar las identidades pues pueden ser falsas/erróneas&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia''' &lt;br /&gt;
** ''Directa'': el mensaje se copia de espacio de emisor a espacio de receptor.&lt;br /&gt;
** ''Indirecta'': el mensaje se copia de espacio de emisor a espacio (buzón) de SO, y de ahí a espacio de receptor.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por referencia'''&lt;br /&gt;
** ''Directa'': lo que se copia es un puntero al mensaje&lt;br /&gt;
** ''Global'': el emisor crea mensaje en espacio de SO, y se copia a espacio de receptor un puntero al mismo.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia de escritura''': 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;
** ''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;
== 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;
* Unidad 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>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicio_de_concurrencia_de_procesos&amp;diff=1263</id>
		<title>Ejercicio de concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Ejercicio_de_concurrencia_de_procesos&amp;diff=1263"/>
				<updated>2011-06-12T10:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: el contador del for es 1 en vez de i en la zona de comprobación, sustituido&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 un proceso P1 que dispone de dos hilos, h1 y h2. Ambos hilos sincronizan su ejecución mediante cerrojos y ejecutan el mismo 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++) {  /* instrucción 1 */&lt;br /&gt;
    lock_down();           /* instrucción 2 */&lt;br /&gt;
    funcion();             /* instrucción 3 */&lt;br /&gt;
    lock_up();             /* instrucción 4 */&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 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;
&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 de los ejercicios de concurrencia#Ejercicio 2|Solución]]'')&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 2== &lt;br /&gt;
''[Este ejercicio formó parte del Segundo Control de Evaluación Contínua en el curso 2010/11, del 11 de mayo de 2011]''&lt;br /&gt;
&lt;br /&gt;
Dados dos hilos h1 y h2 de un mismo proceso P cuyos códigos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
'''Código del hilo h1'''&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;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Código del hilo h2'''&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;
&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 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;
&lt;br /&gt;
Realice el cronograma temporal que represente la ejecución del proceso P que dispone de dos hilos, h1 y h2. El cronograma deberá incluir qué instrucción se ejecuta en cada unidad de ejecución.&lt;br /&gt;
&lt;br /&gt;
(''[[Solución de los ejercicios de concurrencia#Ejercicio 2|Solución]]'')&lt;br /&gt;
&lt;br /&gt;
== Ejercicio 3== &lt;br /&gt;
''[Este ejercicio formó parte del Segundo Control de Evaluación Contínua en el curso 2010/11, del 11 de mayo de 2011]''&lt;br /&gt;
&lt;br /&gt;
Si el planificador empleara turno rotatorio con quantum de 2 unidades de ejecución, ¿qué sucedería?&lt;br /&gt;
&lt;br /&gt;
(''[[Solución de los ejercicios de concurrencia#Ejercicio 3|Solución]]'')&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Criterios_de_reemplazo&amp;diff=1190</id>
		<title>Discusión:Criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Criterios_de_reemplazo&amp;diff=1190"/>
				<updated>2011-06-07T15:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;3. Criterio MRU:&lt;br /&gt;
&lt;br /&gt;
No entiendo que sentido tiene usar una LIFO  en el criterio MRU. Realmente no se necesita conservar la información de los accesos a páginas que no sean la información del último acceso. Con un único registro/variable que almacene cuál fue la última posición es suficiente, ¿no?&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 12:40 7 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Criterio del reloj'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Igual que el de 2º oportunidad (FIFO + NRU sin bit M) pero mantenemos un puntero a la ultima pagina examinada.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
¿Y qué se hace con ese puntero?&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 15:35 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_7&amp;diff=1181</id>
		<title>Sol 7</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Sol_7&amp;diff=1181"/>
				<updated>2011-06-07T15:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La lista de paginas a la que se acceden son las siguientes : &lt;br /&gt;
&lt;br /&gt;
2--2--3--1--1--3--4--5--1--1--2--3--4&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
                              ___1____ 2_____3_____4___&lt;br /&gt;
                 1º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |     |     |     | Nª de fallos: 1   Cola = 2-&lt;br /&gt;
                  Pagina 2    |_R=1_|_R=0_|_R=0_|_R=0_|&lt;br /&gt;
                 2º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |     |     |     | Nª de fallos: 1   Cola = 2-&lt;br /&gt;
                  Pagina 2    |_R=1_|_R=0_|_R=0_|_R=0_| &lt;br /&gt;
                 3º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |     |     | Nª de fallos: 2   Cola = 2-3&lt;br /&gt;
                  Pagina 3    |_R=1_|_R=1_|_R=0_|_R=0_|    &lt;br /&gt;
                 4º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3   Cola = 2-3-1&lt;br /&gt;
                  Pagina 1    |_R=1_|_R=1_|_R=1_|_R=0_| &lt;br /&gt;
                 5º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3   Cola = 2-3-1&lt;br /&gt;
                  Pagina 1    |_R=1_|_R=1_|_R=1_|_R=0_|&lt;br /&gt;
                 6º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |     | Nª de fallos: 3   Cola = 2-1-3&lt;br /&gt;
                  Pagina 3    |_R=1_|_R=1_|_R=1_|_R=0_|&lt;br /&gt;
                 7º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  2  |  3  |  1  |  4  | Nª de fallos: 4   Cola = 2-1-3-4&lt;br /&gt;
                  Pagina 4    |_R=1_|_R=1_|_R=1_|_R=1_| &lt;br /&gt;
                 8º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  5  |  3  |  1  |  4  | Nª de fallos: 5   Cola = 1-3-4-5&lt;br /&gt;
                  Pagina 5    |_R=1_|_R=0_|_R=0_|_R=0_|    &lt;br /&gt;
                 9º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  5  |  3  |  1  |  4  | Nª de fallos: 5   Cola = 3-4-5-1&lt;br /&gt;
                  Pagina 1    |_R=1_|_R=0_|_R=1_|_R=0_|  &lt;br /&gt;
                10º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  5  |  3  |  1  |  4  | Nª de fallos: 5   Cola = 3-4-5-1&lt;br /&gt;
                  Pagina 1    |_R=1_|_R=0_|_R=1_|_R=0_|  &lt;br /&gt;
                11º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  5  |  2  |  1  |  4  | Nª de fallos: 6   Cola = 4-5-1-2&lt;br /&gt;
                  Pagina 2    |_R=1_|_R=1_|_R=1_|_R=0_|&lt;br /&gt;
                12º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  5  |  2  |  1  |  3  | Nª de fallos: 7   Cola = 5-1-2-3&lt;br /&gt;
                  Pagina 3    |_R=1_|_R=1_|_R=1_|_R=1_| &lt;br /&gt;
                13º Acceso    |     |     |     |     |&lt;br /&gt;
                 Acceso a:    |  4  |  2  |  1  |  3  | Nª de fallos: 8   Cola = 1-2-3-4&lt;br /&gt;
                  Pagina 4    |_R=1_|_R=0_|_R=0_|_R=0_|              &lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Fcoramlop|Fcoramlop]] 22:58 4 jun 2011 (UTC)&lt;br /&gt;
                     8&lt;br /&gt;
  tasa fallos pág = ---- = 0,615&lt;br /&gt;
                     13&lt;br /&gt;
&lt;br /&gt;
- Duda: En el acceso nº6 ¿Por que ponemos el 3 al final de la cola? se supone que solo se hace eso si recorremos la cola y el bit R se encuentra a 1, entonces ponemos el bit a 0 y colocamos la pagina al final de la cola para darle una 2º oportunidad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;[[Usuario:PCamino|pablo]]&amp;gt;-Respuesta a la duda: Porque asi funcionan las colas. Si llega un elemento que ya habia, pues le corresponde ponerse al final...o no?&lt;br /&gt;
&lt;br /&gt;
[[Usuario:alberto|alberto]] ---&amp;gt;En el acceso 11 , el R de 5 debería de estar a 0 , puesto que al meter 2 vamos recorriendo para encontrar algún R a 0(En este caso sustituimos 3 que tiene su R a 0) y además si durante esa búsqueda encontramos algún R=1 , debemos ponerlo a 0 y ponerlo al final de la cola para darle una segunda oportunidad. Por tanto pienso que  el acceso 11 quedaría:  5(0) 2(1) 1(1) 4(0) Cola=4-1-5-2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Respuesta 2 a duda: Pienso que en el acceso 6 no debemos tocar las posiciones de la cola, ya que la cola sólo se toca cuando ocurre un reemplazo. En este caso no es como lo hacíamos con el planificador,que teníamos que elegir según el orden para darle paso a un proceso, sino que en este caso ya tenemos un orden de páginas preestablecido. Por tanto, aunque vuelva a aparecer el 3, su posición en la cola no cambia, ya que ésta lo que indica es el orden en el que apareció por primera vez. Claro que también debemos tener en cuenta la puesta a cero cuando recorremos la cola, pero en el acceso 6 todavía no la hemos recorrido,ya que no se ha sucedido ningún reemplazo. Por favor, corríjanme si me equivoco, pero estoy bastante seguro de que lo que he escrito es cierto.[[Usuario:JCGarrido|JCGarrido]]&lt;br /&gt;
&lt;br /&gt;
[[Usuario:josvaldia|josvaldia]] Con respecto a la duda en el acceso 6, en los apuntes de M.Robayo dicen que se añaden al final de la lista las paginas recintemente cargadas. En este caso, '3' ya estaba cargada desde el acceso nº 3, luego no hay que añadirla al final de la cola.&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 15:10 7 jun 2011 (UTC) Creo que todos coincidimos en que en el acceso 6 no hay que poner '3' al final del la cola, alguien cree que no debería cambiarse?&lt;br /&gt;
&lt;br /&gt;
[[Criterios_de_reemplazo|Volver]]&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Criterios_de_reemplazo&amp;diff=1168</id>
		<title>Discusión:Criterios de reemplazo</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Criterios_de_reemplazo&amp;diff=1168"/>
				<updated>2011-06-07T12:40:37Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Pregunta sobre criterio de reemplazo MRU&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;3. Criterio MRU:&lt;br /&gt;
&lt;br /&gt;
No entiendo que sentido tiene usar una LIFO  en el criterio MRU. Realmente no se necesita conservar la información de los accesos a páginas que no sean la información del último acceso. Con un único registro/variable que almacene cuál fue la última posición es suficiente, ¿no?&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 12:40 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1167</id>
		<title>Discusión:Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1167"/>
				<updated>2011-06-07T11:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;¿Los mapas de bits no son de O(n) frente a las listas que son de O(1)? Lo digo porque:&lt;br /&gt;
*Para encontrar un espacio libre en el mapa de bits hay que recorrer toda la lista hasta encontrar una página libre, en cuyo caso hemos recorrido n elementos&lt;br /&gt;
*Para encontrar una página libre en la lista solo hay que hacer un pull sobre el FIFO de páginas libres, por lo tanto orden constante O(1)&lt;br /&gt;
&lt;br /&gt;
Si lo pregunto y no lo corrijo directamente es porque en los apuntes que tomé en clase también tengo que los mapas de bits son de O(1)&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 11:51 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1166</id>
		<title>Discusión:Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1166"/>
				<updated>2011-06-07T11:51:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;¿Los mapas de bits no son de O(n) frente a las listas que son de O(1)? Lo digo porque:&lt;br /&gt;
*Para encontrar un espacio libre en el mapa de bits hay que recorrer toda la lista hasta encontrar una página libre, en cuyo caso hemos recorrido n elementos&lt;br /&gt;
*Para encontrar una página libre en la lista solo hay que hacer un pull sobre el FIFO de páginas libres, por lo tanto orden constante O(1)&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Ajaest|ajaest]] 11:51 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1165</id>
		<title>Discusión:Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Paginaci%C3%B3n&amp;diff=1165"/>
				<updated>2011-06-07T11:51:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Pregunta sobre administración usando Mapa de Bits vs Listas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;¿Los mapas de bits no son de O(n) frente a las listas que son de O(1)? Lo digo porque:&lt;br /&gt;
*Para encontrar un espacio libre en el mapa de bits hay que recorrer toda la lista hasta encontrar una página libre, en cuyo caso hemos recorrido n elementos&lt;br /&gt;
*Para encontrar una página libre en la lista solo hay que hacer un pull sobre el FIFO de páginas libres, por lo tanto orden constante O(1)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Segmentaci%C3%B3n&amp;diff=1157</id>
		<title>Discusión:Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Segmentaci%C3%B3n&amp;diff=1157"/>
				<updated>2011-06-07T10:11:30Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Características=&lt;br /&gt;
&lt;br /&gt;
*No se redimensionan              &amp;lt;&amp;lt;&amp;lt;--------------- ¿No eran de tamaño variable? [[Usuario: JCGarrido|JCGarrido]]&lt;br /&gt;
&lt;br /&gt;
Seguro que se refiere a que una vez creado el segmento del tamaño deseado(lo que quiere decir que son variables) éste se mantiene de tamaño fijo mientras exista, pero tampoco puedo asegurarlo al 100%. ¿Alguien puede aclarar ésto? [[Usuario:Ajaest|ajaest]] 10:06 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=1156</id>
		<title>Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=1156"/>
				<updated>2011-06-07T10:10:40Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &amp;quot; La variabilidad del tamaño de los segmentos solo puede ser establecida en el momento de su creación.&amp;quot; Realmente no estoy seguro al 100% de ésto. Mejor dejamos la pregunta en la discusión&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
Un segmento es un espacio de memoria de tamaño variable, compuesto por:&lt;br /&gt;
*Descriptor: Identificador único del segmento (dentro del espacio de memoria del proceso).&lt;br /&gt;
*Tamaño del segmento&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segmentos.png|725px]]&lt;br /&gt;
&lt;br /&gt;
=Características=&lt;br /&gt;
*Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.&lt;br /&gt;
&lt;br /&gt;
*Solapamiento: 2 segmentos pueden compartir zona de memoria. Ojo! problemas de concurrencia. Habría que usar algún método para su sincronización si se intenta.&lt;br /&gt;
&lt;br /&gt;
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).&lt;br /&gt;
&lt;br /&gt;
*Aspectos materiales : Hay 2 registros que funcionan como dispositivos de traducción segmentada; uno de dirección de comienzo de la tabla de segmentos, y otro para el número de entradas en ella.&lt;br /&gt;
&lt;br /&gt;
*Esto supone dos accesos a memoria física real. La tabla de segmentos ocupa memoria, siendo deseable que permanezcan en cache.&lt;br /&gt;
&lt;br /&gt;
*Cuando un proceso requiere más memoria se crea un nuevo segmento.&lt;br /&gt;
&lt;br /&gt;
*Dos instancias de un mismo proceso pueden compartir segmentos de memoria de instrucciones/código, pero no para datos ya que esto complicaría la gestión.&lt;br /&gt;
&lt;br /&gt;
*No se redimensionan.&lt;br /&gt;
&lt;br /&gt;
*Gestión compleja, sobretodo por su tamaño variable&lt;br /&gt;
&lt;br /&gt;
==Carga de segmentos a petición==&lt;br /&gt;
Es un mecanismo que permite a un proceso no disponer de todos sus segmentos en memoria principal, se pueden descargar a disco (en la zona de intercambio o swap) segmentos en base a un cierto criterio (ver [[Intro | Memoria virtual]]). &lt;br /&gt;
&lt;br /&gt;
Esta zona de intercambio puede ser:&lt;br /&gt;
&lt;br /&gt;
* Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
&lt;br /&gt;
* Un fichero oculto de tamaño variable (Windows).&lt;br /&gt;
&lt;br /&gt;
==Enlace dinámico==&lt;br /&gt;
Uso de llamadas a funciones que están en disco.&lt;br /&gt;
&lt;br /&gt;
Podemos tener referencias a funciones o bibliotecas que no estén en memoria principal (permite ir cargando bajo demanda los segmentos que contengan el código necesario).&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=1155</id>
		<title>Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Segmentaci%C3%B3n&amp;diff=1155"/>
				<updated>2011-06-07T10:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Retirada discusión en artículo principal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
Un segmento es un espacio de memoria de tamaño variable, compuesto por:&lt;br /&gt;
*Descriptor: Identificador único del segmento (dentro del espacio de memoria del proceso).&lt;br /&gt;
*Tamaño del segmento&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Segmentos.png|725px]]&lt;br /&gt;
&lt;br /&gt;
=Características=&lt;br /&gt;
*Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.&lt;br /&gt;
&lt;br /&gt;
*Solapamiento: 2 segmentos pueden compartir zona de memoria. Ojo! problemas de concurrencia. Habría que usar algún método para su sincronización si se intenta.&lt;br /&gt;
&lt;br /&gt;
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).&lt;br /&gt;
&lt;br /&gt;
*Aspectos materiales : Hay 2 registros que funcionan como dispositivos de traducción segmentada; uno de dirección de comienzo de la tabla de segmentos, y otro para el número de entradas en ella.&lt;br /&gt;
&lt;br /&gt;
*Esto supone dos accesos a memoria física real. La tabla de segmentos ocupa memoria, siendo deseable que permanezcan en cache.&lt;br /&gt;
&lt;br /&gt;
*Cuando un proceso requiere más memoria se crea un nuevo segmento.&lt;br /&gt;
&lt;br /&gt;
*Dos instancias de un mismo proceso pueden compartir segmentos de memoria de instrucciones/código, pero no para datos ya que esto complicaría la gestión.&lt;br /&gt;
&lt;br /&gt;
*No se redimensionan. La variabilidad del tamaño de los segmentos solo puede ser establecida en el momento de su creación.&lt;br /&gt;
&lt;br /&gt;
*Gestión compleja, sobretodo por su tamaño variable&lt;br /&gt;
&lt;br /&gt;
==Carga de segmentos a petición==&lt;br /&gt;
Es un mecanismo que permite a un proceso no disponer de todos sus segmentos en memoria principal, se pueden descargar a disco (en la zona de intercambio o swap) segmentos en base a un cierto criterio (ver [[Intro | Memoria virtual]]). &lt;br /&gt;
&lt;br /&gt;
Esta zona de intercambio puede ser:&lt;br /&gt;
&lt;br /&gt;
* Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar&lt;br /&gt;
&lt;br /&gt;
* Un fichero oculto de tamaño variable (Windows).&lt;br /&gt;
&lt;br /&gt;
==Enlace dinámico==&lt;br /&gt;
Uso de llamadas a funciones que están en disco.&lt;br /&gt;
&lt;br /&gt;
Podemos tener referencias a funciones o bibliotecas que no estén en memoria principal (permite ir cargando bajo demanda los segmentos que contengan el código necesario).&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Segmentaci%C3%B3n&amp;diff=1154</id>
		<title>Discusión:Segmentación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Segmentaci%C3%B3n&amp;diff=1154"/>
				<updated>2011-06-07T10:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Movida discusión desde artículo principal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Características=&lt;br /&gt;
&lt;br /&gt;
*No se redimensionan              &amp;lt;&amp;lt;&amp;lt;--------------- ¿No eran de tamaño variable? [[Usuario: JCGarrido|JCGarrido]]&lt;br /&gt;
&lt;br /&gt;
Se refiere a que una vez creado el segmento del tamaño deseado(lo que quiere decir que son variables) éste se mantiene de tamaño fijo mientras exista [[Usuario:Ajaest|ajaest]] 10:06 7 jun 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

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

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

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:SO_multiprogramables_con_particiones_variables&amp;diff=1150</id>
		<title>Discusión:SO multiprogramables con particiones variables</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:SO_multiprogramables_con_particiones_variables&amp;diff=1150"/>
				<updated>2011-06-07T09:45:57Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Movida discusión desde artículo principal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Petición:Por favor,alguien que entienda bien el mejor ajuste y el peor ajuste, que explique lo que significa que tenga menor o mayor ajuste interno, que no se entiende bien.&lt;br /&gt;
Gracias.&lt;br /&gt;
&lt;br /&gt;
Creo que se refiere al desperdicio interno de una partición, por ejemplo si una partición es de 15 KB y un proceso ocupa 5KB el desperdicio interno de dicha particion serian 10KB.--[[Usuario:DvS 013|DvS 013]] 10:46 4 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;[[Usuario:PCamino|pablo]]&amp;gt; Claro, el mejor ajuste consiste en meter el proceso en el hueco mas pequeño en que quepa, tras dar un repaso a los disponibles.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=1149</id>
		<title>SO multiprogramables con particiones fijas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=1149"/>
				<updated>2011-06-07T09:35:48Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: /* Mecanismos de protección de memoria */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La memoria se encuentra dividida en particiones, en cada una habrá un proceso. Por lo tanto, se pueden ejecutar tantos procesos como particiones haya.&lt;br /&gt;
&lt;br /&gt;
=Estrategias=&lt;br /&gt;
Las estrategias a seguir cuando no hay memoria suficiente para otro proceso son dos:&lt;br /&gt;
*Cancelación: &amp;quot;lo siento, no hay memoria libre, prueba más tarde&amp;quot;.&lt;br /&gt;
*Espera: añadir el proceso a una cola hasta que haya memoria disponible.&lt;br /&gt;
&lt;br /&gt;
=Limitaciones=&lt;br /&gt;
*Si un proceso necesita mayor memoria que la partición más grande, entonces éste no se ejecuta.&lt;br /&gt;
*Desperdicio de memoria. Por ejemplo, si los procesos son muy pequeños y las particiones grandes.&lt;br /&gt;
&lt;br /&gt;
=Criterios de asignación=&lt;br /&gt;
Se lanza un proceso, y hay que elegir a qué partición va (estrategia de espera). Puede haber una cola por partición, o una sola para todas las particiones.&lt;br /&gt;
&lt;br /&gt;
 Ej: tenemos los siguientes procesos: m(P1) = 6KB, m(P2) = 1KB, m(P3) = 3KB, m(P4) = 31KB, m(P5) = 30KB;&lt;br /&gt;
     suponemos que la decisión sobre la asignación de procesos a particiones se hace ordenadamente de manera consecutiva según el número del proceso&lt;br /&gt;
     y una memoria de 64 KB divididos en 4 huecos como sigue:&lt;br /&gt;
  _____&lt;br /&gt;
 |_____| H1 = 8KB   &lt;br /&gt;
 |_____| H2 = 8KB &lt;br /&gt;
 |     |&lt;br /&gt;
 |_____| H3 = 16KB&lt;br /&gt;
 |     |&lt;br /&gt;
 |     |&lt;br /&gt;
 |     | H4 = 32KB   &lt;br /&gt;
 |_____|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste estático''': se adjudica cada proceso a la menor partición que quepa. Si la menor en la que cabe está ocupada, se espera. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución mejor ajuste estático|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Primer ajuste''': cuando una partición queda libre, se asigna el primer proceso según el orden de la cola que quepa en ella. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución primer ajuste|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico''': cuando una partición queda libre, se asigna el mayor proceso que quepa en ella. Complejidad: O(nlog(p))&lt;br /&gt;
&lt;br /&gt;
[[solución ajuste dinámico|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico con aplazamiento limitado''': Es una variante del criterio anterior que evita el aplazamiento indefinido. Cuando queda una partición libre, se selecciona el mayor proceso que quepa en ella, pero se cuenta el nº de veces que un proceso se aplaza. Si se superan esas '''n''' veces (umbral), se le da paso.&lt;br /&gt;
&lt;br /&gt;
*'''Subparticiones''': No es un criterio como tal sino que viene a complementar a los anteriores. Si no hay un proceso que pueda aprovechar la partición madre: se asignan las subparticiones a procesos pequeños (para que el desperdicio interno sea lo menor posible). Si llega un proceso grande: los procesos pequeños se vuelcan a disco y se asigna partición madre.&lt;br /&gt;
''Partición madre'': tipo especial de partición que se puede dividir en múltiples particiones menores.&lt;br /&gt;
&lt;br /&gt;
[[Otro ejemplo|Otro ejemplo]]&lt;br /&gt;
&lt;br /&gt;
= Métodos de colocación en memoria =&lt;br /&gt;
&lt;br /&gt;
*'''Montaje absoluto''': Se asigna una dirección de memoria constante, siendo por tanto este método muy restrictivo. Se utiliza para la carga del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
* '''Carga con reubicación''': Al realizar la carga, se le aplica a las direcciones lógicas del programa un ''offset'' o desplazamiento. Este desplazamiento es establecido por el programador antes de que se ejecute el programa.&lt;br /&gt;
&lt;br /&gt;
* '''Reubicación dinámica''': A diferencia de la carga con reubicación, el desplazamiento se asigna en tiempo de ejecución.&lt;br /&gt;
** '''Reubicación dinámica parcial''': Es una variante del anterior, en la que existe también un registro límite.&lt;br /&gt;
&lt;br /&gt;
= Mecanismos de protección de memoria =&lt;br /&gt;
&lt;br /&gt;
Es necesario proteger el SO frente a procesos; y proteger a los procesos entre sí.&lt;br /&gt;
&lt;br /&gt;
* '''Bits de protección''' : Se le asigna a cada zona/partición de la memoria principal una zona con información sobre el propietario y los permisos de lectura/escritura&lt;br /&gt;
&lt;br /&gt;
* '''Ampliación registros valla''' : De esta manera se conocen la posición inicial y final, de manera que si no está entre esas dos posiciones no se permite el acceso a memoria.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=1148</id>
		<title>SO multiprogramables con particiones fijas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=1148"/>
				<updated>2011-06-07T09:34:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Los bits de protección son a particiones y no a palabras&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La memoria se encuentra dividida en particiones, en cada una habrá un proceso. Por lo tanto, se pueden ejecutar tantos procesos como particiones haya.&lt;br /&gt;
&lt;br /&gt;
=Estrategias=&lt;br /&gt;
Las estrategias a seguir cuando no hay memoria suficiente para otro proceso son dos:&lt;br /&gt;
*Cancelación: &amp;quot;lo siento, no hay memoria libre, prueba más tarde&amp;quot;.&lt;br /&gt;
*Espera: añadir el proceso a una cola hasta que haya memoria disponible.&lt;br /&gt;
&lt;br /&gt;
=Limitaciones=&lt;br /&gt;
*Si un proceso necesita mayor memoria que la partición más grande, entonces éste no se ejecuta.&lt;br /&gt;
*Desperdicio de memoria. Por ejemplo, si los procesos son muy pequeños y las particiones grandes.&lt;br /&gt;
&lt;br /&gt;
=Criterios de asignación=&lt;br /&gt;
Se lanza un proceso, y hay que elegir a qué partición va (estrategia de espera). Puede haber una cola por partición, o una sola para todas las particiones.&lt;br /&gt;
&lt;br /&gt;
 Ej: tenemos los siguientes procesos: m(P1) = 6KB, m(P2) = 1KB, m(P3) = 3KB, m(P4) = 31KB, m(P5) = 30KB;&lt;br /&gt;
     suponemos que la decisión sobre la asignación de procesos a particiones se hace ordenadamente de manera consecutiva según el número del proceso&lt;br /&gt;
     y una memoria de 64 KB divididos en 4 huecos como sigue:&lt;br /&gt;
  _____&lt;br /&gt;
 |_____| H1 = 8KB   &lt;br /&gt;
 |_____| H2 = 8KB &lt;br /&gt;
 |     |&lt;br /&gt;
 |_____| H3 = 16KB&lt;br /&gt;
 |     |&lt;br /&gt;
 |     |&lt;br /&gt;
 |     | H4 = 32KB   &lt;br /&gt;
 |_____|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste estático''': se adjudica cada proceso a la menor partición que quepa. Si la menor en la que cabe está ocupada, se espera. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución mejor ajuste estático|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Primer ajuste''': cuando una partición queda libre, se asigna el primer proceso según el orden de la cola que quepa en ella. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución primer ajuste|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico''': cuando una partición queda libre, se asigna el mayor proceso que quepa en ella. Complejidad: O(nlog(p))&lt;br /&gt;
&lt;br /&gt;
[[solución ajuste dinámico|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico con aplazamiento limitado''': Es una variante del criterio anterior que evita el aplazamiento indefinido. Cuando queda una partición libre, se selecciona el mayor proceso que quepa en ella, pero se cuenta el nº de veces que un proceso se aplaza. Si se superan esas '''n''' veces (umbral), se le da paso.&lt;br /&gt;
&lt;br /&gt;
*'''Subparticiones''': No es un criterio como tal sino que viene a complementar a los anteriores. Si no hay un proceso que pueda aprovechar la partición madre: se asignan las subparticiones a procesos pequeños (para que el desperdicio interno sea lo menor posible). Si llega un proceso grande: los procesos pequeños se vuelcan a disco y se asigna partición madre.&lt;br /&gt;
''Partición madre'': tipo especial de partición que se puede dividir en múltiples particiones menores.&lt;br /&gt;
&lt;br /&gt;
[[Otro ejemplo|Otro ejemplo]]&lt;br /&gt;
&lt;br /&gt;
= Métodos de colocación en memoria =&lt;br /&gt;
&lt;br /&gt;
*'''Montaje absoluto''': Se asigna una dirección de memoria constante, siendo por tanto este método muy restrictivo. Se utiliza para la carga del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
* '''Carga con reubicación''': Al realizar la carga, se le aplica a las direcciones lógicas del programa un ''offset'' o desplazamiento. Este desplazamiento es establecido por el programador antes de que se ejecute el programa.&lt;br /&gt;
&lt;br /&gt;
* '''Reubicación dinámica''': A diferencia de la carga con reubicación, el desplazamiento se asigna en tiempo de ejecución.&lt;br /&gt;
** '''Reubicación dinámica parcial''': Es una variante del anterior, en la que existe también un registro límite.&lt;br /&gt;
&lt;br /&gt;
= Mecanismos de protección de memoria =&lt;br /&gt;
&lt;br /&gt;
Es necesario proteger el SO frente a procesos; y proteger a los procesos entre sí.&lt;br /&gt;
&lt;br /&gt;
* '''Bits de protección''' : Se le asigna a cada zona/partición de la memoria principal una zona con información sobre el propietario y los privilegios de lectura/escritura&lt;br /&gt;
&lt;br /&gt;
* '''Ampliación registros valla''' : De esta manera se conocen la posición inicial y final, de manera que si no está entre esas dos posiciones no se permite el acceso a memoria.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=935</id>
		<title>SO multiprogramables con particiones fijas</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=SO_multiprogramables_con_particiones_fijas&amp;diff=935"/>
				<updated>2011-06-01T15:39:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Nota sobre orden de las soluciones&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La memoria se encuentra dividida en particiones, en cada una habrá un proceso. Por lo tanto, se pueden ejecutar tantos procesos como particiones haya.&lt;br /&gt;
&lt;br /&gt;
=Estrategias=&lt;br /&gt;
Las estrategias a seguir cuando no hay memoria suficiente para otro proceso son dos:&lt;br /&gt;
*Cancelación: &amp;quot;lo siento, no hay memoria libre, prueba más tarde&amp;quot;.&lt;br /&gt;
*Espera: añadir el proceso a una cola hasta que haya memoria disponible.&lt;br /&gt;
&lt;br /&gt;
=Limitaciones=&lt;br /&gt;
*Si un procesos necesita mayor memoria que la partición máxima, entonces este no se ejecuta.&lt;br /&gt;
*Desperdicio de memoria. Por ejemplo, si los procesos son muy pequeños y las particiones grandes.&lt;br /&gt;
&lt;br /&gt;
=Criterios de asignación=&lt;br /&gt;
Se lanza un proceso, y hay que elegir a que partición va (estrategia de espera). Puede haber una cola por partición, o una sola para todas las particiones.&lt;br /&gt;
&lt;br /&gt;
 Ej: tenemos los siguientes procesos: m(P1) = 6KB, m(P2) = 1KB, m(P3) = 3KB, m(P4) = 31KB, m(P5) = 30KB;&lt;br /&gt;
     suponemos que la decisión sobre la asignación de procesos a particiones se hace ordenadamente de manera consecutiva según el número del proceso&lt;br /&gt;
     y una memoria de 64 KB divididos en 4 huecos como sigue:&lt;br /&gt;
  _____&lt;br /&gt;
 |_____| H1 = 8KB   &lt;br /&gt;
 |_____| H2 = 8KB &lt;br /&gt;
 |     |&lt;br /&gt;
 |_____| H3 = 16KB&lt;br /&gt;
 |     |&lt;br /&gt;
 |     |&lt;br /&gt;
 |     | H4 = 32KB   &lt;br /&gt;
 |_____|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste estático''': se adjudica cada proceso a la menor partición que quepa. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución mejor ajuste estático|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Primer ajuste''': cuando una partición queda libre, se asigna el primer proceso que quepa en ella. Complejidad: O(1)&lt;br /&gt;
&lt;br /&gt;
[[solución primer ajuste|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor ajuste dinámico''': cuando una partición queda libre, se asigna el mayor proceso que quepa en ella. Complejidad: O(nlog(p))&lt;br /&gt;
&lt;br /&gt;
[[solución ajuste dinámico|Ver solución]]&lt;br /&gt;
&lt;br /&gt;
*'''Mejor que quepa con aplazamiento limitado''': Cuando queda una partición libre, se selecciona el mayor proceso que quepa en ella, pero se cuenta el nº de veces que un proceso se aplaza. Si se superan esas '''n''' veces (umbral), se le da paso.&lt;br /&gt;
&lt;br /&gt;
*'''Subparticiones''': No es un criterio como tal sino que viene a complementar a los anteriores. Si no hay un proceso que pueda aprovechar partición madre: se asignan las subparticiones a procesos pequeños (para que el desperdicio interno sea lo menor posible). Si llega un proceso grande: los procesos pequeños se vuelcan a disco y se asigna partición madre.&lt;br /&gt;
''Partición madre'': tipo especial de partición que se puede dividir en múltiples particiones menores.&lt;br /&gt;
&lt;br /&gt;
[[Otro ejemplo|Otro ejemplo]]&lt;br /&gt;
&lt;br /&gt;
= Métodos de colocación en memoria =&lt;br /&gt;
&lt;br /&gt;
*'''Montaje absoluto''': Se asigna una dirección de memoria constante, siendo por tanto este método muy restrictivo. Se utiliza para la carga del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
* '''Carga con reubicación''': Al realizar la carga, se le aplica a las direcciones lógicas del programa un ''offset'' o desplazamiento asociada. Este desplazamiento es establecido por el programador antes de que se ejecute el programa.&lt;br /&gt;
&lt;br /&gt;
* '''Reubicación dinámica''': A diferencia de la carga con reubicación, el desplazamiento se asigna en tiempo de ejecución.&lt;br /&gt;
** '''Reubicación dinámica parcial''': Es una variante del anterior, en la que existe también un registro límite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Mecanismos de protección de memoria =&lt;br /&gt;
&lt;br /&gt;
Es necesario proteger el SO frente a procesos; y proteger a los procesos entre sí.&lt;br /&gt;
&lt;br /&gt;
* '''Ampliación bits de protección'''&lt;br /&gt;
&lt;br /&gt;
* '''Ampliación registros valla''' : De esta manera se conocen la posición inicial y final, de manera que si no esta entre esas dos posiciones no se permite el acceso a memoria.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=826</id>
		<title>Discusión:Solución ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=826"/>
				<updated>2011-05-10T20:54:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No estoy del todo seguro de la solución dada. Teniendo en cuenta los valores en cada momento de semáforos(justo después de ejecutar la instrucción y antes de que lo haga el planificador):&lt;br /&gt;
&lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
      &amp;gt; = Fin del proceso&lt;br /&gt;
 &lt;br /&gt;
              |   |   | #1| #2| #3| #4| #5| #1|   | #2|   |   |   | #3| #4| #5| #1|   |   |   |&lt;br /&gt;
            p1|   |   |---|---|---|---|---|---|   |---X   /   |   |---|---|---|---&amp;gt;   |   |   |&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              | #1| #2|   |   |   |   |   |   | #3|   | #4| #1| #2|   |   |   |   | #3| #4| #1|&lt;br /&gt;
            p2|---|---X   |   |   |   |   /   |---|   |---|---|---|   |   |   /   |---|---|---&amp;gt;&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
              0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
              *********************************************************************************&lt;br /&gt;
 s1.cont      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 2 | 2 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s1.prlist    |   |   |   |   |   |   |   |   |   |p1 |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.cont      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.prlist    |   |p2 |p2 |p2 |p2 |p2 |   |   |   |   |   |   | p2| p2| p2|   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p1.quantum   | 3 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 3 | 2 | 2 | 2 | 2 | 1 | 0 | 3 | 2 | nc| nc| nc|&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p2.quantum   | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 3 | 2 | 1 | 0 | 3 | 3 | 3 | 3 | 2 | 1 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
                               (2)             (1)                     (2)&lt;br /&gt;
(1) A p2 solo le quedaba una unidad de tiempo de su quantum, así que solo ejecuta una línea y no 3. Aquí cabría preguntarse si al pasar a estado bloqueado un nuevo quantum le es asignado&lt;br /&gt;
&lt;br /&gt;
(2) pese a que p1 agota su quantum, como p2 está bloqueado y p1 es el único proceso se le asigna un nuevo quantum&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=825</id>
		<title>Discusión:Solución ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=825"/>
				<updated>2011-05-10T20:54:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No estoy del todo seguro de la solución dada. Teniendo en cuenta los valores en cada momento de semáforos(justo después de ejecutar la instrucción y antes de que lo haga el planificador):&lt;br /&gt;
&lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
      &amp;gt; = Fin del proceso&lt;br /&gt;
 &lt;br /&gt;
              |   |   | #1| #2| #3| #4| #5| #1|   | #2|   |   |   | #3| #4| #5| #1|   |   |   |&lt;br /&gt;
            p1|   |   |---|---|---|---|---|---|   |---X   /   |   |---|---|---|---&amp;gt;   |   |   |&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              | #1| #2|   |   |   |   |   |   | #3|   | #4| #1| #2|   |   |   |   | #3| #4| #1|&lt;br /&gt;
            p2|---|---X   |   |   |   |   /   |---|   |---|---|---|   |   |   /   |---|---|---&amp;gt;&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
              0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
              *********************************************************************************&lt;br /&gt;
 s1.cont      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 2 | 2 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s1.prlist    |   |   |   |   |   |   |   |   |   |p1 |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.cont      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.prlist    |   |p2 |p2 |p2 |p2 |p2 |   |   |   |   |   |   | p2| p2| p2|   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p1.quantum   | 3 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 3 | 2 | 2 | 2 | 2 | 1 | 0 | 3 | 2 | nc| nc| nc|&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p2.quantum   | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 3 | 2 | 1 | 0 | 3 | 3 | 3 | 3 | 2 | 1 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
                               (2)             (1)                     (2)&lt;br /&gt;
(1) A p2 solo le quedaba una unidad de tiempo de su quantum, así que solo ejecuta una línea y no 3. Aquí cabría preguntarse si al pasar a estado bloqueado un nuevo quantum le es asignado&lt;br /&gt;
(2) pese a que p1 agota su quantum, como p2 está bloqueado y p1 es el único proceso se le asigna un nuevo quantum&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Soluci%C3%B3n_ejercicio_1&amp;diff=824</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=824"/>
				<updated>2011-05-10T20:54:03Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
&lt;br /&gt;
      |   |   | #1| #2| #3| #4| #5| #1|   |   |   | #2| #3| #4|   | #5| #1|   |   |   |&lt;br /&gt;
    p1|   |   |---|---|---|---|---|---|   |   |   |---|---|---|   |---|---&amp;gt;   |   |   |&lt;br /&gt;
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
      | #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |   | #2|   |   | #3| #4| #1|&lt;br /&gt;
    p2|---|---X   |   |   |   |   /   |---|---|---|   |   |   |---X   /   |---|---|---&amp;gt;&lt;br /&gt;
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Observaciones:&lt;br /&gt;
* El proceso P2 bloquea al hacer down sobre el semáforo s2 cuyo contador vale 0.&lt;br /&gt;
* En el instante 15, el proceso P2 bloquea de nuevo pues hace down sobre el semáforo s2 cuyo contador vale 0.&lt;br /&gt;
* En los semáforos no se vuelve a comprobar la condición que hizo que el proceso bloqueara, a difencia de los cerrojos.&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Pneira|Pneira]] 08:59 10 may 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:ajaest|ajaest]] Creo que éste ejercicio no está bien, mirar discusión&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=823</id>
		<title>Discusión:Solución ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=823"/>
				<updated>2011-05-10T20:53:18Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No estoy del todo seguro de la solución dada. Teniendo en cuenta los valores en cada momento de semáforos(justo después de ejecutar la instrucción y antes de que lo haga el planificador):&lt;br /&gt;
&lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
      &amp;gt; = Fin del proceso&lt;br /&gt;
 &lt;br /&gt;
              |   |   | #1| #2| #3| #4| #5| #1|   | #2|   |   |   | #3| #4| #5| #1|   |   |   |&lt;br /&gt;
            p1|   |   |---|---|---|---|---|---|   |---X   /   |   |---|---|---|---&amp;gt;   |   |   |&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              | #1| #2|   |   |   |   |   |   | #3|   | #4| #1| #2|   |   |   |   | #3| #4| #1|&lt;br /&gt;
            p2|---|---X   |   |   |   |   /   |---|   |---|---|---|   |   |   /   |---|---|---&amp;gt;&lt;br /&gt;
              |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
              0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
              *********************************************************************************&lt;br /&gt;
 s1.cont      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 2 | 2 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s1.prlist    |   |   |   |   |   |   |   |   |   |p1 |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.cont      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 s2.prlist    |   |p2 |p2 |p2 |p2 |p2 |   |   |   |   |   |   | p2| p2| p2|   |   |   |   |   |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p1.quantum   | 3 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 3 | 2 | 2 | 2 | 2 | 1 | 0 | 3 | 2 | nc| nc| nc|&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
 p2.quantum   | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 3 | 2 | 1 | 0 | 3 | 3 | 3 | 3 | 2 | 1 | 0 |&lt;br /&gt;
              |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
                               (2)             (1)                     (2)&lt;br /&gt;
&lt;br /&gt;
  (1) A p2 solo le quedaba una unidad de tiempo de su quantum, así que solo ejecuta una línea y no 3. Aquí cabría preguntarse si al pasar a estado bloqueado un nuevo quantum le es asignado&lt;br /&gt;
  (2) pese a que p1 agota su quantum, como p2 está bloqueado y p1 es el único proceso se le asigna un nuevo quantum&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=822</id>
		<title>Discusión:Solución ejercicio 1</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_ejercicio_1&amp;diff=822"/>
				<updated>2011-05-10T20:52:34Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Página nueva: No estoy del todo seguro de la solución dada. Teniendo en cuenta los valores en cada momento de semáforos(justo después de ejecutar la instrucción y antes de que lo haga el planif...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No estoy del todo seguro de la solución dada. Teniendo en cuenta los valores en cada momento de semáforos(justo después de ejecutar la instrucción y antes de que lo haga el planificador):&lt;br /&gt;
&lt;br /&gt;
      X = El proceso pasa a estado bloqueado.&lt;br /&gt;
      / = El proceso pasa a estado preparado.&lt;br /&gt;
      &amp;gt; = Fin del proceso&lt;br /&gt;
&lt;br /&gt;
             |   |   | #1| #2| #3| #4| #5| #1|   | #2|   |   |   | #3| #4| #5| #1|   |   |   |&lt;br /&gt;
           p1|   |   |---|---|---|---|---|---|   |---X   /   |   |---|---|---|---&amp;gt;   |   |   |&lt;br /&gt;
             |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
             | #1| #2|   |   |   |   |   |   | #3|   | #4| #1| #2|   |   |   |   | #3| #4| #1|&lt;br /&gt;
           p2|---|---X   |   |   |   |   /   |---|   |---|---|---|   |   |   /   |---|---|---&amp;gt;&lt;br /&gt;
             |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
             0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 20&lt;br /&gt;
             *********************************************************************************&lt;br /&gt;
s1.cont      | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 2 | 2 |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
s1.prlist    |   |   |   |   |   |   |   |   |   |p1 |   |   |   |   |   |   |   |   |   |   |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
s2.cont      | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
s2.prlist    |   |p2 |p2 |p2 |p2 |p2 |   |   |   |   |   |   | p2| p2| p2|   |   |   |   |   |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
p1.quantum   | 3 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 3 | 2 | 2 | 2 | 2 | 1 | 0 | 3 | 2 | nc| nc| nc|&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
p2.quantum   | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 3 | 2 | 1 | 0 | 3 | 3 | 3 | 3 | 2 | 1 | 0 |&lt;br /&gt;
             |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|&lt;br /&gt;
                              (2)             (1)                     (2)&lt;br /&gt;
&lt;br /&gt;
  (1) A p2 solo le quedaba una unidad de tiempo de su quantum, así que solo ejecuta una línea y no 3. Aquí cabría preguntarse si al pasar a estado bloqueado un nuevo quantum le es asignado&lt;br /&gt;
  (2) pese a que p1 agota su quantum, como p2 está bloqueado y p1 es el único proceso se le asigna un nuevo quantum&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=821</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=821"/>
				<updated>2011-05-10T19:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es una unidad de información que se intercambia entre dos o más procesos. &lt;br /&gt;
&lt;br /&gt;
Mediante los mensajes podemos transmitir información y sincronizar procesos (mediante la espera de un cierto mensaje).&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema (o primitivas básicas) para los procesos, enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;send (mensaje)&amp;lt;/tt&amp;gt;: Para enviar un mensaje&lt;br /&gt;
* &amp;lt;tt&amp;gt;receive (mensaje)&amp;lt;/tt&amp;gt;: Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
== Destino y fuente ==&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Directa'''&lt;br /&gt;
** Se emplea ID para identificar al destinatario. &lt;br /&gt;
** Valores especiales: BROADCAST (a todos), MULTICAST (a un grupo).&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Indirecta'''&lt;br /&gt;
** Se emplea un elemento intermediario. &lt;br /&gt;
** Recurso compartido especial en el sistema: BUZÓN.&lt;br /&gt;
** Habiendo intermediarios, hay que comprobar las identidades pues pueden ser falsas/erróneas&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia''' &lt;br /&gt;
** ''Directa'': el mensaje se copia de espacio de emisor a espacio de receptor.&lt;br /&gt;
** ''Indirecta'': el mensaje se copia de espacio de emisor a espacio (buzón) de SO, y de ahí a espacio de receptor.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por referencia'''&lt;br /&gt;
** ''Directa'': lo que se copia es un puntero al mensaje&lt;br /&gt;
** ''Global'': el emisor crea mensaje en espacio de SO, y se copia a espacio de receptor un puntero al mismo.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia de escritura''': 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;
** ''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'': un recv() sin mensajes a procesar pasa a estado bloqueado. Si se hace un send() vuelve a estado preparado&lt;br /&gt;
** ''No bloqueante'': recv() sin mensajes a procesar devuelve un &amp;quot;prueba más tarde&amp;quot;&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;
* Unidad 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>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mensajer%C3%ADa&amp;diff=820</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=820"/>
				<updated>2011-05-10T19:06:40Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Cambiado párrafo extraño&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es una unidad de información que se intercambia entre dos o más procesos. &lt;br /&gt;
&lt;br /&gt;
Mediante los mensajes podemos transmitir información y sincronizar procesos (mediante la espera de un cierto mensaje).&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos generalmente ofrecen dos llamadas al sistema (o primitivas básicas) para los procesos, enviar y recibir mensajes:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;send (mensaje)&amp;lt;/tt&amp;gt;: Para enviar un mensaje&lt;br /&gt;
* &amp;lt;tt&amp;gt;receive (mensaje)&amp;lt;/tt&amp;gt;: Para recibir un mensaje&lt;br /&gt;
&lt;br /&gt;
== Destino y fuente ==&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Directa'''&lt;br /&gt;
** Se emplea ID para identificar al destinatario. &lt;br /&gt;
** Valores especiales: BROADCAST (a todos), MULTICAST (a un grupo).&lt;br /&gt;
&lt;br /&gt;
* '''Denominación Indirecta'''&lt;br /&gt;
** Se emplea un elemento intermediario. &lt;br /&gt;
** Recurso compartido especial en el sistema: BUZÓN.&lt;br /&gt;
** Habiendo intermediarios, hay que comprobar las identidades pues pueden ser falsas/erróneas&lt;br /&gt;
&lt;br /&gt;
== Formas de transmisión ==&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia''' &lt;br /&gt;
** ''Directa'': el mensaje se copia de espacio de emisor a espacio de receptor.&lt;br /&gt;
** ''Indirecta'': el mensaje se copia de espacio de emisor a espacio (buzón) de SO, y de ahí a espacio de receptor.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por referencia'''&lt;br /&gt;
** ''Directa'': lo que se copia es un puntero al mensaje&lt;br /&gt;
** ''Global'': el emisor crea mensaje en espacio de SO, y se copia a espacio de receptor un puntero al mismo.&lt;br /&gt;
&lt;br /&gt;
* '''Transmisión por copia de escritura''': 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;
**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: un recv() sin mensajes a procesar pasa a estado bloqueado. Si se hace un send() vuelve a estado preparado&lt;br /&gt;
** No bloqueante: recv() sin mensajes a procesar devuelve un &amp;quot;prueba más tarde&amp;quot;&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;
* Unidad 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>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=819</id>
		<title>Discusión:Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=819"/>
				<updated>2011-05-10T18:52:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- A mi enteder en el fragmento de codigo de :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?&lt;br /&gt;
&lt;br /&gt;
Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada,&lt;br /&gt;
se modifica la variable temporal. &lt;br /&gt;
&lt;br /&gt;
Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.&lt;br /&gt;
&lt;br /&gt;
¿Que os parece?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto? &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        '''compartida++''';                   /* actualizo la varible */&lt;br /&gt;
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.&lt;br /&gt;
&lt;br /&gt;
Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        '''else&lt;br /&gt;
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Lo del comentario anterior es cierto excepto lo siguiente, que  no tiene sentido:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿Está asignando dos valores a la misma variable? &lt;br /&gt;
Aparte de ésto, creo que tal y como está planteado el ejemplo debería ser como sigue:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace&lt;br /&gt;
/* Código no concurrente */&lt;br /&gt;
//...&lt;br /&gt;
/* Modificación de variable compartida, código concurrente */&lt;br /&gt;
{       &lt;br /&gt;
        int tmp;                 //Limitamos la existencia de la variable temporal con las llaves&lt;br /&gt;
        retry:                   //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        else&lt;br /&gt;
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada &lt;br /&gt;
}                                //garantiza que la variable compartida no cambie mientras se llega al &lt;br /&gt;
                                 //else&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=818</id>
		<title>Discusión:Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=818"/>
				<updated>2011-05-10T18:49:47Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- A mi enteder en el fragmento de codigo de :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?&lt;br /&gt;
&lt;br /&gt;
Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada,&lt;br /&gt;
se modifica la variable temporal. &lt;br /&gt;
&lt;br /&gt;
Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.&lt;br /&gt;
&lt;br /&gt;
¿Que os parece?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto? &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        '''compartida++''';                   /* actualizo la varible */&lt;br /&gt;
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.&lt;br /&gt;
&lt;br /&gt;
Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        '''else&lt;br /&gt;
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Esto no tieme ningún sentido:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿Está asignando dos valores a la misma variable? &lt;br /&gt;
Aparte de ésto, creo que tal y como está planteado el ejemplo debería ser como sigue:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace&lt;br /&gt;
/* Código no concurrente */&lt;br /&gt;
//...&lt;br /&gt;
/* Modificación de variable compartida, código concurrente */&lt;br /&gt;
{                                //Limitamos la existencia de la variable temporal con las llaves&lt;br /&gt;
        retry:                   //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...&lt;br /&gt;
        int tmp = compartida;    /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        else&lt;br /&gt;
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada &lt;br /&gt;
}                                //garantiza que la variable compartida no cambie mientras se llega al &lt;br /&gt;
                                 //else&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=817</id>
		<title>Discusión:Ejercicio de concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=817"/>
				<updated>2011-05-10T18:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Usuario:Ajaest|Ajaest]] He de suponer que lock_down==lock y lock_up = unlock, no? creo que con lock y unlock queda bastante más claro&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=816</id>
		<title>Discusión:Ejercicio de concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=816"/>
				<updated>2011-05-10T18:26:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
--[[Usuario:Ajaest|Ajaest]]He de suponer que lock_down==lock y lock_up = unlock, no? creo que con lock y unlock queda bastante más claro&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=814</id>
		<title>Discusión:Ejercicio de concurrencia de procesos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Ejercicio_de_concurrencia_de_procesos&amp;diff=814"/>
				<updated>2011-05-10T18:13:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Página nueva: He de suponer que lock_down==lock y lock_up = unlock, no? creo que con lock y unlock queda bastante más claro&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;He de suponer que lock_down==lock y lock_up = unlock, no? creo que con lock y unlock queda bastante más claro&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_de_los_ejercicios_de_concurrencia&amp;diff=813</id>
		<title>Discusión:Solución de los ejercicios de concurrencia</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_de_los_ejercicios_de_concurrencia&amp;diff=813"/>
				<updated>2011-05-10T18:13:28Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Página blanqueada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_de_los_ejercicios_de_concurrencia&amp;diff=812</id>
		<title>Discusión:Solución de los ejercicios de concurrencia</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Soluci%C3%B3n_de_los_ejercicios_de_concurrencia&amp;diff=812"/>
				<updated>2011-05-10T18:13:18Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;He de suponer que lock_down==lock y lock_up = unlock, no? creo que con lock y unlock queda bastante más claro&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=811</id>
		<title>Discusión:Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=811"/>
				<updated>2011-05-10T18:03:18Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- A mi enteder en el fragmento de codigo de :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?&lt;br /&gt;
&lt;br /&gt;
Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada,&lt;br /&gt;
se modifica la variable temporal. &lt;br /&gt;
&lt;br /&gt;
Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.&lt;br /&gt;
&lt;br /&gt;
¿Que os parece?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto? &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        '''compartida++''';                   /* actualizo la varible */&lt;br /&gt;
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.&lt;br /&gt;
&lt;br /&gt;
Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        '''else&lt;br /&gt;
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Esto no tieme ningún sentido:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿Está asignando dos valores a la misma variable? Creo que tal y como está planteado el ejemplo debería ser como sigue:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace&lt;br /&gt;
/* Código no concurrente */&lt;br /&gt;
//...&lt;br /&gt;
/* Modificación de variable compartida, código concurrente */&lt;br /&gt;
{                                //Limitamos la existencia de la variable temporal con las llaves&lt;br /&gt;
        retry:                   //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...&lt;br /&gt;
        int tmp = compartida;    /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        else&lt;br /&gt;
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada &lt;br /&gt;
}                                //garantiza que la variable compartida no cambie mientras se llega al &lt;br /&gt;
                                 //else&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=810</id>
		<title>Discusión:Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Discusi%C3%B3n:Mecanismos_de_sincronizaci%C3%B3n&amp;diff=810"/>
				<updated>2011-05-10T17:47:43Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- A mi enteder en el fragmento de codigo de :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?&lt;br /&gt;
&lt;br /&gt;
Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada,&lt;br /&gt;
se modifica la variable temporal. &lt;br /&gt;
&lt;br /&gt;
Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.&lt;br /&gt;
&lt;br /&gt;
¿Que os parece?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto? &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        '''compartida++''';                   /* actualizo la varible */&lt;br /&gt;
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.&lt;br /&gt;
&lt;br /&gt;
Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                   /* actualizo la varible temporal. */&lt;br /&gt;
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;          /* mientras operaba con la variable temporal. */&lt;br /&gt;
        '''else&lt;br /&gt;
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Esto no tieme ningún sentido:&lt;br /&gt;
&amp;lt;source lang =&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int compartida = 1, tmp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¿Está asignando dos valores a la misma variable?&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=470</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=470"/>
				<updated>2011-03-22T19:33:04Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Las llamadas al sistema son el conjunto de instrucciones de medio-bajo nivel que, pertenecientes al sistema operativo, proveen a los programas de recursos y funciones de software y hardware que generalmente necesitan de una gestión especial por ser recursos compartidos por otros programas y procesos.&lt;br /&gt;
&lt;br /&gt;
=Compatibilidad hacia atrás y hacia delante=&lt;br /&gt;
&lt;br /&gt;
En un sistema operativo bien diseñado la interfaz de las llamadas al sistema han de ser ser estables a lo largo del tiempo, de forma que la modificación funcionamiento interno de no repercuta en el funcionamiento externo de estás para asegurar la compatibilidad hacia atrás([http://en.wikipedia.org/wiki/Backward_compatibility Backward compatibility]). Además, aquellas llamadas que queden obsoletas o en desuso han de ser conservadas para, de la misma manera, asegurar el funcionamiento de programas antiguos ([http://en.wikipedia.org/wiki/Legacy_system?=Legacy_support Legacy Support]).&lt;br /&gt;
&lt;br /&gt;
En ocasiones los sistemas operativos pueden incluir en su diseño criterios de compatibilidad hacia adelante([http://en.wikipedia.org/wiki/Forward_compatibility Fordward compatibility]). Un ejemplo de este tipo de sistemas son aquellos capaces de mostrar información detallada al usuario de aquello que no pueden comprender o los sistemas ignorantes, que son aquellos que solo ejecutan lo que pueden comprender y obvian el resto.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Ajaest&amp;diff=469</id>
		<title>Usuario:Ajaest</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Usuario:Ajaest&amp;diff=469"/>
				<updated>2011-03-22T19:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Página nueva: Luis Alfonso Arce González&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Luis Alfonso Arce González&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_en_sistemas_multiprocesadores&amp;diff=468</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=468"/>
				<updated>2011-03-22T19:28:09Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: error en la capitalización&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En este tipo de sistemas disponemos de n (n&amp;gt;=2) procesadores, siendo los criterios de planificación los mismos seguidos hasta ahora pero contando con más de un procesador. &lt;br /&gt;
Hay que considerar que la asignación del proceso a un procesador puede ser &lt;br /&gt;
* '''Estática''': en la que el proceso es asignado siempre a dicho procesador mientras este no haya terminado su ejecución.&lt;br /&gt;
* '''Dinámica''': en la que se permite la migración del procesador o balanceo de carga.&lt;br /&gt;
&lt;br /&gt;
Se utiliza principalmente la estática debido al principio de localidad espacial y temporal, cuando un proceso se carga en un procesador se carga en caché los datos más frecuentes accedidos por el proceso. Si cambiamos de procesador a dicho proceso habría que cargar de nuevo los datos en la caché del otro procesador.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_en_sistemas_multiprocesadores&amp;diff=467</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=467"/>
				<updated>2011-03-22T19:27:44Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: capitalización&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En este tipo de sistemas disponemos de n (n&amp;gt;=2) procesadores, siendo los criterios de planificación los mismos seguidos hasta ahora pero contando con más de un procesador. &lt;br /&gt;
Hay que considerar que la asignación del proceso a un procesador puede ser &lt;br /&gt;
* '''Estática''': en la que el proceso es asignado siempre a dicho procesador mientras este no haya terminado su ejecución.&lt;br /&gt;
* '''Dinámica: en la que se permite la migración del procesador o balanceo de carga.&lt;br /&gt;
&lt;br /&gt;
Se utiliza principalmente la estática debido al principio de localidad espacial y temporal, cuando un proceso se carga en un procesador se carga en caché los datos más frecuentes accedidos por el proceso. Si cambiamos de procesador a dicho proceso habría que cargar de nuevo los datos en la caché del otro procesador.&lt;/div&gt;</summary>
		<author><name>Ajaest</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=466</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=466"/>
				<updated>2011-03-22T19:27:15Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: capitalización&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ¿Qué es un proceso de tiempo real? ==&lt;br /&gt;
&lt;br /&gt;
Proceso de tiempo real se denomina a aquella actividad que debe ser realizada en un plazo de tiempo, si la actividad no es realizada en dicho plazo de tiempo carece de sentido realizarla. Ej: Actividades industriales, videoconferencias, etc&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 estricto, sino 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 sino es posible se puede posponer. Ej: actualizacion 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, cuando van a llegar ni el tiempo que va a durar. Ej: Notificaciones de errores, Sensores de emergencia en un coche, Ventiladores para refrigeracion.&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 cuando van a llegar y su tiempo de duración Ej: leer una temperatura de un sensor.&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 indice de prioridad y el procesador elige aquel proceso de la lista de preparados con mayor prioridad.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación de tablas estáticas''': se conocen las actividades a realizar 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 estaticas , pero tambien admite actividades aperiodicas. Cuando se presenta una actividad aperiodica , el planificador intenta construir un nuevo plan de ejecucion que incluya a todas las actividades. Si no encuentra la solucion que las englobe a todas, rechaza la actividad, que debe ser flexible u opcional. Tambien puede retrasar alguna actividad flexible/opcional.&lt;br /&gt;
&lt;br /&gt;
*'''Planificación dinámica con un mejor resultado''': Las actividades fuera de plazo se abortan. Es muy similar a la anterior, la diferencia mas notable es que en la anterior existe un análisis previo aceptando actividades aperiodicas y en ésta no existe tal analisis.&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;
                      * = 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   |   |   |   |   |&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;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Criterios_de_planificaci%C3%B3n&amp;diff=465</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=465"/>
				<updated>2011-03-22T19:25:06Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: capitalización&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Métodos no apropiativos =&lt;br /&gt;
&lt;br /&gt;
El procesador es asignado al proceso hasta fin de ejecución. Suele darse en sistemas operativos monoprogramables y sistemas de tiempo real.&lt;br /&gt;
&lt;br /&gt;
== Estocástico ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona aleatoriamente 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_|&lt;br /&gt;
        Cálculos    _t__|_3__|_5__|_2__|_5__|_5__|&lt;br /&gt;
       de tiempos   _T__|_3__|_7__|_7__|_6__|_8__|        z = índice de penalización&lt;br /&gt;
                    _z__|_1__|_7/5|_7/2|_6/5|_8/5|&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;---|---|---|---|---|&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 lleva más tiempo en estado preparado, sin estar en estado activo. Estima los índices de penalización, P=T/t=(w+t)/t y elige el de mayor valor. Este método puede producir aplazamientos de ejecución de procesos,pero no son indefinidos. 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__|_2__|_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;---|---|---|---|---|&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;
= Métodos apropiativos =&lt;br /&gt;
&lt;br /&gt;
El planificador puede retirar el procesador en cualquier momento al proceso activo. Suele darse en sistemas operativos [[Multiprogramación|multiprogramables]]. Este metodo es necesario si existen procesos de alta prioridad.&lt;br /&gt;
&lt;br /&gt;
== El siguiente, el más corto (Shortest Job First: SJF) ==&lt;br /&gt;
&lt;br /&gt;
Se selecciona el proceso que requiera menos tiempo de ejecución. Si hay un proceso en estado preparado que requiere menos tiempo de ejecución, se le asigna el procesador, sólo si el proceso nuevo necesita menos tiempo del que le falta al actual.  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;---|---|---|---|---|&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__|_14_|_3__|        z = índice de penalización&lt;br /&gt;
                    _z__|_1__|_8/5|_1__|14/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 disminuyendola 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;---|---|---|---|---|---|---|---|---|---|---|---|&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 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 cuyo comportamiento está limitado por el procesador, pues se pasan más tiempo asignados al procesador.&lt;br /&gt;
&lt;br /&gt;
Este criterio se puede implementar con una cola, de manera que la complejidad de la selección de un proceso es O(1). 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;
== 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 mayor 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;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=464</id>
		<title>Índices de evaluación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=%C3%8Dndices_de_evaluaci%C3%B3n&amp;diff=464"/>
				<updated>2011-03-22T19:22:57Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para evaluar los criterios de planificación de procesos empleamos los siguientes índices:&lt;br /&gt;
&lt;br /&gt;
* '''Tiempo de ejecución''' (t&amp;lt;sub&amp;gt;ejecución&amp;lt;/sub&amp;gt;): unidades de tiempo que requiere el proceso para finalizar su ejecución.&lt;br /&gt;
* '''Tiempo de terminación''' (T&amp;lt;sub&amp;gt;terminación&amp;lt;/sub&amp;gt;): diferencia entre el instante de lanzamiento y el instante de terminación.&lt;br /&gt;
* '''Tiempo perdido''': T-t . Es el tiempo durante el cual un proceso no está asignado al procesador.&lt;br /&gt;
* '''Tiempo de inactividad''': tiempo durante el cual el procesador está ocioso (''idle'', en inglés), es decir, que no tienen ningún proceso asignado.&lt;br /&gt;
* '''Tiempo del sistema''': tiempo empleado por el [[planificador de procesos|planificador]] para la conmutación de procesos.&lt;br /&gt;
* '''Tiempo de espera''': tiempo desde el instante de lanzamiento hasta que el proceso pasa a estado preparado.&lt;br /&gt;
* '''Índice de penalización''': T/t = x. Se interpreta de la siguiente manera, un proceso ha tardado x-1 veces más en ejecutarse que si hubiera tenido el procesador en exclusividad.&lt;br /&gt;
* '''Índice de respuesta''': inverso del índice de penalización.&lt;br /&gt;
&lt;br /&gt;
Suponga el siguiente ejemplo, en el que hay dos procesos Px y Py, para ilustrar los índices definidos:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;     indica que el proceso está preparado&lt;br /&gt;
  &amp;gt;     indica que el proceso ha finalizado su ejecución &lt;br /&gt;
  $     indica que al proceso se le ha retirado el procesador&lt;br /&gt;
  X     indica la ejecución del planificador para la conmutación&lt;br /&gt;
 &lt;br /&gt;
                |   |   |   |   |   |   |&lt;br /&gt;
 Px             &amp;lt;---|---$   |---&amp;gt;   |   |&lt;br /&gt;
 Py             |   |   &amp;lt;---&amp;gt;   |   |   |&lt;br /&gt;
 planificador   |   |   X   X   |   |   |&lt;br /&gt;
                |___|___|___|___|___|___|___&lt;br /&gt;
                  0   1   2   3   4   5   6&lt;br /&gt;
 &lt;br /&gt;
                                      tiempo -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el proceso Px:&lt;br /&gt;
&lt;br /&gt;
* t   = 3 : Indica que el proceso Px requiere 3 unidades de tiempo para ejecutarse.&lt;br /&gt;
* T   = 4 : unidades de tiempo desde que se lanza hasta que se finaliza el proceso Px&lt;br /&gt;
* T-t = 1 : unidades de tiempo durante la cual el proceso Px no está asignado al procesador, por tanto, no progresa en su actividad.&lt;br /&gt;
* x   = 4/3 = 1.34 : el proceso Px ha tardado un 34% de tiempo más en ejecutarse que si lo hubiera tenido en exclusividad (al tener que haber que compartido el procesador con Py).&lt;br /&gt;
&lt;br /&gt;
En el ejemplo anterior, los tiempos de espera y del sistema se suponen despreciables (en la práctica no lo son, aunque son muy pequeños con respecto a los ilustrados).&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Planificaci%C3%B3n_de_procesos&amp;diff=463</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=463"/>
				<updated>2011-03-22T19:21:59Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: Adecuación y mejora del lenguaje&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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, deben ser similares con 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>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=462</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=462"/>
				<updated>2011-03-22T19:15:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.&lt;br /&gt;
&lt;br /&gt;
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.&lt;br /&gt;
&lt;br /&gt;
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.&lt;br /&gt;
&lt;br /&gt;
El concepto de '''hilo''' aparece para arreglar estos problemas:&lt;br /&gt;
&lt;br /&gt;
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución, por lo que una sola línea podría destruir el trabajo de las demás, de forma que es el programador el que tiene la responsabilidad de proteger la memoria entre los distintos hilos.&lt;br /&gt;
&lt;br /&gt;
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.&lt;br /&gt;
&lt;br /&gt;
La implantación del concepto de hilo desemboca en la necesidad de llamadas al sistema específicas para el tratamiento de hilos, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.&lt;br /&gt;
&lt;br /&gt;
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
 PA1 |  .---   .  .   .  &lt;br /&gt;
 PA2 |  .   ---.  .   .&lt;br /&gt;
     |  .      .  .   .     &lt;br /&gt;
 PB  |  .      .  .---.     &lt;br /&gt;
     |  .      .  .   . &lt;br /&gt;
 Pla |--.      .--.   . &lt;br /&gt;
     |__.______.__.___.&amp;gt;t&lt;br /&gt;
    &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;
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 llame 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;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=461</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=461"/>
				<updated>2011-03-22T19:14:07Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.&lt;br /&gt;
&lt;br /&gt;
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.&lt;br /&gt;
&lt;br /&gt;
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.&lt;br /&gt;
&lt;br /&gt;
El concepto de '''hilo''' aparece para arreglar estos problemas:&lt;br /&gt;
&lt;br /&gt;
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución, por lo que una sola línea podría destruir el trabajo de las demás, de forma que es el programador el que tiene la responsabilidad de proteger la memoria entre los distintos hilos.&lt;br /&gt;
&lt;br /&gt;
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.&lt;br /&gt;
&lt;br /&gt;
La implantación del concepto de hilo desemboca en la necesidad de llamadas al sistema específicas para el tratamiento de hilos, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.&lt;br /&gt;
&lt;br /&gt;
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
 PA1 |  .---   .  .   .  &lt;br /&gt;
 PA2 |  .   ---.  .   .&lt;br /&gt;
     |  .      .  .   .     &lt;br /&gt;
 PB  |  .      .  .---.     &lt;br /&gt;
     |  .      .  .   . &lt;br /&gt;
 Pla |--.      .--.   . &lt;br /&gt;
     |__.______.__.___.&amp;gt;t&lt;br /&gt;
    &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;
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 llame al sistema bloqueante, en este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso, ahorrando asi tiempo de espera al no ejecutar el planificador.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=460</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=460"/>
				<updated>2011-03-22T19:12:58Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.&lt;br /&gt;
&lt;br /&gt;
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.&lt;br /&gt;
&lt;br /&gt;
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.&lt;br /&gt;
&lt;br /&gt;
El concepto de '''hilo''' aparece para arreglar estos problemas:&lt;br /&gt;
&lt;br /&gt;
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución, por lo que una sola línea podría destruir el trabajo de las demás, de forma que es el programador el que tiene la responsabilidad de proteger la memoria entre los distintos hilos.&lt;br /&gt;
&lt;br /&gt;
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.&lt;br /&gt;
&lt;br /&gt;
La implantación del concepto de hilo desemboca en la necesidad de llamadas al sistema específicas para el tratamiento de hilos, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.&lt;br /&gt;
&lt;br /&gt;
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
 PA1 |  .---   .  .   .  &lt;br /&gt;
 PA2 |  .   ---.  .   .&lt;br /&gt;
     |  .      .  .   .     &lt;br /&gt;
 PB  |  .      .  .---.     &lt;br /&gt;
     |  .      .  .   . &lt;br /&gt;
 Pla |--.      .--.   . &lt;br /&gt;
     |__.______.__.___.&amp;gt;t&lt;br /&gt;
    &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;
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 (pudiendo así compartir variables, aprovechando mejor los recursos y no requieren mecanismos de compartición de variables).&lt;br /&gt;
&lt;br /&gt;
*Con un solo procesador es posible que una línea de proceso llame al sistema bloqueante, en este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso, ahorrando asi tiempo de espera al no ejecutar el planificador.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=459</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=459"/>
				<updated>2011-03-22T19:12:30Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.&lt;br /&gt;
&lt;br /&gt;
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.&lt;br /&gt;
&lt;br /&gt;
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.&lt;br /&gt;
&lt;br /&gt;
El concepto de '''hilo''' aparece para arreglar estos problemas:&lt;br /&gt;
&lt;br /&gt;
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución, por lo que una sola línea podría destruir el trabajo de las demás, de forma que es el programador el que tiene la responsabilidad de proteger la memoria entre los distintos hilos.&lt;br /&gt;
&lt;br /&gt;
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.&lt;br /&gt;
&lt;br /&gt;
La implantación del concepto de hilo desemboca en la necesidad de llamadas al sistema específicas para el tratamiento de hilos, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.&lt;br /&gt;
&lt;br /&gt;
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
 PA1 |  .---   .  .   .  &lt;br /&gt;
 PA2 |  .   ---.  .   .&lt;br /&gt;
     |  .      .  .   .     &lt;br /&gt;
 PB  |  .      .  .---.     &lt;br /&gt;
     |  .      .  .   . &lt;br /&gt;
 Pla |--.      .--.   . &lt;br /&gt;
     |__.______.__.___.&amp;gt;t&lt;br /&gt;
    &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;
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 (pudiendo así compartir variables, aprovechando mejor los recursos y no requieren mecanismos de compartición de variables).&lt;br /&gt;
&lt;br /&gt;
-Con un solo procesador es posible que una línea de proceso llame al sistema bloqueante, en este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso, ahorrando asi tiempo de espera al no ejecutar el planificador.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=458</id>
		<title>Hilos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Hilos&amp;diff=458"/>
				<updated>2011-03-22T19:09:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.&lt;br /&gt;
&lt;br /&gt;
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.&lt;br /&gt;
&lt;br /&gt;
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.&lt;br /&gt;
&lt;br /&gt;
El concepto de '''hilo''' aparece para arreglar estos problemas:&lt;br /&gt;
&lt;br /&gt;
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución,  por lo que una sola línea podría destruir el trabajo de las demás. El buen resultado de las líneas depende del programador.&lt;br /&gt;
&lt;br /&gt;
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.&lt;br /&gt;
&lt;br /&gt;
La implantación del concepto de hilo provoca que en el sistema operativo sea necesaria la creación de llamadas al sistema referentes a él, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.&lt;br /&gt;
&lt;br /&gt;
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo diseñado para un solo procesador:&lt;br /&gt;
&lt;br /&gt;
 PA1 |  .---   .  .   .  &lt;br /&gt;
 PA2 |  .   ---.  .   .&lt;br /&gt;
     |  .      .  .   .     &lt;br /&gt;
 PB  |  .      .  .---.     &lt;br /&gt;
     |  .      .  .   . &lt;br /&gt;
 Pla |--.      .--.   . &lt;br /&gt;
     |__.______.__.___.&amp;gt;t&lt;br /&gt;
    &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;
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 (pudiendo así compartir variables, aprovechando mejor los recursos y no requieren mecanismos de compartición de variables).&lt;br /&gt;
&lt;br /&gt;
-Con un solo procesador es posible que una línea de proceso llame al sistema bloqueante, en este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso, ahorrando asi tiempo de espera al no ejecutar el planificador.&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Modelos_de_Dise%C3%B1o_de_Sistemas_Operativos&amp;diff=457</id>
		<title>Modelos de Diseño de Sistemas Operativos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Modelos_de_Dise%C3%B1o_de_Sistemas_Operativos&amp;diff=457"/>
				<updated>2011-03-22T19:03:22Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modos de operación del procesador =&lt;br /&gt;
&lt;br /&gt;
Para entender los modelos de diseño de los sistemas operativos, tenemos que hacer referencia a los modos de ejecución del procesador. El modo de ejecución del procesador indica que conjunto de instrucciones y a qué recursos del procesador se puede acceder en un cierto instante de tiempo.&lt;br /&gt;
&lt;br /&gt;
En la actualidad, un procesador ofrece como mínimo dos modos de operación que son:&lt;br /&gt;
&lt;br /&gt;
* Modo supervisor, que permite la ejecución de todo el conjunto de instrucciones que ofrece el procesador.&lt;br /&gt;
* Modo usuario, que tiene algunas restricciones de acceso a aspectos del procesador o de ejecución de instrucciones.&lt;br /&gt;
&lt;br /&gt;
= Núcleo del sistema operativo =&lt;br /&gt;
&lt;br /&gt;
El núcleo del sistema operativo, también conocido por la terminología inglesa ''kernel'', es la parte más esencial del sistema operativo. Se trata de la capa visible de software más baja del sistema y provee y gestiona de forma segura los recursos del sistema a través de las llamadas al sistema.&lt;br /&gt;
&lt;br /&gt;
El núcleo de un sistema operativo suele operar en modo supervisor. Al operar en dicho modo un error de programación en el núcleo del sistema operativo puede resultar en un error fatal del cual el sistema sólo puede recuperarse mediante el reinicio del sistema. A tal error fatal también se le conoce en los sistemas operativos UNIX por la locución inglesa ''[http://es.wikipedia.org/wiki/Kernel_panic kernel panic]''.&lt;br /&gt;
&lt;br /&gt;
= Tipos de Sistemas Operativos =&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos se pueden clasificar en base a la cantidad de funcionalidad implementada en su núcleo. En general distinguimos dos tipos de sistemas operativos:&lt;br /&gt;
&lt;br /&gt;
* Monolíticos: son núcleos de gran tamaño con poca modularidad y flexibilidad pero con una gran cantidad de funcionalidades, las cuales son normalmente compiladas junto al núcleo en el mismo momento.&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. El resto de funcionalidades son añadidas mediante la adición de módulos externos al núcleo, lo que les proporciona flexibilidad y facilidad de ampliación en detrimento del desempeño necesario para la gestión dinámica de éstos.&lt;br /&gt;
&lt;br /&gt;
No obstante, existen tipologías híbridas o que acentúan algunos aspectos, que también detallamos en esta sección.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:OS-structure2.svg| Comparativa de distribución de funcionalidades entre distintos tipos de SO]]&lt;br /&gt;
&lt;br /&gt;
== Sistemas operativos Monolíticos ==&lt;br /&gt;
&lt;br /&gt;
Los sistema operativos monolíticos se caracterizan por emplear un núcleo que implementa la planificación de procesos, la administración de la memoria principal, la administración de ficheros y la gestión de los dispositivos de entrada/salida. Por tanto, a mayor funcionalidad implementada en el núcleo, mayor número de líneas de código que se ejecutan en modo supervisor.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos monolíticos son los predominantes hoy día, algunos ejemplos son:&lt;br /&gt;
&lt;br /&gt;
* Sistemas operativos UNIX, tales como FreeBSD, NetBSD y OpenBSD. &lt;br /&gt;
* Sistemas operativos GNU/Linux.&lt;br /&gt;
* DOS, tales como MS-DOS y DR-DOS.&lt;br /&gt;
&lt;br /&gt;
Como inconveniente, al emplear un núcleo que incluye gran parte de las funcionalidades básicas del sistema operativo, dispone de un alto número de líneas de código ejecutándose en modo supervisor. Por ello, un error de programación en el núcleo puede provocar un ''kernel panic''. Además el hecho de añadir nuevas funcionalidades provocaría una nueva recompilación del núcleo llevando a reiniciar el sistema para que se apliquen los nuevos cambios.&lt;br /&gt;
&lt;br /&gt;
Como principal ventaja, los sistemas operativo monolíticos ofrecen un alto rendimiento puesto que las peticiones entre los diferentes componentes se reducen a invocaciones de funciones.&lt;br /&gt;
&lt;br /&gt;
== Sistemas operativos Micronúcleo ==&lt;br /&gt;
&lt;br /&gt;
También conocidos como sistemas operativos exokernel o exonúcleo, se caracterizan por disponer de un núcleo que implementa únicamente:&lt;br /&gt;
&lt;br /&gt;
* Planificación de procesos&lt;br /&gt;
* Mecanismo de comunicación entre procesos&lt;br /&gt;
* Gestión de interrupciones&lt;br /&gt;
&lt;br /&gt;
Además, existen procesos servidores que están fuera del núcleo, que se ejecutan en modo usuario del procesador, y que implementan la:&lt;br /&gt;
&lt;br /&gt;
* Administración de memoria principal&lt;br /&gt;
* Administración de ficheros&lt;br /&gt;
* Gestión de dispositivos de entrada/salida.&lt;br /&gt;
&lt;br /&gt;
Siguiendo este esquema, cuando un proceso cualquiera solicita un servicio a través de una llamada al sistema, el micronúcleo canaliza la petición al proceso servidor correspondiente. Dicha comunicación se realiza mediante mensajería.&lt;br /&gt;
&lt;br /&gt;
La principal ventaja de los sistemas operativos micronúcleo es que, al ejecutar menos líneas de código en modo supervisor, de manera intuitiva son más fiables. Otras ventajas son que se garantiza el aislamiento de las partes que estan fuera del nucleo, como los modulos son independientes unos de otros, si cae alguno de ello los demas no se ven afectados y pueden seguir funcionando.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, el principal problema que presentan es el rendimiento, puesto que cualquier petición requiere mensajería, que lleva consigo un coste extra debido a la construcción de los mensajes, el reparto y la interpretación. Son estos problemas relacionados con el rendimiento los que hacen que no existan sistemas operativos micronúcleo desplegables en productivo, a excepción de Minix 2, que tiene propósitos educativos.&lt;br /&gt;
&lt;br /&gt;
== Sistemas basados en Máquinas Virtuales ==&lt;br /&gt;
&lt;br /&gt;
Implementan el material (hardware) en el software. Algunos sistemas operativos ofrecen técnicas de paravirtualización.&lt;br /&gt;
&lt;br /&gt;
Paravirtualización: técnica de programación que ofrecen algunos SO anfitrión para facilitar la virtualización y el rendimiento de máquinas virtuales. Ofrecen llamadas directas al sistema &lt;br /&gt;
o acceso a una API especial del anfitrión para acceder directamente a los recursos. Observamos que se deposita una gran confianza en los procesos de la VM por motivos de rendimiento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ventajas de las Máquinas Virtuales&lt;br /&gt;
&lt;br /&gt;
 ** Ahorro de coste material.&lt;br /&gt;
 ** Se pueden tener diferentes SO en un mismo sistema.&lt;br /&gt;
 ** Se adopta a las necesidades de usuario.&lt;br /&gt;
 ** Se puede deslocalizar la máquina virtual (deslocalización: migrar a otro SO sin sufrir ningún cambio ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Desventajas de las Maquinas Virtuales &lt;br /&gt;
 &lt;br /&gt;
 ** Rendimiento  (KVM +  paravirtualizacion 10%).&lt;br /&gt;
 ** Punto único de fallos(si falla algún componente y las aplicaciones están montadas en él provoca un fallo general).&lt;br /&gt;
&lt;br /&gt;
= Otro material a consultar =&lt;br /&gt;
&lt;br /&gt;
El estudiante puede encontrar el siguiente material de interés para complementar sus conocimientos:&lt;br /&gt;
&lt;br /&gt;
* Debate entre Linus Torvalds, creador del núcleo Linux, que sigue el paradigma monolítico y Andrew S. Tanembaum, creador de Minux, que sigue el modelo micronúcleo: http://oreilly.com/catalog/opensources/book/appa.html (en inglés).&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Modelos_de_Dise%C3%B1o_de_Sistemas_Operativos&amp;diff=456</id>
		<title>Modelos de Diseño de Sistemas Operativos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Modelos_de_Dise%C3%B1o_de_Sistemas_Operativos&amp;diff=456"/>
				<updated>2011-03-22T19:02:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ajaest: imagen SO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Modos de operación del procesador =&lt;br /&gt;
&lt;br /&gt;
Para entender los modelos de diseño de los sistemas operativos, tenemos que hacer referencia a los modos de ejecución del procesador. El modo de ejecución del procesador indica que conjunto de instrucciones y a qué recursos del procesador se puede acceder en un cierto instante de tiempo.&lt;br /&gt;
&lt;br /&gt;
En la actualidad, un procesador ofrece como mínimo dos modos de operación que son:&lt;br /&gt;
&lt;br /&gt;
* Modo supervisor, que permite la ejecución de todo el conjunto de instrucciones que ofrece el procesador.&lt;br /&gt;
* Modo usuario, que tiene algunas restricciones de acceso a aspectos del procesador o de ejecución de instrucciones.&lt;br /&gt;
&lt;br /&gt;
= Núcleo del sistema operativo =&lt;br /&gt;
&lt;br /&gt;
El núcleo del sistema operativo, también conocido por la terminología inglesa ''kernel'', es la parte más esencial del sistema operativo. Se trata de la capa visible de software más baja del sistema y provee y gestiona de forma segura los recursos del sistema a través de las llamadas al sistema.&lt;br /&gt;
&lt;br /&gt;
El núcleo de un sistema operativo suele operar en modo supervisor. Al operar en dicho modo un error de programación en el núcleo del sistema operativo puede resultar en un error fatal del cual el sistema sólo puede recuperarse mediante el reinicio del sistema. A tal error fatal también se le conoce en los sistemas operativos UNIX por la locución inglesa ''[http://es.wikipedia.org/wiki/Kernel_panic kernel panic]''.&lt;br /&gt;
&lt;br /&gt;
= Tipos de Sistemas Operativos =&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos se pueden clasificar en base a la cantidad de funcionalidad implementada en su núcleo. En general distinguimos dos tipos de sistemas operativos:&lt;br /&gt;
&lt;br /&gt;
* Monolíticos: son núcleos de gran tamaño con poca modularidad y flexibilidad pero con una gran cantidad de funcionalidades, las cuales son normalmente compiladas junto al núcleo en el mismo momento.&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. El resto de funcionalidades son añadidas mediante la adición de módulos externos al núcleo, lo que les proporciona flexibilidad y facilidad de ampliación en detrimento del desempeño necesario para la gestión dinámica de éstos.&lt;br /&gt;
&lt;br /&gt;
No obstante, existen tipologías híbridas o que acentúan algunos aspectos, que también detallamos en esta sección.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:OS-structure2.svg|thumb| Comparativa de distribución de funcionalidades entre distintos tipos de SO]]&lt;br /&gt;
&lt;br /&gt;
== Sistemas operativos Monolíticos ==&lt;br /&gt;
&lt;br /&gt;
Los sistema operativos monolíticos se caracterizan por emplear un núcleo que implementa la planificación de procesos, la administración de la memoria principal, la administración de ficheros y la gestión de los dispositivos de entrada/salida. Por tanto, a mayor funcionalidad implementada en el núcleo, mayor número de líneas de código que se ejecutan en modo supervisor.&lt;br /&gt;
&lt;br /&gt;
Los sistemas operativos monolíticos son los predominantes hoy día, algunos ejemplos son:&lt;br /&gt;
&lt;br /&gt;
* Sistemas operativos UNIX, tales como FreeBSD, NetBSD y OpenBSD. &lt;br /&gt;
* Sistemas operativos GNU/Linux.&lt;br /&gt;
* DOS, tales como MS-DOS y DR-DOS.&lt;br /&gt;
&lt;br /&gt;
Como inconveniente, al emplear un núcleo que incluye gran parte de las funcionalidades básicas del sistema operativo, dispone de un alto número de líneas de código ejecutándose en modo supervisor. Por ello, un error de programación en el núcleo puede provocar un ''kernel panic''. Además el hecho de añadir nuevas funcionalidades provocaría una nueva recompilación del núcleo llevando a reiniciar el sistema para que se apliquen los nuevos cambios.&lt;br /&gt;
&lt;br /&gt;
Como principal ventaja, los sistemas operativo monolíticos ofrecen un alto rendimiento puesto que las peticiones entre los diferentes componentes se reducen a invocaciones de funciones.&lt;br /&gt;
&lt;br /&gt;
== Sistemas operativos Micronúcleo ==&lt;br /&gt;
&lt;br /&gt;
También conocidos como sistemas operativos exokernel o exonúcleo, se caracterizan por disponer de un núcleo que implementa únicamente:&lt;br /&gt;
&lt;br /&gt;
* Planificación de procesos&lt;br /&gt;
* Mecanismo de comunicación entre procesos&lt;br /&gt;
* Gestión de interrupciones&lt;br /&gt;
&lt;br /&gt;
Además, existen procesos servidores que están fuera del núcleo, que se ejecutan en modo usuario del procesador, y que implementan la:&lt;br /&gt;
&lt;br /&gt;
* Administración de memoria principal&lt;br /&gt;
* Administración de ficheros&lt;br /&gt;
* Gestión de dispositivos de entrada/salida.&lt;br /&gt;
&lt;br /&gt;
Siguiendo este esquema, cuando un proceso cualquiera solicita un servicio a través de una llamada al sistema, el micronúcleo canaliza la petición al proceso servidor correspondiente. Dicha comunicación se realiza mediante mensajería.&lt;br /&gt;
&lt;br /&gt;
La principal ventaja de los sistemas operativos micronúcleo es que, al ejecutar menos líneas de código en modo supervisor, de manera intuitiva son más fiables. Otras ventajas son que se garantiza el aislamiento de las partes que estan fuera del nucleo, como los modulos son independientes unos de otros, si cae alguno de ello los demas no se ven afectados y pueden seguir funcionando.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, el principal problema que presentan es el rendimiento, puesto que cualquier petición requiere mensajería, que lleva consigo un coste extra debido a la construcción de los mensajes, el reparto y la interpretación. Son estos problemas relacionados con el rendimiento los que hacen que no existan sistemas operativos micronúcleo desplegables en productivo, a excepción de Minix 2, que tiene propósitos educativos.&lt;br /&gt;
&lt;br /&gt;
== Sistemas basados en Máquinas Virtuales ==&lt;br /&gt;
&lt;br /&gt;
Implementan el material (hardware) en el software. Algunos sistemas operativos ofrecen técnicas de paravirtualización.&lt;br /&gt;
&lt;br /&gt;
Paravirtualización: técnica de programación que ofrecen algunos SO anfitrión para facilitar la virtualización y el rendimiento de máquinas virtuales. Ofrecen llamadas directas al sistema &lt;br /&gt;
o acceso a una API especial del anfitrión para acceder directamente a los recursos. Observamos que se deposita una gran confianza en los procesos de la VM por motivos de rendimiento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ventajas de las Máquinas Virtuales&lt;br /&gt;
&lt;br /&gt;
 ** Ahorro de coste material.&lt;br /&gt;
 ** Se pueden tener diferentes SO en un mismo sistema.&lt;br /&gt;
 ** Se adopta a las necesidades de usuario.&lt;br /&gt;
 ** Se puede deslocalizar la máquina virtual (deslocalización: migrar a otro SO sin sufrir ningún cambio ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Desventajas de las Maquinas Virtuales &lt;br /&gt;
 &lt;br /&gt;
 ** Rendimiento  (KVM +  paravirtualizacion 10%).&lt;br /&gt;
 ** Punto único de fallos(si falla algún componente y las aplicaciones están montadas en él provoca un fallo general).&lt;br /&gt;
&lt;br /&gt;
= Otro material a consultar =&lt;br /&gt;
&lt;br /&gt;
El estudiante puede encontrar el siguiente material de interés para complementar sus conocimientos:&lt;br /&gt;
&lt;br /&gt;
* Debate entre Linus Torvalds, creador del núcleo Linux, que sigue el paradigma monolítico y Andrew S. Tanembaum, creador de Minux, que sigue el modelo micronúcleo: http://oreilly.com/catalog/opensources/book/appa.html (en inglés).&lt;/div&gt;</summary>
		<author><name>Ajaest</name></author>	</entry>

	</feed>