capítulo 5 comunicación y sincronización de …sandoval/apuntesso/cap05.pdf1 sistemas operativos:...

41
1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas operativos: una visión aplicada 1 © J. Carretero, F. García, P. de Miguel, F. Pérez Contenido Procesos concurrentes. Problemas clásicos de comunicación y sincronización. Mecanismos de comunicación y sincronización. Paso de mensajes. Aspectos de implementación Interbloqueos. Servicios POSIX Servicios Win32

Upload: dangbao

Post on 29-Oct-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

1

Sistemas operativos: una visión aplicada

Capítulo 5 Comunicación y sincronización

de procesos

Sistemas operativos: una visión aplicada 1 © J. Carretero, F. García, P. de Miguel, F. Pérez

Contenido

• Procesos concurrentes. • Problemas clásicos de comunicación y sincronización. • Mecanismos de comunicación y sincronización.• Paso de mensajes.• Aspectos de implementación• Interbloqueos. • Servicios POSIX• Servicios Win32

Page 2: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

2

Sistemas operativos: una visión aplicada 2 © J. Carretero, F. García, P. de Miguel, F. Pérez

Procesos concurrentes

• Modelos – Multiprogramación en un único procesador – Multiprocesador – Multicomputador (proceso distribuido)

• Razones – Compartir recursos físicos – Compartir recursos lógicos – Acelerar los cálculos – Modularidad – Comodidad

Sistemas operativos: una visión aplicada 3 © J. Carretero, F. García, P. de Miguel, F. Pérez

Sistema multiprogramado con un una CPU

Tiempo

Proceso A

Proceso B

Proceso C

Page 3: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

3

Sistemas operativos: una visión aplicada 4 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejecución en un sistema multiprocesador

Tiempo

Proceso B

Proceso A

Proceso C

Proceso D

CPU 1

CPU 2

Sistemas operativos: una visión aplicada 5 © J. Carretero, F. García, P. de Miguel, F. Pérez

Tipos de procesos concurrentes

• Tipos de procesos – Independientes – Cooperantes

• Interacción entre procesos – Compiten por recursos – Comparten recursos

Page 4: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

4

Sistemas operativos: una visión aplicada 6 © J. Carretero, F. García, P. de Miguel, F. Pérez

Problemas clásicos de comunicación y sincronización

• El problema de la sección crítica• El problema del productor-consumidor• El problema de los lectores-escritores• Comunicación cliente-servidor

Sistemas operativos: una visión aplicada 7 © J. Carretero, F. García, P. de Miguel, F. Pérez

Problema de la sección crítica

• Sistema compuesto por n procesos • Cada uno tiene un fragmento de código: sección crítica• Sólo uno de los procesos en cada instante puede ejecutar en la

sección crítica– Cuando un proceso está ejecutando en la sección crítica,

ningún otro puede hacerlo

Page 5: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

5

Sistemas operativos: una visión aplicada 8 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo 1

S1 = 1 +...+ 50

ni = 1nf = 50

ni =51nf = 100

S2 = 51 +....+ 100

Proceso ligeroprincipal

suma_total = S1 + S2

Sistemas operativos: una visión aplicada 9 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo 1

• Calcula la suma de los N primeros números utilizando procesos ligeros.int suma_total = 0; void suma_parcial(int ni, int nf) {

int j = 0;int suma_parcial = 0;for (j = ni; j <= nf; j++)

suma_parcial = suma_parcial + j;suma_total = suma_total + suma_parcial;pthread_exit(0);

}

• Si varios procesos ejecutan concurrentemente este código se puede obtener un resultado incorrecto.

• Solución: secciones críticas

Page 6: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

6

Sistemas operativos: una visión aplicada 10 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo con sección crítica

void suma_parcial(int ni, int nf) {int j = 0;int suma_parcial = 0;for (j = ni; j <= nf; j++)

suma_parcial = suma_parcial + j;

<Entrada en la sección crítica>suma_total = suma_total + suma_parcial;<Salida de la sección crítica>pthread_exit(0);

}

Sistemas operativos: una visión aplicada 11 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo 2void ingresar(char *cuenta, int cantidad) {

int saldo, fd;fd = open(cuenta, O_RDWR);read(fd, &saldo, sizeof(int));saldo = saldo + cantidad;lseek(fd, 0, SEEK_SET);write(fd, &saldo, sizeof(int));close(fd);return;

}

• Si dos procesos ejecutan concurrentemente este código se puede perder algún ingreso.

• Solución: secciones críticas

Page 7: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

7

Sistemas operativos: una visión aplicada 12 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo 2 con sección crítica

void ingresar(char *cuenta, int cantidad) {int saldo, fd;

fd = open(cuenta, O_RDWR);<Entrada en la sección crítica>

read(fd, &saldo, sizeof(int));saldo = saldo + cantidad;lseek(fd, 0, SEEK_SET);write(fd, &saldo, sizeof(int));

<Salida de la sección crítica>close(fd);return;

}

