Publicado el 6 de Julio del 2017
690 visualizaciones desde el 6 de Julio del 2017
4,2 MB
53 paginas
Creado hace 16a (12/01/2009)
Sistemas operativos II
Memoria en UNIX
Introducción
Espacio de direcciones de los procesos
Organización de la memoria física
Robo de páginas e intercambio
Memoria en UNIX
Introducción
Espacio de direcciones de los procesos
Organización de la memoria física
Robo de páginas e intercambio
Memoria en UNIX
Introducción
Espacio de direcciones de los procesos
Organización de la memoria física
Robo de páginas e intercambio
Generalidades
I Los procesos se ejecutan en un espacio de direcciones virtual
I Usualmente la memoria física está dividida en trozos de
tamaño fijo denominados marcos o páginas físicas
I Tamaño de página depende del procesador. En sistemas
actuales típicamente 4Kbytes
I Lo procesos trabajan con direcciones virtuales compuestas por
número de página y desplazamiento dentro de la página.
Ejemplo: en un sistema con páginas de 4K la dirección
0x800c03a9, corespondería a desplazamiento 0x3a9 en la
página 0x800c0
I La traslación de número de página y desplazamiento a número
de página física (marco) y desplazamiento se hace en tiempo
de ejecución con ayuda del hardware
Esquema del direccionamiento en la arquitectura i386
Esquema del direccionamiento en la arquitectura i386
Generalidades
I Si el sistema soporta memoria virtual
I un proceso no tiene que estar en memoria totalmente para
poderse ejecutar: la tabla de páginas ha de tener un bit que
indica si está o no en memoria.
I El S.O. guarda información de dónde en el almacenamiento
secundario está cada página no residente en memoria física
I Cuando se crea un proceso se necesita memoria para las
estructuras proc y u area
I el código y los datos inicializados residen en el fichero de disco
I la pila y los datos sin inicializar se ajustan durante la ejecución
I solo se asigna memoria para aquellas páginas que son
referenciadas: paginación bajo demanda pura
Generalidades
I Las páginas de memoria no usadas se sacan de la memoria:
robo de páginas.
I En unix el proceso que realiza esta tarea es pageout,
pagedaemon o paged
I Si se produce hiperpaginación (los procesos tienen menos
páginas que su working set en memoria), se intercambian
procesos enteros a disco.
I En unix esto lo hace el swapper (sched)
Memoria en UNIX
Introducción
Espacio de direcciones de los procesos
Organización de la memoria física
Robo de páginas e intercambio
Memoria en unix: regiones
I En su acepción mas simple, un proceso consta de tres
regiones: código, datos y pila.
I código (text) Contiene el código de las funciones del
programa. Es de solo lectura
I datos (data + bss) Contiene los datos (variables globales,
tanto inicializadas como sin inicialización explicita) del
proceso. El montículo (heap) suele ser parte de esta región
I pila (stack). Usado para pasar los parámetros a las funciones y
por éstas para sus variables locales
memoria en unix: regiones
I Cada proceso tiene una tabla de regiones del proceso con
referencias a las entradas en la tabla de regiones del kernel
que constituyen el proceso
I cada entrada de la tabla de regiones que contiene
I donde (dirección virtual) comienza y termina la región
I permisos de la región (solo lectura, lectura-escritura, lectura
ejecución . . . )
I puntero a entrada en la tabla de regiones del kernel
memoria en unix: regiones
I El kernel contiene una tabla de regiones del kernel
I En la tabla de regiones del kernel hay un puntero a los mapas
de traducción de direcciones virtuales a reales (dependientes
de la implementación)
I Cada entrada en la tabla de regiones del kernel contiene
I puntero al inodo cuyos contenidos se cargan en esa región
I tipo de región (código, datos, pila, memoria compartida,
mmaped file)
I tamaño de la región
I localización de la región en memoria física
I contador de referencias
operaciones sobre regiones
I las operaciones sobre regiones que hace el kernel son
I asignar una región (fork(), exec(), shmget())
I encadenar una región a un proceso (fork(), exec(),
shmat())
I cambiar el tamaño de una región (brk(), sbrk(), (malloc()))
I cargar una región (exec())
I desasignar una región (exec(), exit(), shmctl(IPC RMID, ))
I desencadenar una región del espacio de direcciones de
un proceso (exec(), exit(), shmdt())
I duplicar una región (fork())
memoria en System V R4
I El espacio de direcciones de un proceso se almacena como una
lista enlazada de sus segmentos (código, datos, pila . . . )
I en la estructuta proc hay una referencia a una estructura as
(address space)
I la estructura as contiene la referencia a la primera de las
estructuras de la lista que describe los segmentos que
constituyen el espacio de direcciones
I cada segmento esta descrito por una estructura seg que
contiene una referencia a una estructura segvn data.
Mapa de memoria en solaris
Salida del comando pmap
I en solaris
08046000
08050000
0806A000
0806B000
D16D0000
D16E0000
D17A9000
D17AF000
D17C0000
D17CA000
D17FB000
D17FC000
I en linux
8K rwx--
[ stack ]
44K r-x-- /home/antonio/so2tex/Practicas/a.out
4K rwx-- /home/antonio/so2tex/Practicas/a.out
8K rwx--
4K rwx--
[ heap ]
[ anon ]
740K r-x-- /lib/libc.so.1
24K rw--- /lib/libc.so.1
8K rw--- /lib/libc.so.1
24K rwx--
[ anon ]
132K r-x-- /lib/ld.so.1
4K rwx-- /lib/ld.so.1
8K rwx-- /lib/ld.so.1
08048000
08051000
08052000
b7e7c000
b7e7d000
b7fa4000
b7fa9000
b7fab000
b7fbb000
b7fbf000
b7fc0000
b7fd5000
bf8a0000
36K r-x--
4K rw---
4K rw---
4K rw---
1180K r-x--
20K r----
8K rw---
12K rw---
16K rw---
4K r-x--
84K r-x--
8K rw---
88K rw---
/home/antonio/so2tex/Practicas/a.out
/home/antonio/so2tex/Practicas/a.out
[ anon ]
[ anon ]
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
[ anon ]
[ anon ]
[ anon ]
/lib/ld-2.3.6.so
/lib/ld-2.3.6.so
[ stack ]
tras asignarse 100M de memoria . . .
I en solaris
08046000
08050000
0806A000
0806B000
D16D0000
D16E0000
D17A9000
D17AF000
D17C0000
D17CA000
D17FB000
D17FC000
I en linux
8K rwx--
44K r-x--
4K rwx--
97672K rwx--
4K rwx--
740K r-x--
24K rw---
8K rw---
24K rwx--
132K r-x--
4K rwx--
8K rwx--
08048000
08051000
08052000
b1f1d000
b7e7d000
b7fa4000
b7fa9000
b7fab000
b7fbb000
b7fbf000
b7fc0000
b7fd5000
bf8a0000
36K r-x--
4K rw---
136K rw---
97664K rw---
1180K r-x--
20K r----
8K rw---
12K rw---
16K rw---
4K r-x--
84K r-x--
8K rw---
88K rw---
[ stack ]
/home/antonio/so2tex/Practicas/a.out
/home/antonio/so2tex/Practicas/a.out
[ heap ]
[ anon ]
/lib/libc.so.1
/lib/libc.so.1
/lib/libc.so.1
[ anon ]
/lib/ld.so.1
/lib/ld.so.1
/lib/ld.so.1
/home/antonio/so2tex/Practicas/a.out
/home/antonio/so2tex/Practicas/a.out
[ anon ]
[ anon ]
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
[ anon ]
[ anon ]
[ anon ]
/lib/ld-2.3.6.so
/lib/ld-2.3.6.so
[ stack ]
tras crear una zona de memoria compartida . . .
I en solaris
08024000
08050000
0806A000
0806B000
D1693000
D16D0000
D16E0000
D17A9000
D17AF000
D17C0000
D17CA000
D17FB000
D17FC000
I en linux
144K rwx--
[ stack ]
44K r-x-- /home/antonio/so2tex/Practicas/a.out
4K rwx-- /home/antonio/so2tex/Practicas/a.out
97672K rwx--
236K rwxs-
4K rwx--
[ heap ]
[ shmid=0xe ]
[ anon ]
740K r-x-- /lib/libc.so.1
24K rw--- /lib/libc.so.1
8K rw--- /lib/libc.so.1
24K rwx--
[ anon ]
132K r-x-- /lib/ld.so.1
4K rwx-- /lib/ld.so.1
8K rwx-- /lib/ld.so.1
08048000
08051000
08052000
b1ee2000
b1f1d000
b7e7d000
b7fa4000
b7fa9000
b7fab000
b7fbb000
b7fbf000
b7fc0000
b7fd5000
bf891000
36K r-x--
4K rw---
136K rw---
236K rw-s-
97664K rw---
1180K r-x--
20K r----
8K rw---
12K rw---
16K rw---
4K r-x--
84K r-x--
8K rw---
148K rw---
/home/antonio/so2tex/Practicas/a.out
/home/antonio/so2tex/Practicas/a.out
[ anon ]
[ shmid=0x3c800f ]
[ anon ]
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
[ anon ]
[ anon ]
[ anon ]
/lib/ld-2.3.6.so
/lib/ld-2.3.6.so
[ stack ]
tras mapear un fichero de 152739840 bytes . . .
I en solaris
08024000
08050000
0806A000
0806B000
C8400000
D1693000
D16D0000
D16E0000
D17A9000
D17AF000
D17C0000
D17CA000
D17FB000
D17FC000
I en linux
144K rwx--
[ stack ]
44K r-x-- /home/antonio/so2tex/Practicas/a.out
4K rwx-- /home/antonio/so2tex/Practicas/a.out
97672K rwx--
[ heap ]
149160K r---- dev:102,7 ino:29125
236K rwxs-
4K rwx--
[ shmid=0xe ]
[ anon ]
740K r-x-- /lib/libc.so.1
24K rw--- /lib/libc.so.1
8K rw--- /lib/libc.so.1
24K rwx--
[ anon ]
132K r-x-- /lib/ld.so.1
4K rwx-- /lib/ld.so.1
8K rwx-- /lib/ld.so.1
36K r-x--
08048000
4K rw---
08051000
08052000
136K rw---
a8d38000 149160K r----
236K rw-s-
b1ee2000
97664K rw---
b1f1d000
1180K r-x--
b7e7d000
20K r----
b7fa4000
8K rw---
b7fa9000
12K rw---
b7fab000
b7fbb000
16K rw---
4K r-x--
b7fbf000
84K r-x--
b7fc0000
8K rw---
b7fd5000
bf891000
148K rw---
/home/antonio/so2tex/Practicas/a.out
/home/antonio/so2tex/Practicas/a.out
[ anon ]
/home/antonio/so2tex/Practicas/fichero.tar
[ shmid=0x3c800f ]
[ anon ]
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
/lib/tls/i686/cmov/libc-2.3.6.so
[ anon ]
[ anon ]
[ anon ]
/lib/ld-2.3.6.so
/lib/ld-2.3.6.so
[ stack ]
tras crear otra zona de memoria compartida . . .
I en solaris
08024000
08050000
0806A000
0806B000
C6800000
C8400000
D1693000
D16D0000
D16E0000
D17A9000
D17AF000
D17C0000
D17CA000
D17FB000
D17FC000
I en linux
144K rwx--
[ stack ]
44K r-x-- /home/antonio/so2tex/Practicas/a.out
4K rwx-- /home/antonio/so2tex/Practicas/a.out
97672K rwx--
27920K rwxs-
[ heap ]
[ shmid=0xf ]
149160K r---- dev:102,7 ino:29125
236K rwxs-
4K rwx--
[ shmid=0xe ]
[ anon ]
740K r-x-- /lib/libc.so.1
24K rw--- /lib/libc.so.1
8K rw--- /lib/libc.so.1
24K rwx--
[ anon ]
132K r-x-- /lib/ld.so.1
4K rwx-- /lib/ld.so.1
8K rwx-- /lib/ld.so.1
36K r-x--
08048000
4K rw---
08051000
136K rw---
08052000
a71f4000
27920K rw-s-
a8d38000 149160K r----
236K rw-s-
b1ee2000
97664K rw---
b1f1d000
1180K r-x--
b
Comentarios de: Sistemas operativos II (0)
No hay comentarios