Tecnologia

Solo disponible en BuenasTareas
  • Páginas : 8 (1914 palabras )
  • Descarga(s) : 0
  • Publicado : 13 de octubre de 2010
Leer documento completo
Vista previa del texto
Concurrencia en UNIX / LINUX Memoria compartida
Procesos e Hilos POSIX

Memoria Compartida
• La memoria compartida, como cualquier otro recurso del sistema informático, es gestionada por el S.O. • La memoria compartida disponible es siempre un recurso limitado. • El S.O. lo gestiona por medio de tablas, del mismo modo que hace con la mayoría de los recursos. Un posible ejemplo oritentativode tabla de gestión de memoria:

id 1 2 3

Estado

Inicio

Tamaño

Propietario

Asigando 000F 0000 0001 0000 pepe Libre Libre

Permisos rwx rwx rwx rw- r-- ---

Procesos Pesados y Memoria Compartida
• Al crear un proceso nuevo con fork() se crea una copia exacta de la imagen del proceso padre (por supuesto, en zonas de memoria diferentes)
– Cada proceso tiene su PCB, una copiadel texto, de los datos y de la pila. – Al copiarse la zona de datos y de pila se copian tanto las variables locales o automáticas como las externas. Sin embargo dichas variables, aún teniendo el mismo nombre, son propias de cada proceso y no son compartidas.

• Para compartir memoria entre procesos hay que solicitarlo al sistema operativo. Para utilizar la memoria compartida se siguen 3 pasos:
–Obtención de un fragmento de memoria compartida con su identificador en el sistema (número entero): shmget(). – Todos los procesos que vayan a acceder a esa memoria compartida deben apuntar hacia ella con la función. shmat(). • Para conseguir esto hay varios modos: pasar el identificador del fragmento de memoria obtenido, o bien pasar directamente el puntero (dirección de memoria donde comienzael fragmento compartido). – Liberación de la memoria compartida. Se usan las funciones shmdt() y shmctl().

• La obtención y liberación de la memoria se hará una sola vez.

Estado inicial
// Pedir memoria idMem=shmget (IPC_PRIVATE, tam, 0660); // Inicalizarla aquí // Crear hijo pid=fork() If (pid==0){ // El hijo adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso dela memoria compartida // El hijo desadjunta la memoria compartida shmdt((char *)dato); } else { // El padre adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso de la memoria compartida // El padre desadjunta la memoria compartida shmdt((char *)dato); // El padre espera a que termine el hijo wait (); // El padre, sólo cuando todos los hijos hayan // terminado, libera lamemoria compartida shmctl(idMem, IPC_RMID, 0); }

Padre

id Estado Inicio Tamaño Propietario Permisos 1 Asigando 2 Libre 3 Libre

Fase 1: Pedir memoria Compartida
// Pedir memoria idMem=shmget (IPC_PRIVATE, tam, 0660); // Inicalizarla aquí // Crear hijo pid=fork() If (pid==0){ // El hijo adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso de la memoria compartida// El hijo desadjunta la memoria compartida shmdt((char *)dato); } else { // El padre adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso de la memoria compartida // El padre desadjunta la memoria compartida shmdt((char *)dato); // El padre espera a que termine el hijo wait (); // El padre, sólo cuando todos los hijos hayan // terminado, libera la memoria compartidashmctl(idMem, IPC_RMID, 0); }

Padre idMem=2

Mem. Comp.

id Estado Inicio Tamaño Propietario Permisos 1 Asigando 2 Asignado 3 Libre

Fase 2: Crear proceso concurrente
// Pedir memoria idMem=shmget (IPC_PRIVATE, tam, 0660); // Inicalizarla aquí // Crear hijo pid=fork() If (pid==0){ // El hijo adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso de la memoriacompartida // El hijo desadjunta la memoria compartida shmdt((char *)dato); } else { // El padre adjunta la memoria compartida dato = (int*) shmat(idMem, (char*) 0, 0); // Uso de la memoria compartida // El padre desadjunta la memoria compartida shmdt((char *)dato); // El padre espera a que termine el hijo wait (); // El padre, sólo cuando todos los hijos hayan // terminado, libera la memoria...
tracking img