Sistemas operativos: una visión aplicada 13 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo 3

Procesador 1 Procesador 2

PID = 500

PID = 501

PID = 501

PID = 500

Lee PID

Escribe PID

Escribe PID

Incrementa yasigna PID

Incrementa yasigna PID

PID = 500

Registro o posición de memoria

PID = 501

PID = 501

Lee PID

Page 8: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

8

Sistemas operativos: una visión aplicada 14 © J. Carretero, F. García, P. de Miguel, F. Pérez

Solución al problema de la sección crítica

• Estructura general de cualquier mecanismo utilizado para resolver el problema de la sección crítica:

Entrada en la sección críticaCódigo de la sección críticaSalida de la sección crítica

• Requisitos que debe ofrecer cualquier solución para resolver el problema de la sección crítica:– Exclusión mutua – Progreso – Espera limitada

Sistemas operativos: una visión aplicada 15 © J. Carretero, F. García, P. de Miguel, F. Pérez

Problema del productor-consumidor

ProcesoProductor

ProcesoConsumidor

Mecanismo de comunicación

Flujo de datos

Page 9: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

9

Sistemas operativos: una visión aplicada 16 © J. Carretero, F. García, P. de Miguel, F. Pérez

El problema de los lectores-escritores

EscritorLector Lector Escritor Lector

Recurso

Sistemas operativos: una visión aplicada 17 © J. Carretero, F. García, P. de Miguel, F. Pérez

Comunicación cliente-servidor

Computador Computador

Procesocliente

S.O.

Petición

Respuesta

Procesoservidor

Page 10: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

10

Sistemas operativos: una visión aplicada 18 © J. Carretero, F. García, P. de Miguel, F. Pérez

Mecanismos de comunicación

• Archivos• Tuberías (pipes, FIFOS)• Variables en memoria compartida • Paso de mensajes

Sistemas operativos: una visión aplicada 19 © J. Carretero, F. García, P. de Miguel, F. Pérez

Mecanismos de Sincronización

• Construcciones de los lenguajes concurrentes (procesos ligeros) • Servicios del sistema operativo:

– Señales (asincronismo) – Tuberías (pipes, FIFOS)– Semáforos – Mutex y variables condicionales – Paso de mensajes

• Las operaciones de sincronización deben ser atómicas

Page 11: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

11

Sistemas operativos: una visión aplicada 20 © J. Carretero, F. García, P. de Miguel, F. Pérez

Tuberías (POSIX)

• Mecanismo de comunicación y sincronización – Sin nombre: pipes– Con nombre: FIFOS

• Sólo puede utilizarse entre los procesos hijos del proceso que creó el pipe

int pipe(int fildes[2]);

• Identificación: dos descriptores de archivo– Para lectura– Para escritura

• Flujo de datos: unidireccional • Mecanismo con capacidad de almacenamiento

Sistemas operativos: una visión aplicada 21 © J. Carretero, F. García, P. de Miguel, F. Pérez

Comunicación unidireccional con tuberías

Procesode Usuario

Procesode Usuario

pipe

SO

write read

Flujo de datos

Page 12: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

12

Sistemas operativos: una visión aplicada 22 © J. Carretero, F. García, P. de Miguel, F. Pérez

Comunicación bidireccional con tuberías

Procesode Usuario

Procesode Usuario

SO

write write readread

Flujo de datos

Flujo de datos

pipe

pipe

Sistemas operativos: una visión aplicada 23 © J. Carretero, F. García, P. de Miguel, F. Pérez

Tuberías (II)

• read(fildes[0], buffer, n)– Pipe vacío se bloquea el lector – Pipe con p bytes

• Si p ≥ n devuelve n• Si p < n devuelve p

– Si pipe vacío y no hay escritores devuelve 0

• write(fildes[1], buffer, n)– Pipe lleno se bloquea el escritor – Si no hay lectores se recibe la señal SIGPIPE

• Lecturas y escrituras atómicas (cuidado con tamaños grandes)

Page 13: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

13

Sistemas operativos: una visión aplicada 24 © J. Carretero, F. García, P. de Miguel, F. Pérez

Secciones críticas con tuberías

void main(void) {int fildes[2]; /* pipe para sincronizar */char c; /* caracter para sincronizar */

pipe(fildes);write(fildes[1], &c, 1); /* necesario para entrar en la

seccion critica la primera vez */if (fork() == 0) { /* proceso hijo */

for(;;) {read(fildes[0], &c, 1); /* entrada seccion critica */< Seccion critica >write(fildes[1], &c, 1); /* salida seccion critica */

}

Sistemas operativos: una visión aplicada 25 © J. Carretero, F. García, P. de Miguel, F. Pérez

Secciones críticas con tuberías (II)

} else { /* proceso padre */for(;;) {

read(fildes[0], &c, 1); /* entrada seccion critica */< seccion critica >write(fildes[1], &c, 1); /* salida seccion critica */

}}

}

