semÁforos §conceptos l mecanismo para prevenir la colisión que se produce cuando dos o más...
TRANSCRIPT
SEMÁFOROS
Conceptos Mecanismo para prevenir la colisión que
se produce cuando dos o más procesos solicitan simultáneamente el uso de un recurso que deben compartir.
Tabla de semáforos
ESTRUCTURAS BÁSICAS Estructura semid_ds:Asociada a cada conjunto de semáforos.
Struct semid_ds{
struct ipc_perm
time_t sem_otime
time_t sem_ctime
struct sem* sem_base
struct sem_queue* sem_pending
struct sem_queue** sem_pending_last
struct sem_undo* undo
ushort sem_nsems
...
};
ESTRUCTURAS BÁSICAS
Estructura sembuf:Operación a realizar sobre un semáforo.
Struct sembuf{
ushort sem_num;
short sem_op;
short sem_flg;
};
ESTRUCTURAS BÁSICAS
Estructura semun:Almacenar o recuperar información sobre los semáforos.
Struct semun{
int val;
struct semid_ds buf;
ushort * array;
struct seminfo* __buf;
void __pad;
};
SEMÁFOROS
Estructura Seminfo.Permite conocer valores límite o actuales del sistema(semctl).
Struct seminfo{
int semmap;
int semmni;
int semmns;
int semmnu;
int semmsl;
SÉMAFOROS
int semmopm;
int semume;
int semusz;
int semvmx;
int semaem;};
SÉMAFOROS
LLAMADAS AL SISTEMA
Semget: Creación y búsqueda de grupos de semáforos.
Semctl: Control de los semáforos. Semop: Operaciónes sobre los semáforos.
SEMÁFOROS
Semget (creación y búsqueda de grupos de semáforos)
#include <sys/types.h> #include<sys/ipc.h> #include<sys/sem.h>
int (key, int nsems,int semflg);
SEMÁFOROS
Keynsemssemflg
Campo II:
Campo I: 00X00
IPC_CREAT 000X0
IPC_EXCL 0000X
SEMÁFOROS
Descripción: Retorna un descriptor de semáforo. Si no existe el descriptor y si se especifica IPC_CREAT creará uno.
Error: Retornará un -1 y errno tendrá el código de error.
SEMÁFOROS
En este último caso, la variable errno toma uno de los valores siguientes: EACCES EEXIST EIDRM ENOMEN ENOSPC
SEMÁFOROS
Semop(operaciones sobre los semáforos)
#include <sys/types.h> #include <sys/ipc.h> #include<sys/sem.h>
int semop(int semid, struct sembuf * sops,
unsigned nsops);
SEMÁFOROS
SemidsopsnsopsOperaciones:
Valor estrictamente positivo Valor nulo Valor estrictamente negativo
SEMÁFOROS
Ejecución correcta: Operará según el valor que tenga sem_op asociado a cada semáforo.
Error: Retornará un -1 y errno tendrá el código de error.Valores de la variable errno seguidamente:
SEMÁFOROS
E2BIGEACCESEAGAINEFAULTEFBIG
EIDRMEINTREINVALENOMENERANGE
SEMÁFOROS
Semctl(el control de los semáforos)
#include <sys/types.h> #include <sys/ipc.h> #include<sys/sem.h>
int semctl(int semid, int semnum, int cmd,union semun arg);
SEMÁFOROS
semidsemnumargcmdEl parámetro cmd indica indica pues la
operación a realizar, y según su valor puede ser:
SEMÁFOROS
IPC_STAT IPC_SET IPC_RMIDGETPID
GETNCNTGETVAL/SETVALGETALL/SETALL
SEMÁFOROS
Descripción: Se accede a los valores que definen un semáforo.Dependiendo de la operación realizada su retorno será 0 o un valor positivo.
Error: Retornará un -1 y errno tendrá el código de error.
SEMÁFOROS
En caso de error en errno:
EACCES EFAULT EIDRM EINVAL EPERM ERANGE
Exito se devuelve valor positivo o nulo dependiendo de cmd:
GETPID GETVAL GETNCNT GET2CNT
MEMORIA COMPARTIDA
Conceptos Enviar datos de un proceso a otro Compartir una parte de su espacio de
direccionamiento. Obligan implementar un mecanismo de
sincronización de accesos
MEMORIA COMPARTIDA
Estructura shmid_ds:Entrada en la tabla de memorias compartidas.
Struct shmid_ds{
struct ipc_perm;
int shm_shmgsz;
time_t shm_atime;
time_t shm_dtime;
time_t shm_ctime;
unsigned short shm_cpid;
MEMORIA COMPARTIDA
unsigned short shm_lpid;
short shm_nattch;
unsigned short shm_npages;
unsigned long * shm_pages;
struct attaches;
vm_area_struct *;
};
MEMORIA COMPARTIDA
Estructura shminfo:Utilizada sólo por el núcleo. Se utiliza en una llamada a shmctl con IPC_INFO como argumento.
struct shminfo{
int shmax;
int shmmin;
int shmmni;
int shmseg;
int shmall;
};
MEMORIA COMPARTIDA
Llamadas al sistema:
shmget: Creación y búsqueda de una zona de memoria compartida.
shmctl: Control de las zonas de memorias compartidas.
shmat: Vincular una zona de memoria.
shmdt: Desvincular una zona de memoria.
MEMORIA COMPARTIDA
shmget (creación y búsqueda de una zona de memoria
compartida) #include <sys/ipc.h> #include<sys/shm.h> int shmget (key_t, int size, int option);
MEMORIA COMPARTIDA
key_t
size
option
Campo I: IPC_CREAT IPC_EXL
Campo II:
00X00 Usuario 000X0 Grupos 0000X Otros
MEMORIA COMPARTIDA
Descripción: Retorna un descriptor de región de memoria compartida. Si no existe descriptor y se especifica IPC_CREAT creará uno.
Error: Retornará un -1 y errno tendrá el código de error.
MEMORIA COMPARTIDA
• Tamaño especificado debe ser inferior o igual al de
la memoria existente.
• En otro caso el tamaño asignado debe ser múltiplo
de PAGE_SIZE
MEMORIA COMPARTIDA
Valores que puede tomar la variable errno:
ENOMEN EINVAL ENOENT EEXIST
EIDRM EACCES, EPERM EFAULT ENOSPC
MEMORIA COMPARTIDA
shmat (vincular de una zona de memoria)
#include <sys/ipc.h> #include<sys/shm.h> void *shmat (int shmid, const void *shmaddr,
int option);
MEMORIA COMPARTIDA
shmid*shmaddroption
shmaddr == NULL entonces el SO intenta encontrar una zona de memoria libre
MEMORIA COMPARTIDA
Si no, el sistema operativo intenta vincular la memoria compartida a la dirección especificada
Si se especifica la opción SHM_RND, el
sistema intenta vincular la zona de
memoria a una dirección múltiplo de
SHMLBA lo más próxima posible a la
especificada.
MEMORIA COMPARTIDA
SHM_RDONLYNo existe un medio para escritura exclusiva Esta llamada al sistema actualiza los
parámetros siguientes de la estructura shmid_ds: shm_atime recibe la fecha actual; shm_lpid recibe el pid del proceso que llama; shm_nattch se incrementa en una unidad.
MEMORIA COMPARTIDA
Ejecución correcta: conectará una región de
memoria compartida a la memoria de
usuario.
Error: Retornará un -1 y errno tendrá el código de error.
MEMORIA COMPARTIDA
La variable errno puede tomar uno de los valores siguientes: EACCES EINVAL ENOMEN EIDRM
MEMORIA COMPARTIDA
Shmdt (desvincular una zona de una zona de memoria)
#include<sys.types.h>
#include <sys/ipc.h>
#include<sys/shm.h>
void *shmat (int shmid, const void *shmaddr,
int option);
MEMORIA COMPARTIDA
Shmct (Control de las zonas de memoria compartidas)
#include <sys/ipc.h>
#include<sys/shm.h>
int shmct (int shmid, int cmd,
struct shmid_ds *buf);
MEMORIA COMPARTIDA
Diferentes usos: IPC_STAT IPC_SET IPC_RMID
opciones específicas de Linux SHM_LOCK SHM_UNLOCK