Elementos sistema operativohilario_sm/slide/SO-1/semaforos... · 2015-09-30 · Elementos sistema...
Transcript of Elementos sistema operativohilario_sm/slide/SO-1/semaforos... · 2015-09-30 · Elementos sistema...
Elementos sistema operativo
Se examinarán los componentes más
comunes dentro del S.O.
En particular se verán los siguientes
elementos.
• El núcleo
• La llamada de sistema
• El shell
El kernel o núcleo
• Lugar donde residen todos los módulos del S.O.
• Generalmente solo representa una pequeña porción del código del S.O.
• Kernel generalmente se encuentra en memoria principal
• Funciones• Procesamiento de interrupciones
• Creación/destrucción de procesos
• Sincronización de procesos
• Soporte de actividades de E/S
• Soporte de actividades de asignación de memoria
• Soporte de actividades de desasignación de memoria
• Soporte a actividades con archivos
Llamadas de sistema
El shell
Modelo capas Unix
Semáforos
• Solo puede tomar dos valores: 0 ó 1
• Generalmente se inicializan con un valor de 1.
• Son usados por dos o más procesos para garantizar que sólo uno
puede entrar en sección crítica.
• Antes de entrar en sección crítica un proceso ejecuta un P(S) y un
V(S) antes de salir de ella.
• La variable de tipo semáforo se llama entrar y es inicializada en 1.
Cada proceso tiene la estructura siguiente:
Semáforos Binarios
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEM_PADRE 1
#define SEM_HIJO 0
main(int argc, char *argv[ ])
{
Int i=10, semid, pid;
struct sembuf operacion;
key_t llave;
/*Peticion de un identificador con dos semaforos*/
llave=ftok(argv[0],’K’);
If((semid=semget(llave, 2 ,IPC_CREAT│0600))==-1)
{
perror(“semget”);
exit(-1);
}
Número de semáforos
P(S) hijo
/* Inicialización de los semáforos */
/*Cerramos el semáforo del proceso hijo */
semctl(semid, SEM_HIJO, SETVAL,0);
/*abrimos el semáforo del proceso padre */
semctl(semid, SEM_PADRE, SETVAL,1);
/*creación del proceso hijo */
If((pid=fork()) == -1) {
perror(“fork”);
exit(-1); }
else if(pid==0) { /*código del proceso hijo */}
while(i) {
/* cerramos el semáforo del proceso hijo */
operacion.sem_num=SEM_HIJO;
operacion.sem_op=-1;
operacion.sem_flg=0;
semop(semid, &operacion,1);
V(S) padre
P(S) padre
printf(“PROCESOS HIJO: %d \n”,i--);
/*Abrimos el semáforo del proceso padre */
operacion.sem_num=SEM_PADRE;
operacion.sem_op=1;
semop(semid,&operación,1);
printf(“PROCESO PADRE: %d \n”,i--);
}
/*Borrado del semáforo */
semctl(semid,0,IPC_RMID,0);
}
else { /*codigo del proceso padre */
operación.sem_flg=0;
while(i){
operacion.sem_num=SEM_PADRE;
operacion.sem_op= -1;
semop(semid,&operacion,1);
printf(“PROCESO PADRE: %d \n”,i--);
V(S) hijo
/*Abrimos el semáforo del proceso hijo*/
operacion.sem_num=SEM_HIJO;
operacion.sem_op= 1;
semop(semid,&operacion,1);
}
/*Borrado del semáforo */
semctl(semid,&operacion,1);
}
}
P11-h00
Inicialización
P10-h01
Inicialización
P00-h11 P01-h10
sem_op acción
> sem_op+ v. semáforo liberado
< |sem_op|>v. semaforo bloqueado
hasta v. semaforo = |sem_op|
v. semaforo- |sem_op| liberado
0 bloqueado hasta v.semaforo=0,
si ya es cero la llamada vuelve inmediatamente
Padre Zona critica hijo
Valor inicio 1 0
Padre (i=10) -1 (Sp)1-1=0 Printf(i) 1 (Sh)0+1=1
Hijo (i=10) -1 (Sh)1-1=0 Printf(i) 1 (Sp)0+1=1
Padre (i=9) -1 (Sp)1-1=0 Printf(i) 1 (Sh)0+1=1
Hijo (i=9) -1 (Sh)1-1=0 Printf(i) 1 (Sp)0+1=1
Padre (i=8) -1 (Sp)1-1=0 Printf(i) 1 (Sh)0+1=1
Hijo (i=8) -1 (Sh)1-1=0 Printf(i) 1 (Sp)0+1=1
... ... ... ...
Padre (i=1) -1 (Sp)1-1=0 Printf(i) 1 (Sh)0+1=1
Hijo (i=1) -1 (Sh)1-1=0 Printf(i) 1 (Sp)0+1=1
0 Rojo
1 Verde