Page 14: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

14

Sistemas operativos: una visión aplicada 26 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con tuberías

void main(void) {int fildes[2]; /* pipe para comunicar y sincronizar */int dato_p[4]; /* datos a producir */int dato_c; /* dato a consumir */

pipe(fildes);

if (fork() == 0) { /* proceso hijo: productor */for(;;) {

< producir dato_p, escribe 4 enteros *write(fildes[1], dato_p, 4*sizeof(int));

}

Sistemas operativos: una visión aplicada 27 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con tuberías (II)

} else { /* proceso padre: consumidor */

for(;;) { read(fildes[0], &dato, sizeof(int)); /* consumir dato, lee un entero */

}}

}

Procesohijo

Procesopadre

Pipe

Page 15: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

15

Sistemas operativos: una visión aplicada 28 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejecución de mandatos con tuberías/* programa que ejecuta el mandato ``ls | wc'' */

void main(void) {

int fd[2];pid_t pid;

if (pipe(fd) < 0) {perror(``pipe'');exit(-1);

}pid = fork(); switch(pid) {

case -1: /* error */perror(``fork'');exit(-1);

ls wcpipe

Sistemas operativos: una visión aplicada 29 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejecución de mandatos con tuberías (II)

case 0: /* proceso hijo ejecuta ``ls'' */close(fd[0]); /* cierra el pipe de lectura */close(STDOUT_FILENO); /* cierra la salida estandar */dup(fd[1]);close(fd[1]);execlp(``ls'',``ls'',NULL);perror(``execlp'');exit(-1);

default: /* proceso padre ejecuta ``wc'' */close(fd[1]); /* cierra el pipe de escritura */close(STDIN_FILENO); /* cierra la entrada estandar */dup(fd[0]);close(fd[0]); execlp(``wc'',``wc'',NULL);perror(``execlp'');

}}

Page 16: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

16

Sistemas operativos: una visión aplicada 30 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejecución de mandatos con tuberías (III)•Proceso

•STDIN•STDOUT

•pipe(fd) •fork()

•Proceso

•STDIN•STDOUT•fd[0]•fd[1]

•pipe

•redirección

•Proceso hijo

•STDIN•STDOUT•fd[0]•fd[1]

•Proceso

•STDIN•STDOUT•fd[0]•fd[1]

•pipe

•exec

•Proceso hijo

•STDIN

•STDOUT

•Proceso

•STDIN

•STDOUT•pipe

•Proceso hijo

•STDIN

•STDOUT

•Proceso

•ls •wc

•STDIN

•STDOUT•pipe

Sistemas operativos: una visión aplicada 31 © J. Carretero, F. García, P. de Miguel, F. Pérez

Tuberías con nombre en POSIX (FIFOS)

• Igual que los pipes • Mecanismo de comunicación y sincronización con nombre • Misma máquina • Servicios

– int mkfifo(char *name, mode_t mode);• Crea un FIFO con nombre name

– int open(char *name, int flag);• Abre un FIFO (para lectura, escritura o ambas) • Bloquea hasta que haya algún proceso en el otro extremo

• Lectura y escritura mediante read() y write()– Igual semántica que los pipes

• Cierre de un FIFO mediante close()• Borrado de un FIFO mediante unlink()

Page 17: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

17

Sistemas operativos: una visión aplicada 32 © J. Carretero, F. García, P. de Miguel, F. Pérez

Semáforos

• Mecanismo de sincronización • Misma máquina • Objeto con un valor entero • Dos operaciones atómicas

– wait– signal

Sistemas operativos: una visión aplicada 33 © J. Carretero, F. García, P. de Miguel, F. Pérez

Operaciones sobre semáforos

wait(s){

s = s - 1;if (s < 0) {

<Bloquear al proceso>}

}

signal(s){

s = s + 1;if (s <= 0)

<Desbloquear a un proceso bloqueado por la operacion wait>

}}

Page 18: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

18

Sistemas operativos: una visión aplicada 34 © J. Carretero, F. García, P. de Miguel, F. Pérez

Secciones críticas con semáforos

wait(s); /* entrada en la seccion critica */< seccion critica >signal(s); /* salida de la seccion critica */

• El semáforo debe tener valor inicial 1 P0

Valor delsemáforo (s)

wait(s)

signal(s)

signal(s)

signal(s)

wait(s)

desbloquea

desbloquea

wait(s)

1

1

0-1

-2

-1

0

P1 P2

Ejecutando código de la sección crítica

Proceso bloqueado en el semáforo

Sistemas operativos: una visión aplicada 35 © J. Carretero, F. García, P. de Miguel, F. Pérez

Semáforos POSIX• int sem_init(sem_t *sem, int shared, int val);

– Inicializa un semáforo sin nombre• int sem_destroy(sem_t *sem);

