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

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

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=FAT&amp;diff=2359</id>
		<title>FAT</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=FAT&amp;diff=2359"/>
				<updated>2012-01-21T18:53:15Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* FAT 32 */ hiperenlace cluster&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Estructura==&lt;br /&gt;
&lt;br /&gt;
Se dispone de la tabla de asignación de ficheros (File Allocation Table, de ahí las siglas FAT) en la que cada entrada de la tabla representa un bloque del disco. Cada entrada puede tener uno de los siguientes valores:&lt;br /&gt;
&lt;br /&gt;
*Bloque libre: FREE &lt;br /&gt;
*Bloque defectuoso: BAD &lt;br /&gt;
*Último bloque de un archivo: EOF&lt;br /&gt;
*Cualquier otro número: bloque asignado, y el número es el número del siguiente bloque&lt;br /&gt;
*Entradas 0 y 1: reservadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Fat.png|Estructura FAT|center|border|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota: Si alguien quiere editar la imagen para mejorarla: [[https://docs.google.com/drawings/d/1CJlmPagvZl989yUOR41GBqZBL2afKt3gxxvYVkf57NU/edit?hl=en_US| Editar imagen]] --[[Usuario:Robertomartin|Robertomartin]] 12:19 6 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
==FAT 32==&lt;br /&gt;
&lt;br /&gt;
FAT32 fue la respuesta para superar el límite de tamaño de FAT16 al mismo tiempo que se mantenía la compatibilidad con MS-DOS en modo real. Microsoft decidió implementar una nueva generación de FAT utilizando direcciones de cluster[http://es.wikipedia.org/wiki/Cl%C3%BAster_%28sistema_de_archivos%29] de 32 bits (aunque sólo 28 de esos bits se utilizaban realmente).&lt;br /&gt;
&lt;br /&gt;
En teoría, esto debería permitir aproximadamente 268.435.538 clusters, arrojando tamaños de almacenamiento cercanos a los ocho terabytes. Sin embargo, debido a limitaciones en la utilidad ScanDisk de Microsoft, no se permite que FAT32 crezca más allá de 4.177.920 clusters por partición (es decir, unos 124 gigabytes). Posteriormente, Windows 2000 y XP situaron el límite de FAT32 en los 32 gigabytes. Microsoft afirma que es una decisión de diseño, sin embargo, es capaz de leer particiones mayores creadas por otros medios.&lt;br /&gt;
&lt;br /&gt;
FAT32 apareció por primera vez en Windows 95 OSR2. Era necesario reformatear para usar las ventajas de FAT32. Curiosamente, DriveSpace 3 (incluido con Windows 95 y 98) no lo soportaba. Windows 98 incorporó una herramienta para convertir de FAT16 a FAT32 sin pérdida de los datos. Este soporte no estuvo disponible en la línea empresarial hasta Windows 2000.&lt;br /&gt;
&lt;br /&gt;
El '''tamaño máximo de un archivo en FAT32''' es 4 gigabytes (2^32−1 bytes), lo que resulta engorroso para aplicaciones de captura y edición de video, ya que los archivos generados por éstas superan fácilmente ese límite.&lt;br /&gt;
&lt;br /&gt;
http://www.pjrc.com/tech/8051/ide/fat32.html&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=FAT&amp;diff=2358</id>
		<title>FAT</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=FAT&amp;diff=2358"/>
				<updated>2012-01-21T18:52:29Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* FAT 32 */ definicion cluster&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Estructura==&lt;br /&gt;
&lt;br /&gt;
Se dispone de la tabla de asignación de ficheros (File Allocation Table, de ahí las siglas FAT) en la que cada entrada de la tabla representa un bloque del disco. Cada entrada puede tener uno de los siguientes valores:&lt;br /&gt;
&lt;br /&gt;
*Bloque libre: FREE &lt;br /&gt;
*Bloque defectuoso: BAD &lt;br /&gt;
*Último bloque de un archivo: EOF&lt;br /&gt;
*Cualquier otro número: bloque asignado, y el número es el número del siguiente bloque&lt;br /&gt;
*Entradas 0 y 1: reservadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Fat.png|Estructura FAT|center|border|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota: Si alguien quiere editar la imagen para mejorarla: [[https://docs.google.com/drawings/d/1CJlmPagvZl989yUOR41GBqZBL2afKt3gxxvYVkf57NU/edit?hl=en_US| Editar imagen]] --[[Usuario:Robertomartin|Robertomartin]] 12:19 6 jun 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
==FAT 32==&lt;br /&gt;
&lt;br /&gt;
FAT32 fue la respuesta para superar el límite de tamaño de FAT16 al mismo tiempo que se mantenía la compatibilidad con MS-DOS en modo real. Microsoft decidió implementar una nueva generación de FAT utilizando direcciones de [http://es.wikipedia.org/wiki/Cl%C3%BAster_%28sistema_de_archivos%29|cluster] de 32 bits (aunque sólo 28 de esos bits se utilizaban realmente).&lt;br /&gt;
&lt;br /&gt;
En teoría, esto debería permitir aproximadamente 268.435.538 clusters, arrojando tamaños de almacenamiento cercanos a los ocho terabytes. Sin embargo, debido a limitaciones en la utilidad ScanDisk de Microsoft, no se permite que FAT32 crezca más allá de 4.177.920 clusters por partición (es decir, unos 124 gigabytes). Posteriormente, Windows 2000 y XP situaron el límite de FAT32 en los 32 gigabytes. Microsoft afirma que es una decisión de diseño, sin embargo, es capaz de leer particiones mayores creadas por otros medios.&lt;br /&gt;
&lt;br /&gt;
FAT32 apareció por primera vez en Windows 95 OSR2. Era necesario reformatear para usar las ventajas de FAT32. Curiosamente, DriveSpace 3 (incluido con Windows 95 y 98) no lo soportaba. Windows 98 incorporó una herramienta para convertir de FAT16 a FAT32 sin pérdida de los datos. Este soporte no estuvo disponible en la línea empresarial hasta Windows 2000.&lt;br /&gt;
&lt;br /&gt;
El '''tamaño máximo de un archivo en FAT32''' es 4 gigabytes (2^32−1 bytes), lo que resulta engorroso para aplicaciones de captura y edición de video, ya que los archivos generados por éstas superan fácilmente ese límite.&lt;br /&gt;
&lt;br /&gt;
http://www.pjrc.com/tech/8051/ide/fat32.html&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2087</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2087"/>
				<updated>2011-12-08T12:32:48Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* Implementación del control de concurrencia pesimista */ corrección2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimistas =&lt;br /&gt;
&lt;br /&gt;
Este mecanismo debe emplearse si el programador considera que la frecuencia de acceso a un recurso compartido es baja, es decir, que supone que la probabilidad de coincidencia de dos o más procesos al recurso compartido es baja.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código ejecutado por dos hilos: h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; de un mismo proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int tabla[3] = { 100, 101, 102 };  /* tabla compartida por ambos hilos hx y hy. */&lt;br /&gt;
&lt;br /&gt;
/* actividad del hilo */&lt;br /&gt;
void *actividad_hilo(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
&lt;br /&gt;
        while(1) {&lt;br /&gt;
            for (i=0; i&amp;lt;3; i++) {&lt;br /&gt;
                  actualiza_tabla(i);&lt;br /&gt;
                  sleep((random() % 10) + 1);    /* hilo pasa a estado bloqueado durante 1 a 10 segundos. */&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
        pthread_create(&amp;amp;hilo1, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_create(&amp;amp;hilo2, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_join(hilo1, NULL);&lt;br /&gt;
        pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void actualiza_tabla(int i) {&lt;br /&gt;
        int tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = tabla[i];            /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                     /* actualizo la varible temporal. */&lt;br /&gt;
        if (tabla[i]+1 != tmp) {   /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;            /* mientras operaba con la variable temporal. */&lt;br /&gt;
        }&lt;br /&gt;
        tabla[i]=tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo son dos:&lt;br /&gt;
&lt;br /&gt;
* Se consume más memoria, pues hay que realizar una copia del recurso compartido para efectuar la actualización.&lt;br /&gt;
* En situaciones de coincidencia, se tiene que volver a realizar la operación, por tanto, se desperdician recursos de procesamiento.&lt;br /&gt;
&lt;br /&gt;
En base al ejemplo anterior, hay que garantizar que la operación de comprobación y actualización es '''atómica'''. Se dice que una operación es '''atómica''' cuando es indivisible, es decir, que no quedamos en una situación intermedia al ejecutar dicha operación.&lt;br /&gt;
&lt;br /&gt;
Como ventaja, este tipo de mecanismo nos ofrece un mayor grado de paralelismo, por tanto, una mayor tasa de transferencia, siempre que se emplee en una situación donde la frecuencia de concurrencia sea baja.&lt;br /&gt;
&lt;br /&gt;
Por último, si el programador ha empleado una aproximación optimista para una situación en la que la frecuencia de coincidencia es alta, podría darse el caso de que un hilo no progrese en su ejecución de manera indefinida, al tener que volver a reintentar la actualización una y otra vez hasta conseguirlo sin que haya concurrencia.&lt;br /&gt;
&lt;br /&gt;
= Pesimista =&lt;br /&gt;
Este mecanismo debe emplearse si se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
&lt;br /&gt;
En este mecanismo disponemos de tres partes:&lt;br /&gt;
&lt;br /&gt;
* El protocolo de entrada, en el que se emplea un mecanismo que no permite continuar con la ejecución si otro u otros procesos están accediendo al recurso compartido.&lt;br /&gt;
* La sección crítica, en el que se se realizan las operaciones pertinentes con el recurso compartido.&lt;br /&gt;
* El protocolo de salida, en el que se vuelve a permitir el acceso al recurso compartido.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra como se implementa el control de concurrencia pesimista para 2 hilos, h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int compartida = 1;&lt;br /&gt;
   protocolo_de_entrada();     /* no permito acceso a variable compartida. */&lt;br /&gt;
   compartida++;               /* sección crítica: actualización de la variable compartida. */&lt;br /&gt;
   protocolo_de_salida();      /* vuelvo a permitir acceso a la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los protocolos de entrada y salida son, generalmente, operaciones costosas en términos de recursos de procesamiento pues requieren el uso de instrucciones atómicas cuyo tiempo de ejecución es alto.&lt;br /&gt;
&lt;br /&gt;
Por último, se podría emplear un control de concurrencia pesimista para resolver un problema que se resuelve con un control de concurrencia optimista, pero no al revés.&lt;br /&gt;
&lt;br /&gt;
== Implementación del control de concurrencia pesimista ==&lt;br /&gt;
&lt;br /&gt;
El control de concurrencia pesimista se puede implementar de dos formas mediante:&lt;br /&gt;
&lt;br /&gt;
* Espera ocupada o activa, mediante '''cerrojos'''. En este mecanismo se comprueba continuamente la condición que permite franquear en el protocolo de entrada, por tanto, el proceso permanece en estado activo comprobando continuadamente la condición que le permite progresar en su ejecución, tiempo que está siendo desaprovechado por el procesador.&lt;br /&gt;
* Espera no ocupada o bloqueante, mediante '''semáforos''', '''monitores''' o '''mensajería'''. Estos mecanismos hacen que el proceso pase a estado bloqueado cuando no se puede franquear el protocolo de entrada, por tanto, al quedar un proceso que no puede progresar en estado bloqueado, el planificador de procesos tiene que seleccionar a otro proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota aclarativa: Definición de ''espera ocupada o activa''&lt;br /&gt;
&lt;br /&gt;
Esperar a que algo ocurra realizando continuas comprobaciones.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
            …&lt;br /&gt;
            variable= 0;&lt;br /&gt;
            while(variable==0);&lt;br /&gt;
            …&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2086</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2086"/>
				<updated>2011-12-08T12:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* Implementación del control de concurrencia pesimista */ resalto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimistas =&lt;br /&gt;
&lt;br /&gt;
Este mecanismo debe emplearse si el programador considera que la frecuencia de acceso a un recurso compartido es baja, es decir, que supone que la probabilidad de coincidencia de dos o más procesos al recurso compartido es baja.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código ejecutado por dos hilos: h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; de un mismo proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int tabla[3] = { 100, 101, 102 };  /* tabla compartida por ambos hilos hx y hy. */&lt;br /&gt;
&lt;br /&gt;
/* actividad del hilo */&lt;br /&gt;
void *actividad_hilo(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
&lt;br /&gt;
        while(1) {&lt;br /&gt;
            for (i=0; i&amp;lt;3; i++) {&lt;br /&gt;
                  actualiza_tabla(i);&lt;br /&gt;
                  sleep((random() % 10) + 1);    /* hilo pasa a estado bloqueado durante 1 a 10 segundos. */&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
        pthread_create(&amp;amp;hilo1, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_create(&amp;amp;hilo2, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_join(hilo1, NULL);&lt;br /&gt;
        pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void actualiza_tabla(int i) {&lt;br /&gt;
        int tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = tabla[i];            /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                     /* actualizo la varible temporal. */&lt;br /&gt;
        if (tabla[i]+1 != tmp) {   /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;            /* mientras operaba con la variable temporal. */&lt;br /&gt;
        }&lt;br /&gt;
        tabla[i]=tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo son dos:&lt;br /&gt;
&lt;br /&gt;
* Se consume más memoria, pues hay que realizar una copia del recurso compartido para efectuar la actualización.&lt;br /&gt;
* En situaciones de coincidencia, se tiene que volver a realizar la operación, por tanto, se desperdician recursos de procesamiento.&lt;br /&gt;
&lt;br /&gt;
En base al ejemplo anterior, hay que garantizar que la operación de comprobación y actualización es '''atómica'''. Se dice que una operación es '''atómica''' cuando es indivisible, es decir, que no quedamos en una situación intermedia al ejecutar dicha operación.&lt;br /&gt;
&lt;br /&gt;
Como ventaja, este tipo de mecanismo nos ofrece un mayor grado de paralelismo, por tanto, una mayor tasa de transferencia, siempre que se emplee en una situación donde la frecuencia de concurrencia sea baja.&lt;br /&gt;
&lt;br /&gt;
Por último, si el programador ha empleado una aproximación optimista para una situación en la que la frecuencia de coincidencia es alta, podría darse el caso de que un hilo no progrese en su ejecución de manera indefinida, al tener que volver a reintentar la actualización una y otra vez hasta conseguirlo sin que haya concurrencia.&lt;br /&gt;
&lt;br /&gt;
= Pesimista =&lt;br /&gt;
Este mecanismo debe emplearse si se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
&lt;br /&gt;
En este mecanismo disponemos de tres partes:&lt;br /&gt;
&lt;br /&gt;
* El protocolo de entrada, en el que se emplea un mecanismo que no permite continuar con la ejecución si otro u otros procesos están accediendo al recurso compartido.&lt;br /&gt;
* La sección crítica, en el que se se realizan las operaciones pertinentes con el recurso compartido.&lt;br /&gt;
* El protocolo de salida, en el que se vuelve a permitir el acceso al recurso compartido.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra como se implementa el control de concurrencia pesimista para 2 hilos, h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int compartida = 1;&lt;br /&gt;
   protocolo_de_entrada();     /* no permito acceso a variable compartida. */&lt;br /&gt;
   compartida++;               /* sección crítica: actualización de la variable compartida. */&lt;br /&gt;
   protocolo_de_salida();      /* vuelvo a permitir acceso a la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los protocolos de entrada y salida son, generalmente, operaciones costosas en términos de recursos de procesamiento pues requieren el uso de instrucciones atómicas cuyo tiempo de ejecución es alto.&lt;br /&gt;
&lt;br /&gt;
Por último, se podría emplear un control de concurrencia pesimista para resolver un problema que se resuelve con un control de concurrencia optimista, pero no al revés.&lt;br /&gt;
&lt;br /&gt;
== Implementación del control de concurrencia pesimista ==&lt;br /&gt;
&lt;br /&gt;
El control de concurrencia pesimista se puede implementar de dos formas mediante:&lt;br /&gt;
&lt;br /&gt;
* Espera ocupada o activa, mediante '''cerrojos'''. En este mecanismo se comprueba continuamente la condición que permite franquear en el protocolo de entrada, por tanto, el proceso permanece en estado activo comprobando continuadamente la condición que le permite progresar en su ejecución, tiempo que está siendo desaprovechado por el procesador.&lt;br /&gt;
* Espera no ocupada o bloqueante, mediante '''semáforos''', '''monitores''' o '''mensajería'''. Estos mecanismos hacen que el proceso pase a estado bloqueado cuando no se puede franquear el protocolo de entrada, por tanto, al quedar un proceso que no puede progresar en estado bloqueado, el planificador de procesos tiene que seleccionar a otro proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTA ACLARATIVA: Definición de ''espera ocupada o activa''&lt;br /&gt;
&lt;br /&gt;
Esperar a que algo ocurra realizando continuas comprobaciones.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
            …&lt;br /&gt;
            variable= 0;&lt;br /&gt;
            while(variable==0);&lt;br /&gt;
            …&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2085</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2085"/>
				<updated>2011-12-08T12:31:22Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* Implementación del control de concurrencia pesimista */ corrección&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimistas =&lt;br /&gt;
&lt;br /&gt;
Este mecanismo debe emplearse si el programador considera que la frecuencia de acceso a un recurso compartido es baja, es decir, que supone que la probabilidad de coincidencia de dos o más procesos al recurso compartido es baja.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código ejecutado por dos hilos: h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; de un mismo proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int tabla[3] = { 100, 101, 102 };  /* tabla compartida por ambos hilos hx y hy. */&lt;br /&gt;
&lt;br /&gt;
/* actividad del hilo */&lt;br /&gt;
void *actividad_hilo(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
&lt;br /&gt;
        while(1) {&lt;br /&gt;
            for (i=0; i&amp;lt;3; i++) {&lt;br /&gt;
                  actualiza_tabla(i);&lt;br /&gt;
                  sleep((random() % 10) + 1);    /* hilo pasa a estado bloqueado durante 1 a 10 segundos. */&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
        pthread_create(&amp;amp;hilo1, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_create(&amp;amp;hilo2, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_join(hilo1, NULL);&lt;br /&gt;
        pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void actualiza_tabla(int i) {&lt;br /&gt;
        int tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = tabla[i];            /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                     /* actualizo la varible temporal. */&lt;br /&gt;
        if (tabla[i]+1 != tmp) {   /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;            /* mientras operaba con la variable temporal. */&lt;br /&gt;
        }&lt;br /&gt;
        tabla[i]=tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo son dos:&lt;br /&gt;
&lt;br /&gt;
* Se consume más memoria, pues hay que realizar una copia del recurso compartido para efectuar la actualización.&lt;br /&gt;
* En situaciones de coincidencia, se tiene que volver a realizar la operación, por tanto, se desperdician recursos de procesamiento.&lt;br /&gt;
&lt;br /&gt;
En base al ejemplo anterior, hay que garantizar que la operación de comprobación y actualización es '''atómica'''. Se dice que una operación es '''atómica''' cuando es indivisible, es decir, que no quedamos en una situación intermedia al ejecutar dicha operación.&lt;br /&gt;
&lt;br /&gt;
Como ventaja, este tipo de mecanismo nos ofrece un mayor grado de paralelismo, por tanto, una mayor tasa de transferencia, siempre que se emplee en una situación donde la frecuencia de concurrencia sea baja.&lt;br /&gt;
&lt;br /&gt;
Por último, si el programador ha empleado una aproximación optimista para una situación en la que la frecuencia de coincidencia es alta, podría darse el caso de que un hilo no progrese en su ejecución de manera indefinida, al tener que volver a reintentar la actualización una y otra vez hasta conseguirlo sin que haya concurrencia.&lt;br /&gt;
&lt;br /&gt;
= Pesimista =&lt;br /&gt;
Este mecanismo debe emplearse si se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
&lt;br /&gt;
En este mecanismo disponemos de tres partes:&lt;br /&gt;
&lt;br /&gt;
* El protocolo de entrada, en el que se emplea un mecanismo que no permite continuar con la ejecución si otro u otros procesos están accediendo al recurso compartido.&lt;br /&gt;
* La sección crítica, en el que se se realizan las operaciones pertinentes con el recurso compartido.&lt;br /&gt;
* El protocolo de salida, en el que se vuelve a permitir el acceso al recurso compartido.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra como se implementa el control de concurrencia pesimista para 2 hilos, h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int compartida = 1;&lt;br /&gt;
   protocolo_de_entrada();     /* no permito acceso a variable compartida. */&lt;br /&gt;
   compartida++;               /* sección crítica: actualización de la variable compartida. */&lt;br /&gt;
   protocolo_de_salida();      /* vuelvo a permitir acceso a la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los protocolos de entrada y salida son, generalmente, operaciones costosas en términos de recursos de procesamiento pues requieren el uso de instrucciones atómicas cuyo tiempo de ejecución es alto.&lt;br /&gt;
&lt;br /&gt;
Por último, se podría emplear un control de concurrencia pesimista para resolver un problema que se resuelve con un control de concurrencia optimista, pero no al revés.&lt;br /&gt;
&lt;br /&gt;
== Implementación del control de concurrencia pesimista ==&lt;br /&gt;
&lt;br /&gt;
El control de concurrencia pesimista se puede implementar de dos formas mediante:&lt;br /&gt;
&lt;br /&gt;
* Espera ocupada o activa, mediante '''cerrojos'''. En este mecanismo se comprueba continuamente la condición que permite franquear en el protocolo de entrada, por tanto, el proceso permanece en estado activo comprobando continuadamente la condición que le permite progresar en su ejecución, tiempo que está siendo desaprovechado por el procesador.&lt;br /&gt;
* Espera no ocupada o bloqueante, mediante '''semáforos''', '''monitores''' o '''mensajería'''. Estos mecanismos hacen que el proceso pase a estado bloqueado cuando no se puede franquear el protocolo de entrada, por tanto, al quedar un proceso que no puede progresar en estado bloqueado, el planificador de procesos tiene que seleccionar a otro proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTA ACLARATIVA: Definición de [[espera ocupada o activa]]&lt;br /&gt;
&lt;br /&gt;
Esperar a que algo ocurra realizando continuas comprobaciones.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
            …&lt;br /&gt;
            variable= 0;&lt;br /&gt;
            while(variable==0);&lt;br /&gt;
            …&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2084</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2084"/>
				<updated>2011-12-08T12:30:52Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* Implementación del control de concurrencia pesimista */ espera&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimistas =&lt;br /&gt;
&lt;br /&gt;
Este mecanismo debe emplearse si el programador considera que la frecuencia de acceso a un recurso compartido es baja, es decir, que supone que la probabilidad de coincidencia de dos o más procesos al recurso compartido es baja.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código ejecutado por dos hilos: h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; de un mismo proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int tabla[3] = { 100, 101, 102 };  /* tabla compartida por ambos hilos hx y hy. */&lt;br /&gt;
&lt;br /&gt;
/* actividad del hilo */&lt;br /&gt;
void *actividad_hilo(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
&lt;br /&gt;
        while(1) {&lt;br /&gt;
            for (i=0; i&amp;lt;3; i++) {&lt;br /&gt;
                  actualiza_tabla(i);&lt;br /&gt;
                  sleep((random() % 10) + 1);    /* hilo pasa a estado bloqueado durante 1 a 10 segundos. */&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
        pthread_create(&amp;amp;hilo1, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_create(&amp;amp;hilo2, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_join(hilo1, NULL);&lt;br /&gt;
        pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void actualiza_tabla(int i) {&lt;br /&gt;
        int tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = tabla[i];            /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                     /* actualizo la varible temporal. */&lt;br /&gt;
        if (tabla[i]+1 != tmp) {   /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;            /* mientras operaba con la variable temporal. */&lt;br /&gt;
        }&lt;br /&gt;
        tabla[i]=tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo son dos:&lt;br /&gt;
&lt;br /&gt;
* Se consume más memoria, pues hay que realizar una copia del recurso compartido para efectuar la actualización.&lt;br /&gt;
* En situaciones de coincidencia, se tiene que volver a realizar la operación, por tanto, se desperdician recursos de procesamiento.&lt;br /&gt;
&lt;br /&gt;
En base al ejemplo anterior, hay que garantizar que la operación de comprobación y actualización es '''atómica'''. Se dice que una operación es '''atómica''' cuando es indivisible, es decir, que no quedamos en una situación intermedia al ejecutar dicha operación.&lt;br /&gt;
&lt;br /&gt;
Como ventaja, este tipo de mecanismo nos ofrece un mayor grado de paralelismo, por tanto, una mayor tasa de transferencia, siempre que se emplee en una situación donde la frecuencia de concurrencia sea baja.&lt;br /&gt;
&lt;br /&gt;
Por último, si el programador ha empleado una aproximación optimista para una situación en la que la frecuencia de coincidencia es alta, podría darse el caso de que un hilo no progrese en su ejecución de manera indefinida, al tener que volver a reintentar la actualización una y otra vez hasta conseguirlo sin que haya concurrencia.&lt;br /&gt;
&lt;br /&gt;
= Pesimista =&lt;br /&gt;
Este mecanismo debe emplearse si se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
&lt;br /&gt;
En este mecanismo disponemos de tres partes:&lt;br /&gt;
&lt;br /&gt;
* El protocolo de entrada, en el que se emplea un mecanismo que no permite continuar con la ejecución si otro u otros procesos están accediendo al recurso compartido.&lt;br /&gt;
* La sección crítica, en el que se se realizan las operaciones pertinentes con el recurso compartido.&lt;br /&gt;
* El protocolo de salida, en el que se vuelve a permitir el acceso al recurso compartido.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra como se implementa el control de concurrencia pesimista para 2 hilos, h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int compartida = 1;&lt;br /&gt;
   protocolo_de_entrada();     /* no permito acceso a variable compartida. */&lt;br /&gt;
   compartida++;               /* sección crítica: actualización de la variable compartida. */&lt;br /&gt;
   protocolo_de_salida();      /* vuelvo a permitir acceso a la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los protocolos de entrada y salida son, generalmente, operaciones costosas en términos de recursos de procesamiento pues requieren el uso de instrucciones atómicas cuyo tiempo de ejecución es alto.&lt;br /&gt;
&lt;br /&gt;
Por último, se podría emplear un control de concurrencia pesimista para resolver un problema que se resuelve con un control de concurrencia optimista, pero no al revés.&lt;br /&gt;
&lt;br /&gt;
== Implementación del control de concurrencia pesimista ==&lt;br /&gt;
&lt;br /&gt;
El control de concurrencia pesimista se puede implementar de dos formas mediante:&lt;br /&gt;
&lt;br /&gt;
* Espera ocupada o activa, mediante '''cerrojos'''. En este mecanismo se comprueba continuamente la condición que permite franquear en el protocolo de entrada, por tanto, el proceso permanece en estado activo comprobando continuadamente la condición que le permite progresar en su ejecución, tiempo que está siendo desaprovechado por el procesador.&lt;br /&gt;
* Espera no ocupada o bloqueante, mediante '''semáforos''', '''monitores''' o '''mensajería'''. Estos mecanismos hacen que el proceso pase a estado bloqueado cuando no se puede franquear el protocolo de entrada, por tanto, al quedar un proceso que no puede progresar en estado bloqueado, el planificador de procesos tiene que seleccionar a otro proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTA ACLARATIVA: Definición de &lt;br /&gt;
----&lt;br /&gt;
espera ocupada o activa&lt;br /&gt;
&lt;br /&gt;
Esperar a que algo ocurra realizando continuas comprobaciones.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
            …&lt;br /&gt;
            variable= 0;&lt;br /&gt;
            while(variable==0);&lt;br /&gt;
            …&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2083</id>
		<title>Mecanismos de sincronización</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Mecanismos_de_sincronizaci%C3%B3n&amp;diff=2083"/>
				<updated>2011-12-08T12:29:23Z</updated>
		
		<summary type="html">&lt;p&gt;Antdomflo: /* Implementación del control de concurrencia pesimista */ aclaracion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimistas =&lt;br /&gt;
&lt;br /&gt;
Este mecanismo debe emplearse si el programador considera que la frecuencia de acceso a un recurso compartido es baja, es decir, que supone que la probabilidad de coincidencia de dos o más procesos al recurso compartido es baja.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código ejecutado por dos hilos: h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; de un mismo proceso.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int tabla[3] = { 100, 101, 102 };  /* tabla compartida por ambos hilos hx y hy. */&lt;br /&gt;
&lt;br /&gt;
/* actividad del hilo */&lt;br /&gt;
void *actividad_hilo(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
&lt;br /&gt;
        while(1) {&lt;br /&gt;
            for (i=0; i&amp;lt;3; i++) {&lt;br /&gt;
                  actualiza_tabla(i);&lt;br /&gt;
                  sleep((random() % 10) + 1);    /* hilo pasa a estado bloqueado durante 1 a 10 segundos. */&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
        pthread_t hilo1, hilo2;&lt;br /&gt;
&lt;br /&gt;
        pthread_create(&amp;amp;hilo1, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_create(&amp;amp;hilo2, NULL, actividad_hilo, NULL);  /* creación hilo&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;. */&lt;br /&gt;
        pthread_join(hilo1, NULL);&lt;br /&gt;
        pthread_join(hilo2, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void actualiza_tabla(int i) {&lt;br /&gt;
        int tmp;&lt;br /&gt;
retry:&lt;br /&gt;
        tmp = tabla[i];            /* almaceno el valor de la variable compartida en una temporal. */&lt;br /&gt;
        tmp++;                     /* actualizo la varible temporal. */&lt;br /&gt;
        if (tabla[i]+1 != tmp) {   /* compruebo si la variable compartida ha sido modificada */&lt;br /&gt;
            goto retry;            /* mientras operaba con la variable temporal. */&lt;br /&gt;
        }&lt;br /&gt;
        tabla[i]=tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los inconvenientes de este tipo de mecanismo son dos:&lt;br /&gt;
&lt;br /&gt;
* Se consume más memoria, pues hay que realizar una copia del recurso compartido para efectuar la actualización.&lt;br /&gt;
* En situaciones de coincidencia, se tiene que volver a realizar la operación, por tanto, se desperdician recursos de procesamiento.&lt;br /&gt;
&lt;br /&gt;
En base al ejemplo anterior, hay que garantizar que la operación de comprobación y actualización es '''atómica'''. Se dice que una operación es '''atómica''' cuando es indivisible, es decir, que no quedamos en una situación intermedia al ejecutar dicha operación.&lt;br /&gt;
&lt;br /&gt;
Como ventaja, este tipo de mecanismo nos ofrece un mayor grado de paralelismo, por tanto, una mayor tasa de transferencia, siempre que se emplee en una situación donde la frecuencia de concurrencia sea baja.&lt;br /&gt;
&lt;br /&gt;
Por último, si el programador ha empleado una aproximación optimista para una situación en la que la frecuencia de coincidencia es alta, podría darse el caso de que un hilo no progrese en su ejecución de manera indefinida, al tener que volver a reintentar la actualización una y otra vez hasta conseguirlo sin que haya concurrencia.&lt;br /&gt;
&lt;br /&gt;
= Pesimista =&lt;br /&gt;
Este mecanismo debe emplearse si se considera que la frecuencia de acceso al recurso compartido es alta.&lt;br /&gt;
&lt;br /&gt;
En este mecanismo disponemos de tres partes:&lt;br /&gt;
&lt;br /&gt;
* El protocolo de entrada, en el que se emplea un mecanismo que no permite continuar con la ejecución si otro u otros procesos están accediendo al recurso compartido.&lt;br /&gt;
* La sección crítica, en el que se se realizan las operaciones pertinentes con el recurso compartido.&lt;br /&gt;
* El protocolo de salida, en el que se vuelve a permitir el acceso al recurso compartido.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra como se implementa el control de concurrencia pesimista para 2 hilos, h&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; y h&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int compartida = 1;&lt;br /&gt;
   protocolo_de_entrada();     /* no permito acceso a variable compartida. */&lt;br /&gt;
   compartida++;               /* sección crítica: actualización de la variable compartida. */&lt;br /&gt;
   protocolo_de_salida();      /* vuelvo a permitir acceso a la variable compartida. */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los protocolos de entrada y salida son, generalmente, operaciones costosas en términos de recursos de procesamiento pues requieren el uso de instrucciones atómicas cuyo tiempo de ejecución es alto.&lt;br /&gt;
&lt;br /&gt;
Por último, se podría emplear un control de concurrencia pesimista para resolver un problema que se resuelve con un control de concurrencia optimista, pero no al revés.&lt;br /&gt;
&lt;br /&gt;
== Implementación del control de concurrencia pesimista ==&lt;br /&gt;
&lt;br /&gt;
El control de concurrencia pesimista se puede implementar de dos formas mediante:&lt;br /&gt;
&lt;br /&gt;
* Espera ocupada o activa, mediante '''cerrojos'''. En este mecanismo se comprueba continuamente la condición que permite franquear en el protocolo de entrada, por tanto, el proceso permanece en estado activo comprobando continuadamente la condición que le permite progresar en su ejecución, tiempo que está siendo desaprovechado por el procesador.&lt;br /&gt;
* Espera no ocupada o bloqueante, mediante '''semáforos''', '''monitores''' o '''mensajería'''. Estos mecanismos hacen que el proceso pase a estado bloqueado cuando no se puede franquear el protocolo de entrada, por tanto, al quedar un proceso que no puede progresar en estado bloqueado, el planificador de procesos tiene que seleccionar a otro proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA ACLARATIVA:'' (Definición de espera ocupada o activa)&lt;br /&gt;
&lt;br /&gt;
Esperar a que algo ocurra realizando continuas comprobaciones.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
            …&lt;br /&gt;
            variable= 0;&lt;br /&gt;
            while(variable==0);&lt;br /&gt;
            …&lt;/div&gt;</summary>
		<author><name>Antdomflo</name></author>	</entry>

	</feed>