Elementos sistema operativohilario_sm/slide/SO-1/semaforos... · 2015-09-30 · Elementos sistema...

Post on 12-Jul-2020

17 views 0 download

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