– Destruye un semáforo sin nombre• sem_t *sem_open(char *name, int flag, mode_t mode,

int val);– Abre (crea) un semáforo con nombre.

• int sem_close(sem_t *sem);– Cierra un semáforo con nombre.

• int sem_unlink(char *name);– Borra un semáforo con nombre.

• int sem_wait(sem_t *sem);– Realiza la operación wait sobre un semáforo.

• int sem_post(sem_t *sem);– Realiza la operación signal sobre un semáforo.

Page 19: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

19

Sistemas operativos: una visión aplicada 36 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con semáforos (buffer acotado y circular)

Consumidor

Productor

Sistemas operativos: una visión aplicada 37 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con semáforos (II)

#define MAX_BUFFER 1024 /* tamanio del buffer */#define DATOS_A_PRODUCIR 100000 /* datos a producir */

sem_t elementos; /* elementos en el buffer */sem_t huecos; /* huecos en el buffer */int buffer[MAX_BUFFER]; /* buffer comun */

void main(void){

pthread_t th1, th2; /* identificadores de threads */

/* inicializar los semaforos */sem_init(&elementos, 0, 0);sem_init(&huecos, 0, MAX_BUFFER);

Page 20: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

20

Sistemas operativos: una visión aplicada 38 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con semáforos (III)

/* crear los procesos ligeros */pthread_create(&th1, NULL, Productor, NULL);pthread_create(&th2, NULL, Consumidor, NULL);

/* esperar su finalizacion */pthread_join(th1, NULL);pthread_join(th2, NULL);

sem_destroy(&huecos);sem_destroy(&elementos);exit(0);

}

Sistemas operativos: una visión aplicada 39 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con semáforos (IV)void Productor(void) /* codigo del productor */{

int pos = 0; /* posicion dentro del buffer */int dato; /* dato a producir */int i;

for(i=0; i < DATOS_A_PRODUCIR; i++ ) {dato = i; /* producir dato */sem_wait(&huecos); /* un hueco menos */buffer[pos] = i;pos = (pos + 1) % MAX_BUFFER;sem_post(&elementos); /* un elemento mas */

}pthread_exit(0);

}

Page 21: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

21

Sistemas operativos: una visión aplicada 40 © J. Carretero, F. García, P. de Miguel, F. Pérez

Productor-consumidor con semáforos (V)

void Consumidor(void) /* codigo del Consumidor */{

int pos = 0;int dato;int i;

for(i=0; i < DATOS_A_PRODUCIR; i++ ) {sem_wait(&elementos); /* un elemento menos */dato = buffer[pos];pos = (pos + 1) % MAX_BUFFER;sem_post(&huecos); /* un hueco mas *//* consumir dato */

}pthread_exit(0);

}

Sistemas operativos: una visión aplicada 41 © J. Carretero, F. García, P. de Miguel, F. Pérez

Lectores-escritores con semáforos

int dato = 5; /* recurso */int n_lectores = 0; /* numero de lectores */sem_t sem_lec; /* controlar el acceso n_lectores */sem_t mutex; /* controlar el acceso a dato */

void main(void){

pthread_t th1, th2, th3, th4;

sem_init(&mutex, 0, 1);sem_init(&sem_lec, 0, 1);

pthread_create(&th1, NULL, Lector, NULL);pthread_create(&th2, NULL, Escritor, NULL);pthread_create(&th3, NULL, Lector, NULL);pthread_create(&th4, NULL, Escritor, NULL);

Page 22: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

22

Sistemas operativos: una visión aplicada 42 © J. Carretero, F. García, P. de Miguel, F. Pérez

Lectores-escritores con semáforos (II)

pthread_join(th1, NULL);pthread_join(th2, NULL);pthread_join(th3, NULL);pthread_join(th4, NULL);

/* cerrar todos los semaforos */sem_destroy(&mutex);sem_destroy(&sem_lec);

exit(0);}

Sistemas operativos: una visión aplicada 43 © J. Carretero, F. García, P. de Miguel, F. Pérez

Lectores-escritores con semáforos (III)

/* codigo del lector */void Lector(void) { /* codigo del lector */

sem_wait(&sem_lec);n_lectores = n_lectores + 1;if (n_lectores == 1)

sem_wait(&mutex);sem_post(&sem_lec);

printf(``%d\n'', dato); /* leer dato */

sem_wait(&sem_lec);n_lectores = n_lectores - 1;if (n_lectores == 0)

sem_post(&mutex);sem_post(&sem_lec);pthread_exit(0);

}

Page 23: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

23

Sistemas operativos: una visión aplicada 44 © J. Carretero, F. García, P. de Miguel, F. Pérez

Lectores-escritores con semáforos (IV)

/* código del escritor */

void Escritor(void) { /* codigo del escritor */sem_wait(&mutex); dato = dato + 2; /* modificar el recurso */sem_post(&mutex);

pthread_exit(0);}

Sistemas operativos: una visión aplicada 45 © J. Carretero, F. García, P. de Miguel, F. Pérez

