PROCESOS
Cambio de Contexto: El proceso deja de ejecutarse y era necesario almacenarlo y luego cuando la
reanudáramos comenzar en ese punto.
Cuando llega una interrupción ( altera la secuencia de ejecución en el procesador) el sistema operativo toma el
control y analiza que interrupción ha llegado y llama a la rutina de tratamiento de interrupción adecuada y esta
hará alguna cosa.
• Crear un proceso: El sistema operativo le asignará un identificador, un bloque de control de proceso libre,
y un campo de prioridad.
• Destruir un proceso: Tienen un identificador de proceso que es el que se elimina y hay que liberar el
bloque de control correspondiente. Si tiene recursos hay que liberarlos antes de liberar el espacio de bloque
de control.
• Modificar la prioridad del proceso: Solo se puede modificar la prioridad hacia abajo.
• Suspender y reanudar un proceso: Un proceso, suspendido sigue estando en el sistema sigue estando en el
bloque de control de proceso, a diferencia del que está eliminado.
• Retardar un proceso: Un tiempo determinado, útil cuando queremos cumplir plazos de tiempo.
• Leer los atributos de un proceso:
• Dividir y unir un proceso: ( ForK − Join )
Un proceso es la unidad a la que se le asignan los recursos del sistema, unidad de expedición de trabajos al
procesador. Por debajo del proceso hay una parte más pequeña que la denominamos HILO o HEBRA.
El hilo o la hebra se conoce como proceso ligero. La unidad de asignación es el proceso pero la unidad de
expedición son los hilos o las hebras.
Al cargar un proceso cargo el contexto de ese proceso, y tengo varios hilos al ejecutarse el proceso se ejecutan
los hilos y si se interrumpe un hilo continuamos con otro hilo y así no es necesario hacer un cambio de
contexto.
Proceso
La ventaja de tener uno o más hilos es como tener varios caminos al ejecutar un proceso. Si uno se bloquea,
ejecutamos otros hilos que no estén bloqueados, así no tenemos que manejar tanta información en un cambio
de contexto.
1
La tarea la vamos a asignar un espacio de direcciones que contienen la imagen de la tarea y le asignamos un
acceso protegido.
A cada uno de los hilos le asignamos un estado de ejecución, contexto, pila de ejecución, variables locales,
acceso a la memoria y los recursos de la tarea.
La unidad de expedición de la CPU es ahora los hilos o sea que le mandamos los hilos a la CPU. Y la unidad
de asignación de recursos es ahora la TAREA.
Ej:
Tenemos un sistema de adquisición de datos que supervisa de forma continua un proceso físico para registrar
su comportamiento y para identificar e informar sobre cambios significativos a un operador. El programa
toma datos de entrada los archiva en disco, efectúa alguna operación sobre ellos e informa mediante su
impresión.
Primera tarea
Segunda Tarea
Tercera Tarea
Impresión.
Cuarta tarea.
Otra forma de hacerlo sería ver si puedo solapar algunas tareas así tardaría menos tiempo.
La operación de guardar y la operación de calculo son independientes por lo que se pueden hacer
independientemente. Por lo que se pueden ejecutar de forma concurrente.
R = leer
G = guardar
C = calcular
I = imprimir
Tenemos a= x + y
b=z+1
c=a−b
Nos imaginamos que es un programa. ¿ Qué partes se pueden ejecutar a la vez?, a simple vista el tercero no se
2
puede ejecutar con ninguno de los anteriores a la vez ya que necesita de ellos para obtener su resultado, y los
dos primeros se pueden realizar a la vez. Para verlo más fiablemente veremos cuando dos procesos pueden
ejecutarse a la vez de forma concurrente.
Conjunto de lectura de una sentencia: ( R ( Si)) Conjunto de todas las variables cuyos valores son
referenciados durante la ejecución de la instrucción (Si).
Conjunto de escritura de una sentencia: ( W ( Si)) Conjunto de todas las variables cuyos valores cambian en
la instrucción (Si) durante su ejecución.
Ej: tenemos a = x + y.
R ( a= x + y ) = sería la ( x, y)
W(a= x + y ) = sería la ( a)
Ej:
W ( a = a+1) = sería la ( a)
R( a = a+1) = sería la ( a )
El conjunto de lectura puede ser vacío. Como por ejemplo Read (a ) será vacío porque no está referenciada
antes.
BERNSTEIN propuso que para saber si 2 instrucciones eran concurrentes o no debían cumplirse 3
condiciones y todas ellas que son:
• La intersección del conjunto de lectura de la primera instrucción con el conjunto de escritura de la segunda
tenía que ser el conjunto vacío.
• La intersección del conjunto de escritura de la primera instrucción con el conjunto de lectura de la segunda
tenía que ser el conjunto vacío.
• La intersección del conjunto de escritura de las 2 instrucciones tenía que ser igual al conjunto vacío.
3
Tienen que cumplirse las 3 instrucciones para que sean concurrentes.
Ejemplo:
1º ) R ( S1) = ( x , y ) W ( S2) = ( b)
2º ) W ( S1) = ( a ) R ( S1) = ( z )
3º ) W ( S1) = ( a ) W ( S2) = ( b )
Otro ejemplo:
Tenemos ahora los conjuntos de escritura y de lectura siguientes que correspondes a S1 y a S3 .Después
aplicamos la intersección.( " ).
2º ) nos da ( a)
GRAFOS DE PREFERENCIA.
Los grafos de preferencia es un grafo acíclico orientado cuyos nodos corresponden a sentencias individuales.
Un arco desde una sentencia Si hasta el nodo que representa el nodo Sj significa que Sj solamente puede
ejecutarse cuando halla finalizado Si .
Tiene que ser acíclico ya que en este caso ocurriría que Sj no se puede ejecutar hasta que no se haya ejecutado
4
SK pero SK no se ejecuta hasta que Sj no se haya ejecutado y este caso es imposible.
Dibujo 1.
Si quiero dividir tengo que utilizar la sentencia FORK y si quiero unir tengo que utilizar la sentencia JOIN.
El FORK lleva una etiqueta asociada por ejemplo L y cuando el sistema encuentra el FORK ejecuta por un
lado la instrucción que se encuentra asociada a la etiqueta L, y por otro lado ejecuta de forma concurrente ( a
la vez ) la instrucción siguiente a la instrucción.
En el ( dibujo 1) sería:
Fork L1 ( La L1 es la etiqueta)
S2 ( es la sentencia siguiente a la de S1 )
L1 : S3
Donde s1, s2 etc son sentencias de un proceso. Y las dos ramas pueden ser hilos.
Dibujo 2
El programa quedaría:
S1
Fork L1
S2
5
S4
L1 : S3
S5
Ejecuto el programa y tengo S1 me encuentro con un Fork y cojo el de la etiqueta por lo que ejecuto el S3 y
S5 y a continuación se toma la sentencia siguiente al fork S2 y S4.
El JOIN lleva asociado siempre un contador que se inicializa a un valor que es igual al número de
computaciones concurrentes que queremos unir.
Necesitamos que las 2 bifurcaciones lleguen a la vez para poder ejecutarse y así utilizamos el contador y de
esta manera desecha el proceso que llegue antes.
La variable contador la decrementamos en una unidad y eso lo hace el Join y a continuación comprobamos el
valor del contador. Si el cont " 0 el proceso que ejecuta es Join termina.
Suponemos que llegamos antes por la izquierda que por la derecha inicializamos el contador a 2 porque
queremos unir 2 caminos o ramas diferentes, y así cuando llegue cont=0 se destruye o se quita el proceso y así
la última rama que llegue finalizará el programa En el caso del (dibujo 2) ejecutará el proceso S6.
Tenemos el dibujo 2 de antes que no estaba acabado, yo tengo que colocar un Join en el programa ya que
tengo que unir S4 y S5, imaginamos que le ponemos después de la instrucción S4 por lo que el S4 será quien
ejecute la sentencia S6 ya que tengo que saltar del S4 al J1 y después se ejecutará el S6 y para esto tengo que
poner un go to. El contador se inicializa al principio.
Ejercicio de ejemplo. L1
L2 J1
El contador de este grafo será tres porque tengo que unir tres flechas.
Cont = 3
S1
Fork L1
S2
S4
Fork L2
S5
Go to J1 cont = 2
6
L1 : S3
Go to J1 cont = 1
L2 : S6 con = 0
J1 : join cont
S7
Ejemplo 2:
Cont 1 = 2
Cont 2 = 2
S1
Fork L1
S2
S4
Fork J1
S5
Go to J2
L1 : S3
J1 : join cont 1
S6
J2 : join cont 2
S7
Cont 1 = 2
Cont 2 = 2
Cont 3 = 2
Fork L1
S1
7
For J1
S3
Go to J2
L1 : S2
Fork L2
J1 : join cont 1
S4
Fork J3
J2 : join cont 2
S6
Go to fin
L2 : S5
J3 : join cont 3
S7
Fin
S1
Fork L1
Fork L2
S2
Go to
L1 : S3
Go to
L2 : S4
Donde le estamos diciendo con el Fork L1 que a la vez que hace S3 haga el Fork L2 y a su vez este fork L2
dice que haga S4 y también la siguiente instrucción que es S2.
EJERCICIO PROPUESTO.
8
Cont 1 = 2
Cont 1 = 2 Cont 3 = 2
Cont 2 = 2 Cont 4 = 2
Cont 3 = 2 Fork L1
Cont 4 = 2 S1
Fork L1 Fork L2
S1 S3
Fork L2 Go to J1
S3 L1 : S2
Go to J1 S5
L2 : S4 Fork L3
S6 Fork L4
J1 : join cont 1 SA
S9 Go to J2
Go to J2 L2 : S4
L1 : S2 S6
S5 Go to J1
Fork L3 L3 : S8
Fork L4 Go to J3
SA L4 : S7
Go to J3 J3 : join cont 3
L3 : S8 SB
Go to J4 Go to J4
L4 : S7 J1 : join cont 1
J4 : join cont 2 S9
9
SB J4 : join cont 4
J3 : join cont 3 SD
SC
J2 : join cont 4
SD
EJERCICIOS.
L1
L2 L3
C1 C2 C3
J1 J2 J3 L4
C4 J4 C5 J5 C6
Cont 4 = con5 = 3
Fork L1
Fork L2
Fork J1
Go to J4
L2 : G
Fork J2
J1 : Join Cont1
10
Go to J4
L1 : C
Fork L3
Fork J3
J2 : Join Cont2
Fork J5
J4 : Join Cont4
Go to J6
L3 : G
Fork L4
J3 : Join Cont 3
Go to J5
L4 : L
J5 : Join cont5
J6 : Join Cont6
OTRO EJERCICIO
HACERLO
Parbegin
11
S1
S2
Sn
Parend.
Todas las instrucciones entre Parbegin y Parend se ejecutan de forma concurrente ( a la vez ). El grafo
quedaría:
..
b=z+1
c = a − b nos quedaría.
Parbegin
B=z+1
Parend
C=a−b
No todo lo que se puede hacer con Fork / join se puede hacer con parbegin, parend.
Parbegin
G Parend
El programa sería:
Begin
Parbegin
12
B
Begin
Parbegin
Parend
End
Parend
End
Ejercicio:
Begin Begin
Parbegin Parbegin
Begin Begin
S1 S1
Parbegin Parbegin
S3 S3
Begin Begin
S4 S4
S6 S6
13
End Parbegin
Parend SA
S9 S9
End .
Begin End
S2 .
S5 .
Parbegin Parend
SB
End
Parend
SC
End
Parend
SD
End
L2 : S2
Go to Jn
14
Jn : join cont
Sn + 1
− b + " b2 − 4ac
2a Donde −4ac son dos operaciones. Tenemos que ver el mayor grado de concurrencia posible. Lo hacemos
con Fork / Join y Parbegin, Parend.
L1
L2
L3
J2
J3
J1
Donde S1 = −1 * b S6 = "( b * b ) − 4 a c
S2 = b * b S7 = − b + "( b * b ) − 4 a c
S3 = 4 * a S8 = (− b + "( b * b ) − 4 a c) ) / 2
S4 = 4 * a * c S9 = 2 * a
S5 = ( b * b ) − 4 a c
Fork L1
Fork L2
Fork L3
S9
Go to J1
L1: S3
S4
Go to J2
15
L2 : S2
J2 : Join cont1
S5
S6
Go to J3
L3 : S1
J3 : join cont2
S7
J1 : join cont3
S8
b) Tenemos un programa que lee en un fichero y lo copia en otro. ¿Qué concurrencia podría conseguir ahí ?.
Si pongo Read ( f . s )
Write ( g . s ) De esta forma no podría hacer las cosas a la vez porque hasta que no haya escrito el contenido
no puedo volver a leer.
Pero si pongo una variable adicional lo que leo lo almaceno en esa variable y luego lo paso al fichero si puedo
leer y escribir a la vez.
Read ( f . s )
T=s
Write ( g . t )
La solución sería:
Begin
Read ( f . x )
Begin
Y=x
16
Parbegin
Write ( g . y )
Read ( f . x )
Parend
End
Write ( g . x )
End.
Begin
Parbegin
Begin
Parbegin
S1
Begin
Parbegin
S2
Begin
S3
S4
End
Parend
S5
S6
End
Parend
S7
17
End
S8
Parend
S9
End
Exclusión mutua
Imaginamos que tenemos un Spool de impresión, un lugar donde tenemos los trabajos de impresión.
Y en algún lugar tengo una variable ( Entrada ) para ver que sitio tengo libre y otra variable ( salida ) para ver
donde voy imprimiendo.
4567
Al meter el trabajo en el Spool entonces la variable entrada que tiene la siguiente estructura:
ENTRADA = ENTRADA + 1 .
Pero que ocurre si hay un proceso que llega y le asigna el 5 mediante la variable, y cuando llega el trabajo 5
que era el número que le había asignado se interrumpe ( por cualquier motivo ) y en ese momento llega otro
trabajo y se coloca en 5 entonces el anterior se borrará. Este problema se denomina condiciones de carrera,
dos o más procesos leen o escriben en un área compartida y el resultado final depende de los instantes de
ejecución de cada uno.
El problema se soluciona impidiendo que más de un proceso lea o escriba simultáneamente datos
compartidos. Relentizando la exclusión mutua.
La exclusión mutua es que un solo proceso excluye a todos los demás de utilizar un recurso compartido, con
el fin de garantizar la integridad del sistema . A estos recursos se les denomina recursos críticos y la pare del
programa en la que acede a estos recursos se la denomina sección crítica.
• Debe garantizar la exclusión mutua ( no debe haber 2 procesos que se encuentren de forma simultánea
dentro de sus secciones críticas).
• No tenemos que hacer suposiciones con respecto a la velocidad de los procesos en conflicto ni con respecto
a su número.
• Debemos garantizar que ningún proceso fuera de su sección crítica, pueda bloquear a otro proceso.
• Debemos garantizar que cuando un proceso quiera obtener la entrada en su sección crítica se la conceda en
un tiempo finito.
• Debemos garantizar que no se produzca inalición, que no haya ningún proceso que no entre en la sección
crítica.
18
Sección residual de entrada ( El resto de programa que está antes de la sección crítica que nos plantea
problemas).
• Negociación del protocolo. ( se establecen los mecanismos que nos permiten garantizar que los demás no
entren en la sección crítica)
• Sección crítica.
• Protocolo de liberación. ( los mecanismos anteriores se eliminan para continuar con el programa.
Soluciones al problema :
Alternancia de procesos : La ejecución de un proceso condiciona la ejecución del otro. No es una solución
válida ya que la sección residual del proceso p1 y la del p2 no tienen por qué ejecutarse al mismo tiempo o ser
iguales por lo que en este aspecto falla.
Indicadores de ocupación: Nos indican si uno u otro proceso están en su sección crítica. Para que P1 y P2
estén a la vez en su sección crítica las variables P1enuso y P2enuso tienen que ser Falso. No es una solución
válida ya que ambos procesos pueden estar a la vez en su sección crítica.
Tercera solución : Si alternamos la ejecución de los procesos en el planificador puede que ocurra que ambos
se queden esperando.
Solución de cortesía: No es válida porque puede ocurrir que alternando los procesos, ocurra lo mismo de
antes, que están dando vueltas sin acceder a la sección crítica.
Solución de Peterson: ¿ Garantiza la exclusión mutua? Que ambos procesos no estén en su sección crítica a
la vez. En esta solución no existe la posibilidad de que ambos procesos estén a la vez en su sección crítica. El
que P2 esté en su sección residual no impide a P1 entrar en su sección crítica. ESTA SOLUCIÓN ES
VALIDA.
Todos estos métodos que hemos visto que eran válidos tienen un problema es que retardan la ejecución de los
procesos, debido al WHILE que llevan por lo que consumimos recursos y no es bueno para el sistema.
Vamos a ver ahora soluciones para la exclusión mutua que son soluciones hardware, no dependen de
programas hechos por nosotros. Hay dos soluciones:
• Pesimistas: Suponen siempre el peor caso posible y actúan bloqueando todo lo que pueda interferir un
proceso a continuación actualizan la variable y después desbloquean lo que habrían bloqueado.
• Optimistas: Consideran que no hay conflictos o que hay my pocos, por lo que permiten el acceso a los
datos compartidos. En el caso de que haya conflicto mantienen la integridad del sistema descartando las
actualizaciones que han sido invalidadas por los procesos concurrentes contendientes. Lo primero leen el
valor de la variable global y preparan la actualización local tentativa. En el caso de no haber cambiado,
entonces se aplica la actualización local tentativa a la variable global y si ha cambiado se descarta la
actualización tentativa y se vuelve al paso primero. Este caso no obliga a la serialización de procesos, no
existe noción de sección crítica y no se precisa la exclusión mutua, salvo en la comparación.
MÉTODOS.
19
• Habilitar_inhabilitar interrupciones.
Es pesimista, y no es válido para sistemas multiprocesadores, con más de un procesador, ya que sólo afecta a
un solo procesador.
−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−
variable variable
−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−
Lo que hace es que hasta que no se actualice la variable bloqueo todas las interrupciones y después habilito lo
que haya inhabilitado.
Vamos a tener una función que es la de ( Test and Set) que devuelve un valor de tipo booleano.
Begin
If i = 0 then
Begin
I=1
TS = cierto
End
Else
TS = falso
End
Proceso P ( i : entero)
Begin
20
Repeat
SC
Lock = 0
..
Forever
End
La expresión Repeat ( nada) until TS ( lock) quiere decir que no hacemos nada hasta que TS nos devuelva
algo verdadero.
SC ( sección crítica).
Inicialmente la variable Lock la ponemos a o (lock = 0), que esta variable iría declarada en algún sitio. Todos
los procesos tienen una variable lock que vale 0. Los demás procesos no entrarán hasta que el primero acabe
la sección crítica y coloque la variable lock a cero. ( lock =0).
Esta solución sí vale para sistemas multiprocesadores siempre que las operaciones de lectura, modificación,
escritura se realicen de forma indivisible ( dentro de un ciclo de ejecución). Es una solución pesimista.
Se copia el valor de la variable global al espacio local, se utiliza ese valor para realizar una actualización
tentativa y esa actualización será correcta si ningún otro proceso ha modificado la variable global, mientras se
modifica la variable local. Si es así hay que repetir la secuencia.
VIEJOREG = VARGLOBAL
NUEVOREG = VIEJOREG
SI ( VIEJOREG 0 VARGLOBAL )
21
VARGLOBAL = NUEVOREG
SINO
VIEJOREG = VARGLOBAL
SEMÁFOROS.
A ) en el momento de su inicialización .
B) Por medio de 2 operaciones que actúan sobre la variable, son operaciones atómicas ( de forma indivisible)
hacemos referencia a ellas como P y V se llaman wait y signal. ( verificar e incrementar).
WAIT ( S ) la operación decrementa el valor del argumento semáforo en tanto que el resultado no sea
negativo. Sería algo como :
Wait ( s )
S=s−1;
Signal ( s )
S=s+1;
Ejemplo:
Tengo dos procesos P1 y P2 y quiero que hasta que S1 no se ejecute no se ejecute S2. Por lo tanto tengo que
poner:
s1 Wait ( m )
Signal ( m ) s2
22
Yo inicializo a cero el valor del semáforo ( m ).
Imaginamos que el proceso 2 va más rápido que el proceso 1, llegará a wait y esperará hasta que no se ejecute
S1 y después el signal ( m ) que equivale a decir m = m+1 dará paso a que el otro proceso pueda pasar y
pondrá m = m−1 y así aseguramos que S1 se ha ejecutado.
Programa Principal
Mutex = 1
Parbegin
P1
P2
P3
Parend
Var
Proceso P1 Proceso P2
Begin Begin
Begin Begin
SR P1 SR P2
End End
End End
Proceso P3
Begin
While true do
Begin
23
Wait ( mutex )
Sección Crítica
Signal ( mutex )
SR P3
End
End;
Cuando un proceso está en su SECCIÓN CRÍTICA los otros procesos no pueden entrar en su sección crítica
ya que tienen el wait ( mutex) y como el mutex = 0 no pueden entrar y cuando acaba el P1 tienen un signal (
mutex ) que aumenta el valor de mutex que ahora valdrá 1 y así puede entrar otro proceso.
Cuando un proceso ejecuta la operación WAIT y encuentra que el valor del semáforo no es positivo, el
proceso se bloquea a sí mismo y el proceso es colocado en una cola de espera asociada al semáforo donde no
consume ciclos del procesador. Posteriormente el proceso debe ser despertado en algún momento por alguien
y este será el SIGNAL que hará que se reanude alguno de los procesos suspendidos. Es parecido al esperar
pero aquí no consumimos recursos.
La implementación será :
Wait ( S )
Sino S = S − 1.
Signal ( S )
Sino S = S + 1
Ahora podemos utilizar semáforos para hacer grafos que no eran posibles hacerlos con Parbegin y Parend pero
con semáforos , Parbegin y Parend si lo podemos hacer.
Begin
Parbegin
Begin
P1
24
Parbegin
S2
Begin
S3
Signal ( S3−7)
End
Parend
S4
End
Begin
S6
Wait ( S3−7)
S7
End
Parend
S5
End
Ejemplo:
Begin
Parbegin
25
Begin , Parbegin Wait ( f ), wait ( d ) ,Parend, S6, signal ( h ) End
Parend
End.
Estamos utilizando 8 semáforos ( está bien ) pero no del todo ya que se puede utilizar solo uno.
Begin Begin
S1 S1
Parbegin Parbegin
Begin Begin
S3 Parbegin
Signal ( S3−6) S3
Begin Parend
S2 End
S4 Begin
Parbegin S2
S5 S4
Begin Parbegin
Wait ( S3−6 ) S5
S6 Signal ( S4−6)
End Parend
Parend End
S7 Parend
End S7
Parend End
End
26
UNIX
El SHELL en UNIX hace una personalización del entorno. Los shell en UNIX también son lenguajes de
programación, son lenguajes interpretados. Los más importantes en Unix son: C_Shell , Bourne, Koin Shell,
nosotros veremos el BOURNE.
Con shell podemos escribir pequeños programas que se llaman Scripts, consiste en editar un fichero que
contiene los comandos que se van a ejecutar.
• Como un fichero ejecutable: para lo cual necesitamos dar al fichero un permiso de ejecución. Por ejemplo
al fichero program1.
• Invocar un nuevo Shell: pasándole como argumento el archivo que queremos ejecutar. Por ejemplo sh
program1.
El Shell del programa es otro programa, puede tener tantos entornos como quiera con shell. Cuando entro en
Unix ya estoy en el shell de Unix al tener el prom $ si pongo ahora −ch ya tengo otro entorno de Shell y si
pongo otro −ch tendría otro entorno de shell y para salir pongo exit y saldría del ultimo entorno de shell
creado.
Por lo tanto tenemos que coger el vi y editaremos el primer script, le ponemos un nombre significativo.
Ejemplo de script.
CLEAR
Si dentro del script deseamos poner comentarios tendremos que utilizar # (almohadillas).
Los argumentos que se le pasan por ejemplo al program1 como puede ser:
Program1 A B se hacen referencia dentro del script poniendo el símbolo de dólar y el argumento que es.
PWD
ECHO $1 me saca la A
ECHO $2 me saca la B
Otras variables pueden ser $# que contiene el número de argumentos que se le han pasado al Script.
27
La variable $* contiene todos los argumentos, no su número sino su valor.
En el caso de que desease utilizar más de 9 argumentos está el comando SHIFT que produce un
desplazamiento de los argumentos, y este desplazamiento se realiza hacia la izquierda.
Ejemplo:
Tenemos en el Script:
SHIFT
Si pusiese ahora
Pongo el comando y una variable donde quedará almacenado lo que escribo y si quiero visualizarlo pongo
ECHO $ (valor de la variable).
Ejemplo:
READ (valor)
ECHO $(valor)
READ nombre
RM $nombre
Sentencias de control.
IF condición IF condición
THEN THEN
Comando / os Comando / os
28
Comando / os
FI
Para poner 2 comandos en una misma línea tengo que poner el símbolo de punto y coma ( ; ).
Para evaluar las condiciones hay un comando que es TEST y puede evaluar condiciones de 3 tipos:
• Valores numéricos.
• TEST condición
• TEST [ condición ]
Y entre corchetes antes de condición y después hay que dejar un espacio en blanco.
Ejemplo:
PROGRAM1
READ A
READ B
IF TEST $A −eq $B
• Tipos de ficheros.
− d Si existe y es un directorio.
29
− r Si existe y tiene permiso de lectura.
−a Si existe el archivo.
Ejemplo:
PROGRAM1
Read A
Read B
Then
Then
Cp $A $B (copio A en B)
If test − f $A −a −d $B
Then
Cp $A $B
30
Podía crear un Script como:
PROGRAM1
If test $# − eq 0
Then
Read fichero
Rm $fichero
Else
Rm $ 1
Fi
Lo que hace es que borra un fichero pero comprueba que se le ha pasado el parámetro.
Ejemplo:
PROGRAM1
If test $# − eq 0
Then
Read fichero
Else
Fi
Tenemos el Script
PROGRAM1
Shift
31
Echo $# me saca 3 ya que tengo solo ahora 3 variables
DO
Sentencias
DONE
La variable va tomando cada uno de los valores que hay en la lista y por cada uno se ejecutan las sentencias
comprendidas entre el DO y el DONE.
Ej:
DO
DONE
La v el primer valor que toma es lunes y ejecuta el conjunto de sentencias y luego tomaría martes y ejecutaría
el conjunto de sentencias y así sucesivamente.
Otra forma de usar el For y las variables que le pasas sería utilizando por ejemplo un fichero y en el poner las
variables y cuando haces el bucle for llamas a ese fichero para que tome las variables del fichero.
Contenga el fichero. La instrucción cat te muestra el contenido del fichero. El cat fichero produce una salida y
para que cat fichero se sustituya por la salida debemos ponerlo en comillas invertidas.
BUCLES WHILE
Su estructura es la siguiente:
DO DO
Sentencias sentencias
32
DONE DONE
El while es que mientras se cumple la condición estamos en el bucle y el Until es que hasta que no se cumpla
la condición estaremos en el bucle.
Tenemos las sentencias BREAK que provocan un salto a la siguiente instrucción fuera del bucle. Tenemos las
sentencia CONTINUE que saltan a la siguiente instrucción del bucle, o sea dentro de él a la siguiente donde
aparezca.
FI
DONE
SENTENCIA CASE
Su sintaxis es la siguiente:
CASE variable IN
Valor 1 ) sentencia
..
Sentencia n ; ;
Valor 2) Sentencia
especificado anteriormente.
ESAC
33
La instrucción ESAC sirve para finalizar el CASE.
Se emplea la palabra
Nombre_función ( )
A las funciones se les puede pasar parámetros que son internos a la función.
Ejemplo de función.
Suma ( )
a = ` expr $a + 1 `
Return a
Read a
b = ` suma `
Cuando quiero evaluar una expresión matemática tengo que poner la expresión EXPR.
Las funciones devuelven el valor mediante RETURN pero solo valores numéricos entre 0 y 255, si devuelvo
una cadena me dará error.
EJERCICIOS.
• Realizar un Script que presente un menú por pantalla con 3 opciones. Mostrar, Borrar, renombrar un fichero
( pidiendo el nuevo nombre). Si se pasa el fichero como argumento no lo solicitará si se pasa como
argumento lo solicitará.
If [ $# − eq 0 ]; then
Read fichero
34
Else
Fichero = $1
Fi
Read var
Case $var in
1) cat $fichero ;;
2) rm $fichero ;;
read destino
mv $fichero $ destino;;
• Realizar un Script al que se le pasen como parámetros 2 cadenas la primera el nombre del fichero y la
segunda el nombre del directorio. Tras comprobar que el fichero existe y tiene permiso de escritura lo
copiará en el directorio comprobando previamente que no exista el fichero en el directorio y que tenga
permiso de escritura en el directorio. Si no se le pasa alguno de los parámetros los solicitará.
If test $# −eq 2
Then
fich = $1
dir = $2
else
read fich
read dir
fi
35
if test −f $fich −a ! −f $dir / $fich
then
then
cp $fich $dir
else
Echo de escritura
Fi
Else
Fi
EJERCICIOS.
• Tenemos un directorio /FUENTE y otro /DESTINO, se pide copiar al directorio destino aquellos ficheros
ordinarios del directorio fuente que no existan en l directorio destino.
SCRIPT 1
For a in ` ls / FUENTE `
Do
If [ −f $a ]
Then
If [ ! −f /DESTINO/ $a ]
Then
Cp /FUENTE / $a /DESTINO
Fi
Fi
Done
• Sabiendo que en el fichero \ etc\passwd la primera columna contiene el nombre de cada usuario dado de
36
alta en el sistema realizar un script que muestre aquellos usuarios que están dados de alta en el sistema pero
que no están en sesión de ejecutar el script.
Do
Then
fi
done
• Crear un Shell script que permita saber si un número está comprendido entre otros 2. Los 3 números ( limite
inferior, limite superior, número que se comprueba) deben ser pasados en ese orden. Si alguno no se pasa se
solicitará.
Then
Then
Read sup
Inf = $1
Else
Read inf
Read sup
Fi
Else
Superior = $1
Inferior = $2
Fi
37
While [ $inf −le $sup ] mientras el valor inferior sea menor o menor_igual que el
Done
• Crear un Script que reciba como parámetro 2 números y muestre los números comprendidos entre ambos.
HACERLO.
EJERCICIOS:
• En una oficina tenemos 4 impresoras ( láser, matricial, tinta, color) a las que referenciamos con estos
nombre. Realizar un script que nos permita imprimir un fichero en una de las 4 impresoras diferentes de la
manera siguiente. El fichero a imprimir se pasa como parámetro y si no es así se mostrará un error y se
finalizará la ejecución del script. En caso de suministrarlo se comprobará que es un fichero ordinario y se
mostrará un menú que permita elegir la impresora donde se imprimirá, luego se imprime y se termina.
If [ $# −eq 1 ]
Then
If test −f $1
Then
Read num
Case $num in
1) lpr −p Láser $1
2) lpr −p Tinta $1
3) lpr −p matricial $1
4) lpr −p color $1
esac
38
else
fi
else
fi
• Crear un Script al que se le pase un número cualquiera de parámetros ( es desconocido, y puede ser mayor
de 9 ) y los muestre uno a uno por pantalla.
Do do
Echo $1 echo $V
Shift t done
Done
El operado << .
Si pongo cat << cadena el sistema muestra por pantalla desde ese punto hasta que se encuentre con la cadena.
1. Impresora de Láser
2. Impresora de tinta
3. Impresora matricial
4. Impresora de color
EOF
Tenemos un conjunto de procesos operativos y algunos de ellos producen datos que otros consumen.
Existiendo posible disparidad entre las velocidades de producción y consumo. Se trata de idear un protocolo
que permita a productores y consumidores operar de forma conjunta ( concurrente ) de manera que los datos
producidos se consuman en el orden exacto en el que son producidos.
39
Se trata de que cuando produzca tengo que incrementar algo para saber que se ha producido, y cuando
consuma tengo que decrementar algo para saber que se ha consumido.
Se trata de que para que el productor pueda producir tiene que haber sitio en el buffer y para que el
consumidor consuma tiene que haber algo en el buffer. Ahora tenemos que saber que espacios hay libres en el
buffer. Tendremos 2 semáforos uno para llevar cuenta de los espacios libres y otro para los elementos
consumidos.
Cuando un filosofo quiere comer necesita 2 tenedores y el que los tiene no los soltaba. La solución a este
problema debe asegurar que no se produce interbloqueo, y que no hay ninguna conspiración que impida
comer a algún filósofo.
FILOSOFO (i )
Int i ;
While true do
Begin
Meditar ;
Comer
Elegir_tenedor ( i )
End;
La función comprobar es una función que comprueba el estado del filósofo a la izquierda y el de la derecha.
Se trata de idear un protocolo de sincronización entre lectores y escritores que asegure la consistencia de los
datos comunes y mantenga un grado de concurrencia tan elevado como sea posible. La solución es que tantos
40
lectores como sean posible accedan a recursos compartidos, lecturas simultáneas y los de escritura solo
puedan llevar a cabo su función cuando acabe el último lector.
Un proceso industrial de fabricación de vigas de madera, consiste en pelar troncos de madera, darles forma de
paralelepípedo y estamparlos con un número de serie para luego ser retirados, para ello se utilizan 3 máquinas
y 2 depósitos intermedios de capacidad limitada, siendo la capacidad del de troncos pelados 100 unidades y el
de vigas sin estampar 200 unidades.
AB
Escribe un programa con 3 procesos concurrentes utilizando semáforos que imiten el comportamiento de las
máquinas. Siempre hay troncos y cuando depositamos las vigas en el deposito esto no tiene límite. Es
necesario controlar que no accedan los dos a la vez.
Necesitamos 2 semáforos para que no choquen las máquinas cuando acceden a los depósitos. Necesitamos
controlar el número de espacio libre y el de vigas del depósito.
Troncos ocupados = 0
Primer depósito.
Semáforos
Segundo depósito
Begin begin
Wait(troncos_libres); Coger_tronco_pelado;
41
Evita chocar Wait ( mutex A); signal ( mutex A);
signal ( vigas_ocupadas);
end;
end;
Proceso Estampadora
Begin
Estampar la Viga
Dejar_viga_estampada; PARBEGIN
End; Peladora
End; Cortadora
Estampadora
PAREND
42
Tenemos las posibilidades :
y así sucesivamente.
Proceso fumador ( i )
Begin
While true do
Begin
Fumar ( ) ;
End;
Proceso Agente
Begin
While true do
Begin
x= random ( )
signal ( sem [ x] );
wait ( mesa );
end;
end;
TEORIA PRACTICA
43
Begin Begin
Begin begin
Guardar_examen For i = 1 to 20 do
Done coger_examen
Dejar_sobre done
End end
end
Signal ( sobres )
Signal ( mesa )
For i = 1 to 20 do
Signal ( mesa_vacía)
Done
Parbegin
Teoría
44
Practica
Parend
• PRIMERA PARTE.
Begin begin
Begin begin
End end
End
• SEGUNDA PARTE.
Begin begin
Begin begin
45
Signal ( norte ) end
End end
end
Proceso CLIENTE
Begin
While true do
Begin
Wait ( Sala_espera)
Wait ( mutex )
Cli = cli + 1
Signal ( mutex )
Wait ( barbero )
Wait ( mutex )
Cli = cli − 1
Signal ( mutex )
Signal ( barbero )
End
End
Signal ( sala_espera )
46
No es valido porque puede haber 2 procesos que accedan a su sección crítica a la vez.
Si ponemos :
Signal ( mutex )
SECCIÓN CRÍTICA
Wait ( mutex )
Si ponemos :
Wait ( mutex )
SECCION CRITICA
Wait ( mutex )
Región crítica:
Es lo mismo que un semáforo, pero es el compilador el que se encarga de controlar los accesos a la sección
crítica, en vez del programador.
Procedure
Begin
While true do
begin
REGION x DO
Begin
Sección Crítica
End
End
end
47
Procedure
Begin
While true do
begin
Wait ( X . S ) semáforo
Sección crítica
Signal ( X. S )
End
End
Este resultado resuelve el problema de la exclusión mutua pero no nos vale para problemas de sincronización.
( antes de hacer la y , hacer la x )
Su funcionamiento es igual que la Región Crítica, pero esta permite una condición que debe cumplirse para
ejecutarse la sección crítica.
Begin
Sección crítica
End
Donde B es la condición.
Si no se cumple la condición el proceso se queda esperando, asociado a una cola de esa región.
Cuando un proceso sale de la sección Crítica comprueba la condición de los procesos que están esperando y si
se cumple alguna condición alguno de los procesos es activado. Solamente dejaremos entrar nuevos procesos
en la región crítica cuando no se cumpla ninguna condición o cuando no quede ningún proceso en la cola.
Implementación:
Wait ( X . S )
Signal ( X . S )
48
Wait ( X mutex )
Tengo un proceso y quiero que la instrucción x se ejecute antes que y . ¿Cómo se puede hacer?
Region x mutex
b = verdadero
Region z when b do
Monitores.
Son mecanismos que nos garantizan la exclusión mutua. La estructura garantiza que solo se esté ejecutando
un procedimiento a la vez.
Un monitor tiene una estructura formada por una cabecera que lo identifica, un conjunto de variables globales,
un conjunto de procedimientos y un bloque de inicialización que se ejecutará una sola vez cuando se crea el
monitor.
Cabecera MONITOR
Variables
Procedimientos o rutinas
..
En el recurso compartido ( requiere un acceso exclusivo para los procesos ) se declara como monitor y dentro
de los procedimientos del monitor se incluyen todas las operaciones que se puedan llevar a cabo con dicho
recurso. Los procesos que utiliza el monitor se sitúan de forma independiente de tal manera que se encapsulan
los datos y procedimientos y quedan al margen de dichos procesos. Cuando alguno de los procesos necesita
acceder al recurso compartido, llamará al monitor correspondiente y dentro del monitor al procedimiento
específico que implementa la operación deseada. Es necesario garantizar que todos los accesos al recurso
compartido se realizan a través de procedimientos implementados en el monitor.
CWAIT ( variable_condición ): El proceso que realiza la operación siempre es suspendido en una cola
asociada a la variable_condición, hasta que otro proceso haga Csignal.
La variable_condición no tiene valor son simplemente colas donde albergamos procesos suspendidos.
49
ISEMPTY(variable_condición)
El monitor permite que mientras un proceso está esperando en un CWAIT entre otro procedimiento para
ejecutarse.
Cuando un proceso se despierta dentro del monitor tiene preferencia sobre uno que entre.
Ejemplo:
P1
CWAIT
..
A=a+1
A=a+1
CSIGNAL
Wait_signal : monitor
Begin
Ocupado : boolean ;
Procedure Mon_wait
begin
50
end;
Procedure Mon_signal
Begin
Ocupado= false ;
Disponible . signal ;
End
<Inicialización >
Begin
Ocupado = false
End.
EJERCICIO
Por un canal circulan barca y por la carretera vehículos y en ambos casos solo circulan en un sentido. Escribir
un tipo monitor que planifique el uso de los puentes con los vehículos y las barcas como procesos. Las barcas
tienen prioridad de paso frene a los vehículos.
Barcas
Coches
Puente Monitor
Begin
Num_coches integer
51
Pasa barca boolean
Procedure Entra_coche ( )
Begin
Hay_coches . Wait
Hay_coches . signal
End;
Procedure Sale_coche ( )
Begin
Hay_coches . wait
Num_coches = num_coches − 1
If num_coche = 0
End
Procedure Entra_barca ( )
Begin
Hay_barca . wait
Pasa_barca = true
end
Procedure Sale_barca ( )
Begin
Pasa_barca = False
52
If Nom_empty ( hay_barca)
Hay_barca . signal
Else
Hay_coche . signal
End_if
End
MENSAJES.
Son un mecanismo que sirve para sincronización y intercomunicación entre procesos, es válida para entornos
centralizados y en entornos distribuidos. Un mensaje es una colección de información que se intercambia
entre un proceso emisor y un proceso receptor. Un mensaje puede contener datos, ordenes de ejecución o
incluso código.
Aspectos
Direccionamiento.
• Direccionamiento Directo: Cada proceso que desea enviar un mensaje tiene que especificar explícitamente
el receptor del mensaje y a su vez el receptor del mensaje tienen que especificar la fuente o el remitente
desde el cual desea recibir el mensaje.
• Direccionamiento Implícito: Unicamente el emisor especifica quien va ha ser el receptor del mensaje. Ej:
un servidor de impresión.
• Direccionamiento Indirecto: Los mensajes se envían a una estructura denominada buzón o Mail_box, no
especificamos quien es el receptor del mensaje, luego habrá un proceso que recoja los mensajes del buzón.
• Los buzones sean propiedad del proceso que los crea: El buzón tienen existencia mientras tenga existencia
el proceso
53
• Los buzones sean propiedad del Sistema Operativo: Se proporciona algún tipo de primitiva para crear o
destruir el buzón.
• Tamaño fijo: Son más fáciles de implementar, ya que tendrán que ser en un buffer y como sabemos el
tamaño del mensaje podemos saber el tamaño del buffer. Si el tamaño del mensaje es mayor que el tamaño
establecido , se divide el mensaje y lo envío como varios mensajes, esto implica el secuenciamiento de
mensajes.
• Tamaño Variable: Son más difíciles de implementar, ya que no conocemos el tamaño de los buffer. Peor
no tenemos que dividir el mensaje por lo que es más rápido.
Sincronización
poco más en ser recibido puede ocurrir que el mensaje se pierda para que no ocurra esto se hace el B3.
Envío bloqueante
Rendezvous o Cita
Recepción bloqueante
Envío no bloqueante
Servidor
Recepción bloqueante
Envío no bloqueante
En los demonios
de Unix
54
Recepción no bloqueante
Capacidad Cero ( 0 ): No puede haber mensajes esperando , el emisor tienen que esperar a que el receptor
reciba el mensaje.
Capacidad Limitada: Tengo una cola de longitud finita en la que se almacenan los mensajes y si el número de
mensajes es menor que la capacidad de la cola puedo enviar un mensaje y si está llena no puedo enviar el
mensaje.
Son buenos los tres y los utilizo dependiendo de la situación en la que estemos.
Ejemplo:
Proc 1 Proc 2
. ..
. ..
A.
.b
..
En la fotocopia ( Pag 1) el receive del exclusión mutua tienen que ser bloqueante.
Proceso Controlador: Da servicio a los lectores y a los escritores. Vamos a utilizar un controlador y lo
vamos a inicializar a un número mayor que el número máximo de lectores posibles.
Si contador > 0 : quiere decir que no hay escritores esperando y puede haber o no lectores activos, en este
caso servimos todos los mensajes TERMINADO antes de eliminar los lectores activos, a continuación
servimos las solicitudes de escritura y luego las de lectura.
Si contador = 0 : Quiere decir que la única solicitud pendiente es de escritura, y lo que nos hace es permitir al
escritor continuar y esperamos un mensaje TERMINADO.
Si contador < 0 : Indica que un escritor ha realizado una solicitud y se le ha hecho esperar para despejar a
todos los lectores activos. En este caso solo deben servirse mensajes TERMINADO.
EJERCICIO.
55
Maquina A
Máquina C
Máquina B
La Máquina C solamente coge pieza del depósito que hay pieza. En los depósitos ( A y B ) solamente puede
haber una pieza. Utilizando semáforos y pasos de mensajes implementar una solución.
Begin begin
Begin begin
Coger_pieza Coger_pieza
Dejar_pieza en A Dejar_pieza en B
End End
End End
Proceso Máquina C
Begin
While true do
Begin
If msj : A then
Coger pieza A
Signal ( señal A)
Dejar pieza A
Else
Begin
Coger pieza B
56
Signal ( señal B)
Dejar_pieza B
End
End
End
Es una situación en la que un grupo de procesos están permanentemente bloqueados como consecuencia de
que cada proceso ha adquirido un subconjunto de los recursos necesarios para su operación y está esperando
la liberación de los restantes recursos mantenidos por otros procesos del mismo grupo haciendo imposible que
ninguno de los procesos puede continuar.
Proceso A Proceso B
Imprimir_dato Leer_disco
Leer_disco Imprimir_dato
Imprimir_dato Leer_disco
El interbloqueo se produce en :
• Recursos reutilizables : Se caracterizan porque pueden ser utilizados por seguridad solamente por un
proceso de forma simultánea. Ej : caso de la impresora.
• Recursos consumibles : Son recursos producidos y consumidos por procesos activos, de tal manera que su
número puede variar a lo largo del tiempo . Ejemplo: un mensaje.
• Exclusión mutua : Los recursos compartidos son adquiridos y utilizados de forma exclusiva.
• Retener y esperar : Cada proceso retiene los recursos que ya le han sido asignados mientras espera la
asignación de los restantes.
• No expropiación : Un recurso solamente puede ser liberado de forma voluntaria pro el proceso al cual se le
ha concedido su uso.
• Espera Circular : Los procesos interbloquedos forman una cadena circular de tal manera que cada proceso
retiene uno o más recursos que son solicitados pro el siguiente proceso de la cadena.
57
Para que se produzca interbloqueo tienen que cumplirse las 4 a la vez.
Ejemplo:
Es el grafo en el que representamos los procesos ,recursos , la asignación de recursos a procesos y la solicitud.
Una flecha de un proceso a un recurso significa que el proceso solicita ese recurso.
Una flecha de un recurso a un proceso significa que ese recurso está asignado a ese proceso.
Asignación
Solicitud
En el caso de tener varia instancias a un recurso entonces se dibuja círculos dentro del recurso tantos como
instancias tenga.
Asignación
Solicitud
Interbloqueo.
Se sabe si hay o no interbloqueo si dentro del grafo hay un ciclo, esto significa que puede o no haber
interbloqueo.
La existencia de un ciclo en el grafo es condición necesaria para la existencia de interbloqueo pero puede no
existir.
En el caso de que solo tengamos una unidad de cada recurso entonces es condición necesaria y suficiente para
la existencia de interbloqueo.
Nudo: Es un ciclo en el cual de ninguno de los nodos que lo forman sale un camino que no sea ciclo.
Tenemos:
58
En este dibujo tenemos interbloqueo no existe ningún camino que no me lleve al mismo sitio.
Empezamos en P1
Primer camino: P1 R1 P2 R2 P3 R3 P2
Segundo camino: P1 R1 P2 R2 P3 R3 P1
Otro ejemplo:
No se produce interbloqueo porque habrá un momento en el que acabe P2 porque tiene todo para ejecutarse, y
el recurso que ocupa se lo asignará a P1. P4 como también tienen todo para acabar , cuando termine liberará el
recurso y se lo asignaremos a P3.
Prevención
Se encarga de negar alguna de las cuatro condiciones para que no haya interbloqueo.
• Un proceso antes de empezar a ejecutarse solicite todos los recursos que vaya a necesitar, si estos están
disponibles se le asignan todos y si alguno no está disponible no se le asigna ninguno. A veces esto no es
posible porque muchos procesos a priori no conocen los recursos que van a utilizar y otro motivo es que no
conduce a una utilización óptima de los recursos ya que algún recurso solicita algún recurso y este igual no
lo usa hasta el final y le tiene retenido y no lo puede usar nadie.
• Se solicitan los recursos de forma incremental, pero antes de solicitar un recurso se le obliga a dejar
temporalmente los que ya tiene, si el nuevo recurso está disponible se le devuelven los que ya tenían, si no
está disponible no se le devuelven y evitamos la retención.
Si existe la línea de puntos entonces habrá interbloqueo pero si no existe y A solicita el recurso R1 obligamos
a que deje R2 así B tiene asignada los dos recursos que le hacen falta y acabará en algún momento y el recurso
R1 podrá ser asignado al proceso A. Como R1 antes no estaba disponible la solicitud se mantiene hasta que
R1 si esté libre y se pueda asignar.
Esperará hasta
Los problemas son que hay recursos que no son fácilmente liberados o adquiridos en un instante posterior.
59
SEGUNDA CONDICIÓN PARA NO INTERBLOQUEO.
No expropiación:
Quito esta
línea y así
obligamos a liberar
R2 obligatoriamente.
El problema es que esto es posible con determinado tipo de recursos y con otros no.
Espera Circular.
Los tipos de recursos se ordenan de forma lineal de tal manera que cada proceso solo puede solicitar recursos
en orden creciente y todos los recursos de un mismo tipo se deben solicitar de forma simultánea.
flecha que va de P4 a R1
desaparece y también
60
interbloqueo.
PROBLEMAS:
Los recursos deben ser adquiridos en el orden previsto y no en el orden en el que realmente se necesitan.
El rendimiento cae por lo mismo de antes, ya que los procesos toman recursos que igual no los utilizan hasta
el final y les tienen retenidos.
Exclusión Mutua.
EVITACIÓN DE INTERBLOQUEO.
Solamente se van a conceder aquellas peticiones de recursos que no puedan dar lugar a un estado inseguro.
Cada proceso va ha especificar de antemano las necesidades máximas. Se mira a ver si el estado es seguro. Un
estado se considera seguro si todos los procesos que ya tienen concedidos los recursos, tienen la posibilidad de
ser completados en algún orden determinado, incluso si cada uno de los procesos utiliza todos los recursos a
los que está autorizado.
Vamos a utilizar un Algoritmo que es el del BANQUERO para saber si es seguro o no el sistema. Este
algoritmo comprueba si la solicitud de un recurso produce un estado seguro.
Tenemos un vector que lo llamamos disponibles que representa el número de unidades disponibles de cada
recurso.
P1 P2 P3
Tengo una Matriz de asignado en la que cada fila es un proceso y cada columna un recurso, y esta matriz
representa cada uno de los recursos asignados a cada proceso.
R1 R2 R3
P1
P2
P3
Tengo una Matriz necesidades, la misma estructura que la de matriz asignado, y nos da las unidades del
recurso que necesita para su ejecución.
Un estado inseguro no implica que haya interbloqueo, puede haberlo o no puede haberlo.
61
Primer Paso: Buscamos una fila en la matriz de necesidades cuyos valores sean menores o iguales al vector
D ( disponibles), si no existe el estado es no seguro y si existe pasamos al punto 2.
Segundo Paso: El proceso de la fila seleccionada solicita todos los recursos que necesita para su finalización
y termina, en ese caso se marca el proceso y todos los recursos que tenían asignados se añaden al vector D.
Tercer Paso: Se repiten las etapas 1 y 2 hasta que todos los procesos estén marcados ( el estado seguro) o
hasta que lleguemos a una situación en la que no podamos continuar en cuyo caso el estado no es seguro.
EJEMPLO.
R1 R1
P1 P1
P2 P2
P3 P3
P4 P4
Lo primero es hacer el vector disponibles, para ello sumamos la matriz asignación: ( 1 + 1 + 2 + 4) = 8 hay
asignadas 8 al recurso R1, y tenemos un 10 unidades del recurso R1 por lo que el vector disponibles tendrá 10
− 8 = 2 unidades. D = 2.
Se trata de buscar una entrad en la Mat. Necesidades que sea menor o igual que el vector D, y tenemos el P3,
si solicitara todos los recursos de golpe se le podría atender, cuando acabe liberará los recursos asignados por
lo tanto se lo sumamos a disponibles. D = 2 + asignados a P3 que son 2.(tabla asignación). D = 2 + 2 = 4.
Hacemos el mismo proceso buscamos alguno. En este caso tenemos P2. Lo marcamos y le sumamos 1 al
disponibles. D= 5, ahora sería o P1 o P4 , nos da igual uno que otro, cogemos P1 y D valdrá D=6, después
cogemos el P4 y D valdrá 10, si nos fijamos tiene el mismo valor que el que nos daban al principio ( 10). Por
lo tanto la secuencia nos queda: P3P2P1P4. ¿Qué ocurriría si P2 solicita una unidad de R1. Habría que sumar
un 1 a la matriz asignados en P2 y restar en la de necesidades a P2 un 1. Nos quedaría:
R1 R1
P1 P1
P2 P2
P3 P3
P4 P4
Y volveríamos a hacer todo el proceso. ¿Sería seguro el sistema ahora? Lo comprobamos: Sumamos la Mat.
62
Asignación tenemos 9 le restamos los totales de la de disponibles que nos daban y que era 10. D = 10 − 9 = 1,
miramos si hay algún proceso que necesite menos de 1 y no hay ninguno, por lo que no si algún proceso
solicitase todos los recursos a la vez sería imposible satisfacerle, por lo que es un sistema no seguro, aunque
no implica interbloqueo. Por lo tanto debemos retroceder y posponer la solicitud.
Ejercicio:
Asignados Necesidades
R1 R2 R3 R4 R1 R2 R3 R4
P1 P1
P2 P2
P3 P3
P4 P4
P5 P5
5322
Totales 6 3 4 2
Asignad 5 3 2 2
Disponi 1 0 2 0
(P4) + 1 1 0 1
Disponi 2 1 2 1
(P1)+ 3 0 1 1
Disponi 5 1 3 2
(P3)+ 1 1 1 0
Disponi 6 2 4 2
(P2)+ 0 1 0 0
Disponi 6 3 4 2
(P5)+ 0 0 0 0
Disponi 6 3 4 2
Por lo tanto podemos decir que es un sistema seguro. Los totales = Disponibles.
63
¿Qué ocurre si P2 solicita una unidad de R3?
Asignados Necesidades
R1 R2 R3 R4 R1 R2 R3 R4
P1 P1
P2 P2
P3 P3
P4 P4
P5 P5
5332
Cuando P2 solicita una unidad de R3 le sumamos uno en la casilla de asignado a P2, en R3 y se la restamos en
el mismo lado en la matriz de necesidades.(negrita).
Totales : 6 3 4 2
Disponi: 1 0 1 0
(P4) : 1 1 0 1
Disponi: 2 1 1 1
(P1) : 3 0 1 1
Disponi: 5 1 2 2
(P2) : 0 1 1 0
Disponi: 5 2 3 2
Disponi: 6 3 4 2
(P5) : 0 0 0 0
Disponi: 6 3 4 2
Vamos a ver cuando cuando P5 solicita una unidad de R3. Y dejamos los cambios de antes también. Nos
quedará.
64
Asignados Necesidades
R1 R2 R3 R4 R1 R2 R3 R4
P1 P1
P2 P2
P3 P3
P4 P4
P5 P5
5342
Totales : 6 3 4 2
Disponi: 1 0 0 0
Como en la matriz necesidades no hay ningún proceso que pueda satisfacerse ya que ninguno tiene todas las
necesidades por debajo de los disponibles, entonces si algún proceso los solicitase todos a la vez no se podría
cumplir su petición, por lo que es un Sistema no seguro.
Ejercicio
Asignados Necesidades
R1 R2 R3 R1 R2 R3
P1 P1
P2 P2
P3 P3
P4 P4
764
Totales: 8 8 7
Dispon: 1 2 3
(P2) : 1 2 1
Dispon: 2 4 4
Dispon: 2 5 6
65
(P3) : 2 0 1
Dispon: 4 5 7
(P1) : 4 3 0
Dispon: 8 8 7
Asignados Necesidades
R1 R2 R3 R1 R2 R3
P1 P1
P2 P2
P3 P3
P4 P4
864
Totales: 8 8 7
Dispon: 0 2 3
Ocurre que es un sistema no seguro ya que si algún proceso solicita todas las unidades de los recursos a la vez
no se le puede atender.
DETECCIÓN.
Se conceden libremente los recursos disponibles a los procesos que lo soliciten y periódicamente se
comprueba si hay un interbloqueo. Para detectarlo hay que conocer los recursos que hay asignados a los
procesos. Necesitamos saber las solicitudes y también de algún algoritmo que con esta información detectar o
no el interbloqueo.
Algoritmos:
ciclos
Solicitudes: Número de recursos de un tipo que ya ha solicitado al sistema, aunque puede que necesite más. Si
no podemos continuar quiere decir ahora que si hay interbloqueo y los procesos que se encuentran en esa
situación son los no marcados.
66
R1
Aquí hay
Interbloqueo.
R2
Asignados Necesidades
R1 R2 R1 R2
P1 P1
P2 P2
12
Totales 1 2
Dispon: 0 0
R1 R2 R3 R4
Asignados Solicitudes
R1 R2 R3 R4 R1 R2 R3 R4
P1 P1
P2 P2
P3 P3
P4 P4
2011
Totales: 2 2 1 1
Dispon: 0 2 0 0
Dispon: 1 2 0 0
67
(P1) : 1 0 0 0
Dispon: 2 2 0 0
Otro ejercicio.
R3 R4
R1
R2 R5
Asignados Necesidades
R1 R2 R3 R4 R5 R1 R2 R3 R4 R5
P1 P1
P2 P2
P3 P3
P4 P4
P5 P5
11111
Totales: 1 1 1 1 1
(P5) 0 0 1 0 0
Dispon: 0 0 1 0 0
Si es alta tienen unas ventajas por ejemplo antes detectaremos la existencia de interbloqueo y la desventaja
puede ser que ese algoritmo consume tiempo.
Si es baja la frecuencia tardaremos mucho en detectar el estado de interbloqueo, la ventaja es que ese tiempo
no lo consumimos. El sistema no hace nada y todos están en interbloqueo si la frecuencia de invocación es
muy baja.
68
Recuperación del interbloqueo.
• Ir abandonando procesos, de esta manera se liberan los recursos que este tenía y así se mira si el sistema
sigue con interbloqueo y si sigue bloqueado se sigue abandonando procesos.
• Abandonar todos de golpe.
• Vuelta atrás consiste en ir a un estado anterior en el cual no hubiera interbloqueo, obliga a guardar en un
registro todos los estados seguros y poder regresar a uno de estos estados.
• El sistema se apropie de recursos, se van quitando recursos a procesos para volver a una situación segura.
Algoritmos del Avestruz : Ignoran los interbloqueos, no hacen nada ante un interbloqueo.
CUENTAS DE USUARIO.
Se gestionan a través de unos ficheros específicos, son editables y visibles por cualquiera.
• Con el comando USERADD o con el comando ADDUSER. Nos pedirá el Login que es el nombre del
usuario en el sistema . Va a tener un UID, es único e internamente maneja ese número o identificador.
Además debemos utilizar una contraseña un password, y un GID identificador de grupo. El sistema nos
pide el directorio HOME del usuario, nos solicitará el shell para dicho usuario. Y nos solicitará el nombre
completo del usuario.
• Se puede dar de alta también a través de algún tipo de herramienta gráfica como pueden ser las
X_WINDOWS.
• También se puede hacer a mano: Existe un fichero /etc/passwd que contiene las cuentas de usuario, y existe
una línea en el fichero por cada usuario que esté dado de alta en el sistema , tiene un formato definido y
vienen separados los campos por ( : ) los dos puntos y estos campos son la información que se debe dar
para dar de alta un usuario.
Login : passwd : UID : GID : nombre completo del usuario : Directorio Home :
En el caso de que el campo passwd esté vacío es que no tiene contraseña y si el nombre no aparece, no pasa
nada. Todos los campos son obligatorios menos el passwd y el nombre completo del usuario.
El login no puede ser igual en dos entradas del fichero. Tampoco puede haber dos UID iguales. Lo que si
puede haber son 2 contraseñas iguales. Las contraseñas aparecen en el fichero encriptadas, tienen que ser de 6
caracteres, contener números y letras y que no deben coincidir con datos pertenecientes al usuario y no deben
estar en el diccionario del sistema, pluralistas.
La contraseña puede cambiarse con passwd, y el administrador o superusuario puede cabmiar todas las
contraseñas.
Con : !passwd : poniendo el cierre de admiración en el campo password se deshabilita una cuenta.
69
Hay otro fichero / etc / shadow , y este es el que contiene las contraseñas del usuario, ya que en el fichero de
password se podían ver las contraseñas aunque estén encriptadas , solo tiene permiso de lectura para el
administrador y tiene una entrada pro cada uno de los usuarios y permite almacenar en el otro tipo de
información relativa a la cuenta del usuario.
Edad mínima , el tiempo que tiene que transcurrir antes que pueda cambiar la contraseña.
. profile se ejecuta siempre que entra en el fichero. Cuando damos de alta un usuario no solo hay que poner la
línea si no que hay que crear el directorio HOME, y copiar algún fichero como el . profile y algún otro y todos
ellos se encuentran en el directorio / etc / skel es necesario copiarlos al directorio de usuario.
Herramienta gráfica
A mano.
Eliminar la línea correspondiente / etc/passwd y también debería borrar el directorio del usuario.
Con newgrp puedo cambiarme de grupo y tendrás los permisos asignados a ese grupo, cuando entro
pertenezco al grupo que aparece a al entrada / etc / passwd .
: : : GID :
Es posible que un usuario pertenezca a más de un grupo, pero en un determinando momento solo perteneceré
a un determinado grupo.
También tenemos el fichero /etc/group que contiene los grupos que están dados de alta en el sistema y otra
información relativa a esos grupos. Hay 4 campos:
Este último campo va separado por comas. No es común que exista el campo contraseña.
Existe un tipo de Shell que se denomina Shell restringido que se suele llamar RSH, las restricciones son : que
no se puede utilizar comandos como CD, no se puede cambiar el valor de la variable PATH, no se pueden
utilizar rutas completas, no se puede dirigir la salida con los comandos >, >>.
Nota:
para eliminar los ficheros de un usuario se hace: Find / − user ( username ) −exec.
70
Sustituciones de History : a medida que vamos introduciendo comandos lo almacena en un fichero que se
denomina como . HISTORY, y si visualizo, veo los comandos que he utilizado durante su uso, si pulso la
tecla de cursor ! se van viendo.
Si ejecuto el comando HISTORY me aparece todos los comandos que hemos ejecutado.
• instrucción
• instrucción .
• Instrucción
• ..
•
!−1=!
! el primero.
! $ el último.
Ejemplo: Si pusiese CAT PEPE y luego pongo RM ! $ haría referencia del último parámetro del comando.
Cuando pongo rm ! $ me sustituye esto por el parámetro, luego me sustituirá el alias si lo hay. Si quiero ver
los alias definidos basta con poner ALIAS y si quiero quitar alguno UNALIAS nombre.
Ejemplo: dir ! $, traduce como dir y el parámetro, luego lo transforma como ls y el parámetro.
Primero se sustituye el !$ luego el comando Copy y lo tercero $HOME por la dirección que sea.
71
Todos estos pasos se realizan antes de ejecutar los comandos.
PS1 = $cad
Cad = adiós
En este ejemplo PS1 seguirá valiendo Hola, para que valiera adiós hay que poner:
Las comillas dobles ( ) desactivan la generación de nombre y archivos, pero mantienen la sustitución de
comandos y variables.
Ejemplo: echo $ term sigue manteniendo el valor. Si pongo ls * lo anula y me mostraría un fichero cuyo
nombre sea el asterisco.
La comilla simple ( ` ) no realiza nada, desactiva toda función de análisis. Si pongo echo ` $HOME ` me
sacará por pantalla $HOME.
Error Estándar : cuando escribo un comando y no especifico nada, los errores que se producen van a salir por
el error estándar. El error estándar está referenciado a la pantalla y nos referiremos a este error con el número
2.
El error estándar lo puedo redirigir y así no me aparece por pantalla. Ejemplo: En este ejemplo suponemos
que el fichero1 no existe.
Donde el 2 sirve para que en vez de sacarlo por pantalla lo pase al fichero.
Cat f1 1 > f2 2 > &1 donde el &1 hace referencia a la salida estándar.
Con set − o noclobber impedimos que una redirección con un operador > sobreescriba el fichero existente.
72
Con >! forzamos a la sobreescritura del fichero ignorando el noclobber.
GESTIÓN DE PROCESOS.
Ps muestra los procesos que hay en el sistema, nos muestra el PID ( identificación del proceso ), el TTY (
terminal asociado desde el que se ha ejecutado el proceso ), el comando que ha motivado la aparición del
proceso, la hora, el estado del proceso si aparece una r ( ejecución) si aparece una s ( dormido ) y si aparece
una z ( zombie ).
El directorio / proc contienen muchos ficheros y cada uno de estos son las imágenes de los procesos que hay
en memoria.
Cuando metemos un comando en el shell hace un Fork y crea un shell hijo y es el que ejecuta el comando y el
shell padre espera a que acabe para que tome otra vez el mando.
El comando se ejecuta y el shell padre crea un hijo pero no espera a que acabe el shell hijo, podemos
continuar introduciendo comandos. Se utiliza para aquellos trabajos que no tengan una característica
interactiva con el usuario.
Lo normal es redirigirlo o mandar a background aquellos trabajos que no necesitan salida por pantalla.
Normalmente me aparece [ ] que es el número de proceso que luego lo puedo utilizar poniendo: Background
numproceso.
Foreground numproceso.
NOHUP manda un trabajo en backgroung y no será interrumpido cuando finalice la sesión en el sistema.
73
Ejemplo : nohup nombre comando &
No tiene ningún terminal asociado, las salidas de esos comandos van a pasar a un fichero que se llama nohup.
Out
KILL : sirve para enviar señales a un proceso, entre estas señales está la de terminación que hace que
concluya un proceso y es ( KILL − 9 ) .
La instrucción se pone:
Ejemplo:
Kill −9 23456
Cuando se arranca el sistema operativo se crea 2 procesos. Antes hay un proceso 0 que hace una llamada a
fork y se crean el proceso 0 y el nuevo proceso 1.
PROCESO 0
Fork
Proceso 0 Proceso 1
Planificador Init
Cuando arrancamos leemos un fichero que es /etc/ inittab que contiene una serie de campos que sirven para el
arranque.
Runlevels : Estados INIT en los que se debe ejecutar las acciones correspondientes.
En Unix se puede arrancar en diferentes niveles, pero solamente puede estar en uno de esos niveles y
dependiendo de ese estado el estado de la máquina va ha ser diferente.
NIVEL 1 : Modo monousuario, el administrador solamente puede conectarse a la máquina y tiene que hacerlo
de forma local.
74
NIVEL 2 : Multiusuario sin red, es posible abrir varias sesiones con el sistema pero no está disponible la red.
NIVEL 3 : Multiusuario con red, se puede conectar cualquier usuario de cualquier tipo.
NIVEL s :
NIVEL S : son monousuarios, peor permiten conectarse desde una consola remota.
El administrador puede pasar de un nivel a otro a través del comando INIT y el número de nivel.
Cuando ponemos en ese campo : : quiere decir que es para todos los niveles.
• Respawn : el proceso que se ejecuta a continuación será arrancado una vez termine el proceso.
• Wait : El proceso es arrancado al ejecutar el nivel de ejecución especificado y el proceso INIT espera a la
terminación del proceso antes de terminar.
• Once : Especifica que solo se ejecutará una vez.
• Boot : Se ejecutará durante el arranque.
• Initdefault : Especifica el nivel de ejecución por defecto en el que se arrancará el sistema, y no lleva ningún
tipo de proceso.
Ejemplo : in : 3 : intitdefault :
De tal forma que INIT no continua hasta que el script rc . local no se ejecute.
Donde rc . d contiene una serie de directorios como por ejemplo ( rc0 . d ; rc1 . d rc2 .d) que a su vez
contienen scripts que se ejecutarán cuando el sistema entre en el nivel correspondiente.
Nos encontraremos Scripts que empiezan por S o por K, tendrán una serie de números y a continuación el
nombre del servicio al que afecta. Los que empiezan por S son Scripts que arrancan el servicio
75
correspondiente. Los que empiezan por K finalizan el servicio correspondiente. Los números del medio
ayudan a determinar el orden en el que se ejecutan cada uno de los scripts. ( Los Unix modernos utilizan
START para arrancar y STOP para parar).
INIT . d es un fichero que realmente contiene los archivos que reinician y cierran los demonios.
En Rc1 . d, rc2 . d vemos enlaces simbólicos (especie de punteros ) a ficheros que están el directorio int . d .
Tenemos 2 variables:
En el fichero . / etc / rc . d / init . d / functions están definidas la funciones que utilizan los scripts de
arranque y finalización de servicios. El sistema en vez de incluirlos en cada scripts de arranque los almacena
en este fichero y después lee el fichero functions y los carga en memoria y así facilitará su invocación desde
un script.
Ejemplo:
Function borrar ( )
Y en otro script pongo . fun y así leo las funciones que tengo en el fichero fun .
. fun
read a
borrar
Si pongo en prom $ . fun también valdría, luego pongo $ Borrar y me borraría la pantalla.
IMPRESIÓN EN UNIX.
76
Utilizamos una cola de impresión llamada Spool para almacenar los trabajos y después con el demonio ( lpd)
que es el que se encarga de enviar los datos a la impresora. La cola es un directorio /var / spool / lpd / lp0
Lp1.
El fichero / etc / printcap contiene todos las definiciones d todas las impresoras lógicas que tenemos. Dentro
del fichero tienen campos y utiliza los : para separar los campos.
Nombre impresora : :
Siempre conviene tener una impresora por defecto y se hace con lp a no ser que tuviésemos la variable
PRINTER.
LPC: Podemos controlar el proceso de imprimir trabajos (start/ stop) o admitir o no trabajos en la cola de
impresión ( Enable / disable). Con ( up / down ) equivale a tener los otros dos juntos ( enable y el start /
disable y el stop ).
SISTEMAS DE FICHEROS.
Directorio Raíz.
Punto de entrada, el más importante. Tenemos 2 formas : forma absoluta ( parte del directorio raíz), forma
relativa.
Directorio BOOT.
Contiene archivos estáticos del cargador de arranque. Las tablas de particiones del disco se encuentran en el
boot.
Directorio BIN.
Contiene comandos esenciales de usuarios. Comandos como ls, cat, chmod etc.
77
Directorio DEV
Contiene un archivo por cada dispositivo que el kernel puede soportar. Ejemplo:
• lp0 ( impresora )
• fd0 ( disquetera)
• hda ( primer disco duro)
• hdb ( segundo disco duro)
Directorio ETC.
Contiene configuración del sistema local. Hay ficheros que se encargan de la configuración de impresoras (
printcap ), de usuarios ( passwd ), de la máquina ( inittab).
Directorio HOME.
Directorio LIB.
Directorio MNT.
Directorio PROC.
Directorio ROOT.
Directorio SBIN
Contiene comandos que solamente pueden ser ejecutados por el superusuario. Ejemplo:
Mkswap
Shutdown
Swapon
Directorio USR
Contiene subdirectorios y son de solo lectura, dentro de los subdirectorios hay 2 que son:
c) Directorio MAN.
78
Contiene todas las páginas del manual.
Directorio VAR.
Sistemas de Ficheros.
Ejemplo: /
bin
Si quiero montar un disco este tiene que poseer un sistema de ficheros (un estilo al formateado), y montar ese
árbol sobre mi sistema de ficheros.
disco.
Ejemplo: /
Mat
ope Edi
Mat
El comando MOUNT sirve para montar un sistema de ficheros, y hay que especificar el dispositivo donde
está esos archivos ( el sistema de ficheros) y especificar el punto donde lo voy a montar en mi sistema de
ficheros.
(En las opciones es necesario a veces especificar el tipo de sistemas de ficheros que voy a montar).
79
El −t sirve para el tipo MSDos.
Para desmontar el sistema de ficheros se utiliza el comando AMOUNT dispositivo punto de montaje. Para
desmontar el sistema de ficheros no puede haber nadie en ese sistema de ficheros.
Existe un fichero que se llama fstab que se encuentra en \etc \ fstab que contiene información sobre el
sistema de ficheros que el sistema Operativo montará de forma automática al arrancar.
Se montará en alumnos y las opciones es si es posible la lectura, escritura sobre el sistema de ficheros.
Dentro de las opciones la más común es tener default, se monta como escritura / lectura, se montará como
bloque, los usuarios ordinarios no pueden hacer montajes en ese punto y se pueden ejecutar programas en él.
El NFS es un sistema de fichero que se llama Network File System y es el fichero de sistema de red.
El fichero /proc/filesystems contiene el nombre de los sistemas de ficheros que es capaz de soportar el
Sistema Operativo.
Con el comando MKFS permite crear un sistema de ficheros, es parecido a formatear un disco.
El comando MKDEV sirve para añadir un fichero de dispositivo. Es un script que se encarga de solicitar la
información que necesita.
Enlace: Es como una referencia a otro fichero, esta referencia se guardan en el inodo correspondiente.
Enlaces duros: Ocurre que dentro de cada información asociada a cada fichero ( ls − l ) , está el número de
enlaces que hay al fichero, al borrar un fichero solo borramos la unión entre la entrada de directorio y el inodo
correspondiente. Solamente al borrar el fichero con número de enlaces uno es en realidad cuando se borra el
archivo del disco.
Es posible que yo borre un fichero al que se tenga enlace y los demás que tuvieran el enlace puedan seguir
accediendo al fichero, no importa de quien sea el fichero, sino que el fichero estará en un inodo del disco que
es el que contiene la información del fichero.
Los inodos apuntan al fichero en disco y los enlaces duros apuntan a dichos inodos.
80
• Desventajas:
Enlaces simbólico: En el caso del enlace simbólico se guarda la ruta completa del fichero al que enlazo, es
equivalente a crear un fichero cuyo contenido es la dirección donde se encuentra el fichero. El tamaño del
enlace es igual al número de caracteres de la ruta del fichero.
• Desventajas:
• Ventajas:
− fichero
d directorio
l enlace simbólico.
El comando DD permite hacer copias exactas de discos flexibles, presenta la ventaja de que el disco sobre el
que hacemos la copia no necesita tener ningún sistema de ficheros previamente. Se necesita especificar el
dispositivo de origen ( < ) y el primer paso es almacenar temporalmente los datos en el disco duro y en un
segundo paso hay que:
Existen 3 opciones:
81
• of = especifica fichero de salida
• bs = especifica el número de bloques que es capaz de leer a la vez.
El comando TAR ( tape archivo ) permite archivar archivos en cinta, hoy en día permite agrupar una serie de
ficheros en un solo fichero y después podemos reemplazar o extraer ficheros del fichero grande pudiendo
tratar los ficheros del fichero grande de manera individual.
Sintaxis:
TAR opciones:
C crea un fichero
X Extraer
R Reemplazar
T Lista.
Ejemplos:
Donde directorio es el nombre del directorio del que voy a hacer el tar incluye los subdirectorios.
Gzip nombre_fichero
Si queremos comprimir varios ficheros pues lo haríamos primero con TAR y luego con GZIP.
El GZIP tiene grados de compresión ( − 1 y − 9 ), según sea un grado será mayor grado de compresión y
tardará más.
En el comando TAR está la opción z con la cual podemos trabajar a través de ficheros comprimidos por gzip.
Tenemos otros comandos como COMPRESS y UNCOMPRESS que se mantiene por compatibilidad y
generan archivos con extensión . Z .
82
El gzip y el gunzip borran el fichero que comprimieron o descomprimieron.
El comando CPIO acepta una lista de ficheros y copia estos ficheros en un único fichero de salida además
inserta cabecera entre cada uno de los ficheros para su posterior recuperación.
Ejemplo:
Siempre habrá un comando antes de cpio que proporcione una lista de fichero.
La opción para crear el fichero es la opción − O, este comando no comprime los ficheros, solo los une.
El comando SHUTDOWN permite realizar un apagado ordenado del sistema , las opciones son:
Si se está haciendo un SHUTDOWN ( por ejemplo de 5 minutos 9 pues ningún usuario se puede conectar al
sistema.
Mesg Con la opción − n se deshabilita la opción de que otro usuario pueda escribir en nuestro terminal.
SISTEMAS MULTIPROCESADORES.
Proporcionan una alternativa arquitectónica para mejorar el rendimiento de los sistemas informáticos,
mediante la reunión de varios procesadores.
Vamos a ganar en fiabilidad o tolerancia a fallos. Ejemplo es que si tengo 2 procesadores y me falla uno
todavía puedo hacer algún trabajo.
Esto puede servir para adaptar el sistema a mis necesidades, un tipo de trabajos a un procesador y otro tipo a
otro procesador.
83
Clasificaciones de sistemas multiprocesadores según FLYNN, que se basa en como se relacionan los datos o
las secuencias de datos y secuencias de instrucciones.
• Relación SISD ( single instruction single data): una secuencia de instrucciones o una sola, un solo dato o
una secuencia de datos. Solamente podemos estar ejecutando una instrucción en un determinado momento
y solo un dato.
• Relación SIMD : una sola instrucción, varios datos. Esta instrucción la puedo aplicar a un conjunto de datos
diferente.
• Relación MISD: múltiples instrucciones sobre un solo dato, tengo varios procesadores y cada uno realiza
una operación diferente sobre un único dato.
• Relación MIMD: múltiples instrucciones sobre múltiples datos. Hay n procesos, n conjuntos de datos y
cada uno realiza operaciones diferentes sobre datos diferentes.
La relación de procesadores_memoria es :
Los procesadores individuales tienen memorias privadas y no existe una memoria globalmente compartida los
sistemas funcionan independientemente y se comunican entre sí a través de un enlace de comunicación.
Los multiprocesadores contienen memoria globalmente compartida a la que todos los procesadores tienen
acceso.
Un sistema multiprocesador no tiene porque ser un sistema distribuido pero un sistema distribuido si es un
sistema multiprocesador ya que un sistema distribuido tiene varios procesadores, pero si es un sistema
fuertemente acoplado ya no cumple que sea distribuido ya que el sistema distribuido tiene su propia memoria
en los procesadores.
• Maestro_satélite: Sencillo de implementar, solo un procesador que va ha ser el maestro el que puede
ejecutar el sistema operativo y los demás se van a encargar de ejecutar programas de usuario. Todo lo que
necesite el sistema operativo se hace dentro del procesador Maestro. El maestro planifica los diferentes
procesadores satélites.
Ventajas:
• Sencillo de implementar.
Desventajas:
84
Este tipo permite paralelismo dentro de una aplicación, pero no es posible paralelismo a nivel del sistema
operativo porque es el maestro el único que puede ejecutar instrucciones del sistema operativo.
• Ejecutivos separados: Cada procesador tienen su propio sistema operativo, este gestiona la memoria,
recursos de Entrada/Salida de forma que ese sistema operativo responde a las interrupciones de los usuarios
que operan en ese procesador. Los procesos son asignados a los procesadores lo que hace que un proceso se
tenga que ejecutar hasta su finalización en el procesador correspondiente.
Desventajas :
• No es posible el equilibrado de las cargas de trabajo entre los diferentes procesadores ya que los
procesos son asignados por el sistema.
Aquí no existe paralelismo dentro de una misma aplicación. Lo normal es que haya algún procesador
encargado de asignar los trabajos a los procesadores.
• Organización Simétrica: Todos los procesadores son idénticos y el sistema operativo es simétrico en el
sentido de que cualquier procesador puede ejecutar el sistema operativo pero el sistema operativo en un
momento determinado solo va a estar en un procesador. Se suele llamar Sistema flotante. Así cualquier
procesador gestiona la entrada / salida del sistema operativo y cuando un procesador necesite ejecutar algún
tipo de operación que necesite el sistema operativo este flotará a este procesador.
Ventajas:
Tengo que explicar en que momento la aplicación se va ha ejecutar por separado, cuales se ejecutan
concurrentemente y cuales no.
La planificación por parte del Sistema operativo : tiene un planificador que asigna procesos a cada uno de los
procesadores.
P1 P2 P3 P4
0ABCD
1VXYZ
2ABCD
85
3VXYZ
Tenemos RR(20) y tenemos el proceso A que vale ( 2 ) y ahora necesitamos sincronizar con V , lo que pasa es
que tendríamos que durante 18 periodos estaría parado.
Por lo tanto procesos que cooperan entre sí deben sincronizarse evitando estas operaciones y planificados para
que se ejecuten de forma simultánea.
En los sistemas débilmente acoplados tenemos un proceso que se ejecuta en P1 y queremos cambiarlo a P2, lo
que pasa es que tenemos que poner una serie de variables adicionales que son las que especifican donde estaba
el proceso en el procesador primero, por lo que hay veces que no nos interesa cambiar los procesos.
En el caso de los sistemas débilmente acoplados al ser máquinas diferentes es más difícil que los procesadores
sean diferentes de tal forma que las operaciones pesadas (de muchos cálculos) se ejecuten en los procesadores
más potentes aunque tengan que esperar ( habiendo un procesador menos potente libre).
Sistema Distribuido.
Características:
Ventajas :
Desventajas.
Concepto de transparencia.
Da una idea de perfección del sistema como un todo en vez de cómo una colección de elementos individuales
86
independientes. Es la ocultación al usuario y programas de la separación de componentes en un sistema
distribuido.
Tipos:
• De acceso: Permite a los usuarios o los programas acceder a los objetos locales y remotos utilizando las
mismas operaciones.
• De localización: Permite acceder a los objetos sin necesidad de conocer su ubicación.
• De concurrencia: Permite a varios procesos ejecutarse de forma concurrente utilizando información
compartida sin interferirse entre ellos.
• De replicación: Permite la utilización de diferentes instancias de un objeto sin necesidad de conocimiento
de las mismas por parte de los usuarios o de los programas de aplicación.
• De migración: Permite mover elementos e información de un sistema a otro sin que esto afecte a los
usuarios o a los programas.
• De tolerancia a fallos: Permite ocultar fallos a usuarios y programas permitiendo que estos puedan
continuar su ejecución a pesar de los fallo Hardware o software.
• De rendimiento: Permite reconfigurar el sistema para mejorar el rendimiento a medida que la carga de
trabajo varía.
• De escalabilidad: Permite añadir nuevos elementos sin necesidad de cambiar el sistema ( cambiar su
estructura o los algoritmos de los programas).
En un sistema distribuido no existe ni memoria , ni relojes comunes, por lo tanto es difícil determinar entre 2
sucesos cuál ha ocurrido primero. Para esto se definen una relación que se llama sucedió antes o primero que
es una ordenación parcial de sucesos en sistemas distribuidos. Todos los sucesos de un mismo proceso están
ordenados. >Un mensaje solo puede ser recibido si antes ha sido enviado. La relación se define de la siguiente
forma:
Si A y B son sucesos del mismo proceso y A se ejecutó antes que B entonces esto se expresa de la siguiente
forma:
AB
Si A es el suceso consistente en enviar un mensaje por parte de un proceso y B es el suceso de recibir ese
mismo mensaje pro parte de otro proceso esto lo expresamos como A sucedió antes que B.
AB
Si A sucedió antes que B y B antes que C podemos decir que A sucedió antes que C.
AB y BC entonces A C.
En cualquier otro caso si 2 sucesos A y B no están relacionados por la relación sucedió antes AB, BA diremos
que esos procesos se ejecutan concurrentemente.
Ejemplo:
87
P4 Q4 R1
P3 Q3
P2 Q2
P1 Q1
P0 Q0 R0
P1P2
Q1Q2
Q1P4
Q3R1
R0Q4
Si existe un camino entre 2 sucesos podemos afirmar que uno ha ocurrido antes que otro.
A cada uno de los sucesos le vamos asociar un registro de tiempo llamado TIMSTAMP. Esto quiere decir que
si AB la marca de tiempo de A tiene que ser menor que la de B.
Para asociar esas marcas a los procesos vamos a utilizar relojes lógicos, por ejemplo un contador.
Py recibe un mensaje con una marca de tiempo superior a la suya , entonces avanza su reloj lógico de tal
manera que el nuevo valor del reloj es igual a la marca de tiempo recibida más uno.
10
88
recibe instante con marca 10
Podría ocurrir que envío un mensaje en un instante de tiempo 10 lo recibo y lo pongo una marca de tiempo 10.
¿ Incremento la marca y se lo asigno al mensaje recibido?
Tengo que incrementarlo ya que tiene que ser una marca de tiempo posterior, lo incremento.
Existen 3 procesadores:
• Solución centralizada.
Se centraliza todas las solicitudes del recurso a través de un nodo que es el que concede la utilización de dicho
recurso. Podemos tener tres tipos de mensaje:
• Solicitud
• Concesión ( asignación).
• Liberación
Cuando desea utilizar un recurso envía un mensaje de solicitud al nodo central, este nodo entre todas las
solicitudes asignará el recurso a una de ellas a través de un mensaje de concesión y quedará a la espera de
recibir un mensaje de liberación por parte del proceso al cuál había enviado el mensaje de concesión. La
concesión del recurso se hace en base a marcas de tiempo incluidas en la solicitud.
Solicitud
concesión
liberar
Problemas:
• Paso de testigo
Tenemos un tipo especial de mensaje llamado testigo, el cual vamos hacer circular a través de todos los nodos
del sistema, los nodos van a estar dispuestos en forma de anillo lógico y ese anillo va a ser unidireccional.
Solamente aquel proceso que disponga del testigo podrá utilizar el recurso compartido.
Es importante que el anillo sea unidireccional porque así antes o después el testigo pasará por cualquiera de
89
los nodos. Si no se desea ningún recurso el testigo continúa.
• Perdida de testigo
• Si falla alguno de los nodos del anillo es necesario reconstruir dicho anillo.
• Si nosotros añadimos alguna máquina hay que reconstruir también el anillo.
• Solución distribuida
Cuando un proceso Pi quiere ingresar en su Sección Crítica genera una marca de tiempo y envía un mensaje
con su identidad y marca de tiempo a todos los demás procesos. Cualquier proceso al recibir un mensaje
puede contestar de inmediato o diferir la contestación. Un proceso que ha recibido contestación por parte de
todos los demás procesos, podrá ingresar entonces en su Sección Crítica.
Los mensajes que reciba mientras está en su Sección Crítica los encolará y diferirá ( retrasará) su contestación,
una vez finalizada su Sección Crítica, responderá a todos los mensajes diferidos.
• Si un proceso está en su Sección Crítica cuando recibe el mensaje entonces diferirá la contestación.
• Si un proceso no quiere entrar en su Sección Crítica entonces responderá de inmediato.
• Un proceso quiere entrar en su Sección Crítica en cuyo caso comparará la marca de tiempo del mensaje
recibido con su propia marca de tiempo, si su marca de tiempo es mayor enviará una respuesta, si no
diferirá la respuesta.
A=10
B=4 A contestación de C
(A, 10)
(B,4) (A, 10 )
diferir a A B C
(B,4)
contestación de C
En este ejemplo suponemos que C no quiere acceder a su Sección Crítica, C contesta inmediatamente el
mensaje enviado por A y por B.
A contesta a B ya que su marca de tiempo es mayor que la de B, luego contestará a todos los mensajes que
tenía diferidos.
Miramos que pasaría si: C ahora quiere acceder a su sección crítica y B está en su Sección Crítica.
90
C=12
Cuando acaba B contesta a A y contesta a C y entre A y B miran a ver quien tiene menor marca.
Difiere C
contesta A
(A, 10)
(B,4) (A, 10 )
(C,12)
BC
contestación de C
Se genera el evento
De ha recibido todos.
Sale de la S.C.
• Garantiza la exclusión mútua pro que mientras un proceso está en su S.C diferirá todos los mensajes que
reciba mientras tanto.
• La solución no produce bloqueos; garantizamos que no hay inanición puesto que utilizamos marcas de
tiempo.
• Es obligatorio que cada nodo conozca la existencia de todas los demás nodos.
• Que pasa si uno de los nodos falla, lo lógica es que desaparezca de la lista de nodos de los cuales tenemos
que enviar mensajes. El problema es después de enviar el mensaje si falla, ya que no tendremos respuesta.
Gestión de Interbloqueos.
Las soluciones que se dan a los interbloqueos son las que se dan a los interbloqueos son las que se dan a las
bases de datos.
Como se gestionan:
91
Siguen siendo válidas algunas de la soluciones para sistemas monoprocesadores.
• Detección
• Evitación
• Prevención
• Ordenar de forma global todos los recursos de forma que un proceso que solicite un recurso de una
determinada clase ya no pueda solicitar recursos de una clase inferior. Esta solución es sencilla de
implementar pero no es muy útil.
• Esperar_Morir: Es una solución no apropiativa, si un proceso Pi solicita un recurso que tiene Pj , Pi
esperará la concesión del recurso si su marca de tiempo es menor que la de Pj . En cualquier otro caso Pi
muere ( ser reinicia pero manteniendo la misma marca de tiempo que tenía antes.
• Herir_Esperar: Es una solución apropiativa, se concede inmediatamente la petición a los procesos más
antiguos, si Pi solicita un recurso que tiene Pj , Pi espera si su marca de tiempo es mayor que la de Pj . En
otro caso Pj es herido (reiniciado) y Pi pasa a utilizar el recurso.
• Utilizar una versión distribuida del Algoritmo del banquero.
BANQUERO.
• Centralizado
• Jerárquica
• Distribuida
CENTRALIZADO.
Construimos un grafo global en uno de los nodos de forma que ese nodo, en base al examen de ese grafo
global que ha construido, sea el encargado de la detección de los interbloqueos. Tenemos que hacer distinción
entre el grafo real y el construido.
92
El global construido es una aproximación generado por el nodo coordinador durante la ejecución de su
algoritmo.
NODO A NODO B
El mayor problema que tiene esto es la aparición de interbloqueos fantasma o falsos interbloqueos, son
debidos al retraso de la comunicación entre los nodos y se producen cuando el algoritmo detecta en base al
grafo que tienen un interbloqueo que no existe.
• Construirlo cada vez que se inserta o elimina una arista en uno de los grafos de espera locales.
• De forma periódica cada vez que hay un cierto número de cambios en un grafo.
• Cada vez que el coordinador necesita invocar el algoritmo de detección.
JERARQUICO.
Existe una jerarquía de nodos de forma que un nodo no hoja construye el grafo de los nodos que están por
debajo suyo, evalúa si existe o no interbloqueo en ese grafo y opera en consecuencia.
ESTRATEGIA DISTRIBUIDA
Todos los nodos comparten igualmente la responsabilidad de detectar bloques mutuos y cada nodo construye
un grafo de espera que representa una parte del grafo total. La idea es que si hay un ciclo este aparecerá por lo
menos en alguno de los grafos parciales. Al grafo de espera local añadimos un elemento extra que
denominamos Pex de forma que existirá en el grafo una arista Pi Pex si Pi está esperando pro un recurso de
otro sitio que está en posesión de cualquier otro proceso. Aparecerá una arista Pex Pi si algún otro proceso en
otro nodo está esperando un recurso que actualmente está en poder de Pi .
• Si encontramos un ciclo en el grafo que no involucre a Pex entonces podemos afirmar que el sistema
está en un estado de interbloqueo.
• Si encontramos un ciclo en el grafo que involucre a Pex implica que hay la posibilidad de
interbloqueo. Para determinar si realmente existe interbloqueo es preciso invocar un algoritmo para su
detección. En ese caso mandamos a alguno de los nodos información sobre nuestro grafo y con ella él
construirá un nuevo grafo local, y volvemos otra vez hacer loso pasos.
Ej:
93
Nodo a) P1 P2
Pex
P5 P3
Nodo b ) Pex P2 P4
P3
Pex − P3 − P4 − P2 − Pex
Y con la línea azul tenemos: P2 − P3 − P4 y como no interviene el nodo P1 podemos afirmar que hay
interbloqueo.
ventajas:
Desventajas:
Ventajas:
Desventajas:
Ventajas:
94
Desventajas:
TRATAMIENTO DE FALLOS:
Hay algoritmos que tratan los fallos y se denominan algoritmos de lección de sucesores y determinan lo que
ocurre cuando un nodo coordinador falla, estos algoritmos suponen que existe un número de prioridad único
asociado a cada proceso activo del sistema de forma que el nodo coordinador será el que tenga el número de
prioridad más alto. Estos algoritmos deben garantizar que el nodo seleccionado como nuevo nodo coordinador
es único.
Es adecuado para sistemas donde cada proceso puede enviar un mensaje a todos los demás, si un proceso Pi
envía una solicitud y no recibe respuesta en un intervalo de tiempo T supone que el coordinador ha fallado y
trata de establecerse como nuevo coordinador, en ese caso envía un mensaje de elección a todos los procesos
que tengan un número de prioridad mayor y espera nuevamente un tiempo de espera T. Si no recibe respuesta
en ese tiempo supone que todos los demás nodos han fallado y se establece como coordinador, entonces envía
un mensaje a todos los procesos indicando que es el coordinador. Si hubiera recibido algún mensaje de los
nodos de más prioridad espera un tiempo T' la recepción de un mensaje en el cuál otro nodo indique que es
coordinador, si no llegara en ese tiempo T' reinicia el algoritmo.
En un momento determinado un proceso Pi puede recibir 2 mensajes o bien un mensaje en el que se especifica
que Pj es el nuevo coordinador ( entonces la prioridad j > i ) o bien que el proceso responda a un inicio de
elección ( j < i ). En ese caso Pi responde a Pj y además inicia el algoritmo de elección.
Elección
Elección Elección
P1 P2 P3 P4
Respuesta
Coordinador
Coordinador
Supone que los procesos no conocen la identidad de otros procesos a priori y a su vez los procesos están
conectados a través de un anillo lógico, cada nodo únicamente conoce como comunicarse con su vecino del
anillo.
El nodo coordinador será el nodo con el identificador más alto y el algoritmo asume que todos los nodos
95
permanecen activos y alcanzables durante la operación.
Inicialmente cada nodo se marca como no participante y cualquier proceso puede comenzar la elección del
coordinador. Cuando un nodo detecta el fallo del coordinador se maca así mismo como participante, coloca su
identificador en un mensaje y manda este mensaje a su vecino. Cuando un proceso recibe un mensaje de
elección compara su identificador con el del mensaje. Si el identificador recibido es mayor que el suyo,
entonces reenvía el mensaje al siguiente nodo del anillo, si es menor y el que la recibe es no participante,
entonces sustituye el identificador recibido por el propio , se marca como participante y lo reenvía. Si
previamente ya estaba como participante entonces no hace nada. Si el mensaje recibido contiene su
identificador entonces se convierte en coordinador, se marca como no participante y envía un mensaje al
vecino avisando que es el nuevo coordinador, cuando los demás procesos reciban el mensaje se marcan como
no participantes y lo reenvían.
Sentido
Como el identificador es
como participante y
Falla
Envía
Detecta el fallo y se
Si detectan 2 procesos el fallo envía su identificador cada uno y se marcan como participante y cuando llega a
ellos el identificador lo califican y si es menor que el suyo quitan el suyo y envían ese mensaje hasta que
llegue alguno de los que localizó el fallo su identificador, y se marque como coordinador.
El que inventó este algoritmo se llama MISRA , este algoritmo también se llama algoritmo del PING PONG.
No requiere conocer las identidades de los procesos ni tampoco conocer los retardes de comunicación, supone
que todos los nodos del sistema forman un anillo lógico, utiliza 2 testigos circulando de forma independiente,
de forma que cada uno de ellos puede detectar la ausencia del otro , esto se detecta si un nodo ve el mismo
testigo 2 veces in haber visto el otro. Una ver detectada la perdida se genera el que falta.
Nping − pong =0
Tenemos para identificarlos 1 Ping, y − 1 Pong. Si el ultimo recibido es Ping y a continuación llega Pong 1 +
(− 1) = 0 es correcto pero si recibimos otra vez Ping, 1 + 1 = 2 ha pasado dos veces Ping antes de que pase
una vez Pong por lo que diremos que el testigo Pong se ha perdido y lo regeneramos.
96
Este paso de testigo no Afecta a lo de la exclusión mutua. Tenemos que poner la orden que solo puede acceder
a su sección crítica aquel que tenga el testigo Ping o aquel que tenga el testigo pong. Pero no pueden acceder
los 2.
CONSECUCIÓN DE ACUERDOS.
A la hora de comunicar diferentes nodos entre sí a través de mensajes hay que asegurar que el mensaje es
recibido y que es recibido de forma correcta. Existen pro tanto 2 tipos de problemas:
Puede resolverse mediante envío de mensajes de confirmación que indiquen que se ha recibido el mensaje. Se
establecen periodos de tiempo, dentro de los cuales debemos recibir la confirmación de que el mensaje
enviado ha sido recibido. Si transcurrido ese periodo no hemos recibido dicha confirmación entonces
suponemos que el mensaje original no fue recibido y lo enviamos de nuevo.
AB
Lo primero un nodo envía un mensaje V, luego los nodos que reciben el mensaje lo reenvían a los otros nodos
que no son ellos ni al nodo que se lo envió por primera vez así se comprueba si el mensaje es correcto.
Vv
BvC
Si M es el número de nodos que fallan entonces el número total de nodos del sistema debe ser al menos mayor
o igual a 3m + 1 pro que así podremos utilizar una función mayoría.
v P0 v
P1 P2 P3
V v X vdef v v
P2 P3 P1 P3 P1 P2
Suponemos que P2 falla, envía x a P1 y P3 no recibe nada por lo que asume un valor por defecto P3 que es
vdef .
P0 P2 P3
97
P1 ( v, x , v ) selecciona a v ya que es mayoría.
P0 P1 P3
P0 P1 P2
M va a valer uno ya que solo hay un nodo que falla. M = 1. Pues la fórmula nos da entonces: 3M + 1 = 4 se
cumple este acuerdo ya que tenemos 4 nodos.
Método alternativo al paso de mensajes y permite que programas de máquinas diferentes interactúen a través
de llamadas a estos procedimientos.
Cuando se invoca un procedimiento el entorno que lo invoca queda suspendido y se transfieren los parámetros
al nodo donde se ejecuta el procedimiento, cuando este finaliza su ejecución se le devuelve el resultado al
nodo invocador y este continua su ejecución.
Día 3 − 5 − 00
WINDOWS NT
Es capaz de trabajar con varios procesadores ( multiprocesador) la asignación a los procesadores es estática.
CONCEPTOS.
Dominio.
La unidad administrativa básica del Sistema Operativo. Grupo de ordenadores que comparten una base de
datos y tienen una política de seguridad común.
PDC ( controlador de Dominio Primario) Solo hay uno: Es el ordenador más importante del dominio y es el
que contiene la copia maestra de la Base de Datos que contiene información sobre los grupos y usuarios del
dominio es el que impone las políticas de seguridad para el dominio. Registra todos los cambios que se
realizan en la Base de Datos y es el único que recibe estos cambios.
BDC hay varios controladores de dominio secundario o BACKUP: Contienen una copia de la Base de
Datos de las cuentas de usuario, pueden validar a los usuarios, cuando inician una sesión en el sistema y
autorizar el acceso a los recursos.
98
Servidores independientes: no contienen copias de las Bases de Datos de los usuarios por lo que no
participan en la autentificación de usuarios. Normalmente se destinan a aplicaciones pesadas en las que
requieren tiempos de respuesta pequeños.
Para que los dominios puedan trabajar entre ellos es necesario que halla relaciones de confianza. Puede ser
en ambos sentidos la relación. Cuando establezco una relación de confianza unidireccional hay un dominio
que confía y otro en el que se confía. El que confía, confía en que el otro autentifique al usuario
apropiadamente.
En las relaciones de confianza bidireccional un usuario que se conecte con éxito a uno de los dominios será
considerado auténtico por el otro dominio, tendrá acceso a los recursos de ambos dominios hasta el punto
concedido por el administrador. Una relación bidireccional necesita 2 unidireccionales.
Es necesario que el usuario tenga cuenta en ambos dominios. Según esto podemos tener varios modelos de
dominio:
• Modelo de Dominio Único: Solo hay un único Dominio y a él pertenecen todos los servidores y todas las
cuentas de usuario. No hay relaciones de confianza.
• Modelo de dominio Maestro único: Consiste en designar un único dominio donde se administran todas las
cuentas de usuario y grupos globales, el resto de dominios confía en el maestro y tiene definidos grupos
locales, la función principal del dominio maestro es ser el núcleo de la administración central de cuentas.
• Modelo de múltiples dominios maestros: hay un pequeño número de dominios maestros, cada uno de los
cuales confía en todos los otros dominios maestros. Las cuentas de usuario están localizadas en los
dominios maestros de forma que cada cuenta solo está en un dominio maestro. Cada dominio secundario
confía en todos los dominios maestros y los dominios secundarios pueden establecer relaciones de
confianza entre sí aunque no es necesario.
• Modelo de múltiples dominios maestros con confianza total: Cada uno de los dominios confía en los
demás y una cuenta de usuario se crea en el dominio en el que el usuario comienza la sesión por defecto. Es
necesario establecer relaciones de confianza bidireccional con todos los dominios.
Promoción de controladores:
CUENTAS DE USUARIO.
• Usuarios Globales: Las cuentas son creadas en un servidor y se pueden utilizar tanto en el dominio en el
que han sido creadas como en los dominios que confían en ese dominio.
• Usuarios Locales: Solamente pueden ser utilizados en el dominio donde se crearon, pueden ser añadidos a
grupos locales y a grupos globales.
• Grupos Globales: Residen en un dominio pero mantienen sus permisos a lo largo de los dominios que
confíen en ese domino . Solo pueden tener cuentas de usuario y no de grupo.
• Grupos Locales: Existe y mantiene sus permisos solo dentro del dominio donde fueron creados. Pueden
contener usuarios y grupos globales pero no locales.
Dominio A Dominio B
Pueden
99
estar en los
dos dominios
• Cuenta de Administrador.
Permite la administración del servidor en el cuál ha sido creada la cuenta y no se puede borrar, ni deshabilitar,
ni bloquear. El administrador es miembro de los siguientes grupos.
• Cuenta de Invitado
Normalmente desactivada y que se utiliza para aquellos usuarios que no tienen una cuenta en el equipo o
pertenecen a un dominio en el que no se confía.
• Cuentas Globales.
• Administradores del dominio: Tienen permiso en el dominio inicial del usuario, en todas las
administraciones de trabajo de dominio inicial y en los dominios en que se confían.
• Usuarios del dominio.
• Grupos Locales:
Existe una herramienta que es el administrador de usuarios que permite realizar las siguientes tareas.
100
TIPOS DE PERFILES EN WINDOWS NT.
Directorio Activo: Servicio que proporciona Windows 2000 Server que almacena información acerca de
objetos de la red y facilita la búsqueda y utilización de esa información pro parte de usuarios y
administradores. El servicio de directorios utiliza un almacén de datos que están estructurados como una base
jerárquica y contiene la información de ellos. El echo de que esté de forma jerárquica permite establecer
diferentes contextos a los cuales se aplicará las directivas.
Las directivas : tiene como finalidad aplicar un conjunto de reglas sobre un grupo concreto de elementos.
• Datos del dominio: Información sobre los objetos que hay en el dominio
• Datos de configuración: Topología del directorio activo.
• Datos del esquema: Son metadatos, Datos que explican lo que son otros datos.
El control de acceso se lleva a cabo mediante los controladores de dominio y se puede realizar para cada
objeto del directorio y también para cada una de las propiedades del objeto.
Directivas de Grupo:
Dentro de cada dominio los usuarios se van a identificar a través de un nombre de usuario y el nombre de
dominio.
Usuario @ Dominio
Eui.upsa.es
Dominio \ usuario
Eui.upsa.es \ pepe
Bosque
Conjunto de uno o varios dominios que comparten un esquema , configuración y catálogos comunes. Entre los
elementos existe relaciones de confianza bidireccional.
101
Secundario. Microsoft.com Subdominio
Terciario.secundario.Microsoft.com Subdominio
Dentro de un domino existe replicación de información entre los diferentes controladores del dominio.
Controladores maestros de operaciones: Tienen asignados funciones que no pueden ocurrir en diferentes
lugares al mismo tiempo.
1.1
Nota: Nosotros teníamos antes un proceso con un solo hilo ahora tenemos un proceso con varios hilos.
Recoger
Guardar
Cálculos
Imprimir
Si
Sj
Sk
S1
S3
S2
S1
S4
S2
S3
S6
S5
S1
S3
102
S2
S4
S6
S5
S7
S7
S5
S6
S4
S2
S3
S1
S6
S3
S4
S1
S7
J2
S5
S2
J3
J1
S4
S2
S3
S1
103
S7
S5
S6
R1
S3
S4
S1
S2
Sa
Sb
S8
S9
Sd
Sc
G1
R2
I1
C1
R3
C2
G2
I2
104
K
Sn
S0
S2
P1
P8
S1
P2
P3
Sn+1
P9
P7
P4
P5
P6
105
G
Si quiero por ejemplo la zona gris que se ejecute en el programa tengo que hacerlo con un Begin y un End . Es
como si dentro de uno principal nos encontramos un subprograma.
Sc
Sd
S9
S8
Sb
Sa
S2
S7
S5
S6
S3
S4
S1
S1
S2
Sn+1
Sn
106
S0
S2
S1
S2
S1
S9
S8
S7
S5
S6
S3
S4
S2
S1
S8
S7
S6
S4
S5
S3
S9
P1
P4
P3
P2
107
P7
P6
P5
P5
P6
P7
P2
P3
P4
P1
LUNES
MARTES
MIERCOLES
Las condiciones se agrupan con IF anidadas o con paréntesis, pero antes del paréntesis ponemos la barra
invertida. Test \ ( a o b \) c
100
100
Peladora
Cortadora
Marcadora
NOTA : Esto sirve para solucionar problemas de exclusión mutua y de sincronización de procesos.
Deposito
Deposito
108
B
Deposito
B'
Deposito
A'
P principal
Crear Buzón C
Signal ( señal A )
Signal ( señal B)
Parbegin
Máquina A
Máquina B
Máquina C
Parend
Recurso
R1
P1
P2
Recurso
R2
R1
Recurso
P2
P1
Recurso
R2
109
R3
Recurso
P3
P1
Recurso
R1
P2
Recurso
R2
NOTA:
R1
Recurso
R1
P3
P2
P1
R2
Recurso
P4
R2
110
B
R2
R1
R1
R1
R2
R1
R2
111
2
3011
0100
1110
1101
0000
1100
0112
3100
0010
2110
1100
0102
3100
0010
2110
3011
0110
1110
1101
0000
1100
0102
3100
0010
112
2100
3011
0110
1110
1101
0010
335
111
224
123
430
121
201
012
335
111
124
123
430
121
301
012
P1
P1
113
O
•1
01
•1
10
P1
P3
P4
0100
0110
0100
0001
1000
0001
1000
0010
P2
P4
P1
P3
P5
10000
01111
11001
01000
00000
114
01000
10000
00010
00001
00100
Procesador
Memoria
Procesador
Memoria
Procesador
Memoria
Procesador
Memoria
Computo
Solicitud de Exclu.
Mutua
Espera
S.C
diferidos
115
2B
3C
4D
5E
1A
P1
P5
P3
P2
P4
P3
P2
P4
P2
P3
P5
P1
P2
P1
P3
P1
P2
P1
P3
116
C
Usuario Local
Juan
Grupo Local
Informática
Usuario Local
Pepe
Usuario Global
Juan
Grupo Local
Teología
Grupo Global
Informática
117