Memoria compartida

• Declaración independiente de variables

Datos

Texto

Proceso A Proceso B

Pila

TextoDatos

PilaSegmento de memoriacompartida

var1

2

var2

Page 24: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

24

Sistemas operativos: una visión aplicada 46 © J. Carretero, F. García, P. de Miguel, F. Pérez

Mutex

• Un mutex es un mecanismo de sincronización indicado para procesos ligeros.

• Es un semáforo binario con dos operaciones atómicas: – lock(m) Intenta bloquear el mutex, si el mutex ya está

bloqueado el proceso se suspende. – unlock(m) Desbloquea el mutex, si existen procesos

bloqueados en el mutex se desbloquea a uno.

Sistemas operativos: una visión aplicada 47 © J. Carretero, F. García, P. de Miguel, F. Pérez

Secciones críticas con mutex

lock(m); /* entrada en la seccion critica */< seccion critica >unlock(s); /* salida de la seccion critica */

• La operación unlock debe realizarla el proceso ligero que ejecutó lock

Proceso ligero A

lock mutex

Seccióncrítica

Proceso ligero B

lock mutex

unlock mutex obtiene mutex Proceso ligero ejecutando

Proceso ligero bloqueado

Punto de sincronización

Page 25: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

25

Sistemas operativos: una visión aplicada 48 © J. Carretero, F. García, P. de Miguel, F. Pérez

Paso de mensajes• Permite resolver:

– Exclusión mutua – Sincronizar entre un proceso que recibe un mensaje y otro que lo envía – Comunicación de datos entre espacios de memoria diferentes (mismo

computador, diferentes computadores) • Primitivas básicas:

– send(destino, mensaje) envía un mensaje al proceso destino – receive(destino, mensaje) recibe un mensaje del proceso destino

• Múltiples soluciones • Aspectos de diseño

– Tamaño del mensaje– Flujo de datos (unidireccional, bidireccional)– Nombrado

• Directo• Indirecto (puertos, colas)

– Sincronización (síncrono, asíncrono)– Almacenamiento

Sistemas operativos: una visión aplicada 49 © J. Carretero, F. García, P. de Miguel, F. Pérez

Uso de colas y puertos

Comunicación con puertosComunicación con colas de mensajes

Proceso cliente Proceso clientesend

mensaje

receive

Cola de mensajes

Proceso cliente Proceso cliente

mensaje

Puertosend

Page 26: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

26

Sistemas operativos: una visión aplicada 50 © J. Carretero, F. García, P. de Miguel, F. Pérez

Colas de mensajes POSIX

mqd_t mq_open(char *name, int flag, mode_t mode, mq_attr *attr);

– Crea una cola de mensajes con nombre y atributos attr: • Número máximo de mensajes. • Tamaño máximo del mensaje. • Bloqueante, No bloqueante.

int mq_close (mqd_t mqdes);– Cierra una cola de mensajes.

int mq_unlink(char *name);– Borra una cola de mensajes.

Sistemas operativos: una visión aplicada 51 © J. Carretero, F. García, P. de Miguel, F. Pérez

Colas de mensajes POSIX (II)

int mq_send(mqd_t mqdes, char *msg, size_t len, int prio);

– Envía el mensaje msg de longitud len a la cola de mensajes mqdes con prioridad prio;

– Si la cola está llena el envío puede ser bloqueante o no.

int mq_receive(mqd_t mqdes, char *msg, size_t len,int prio);

– Recibe un mensaje msg de longitud len de la cola de mensajes mqdes con prioridad prio;

– Recepción bloqueante o no.

Page 27: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

27

Sistemas operativos: una visión aplicada 52 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes

Proceso cliente

Cola del cliente

Proceso cliente

Cola del cliente

Cola del servidor

Proceso servidor

petición

petición

respuestarespuesta

Creación delthread

Creación delthread

Thread quesirve la petición

Thread quesirve la petición

Sistemas operativos: una visión aplicada 53 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes (II)

/* estructura de un mensaje */struct mensaje {

char buffer[1024]; /* datos a enviar */char cliente[256]; /* cola del cliente */

};

/* mutex y variables condicionales para proteger la copia del mensaje */

pthread_mutex_t mutex_mensaje;int mensaje_no_copiado = TRUE;pthread_cond_t cond;

void main(void){mqd_t q_servidor; /* cola del servidor */struct mensaje mess; /* mensaje a recibir */struct mq_attr q_attr; /* atributos de la cola */pthread_attr_t t_attr; /* atributos de los threads */

Page 28: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

28

Sistemas operativos: una visión aplicada 54 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes (II)

attr.mq_maxmsg = 20;attr.mq_msgsize = sizeof(struct mensaje));

q_servidor = mq_open("SERVIDOR", O_CREAT|O_RDONLY, 0700, &attr);

pthread_mutex_init(&mutex_mensaje, NULL);pthread_cond_init(&cond, NULL);pthread_attr_init(&attr);pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

Sistemas operativos: una visión aplicada 55 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes (III)

while (TRUE) {mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0);

pthread_create(&thid, &attr, tratar_mensaje, &mess);

/* se espera a que el thread copie el mensaje */pthread_mutex_lock(&mutex_mensaje);while (mensaje_no_copiado)

pthread_cond_wait(&cond, &mutex_mensaje);mensaje_no_copiado = TRUE;pthread_mutex_unlock(&mutex_mensaje);

}}

Page 29: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

29

Sistemas operativos: una visión aplicada 56 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes (IV)

void tratar_mensaje(struct mensaje *mes){

struct mensaje mensaje_local;struct mqd_t q_cliente; /* cola del cliente */struct mensaje respueta; /* mensaje de respuesta al cliente */

/* el thread copia el mensaje */pthread_mutex_lock(&mutex_mensaje);memcpy((char *) &mensaje_local, (char *)&mes,

sizeof(struct mensaje));

/* ya se puede despertar al servidor*/pthread_mutex_lock(&mutex_mensaje);mensaje_no_copiado = FALSE;pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex_mensaje);

Sistemas operativos: una visión aplicada 57 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servidor multithread con colas de mensajes (V)

/* ejecutar la petición del cliente *//* y preparar respuesta */

/* responder al cliente a su cola */q_cliente = mq_open(mensaje_local.nombre, O_WRONLY);

mqsend(q_cliente, (char *) &respueta, sizeof(respuesta), 0);

mq_clise(q_cliente);

pthread_exit(0);}

Page 30: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

30

Sistemas operativos: una visión aplicada 58 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo de código cliente

/* estructura de un mensaje */struct mensaje {

char buffer[1024]; /* datos a enviar */char cliente[256]; /* cola del cliente */

};

void main(void){

mqd_t q_servidor; /* cola del servidor */mqd_t q_cliente; /* cola del cliente */struct mq_attr q_attr; /* atributos de la cola */struct mensaje peticion; /* peticion al servidor */struct mensaje respuesta; /* respuesta del servidor */

attr.mq_maxmsg = 1;attr.mq_msgsize = sizeof(struct mensaje));

Sistemas operativos: una visión aplicada 59 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo de código cliente (II)

q_cliente = mq_open("CLIENTE", O_CREAT|O_RDONLY, 0700, 0);q_servidor = mq_open("SERVIDOR", O_WRONLY);

/* preparar peticion */mq_send(q_servidor, &petcicion, sizeof(struct mensaje), 0);

/* esperar respuesta */mq_receive(q_cliente, &respuesta, sizeof(struct mensaje), 0);

mq_close(q_servidor);mq_close(q_cliente);mq_unlink("CLIENTE");

exit(0);}

Page 31: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

31

Sistemas operativos: una visión aplicada 60 © J. Carretero, F. García, P. de Miguel, F. Pérez

Implementación de mecanismos de sincronización

• Espera activa:wait(s) {

s = s – 1;while (s < 0)

;

signal(s) {s = s + 1;

• Espera pasivawait(s) {

s = s – 1;if (s < 0)

Bloquear al proceso;

signal(s) {s = s + 1;if (s <= 0)

Desbloquear a un proceso bloqueado en la operación wait;}

Sistemas operativos: una visión aplicada 61 © J. Carretero, F. García, P. de Miguel, F. Pérez

Implementación de la espera pasiva

• Operaciones para bloquear a un proceso en un semáforo

(a)

Tabla de procesos

BCP1 BCP7BCP2 BCP8BCP3 BCP9BCP4 BCP10BCP5 BCP11BCP6 BCP12

1 90 56 11 87 0

Cola asociada al semáforo 7

(b)

Tabla de procesos

BCP1 BCP7BCP2 BCP8BCP3 BCP9BCP4 BCP10BCP5 BCP11BCP6 BCP12

1 90 56 11 87Bloq.

Bloq. Ejec.EstadoPID

EstadoPID

Bloq. Bloq.0

Cola asociada al semáforo 7 11

Page 32: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

32

Sistemas operativos: una visión aplicada 62 © J. Carretero, F. García, P. de Miguel, F. Pérez

Implementación de la espera pasiva

• Operaciones para desbloquear a un proceso bloqueado en un semáforo

(a)

(b)

Tabla de procesos

BCP1 BCP7BCP2 BCP8BCP3 BCP9BCP4 BCP10BCP5 BCP11BCP6 BCP12

1 90 56 11 87ListoEstado

PIDBloq. Bloq.

0

Cola asociada al semáforo 11

Tabla de procesos

BCP1 BCP7BCP2 BCP8BCP3 BCP9BCP4 BCP10BCP5 BCP11BCP6 BCP12

1 90 56 11 87Bloq.Estado

PIDBloq. Bloq.

0

Cola asociada al semáforo 7 11

Sistemas operativos: una visión aplicada 63 © J. Carretero, F. García, P. de Miguel, F. Pérez

Instrucciones hardware especiales

• Operación atómicasint test-and-set(int *valor) {int temp;

temp = *valor;*valor = 1; /* true */return temp;

}

void swap (int *a, int *b) {int temp;

temp = *a;*a = *b;*b = temp;return;

}

Page 33: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

33

Sistemas operativos: una visión aplicada 64 © J. Carretero, F. García, P. de Miguel, F. Pérez

Sección crítica con test-and-set

• Los procesos comparten la variable lock (con valor inicial afalse)

while (test-and-set(&lock));

<Código de la sección crítica>

lock = false;

Sistemas operativos: una visión aplicada 65 © J. Carretero, F. García, P. de Miguel, F. Pérez

Sección crítica con swap

• Los procesos comparten la variable lock con valor inicial false.• Cada proceso utiliza una variable local llave.

llave = true;do

swap(lock, llave);while (llave != false);<Código de la sección crítica>lock = false;

Page 34: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

34

Sistemas operativos: una visión aplicada 66 © J. Carretero, F. García, P. de Miguel, F. Pérez

Implementación de un semáforo con test-and-set

wait(s){while (test-and-set(&valor_s))

;s = s - 1;if (s < 0){

valor_s = false;Bloquear al proceso;

}else

valor_s = false;}

signal(s){while (test-and-set(&valor_s))

;s = s + 1;if ( s <= 0){

Desbloquear a un proceso bloqueado en la operación wait;

}valor_s = false;

}

Sistemas operativos: una visión aplicada 67 © J. Carretero, F. García, P. de Miguel, F. Pérez

Interbloqueos

• Bloqueo permanente de un conjunto de procesos que compiten por los recursos del sistema o se comunican entre sí.

• Ejemplo: Si P y Q con semáforos con valor inicial 1

P1 P2wait(P) wait(Q)wait(Q) wait(P)... ...

signal(P) signal(Q)signal(Q) siangl(P)

Page 35: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

35

Sistemas operativos: una visión aplicada 68 © J. Carretero, F. García, P. de Miguel, F. Pérez

Ejemplo de interbloqueo

Q

P

BA

Sistemas operativos: una visión aplicada 69 © J. Carretero, F. García, P. de Miguel, F. Pérez

Interbloqueos II

• Ejemplo: Si C1 y C2 son dos colas de mensajes:

P1 P2receive(P2, M) receive(P1, N)... ...

send(P2, M) send(P1, N)

• Condiciones del interbloqueo: – Exclusión mutua – Retención y espera – No apropiación – Espera circular

Page 36: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

36

Sistemas operativos: una visión aplicada 70 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servicios Posix: Tuberías

• Crear una tubería sin nombre– int pipe(int fildes[2]);

• Crear una tuberías con nombre– int mkfifo(char *name, mode_t mode);

• Abrir una tubería con nombre– int open(char *fifo, int flag);

• Cerrar una tubería– int close(int fd);

• Borrar una tubería con nombre– int unlink(char *fifo);

• Leer de una tubería– int read(fildes[0], buffer, n);

• Escribir en una tubería– int write(fildes[1], buffer, n);

Sistemas operativos: una visión aplicada 71 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servicios Posix: Semáforos

• int sem_init(sem_t *sem, int shared, int val);– Inicializa un semáforo sin nombre

• int sem_destroy(sem_t *sem);– Destruye un semáforo sin nombre

• sem_t *sem_open(char *name, int flag, mode_t mode, int val);

– Abre (crea) un semáforo con nombre.• int sem_close(sem_t *sem);

– Cierra un semáforo con nombre.• int sem_unlink(char *name);

– Borra un semáforo con nombre.• int sem_wait(sem_t *sem);

– Realiza la operación wait sobre un semáforo. • int sem_post(sem_t *sem);

– Realiza la operación signal sobre un semáforo.

Page 37: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

37

Sistemas operativos: una visión aplicada 72 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servicios Posix: Mutex

• int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t * attr);

– Inicializa un mutex.

• int pthread_mutex_destroy(pthread_mutex_t *mutex) ;– Destruye un mutex.

• int pthread_mutex_lock(pthread_mutex_t *mutex);– Intenta obtener el mutex. Bloquea al proceso ligero si el mutex se

encuentra adquirido por otro proceso ligero. • int pthread_mutex_unlock(pthread_mutex_t *mutex);

– Desbloquea el mutex.

Sistemas operativos: una visión aplicada 73 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servicios Posix: Colas de mensajes

• mqd_t mq_open(char *name, int flag, mode_t mode, mq_attr *attr);

– Crea una cola de mensajes con nombre y atributos attr: • Número máximo de mensajes. • Tamaño máximo del mensaje. • Bloqueante, No bloqueante.

• int mq_close (mqd_t mqdes);– Cierra una cola de mensajes.

• int mq_unlink(char *name);– Borra una cola de mensajes.

Page 38: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

38

Sistemas operativos: una visión aplicada 74 © J. Carretero, F. García, P. de Miguel, F. Pérez

Servicios Posix: Colas de mensajes (II)

• int mq_send(mqd_t mqdes, char *msg, size_t len, int prio);

– Envía el mensaje msg de longitud len a la cola de mensajes mqdes con prioridad prio;

– Si la cola está llena el envío puede ser bloqueante o no.

• int mq_receive(mqd_t mqdes, char *msg, size_t len,int prio);

– Recibe un mensaje msg de longitud len de la cola de mensajes mqdes con prioridad prio;

– Recepción bloqueante o no.

Sistemas operativos: una visión aplicada 75 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Servicios de sincronización

• DWORD WaitForSingleObject(HANDLE hHandle, DWORDdwMilliseconds);

• DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitFail, DWORD dwMilliseconds);

Page 39: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

39

Sistemas operativos: una visión aplicada 76 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Tuberías

• Crear una tubería sin nombre– BOOL CreatePipe(PHANDLE phRead, PHANDLE phWrite,

LPSECURITY_ATTRIBUTES lpsa, DWORD cbPipe);

• Crear una tubería con nombre– HANDLE CreateNamedPipe (LPCTSTR lpszPipeName, DWORD

fdwOpenMode, DWORD fdwPipeMode, DWORD nMaxInstances, DWORD cbOutBuf, DWORD cbInBuf, DWORD dwTimeOut, LPSECURITY_ATTRIBUTES lpsa);

• Abrir una tubería con nombre – HANDLE CreateFile(LPCSTR lpFileName, DWORD

dwDesiredAccess,DWORD dwShareMode, LPVOIDlpSecurityAttributes, DWORD CreationDisposition, DWORDdwFlagsAndAttributes, HANDLE hTemplateFile);

Sistemas operativos: una visión aplicada 77 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Tuberías (II)

• Cerrar una tubería con nombre– BOOL CloseHandle (HANDLE hfile);

• Leer de una tubería– BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD

nBytes, LPDWORD lpnBytes, LPOVERLAPPED lpOverlapped);

• Escribir en una tubería– BOOL WriteFile (HANDLE hFile, LPVOID lpBuffer, DWORD

nBytes, LPDWORD lpnBytes, LPOVERLAPPED lpOverlapped);

Page 40: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

40

Sistemas operativos: una visión aplicada 78 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Secciones críticas

• VOID InitializeCriticalSection(LPCCRITICAL_SECTION lpcsCriticalSection);

• VOID DeleteCriticalSection(LPCCRITICAL_SECTION lpcsCriticalSection);

• VOID EnterCriticalSection(LPCCRITICAL_SECTION lpcsCriticalSection);

• VOID LeaveCriticalSection(LPCCRITICAL_SECTION lpcsCriticalSection);

Sistemas operativos: una visión aplicada 79 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Semáforos

• Crear un semáforo– HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpsa,

LONG cSemInitial, LONG cSemMax, LPCTSTRlpszSemName);

• Abrir un semáforo– HANDLE OpenSemaphore(LONG dwDesiredAccess, LONG

BinheritHandle, lpszName SemName);

• Operación wait– DWORD WaitForSingleObject(HANDLE hSem,

DWORD dwTimeOut);

• Operación signal– BOOL ReleaseSemaphore(HANDLE hSemaphore,

LONG cReleaseCount, LPLONG lpPreviousCount);

Page 41: Capítulo 5 Comunicación y sincronización de …sandoval/ApuntesSO/Cap05.pdf1 Sistemas operativos: una visión aplicada Capítulo 5 Comunicación y sincronización de procesos Sistemas

41

Sistemas operativos: una visión aplicada 80 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Mutex y eventos

• Crear un mutex– HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpsa, BOOL fInitialOwner, LPCTSTR lpszMutexName);

• Abrir un mutex– HANDLE OpenMutex(LONG dwDesiredAccess, LONG BineheritHandle,

lpszName SemName);

• Cerrar un mutex– BOOL CloseHandle(HANDLE hObject);

• Operación lock– DWORD WaitForSingleObject(HANDLE hMutex, DWORD dwTimeOut);

• Operación unlonk– BOOL ReleaseMutex(HANDLE hMutex);

Sistemas operativos: una visión aplicada 81 © J. Carretero, F. García, P. de Miguel, F. Pérez

Wind32: Mutex y eventos (II)

• Crear un evento– HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpsa, BOOL

fManualReset, BOOL fInitialState, LPTCSTR lpszEventName);

• Destruir un evento– BOOL CloseHandle(HANDLE hObject);

• Esperar por un evento– DWORD WaitForSingleObject(HANDLE hEvent, DWORD

dwTimeOut);

• Notificar un evento– BOOL SetEvent(HANDLE hEvent);– BOOL PulseEvent(HANDLE hEvent);