Dudas sobre el esquema de asignación de particiones variables

Dudas sobre el esquema de asignación de particiones variables

de Jerónimo Ismael Acosta Monteavaro -
Número de respuestas: 3

Buenas noches, quisiera consultar lo siguiente respecto al esquema de asignación de particiones variables. Gracias.

1. Los aspectos de implementación explicados previo a la introducción del esquema de partición, ¿se corresponden con ese esquema en específico? Esto no se aclara.
Conceptos como el registro de reubicación y registro límite se indagan bajo títulos como "protección de memoria", pero en otros pdf se presentan implementaciones diferentes.


2. El pdf dice "El sistema operativo define particiones de tamaño variable", pero no se especifica si es variable entre procesos, o para un mismo proceso: ¿puede un segmento ya creado cambiar de tamaño?.


3. ¿La totalidad de un proceso está siempre dentro de una misma partición?, no se aclara.


4. ¿Cómo funciona cada heap y stack?: ¿las solicitudes de memoria en heap crean una partición nueva?, ¿o expanden una ya existente?


5. Se dice que el sistema delega la administración del heap a librerías de usuario, pero no se explica cómo el sistema se encarga de administrar el stack en el esquema de particiones variables.
Se me ocurre que el compilador podría culcular cuál será el uso máximo de stack, y esa información se usa al asignar la partición; ¿es correcto?.


6. Se menciona que "Las estrategias de asignación sufren de fragmentación externa", asumo que se refiere específicamente al esquema de asignación de particiones (por contraste con lo visto sobre paginación). Luego, se presenta el concepto de fragmentación interna, pero no se aclara: ¿sufre el esquema de asignación de particiones fragmentación interna también, o es inmune a esta?. A continuación, se menciona que "para evitar el problema, se divide la memoria física en bloques de tamaño fijo", aquí ya no sé si aún se sobre-entiende que se habla del esquema antes mencionado. ¿Puede el esquema de particiones variables catalogarse como tal si la memoria se particiona "en bloques fijos" (entendiendo que son relativamente pequeños)?

Tengo algunas otras preguntas que se desvían del tema del título. Las adjunto aquí para evitar hacer varios post:

7. En el pdf se menciona: "A diferencia de la carga dinámica, el enlace dinámico de bibliotecas compartidas generalmente requiere la intervención del sistema operativo.". Previamente se había establecido que todo acceso a memoria es una operación privilegiada, por lo que me confunde la afirmación de que pueda cargarse una rutina en memoria (carga dinámica) sin que el sistema intervenga.

8. ¿Cómo afecta al rendimiento la carga dinámica?. En la sección de swapping se establece que mover datos de la memoria secundaria a la memoria principal es una operación muy lenta, por lo que me cuestiono si la carga dinámica no ralentizaría mucho la ejecución de una rutina (ya que habría que esperar a que se cargue, no estaría cargada de antemano). Si es el caso, ¿es viable de todos modos?

9. Como desventaja de la reubicación dinámica se lista "Los procesos requieren una cantidad fija de memoria física, (...) cada proceso activo debe caber en la memoria". ¿Implica esto que la reubicación dinámica es de alguna forma incompatible con la carga dinámica? (ya que esta se presenta anteriormente como una solución a ese mismo problema).

En respuesta a Jerónimo Ismael Acosta Monteavaro

Re: Dudas sobre el esquema de asignación de particiones variables

de Sergio Nesmachnow -
Hola,

Te respondo tus consultas

1. Los aspectos de implementación explicados previo a la introducción del esquema de partición, ¿se corresponden con ese esquema en específico? Esto no se aclara.
Conceptos como el registro de reubicación y registro límite se indagan bajo títulos como "protección de memoria", pero en otros pdf se presentan implementaciones diferentes.

No me queda claro a qué refieres con "aspectos de implementación" previos a presentar el esquema de particiones. Si te refieres a los conceptos presentados en las 23 slides previas de la clase Administración de Memoria I te respondo que si, son conceptos generales que se aplican en todos los métodos posteriores, en algunos casos con variantes especificas. Los conceptos de registro de reubicación y registro límite no se presentan para "protección de memoria", se presentaron de modo genérico en el primer tema del curso y en la clase Administración de Memoria I registro de reubicación se introduce en la slide 18 "Tipos de direccionamiento". Registro límite si se introduce en la slide "Asignacion de memoria a nivel del sistema" dado que se presenta allí su principal función, para verificar accesos válidos a la memoria.

2. El pdf dice "El sistema operativo define particiones de tamaño variable", pero no se especifica si es variable entre procesos, o para un mismo proceso: ¿puede un segmento ya creado cambiar de tamaño?.

Particiones de tamaño variable significa precisamente eso, las particiones que se crean en la memoria son de tamaño variable para poder cumplir con los requisitos de memoria de cada proceso. Entiendo que está bien explicado en la primera frase de la slide "El sistema operativo define particiones de tamaño variable y las asigna a los procesos". Todos los casos que siguen presentan ejemplos de ese concepto, asignando particiones a los procesos de acuerdo con sus solicitudes de memoria. La frase "para un mismo proceso: ¿puede un segmento ya creado cambiar de tamaño?" no parece bien formulada, porque en este esquema no se segmenta la memoria. Si te refieres a las particiones, una vez asignadas son de tamaño fijo durante toda la ejecución del proceso.

3. ¿La totalidad de un proceso está siempre dentro de una misma partición?, no se aclara.
A nivel general (para el esquema de particiones variables, que aplica segmentación ni paginación, técnicas que se presentan posteriormente) la respuesta es que si, todo proceso está siempre dentro de una misma partición, y así deben considerarlo en los ejercicios planteados en el práctico. Hilando más fino, entre los requerimientos de memoria de un proceso están las bibliotecas compartidas, que podrían ser referencias a otra partición, pero eso corresponde a detalles específicos de implementación, para tener un manejo más eficiente de la memoria.

4. ¿Cómo funciona cada heap y stack?: ¿las solicitudes de memoria en heap crean una partición nueva?, ¿o expanden una ya existente?

No se crean particiones nuevas, se trabaja siempre dentro de la partición asignada al proceso.

5. Se dice que el sistema delega la administración del heap a librerías de usuario, pero no se explica cómo el sistema se encarga de administrar el stack en el esquema de particiones variables.
Se me ocurre que el compilador podría culcular cuál será el uso máximo de stack, y esa información se usa al asignar la partición; ¿es correcto?.

A los efectos de lo que presentamos en el curso, la información sobre uso (estimado) de memoria es determinada por el compilador y pasada al loader, que indica los requerimientos al sistema operativo. El archivo ejecutable contiene información al respecto.

6. Se menciona que "Las estrategias de asignación sufren de fragmentación externa", asumo que se refiere específicamente al esquema de asignación de particiones (por contraste con lo visto sobre paginación). Luego, se presenta el concepto de fragmentación interna, pero no se aclara: ¿sufre el esquema de asignación de particiones fragmentación interna también, o es inmune a esta?. A continuación, se menciona que "para evitar el problema, se divide la memoria física en bloques de tamaño fijo", aquí ya no sé si aún se sobre-entiende que se habla del esquema antes mencionado. ¿Puede el esquema de particiones variables catalogarse como tal si la memoria se particiona "en bloques fijos" (entendiendo que son relativamente pequeños)?

Toda la información que se presenta en un determinado punto de las slides refieren al tema (o temas) ya presentado(s). Nunca refieren a métodos no presentados. "Las estrategias de asignación sufren de fragmentación externa" refieren a las estrategias presentadas hasta ese punto, para implementar la gestión de memoria basada en particiones variables.
La fragmentación interna es la sobrecarga por gestionar huecos muy pequeños, puedes ver claramente que todas las estrategias presentadas hasta ese punto de la slide adolecen de ese problema.
La última parte de tu pregunta no la entiendo. La estrategia de dividir la memoria física en bloques de tamaño fijo y asignar la memoria en unidades del tamaño del bloque se aplica efectivamente sobre el esquema presentado (no entiendo sobre qué otro esquema se podría aplicar ... nunca presentaremos una estrategia sobre un esquema aún no presentado). La partición sigue siendo de tamaño variable, solo que se se definen bloques (de tamaño fijo) como subdivisión. En este caso la memoria asignada a un proceso puede ser ligeramente mayor que la memoria solicitada (en el último bloque). La diferencia entre lo solicitado y lo asignado es precisamente la fragmentación interna (memoria no utilizada, interna a una partición).

Tengo algunas otras preguntas que se desvían del tema del título. Las adjunto aquí para evitar hacer varios post:

7. En el pdf se menciona: "A diferencia de la carga dinámica, el enlace dinámico de bibliotecas compartidas generalmente requiere la intervención del sistema operativo.". Previamente se había establecido que todo acceso a memoria es una operación privilegiada, por lo que me confunde la afirmación de que pueda cargarse una rutina en memoria (carga dinámica) sin que el sistema intervenga.
El enlace dinámico de bibliotecas compartidas requiere de la intervención del sistema operativo que es quien conoce en qué direcciones de memoria están cargadas las bibliotecas compartidas. La carga dinámica refiere a que una rutina no se carga en memoria física hasta que sea invocada y esta carga la realiza el cargador (loader) que debe incluir soporte para reubicación. No es correcto que "todo acceso a memoria es una operación privilegiada", esa idea la tomaste de alguna slide ? por favor nos avisas para corregirlo si ese es el caso.

8. ¿Cómo afecta al rendimiento la carga dinámica?. En la sección de swapping se establece que mover datos de la memoria secundaria a la memoria principal es una operación muy lenta, por lo que me cuestiono si la carga dinámica no ralentizaría mucho la ejecución de una rutina (ya que habría que esperar a que se cargue, no estaría cargada de antemano). Si es el caso, ¿es viable de todos modos?
Si es viable. La reducción de desempeño (por el tiempo de carga) se compensa porque no se carga todo el programa inicialmente y además permite un uso más eficiente de la memoria. Lo que se debe pagar es el tiempo de latencia adicional para acceder a la rutina a cargar, pero las ventajas en gestión de memoria compensan ese costo.

9. Como desventaja de la reubicación dinámica se lista "Los procesos requieren una cantidad fija de memoria física, (...) cada proceso activo debe caber en la memoria". ¿Implica esto que la reubicación dinámica es de alguna forma incompatible con la carga dinámica? (ya que esta se presenta anteriormente como una solución a ese mismo problema).
No es incompatible, de hecho en la slide 11 se indica que "El enlace dinámico, utilizado en conjunto con la carga dinámica, permite un uso mas eficiente de la memoria, dado que ´
las bibliotecas dinámicas se cargan una única vez en memoria principal". La reubicación dinámica por si sola no mejora o resuelve el problema de que se debe asignar a los procesos toda la cantidad (fija) de memoria física que requieren.

Como comentario general ,te sugiero que este tipo de preguntas las realices en el teórico. De este modo será posible dialogar, entender tus preguntas y explicarte de mejor manera. Es muy difícil contestar todo este tipo de consultas conceptuales en un mail o post. Las slides tratan ser autocontenidas, pero las frases que se incluyen en las slides no permiten incluir todos los detalles de todos los temas.

Saludos
SN
En respuesta a Sergio Nesmachnow

Re: Dudas sobre el esquema de asignación de particiones variables

de Jerónimo Ismael Acosta Monteavaro -
Gracias por las respuestas profe. Respondo con las aclaraciones y nuevas preguntas pertinentes a mis consultas.

1. Mi confusión se da a raíz de lo presentado en la sección "Protección de memoria" del tema paginación: allí se habla de implementar la protección de memoria mediante la inclusión de un "bit de protección" en las entradas de la page-table; no se menciona el concepto de registros base y límite, y no tengo claro por qué eso sería necesario si ya se tiene la implementación del bit de protección.

2. Sí, me refería a partición cuando usé la palabra segmento, mi error.

3, 4. Dado que todo un proceso está siempre dentro de una partición, y que estas no pueden cambiar de tamaño: ¿cómo se maneja el hecho de solicitar memoria dinámicamente al s.o.?. Quiero decir, cuando se guardan datos en el heap, esa es memoria extra que el programa requiere, y cuyo tamaño (el total de todo el uso de heap) no podía preverse previo al run-time.
Esta pregunta se corresponde con el punto 4. Ya fue respondido, pero no me queda claro.
Por ejemplo: el proceso podría alojarse en una partición con un espacio de heap máximo inicialmente libre para que pueda usarlo conforme lo necesite. Una descripción del estilo es lo que no sé formular.

6. Me refería a que habían 2 interpretaciones diferentes que podrían concluirse del texto:
El esquema de particiones variables sufre de fragmentación externa, así que
a. existen implementaciones concretas de este esquema que consisten en dividir la memoria en bloques de
tamaño fijo. Remarco: es una variación del mismo esquema, aún se considera como tal.
b. existen otros esquemas diferentes que consisten en dividir la memoria en bloques de tamaño fijo. Por
ejemplo: la paginación divide la memoria en frames. Remarco: ya no se refiere al mismo esquema.
Dos diapositivas más adelante, en la sección de "Soluciones al problema de la fragmentación", se habla de tener un espacio de direcciones no contiguo, y entonces sí se aclara que son otras técnicas las que implementan esa idea. Me hizo volver sobre los puntos previos para preguntarme si estos son aplicados por esa técnica, o si al aplicarse ya hablaríamos de una técnica diferente.

7. No pude encontrar la afirmación en concreto, posiblemente la obtuve mediante el intercambio con alumnos y no de un slide en particular, mi error. Lo que si encontré son menciones a que el S.O. es el responsable de administrar la memoria, quizá de allí parte la idea equivocada.
Por otro lado, en el slide 22 (p.25) de "Estructura de los sistemas operativos" se lista la gestión de dispositivos como una categoría de system calls que incluyen "leer o escribir". También, en "Estructura de los sistemas de computación" se dice (en "Protección de E/S") que todas las instrucciones de E/S son privilegiadas. Tengo entendido que el hardware de almacenamiento por fuera de la memoria principal cataloga como dispositivo E/S, ¿es correcto?. En ese caso, interactuar con un disco duro para cargar un programa en la RAM catalogaría como una instrucción de E/S, ¿no?.

Respecto al comentario general: vivo lejos de la facultad, y mi itinerario causa que asistir al teórico para preguntar estas cosas implique múltiples horas de estudio sacrificadas encima de un ómnibus. Veré que puedo hacer.

Saludos
En respuesta a Jerónimo Ismael Acosta Monteavaro

Re: Dudas sobre el esquema de asignación de particiones variables

de Sergio Nesmachnow -
Hola, te contesto de forma más breve que a las preguntas previas.
Reitero que lo mejor es que puedas realizar las consultas personalmente, en alguna de las instancias presenciales que cuenta el curso

1.
El bit de protección (controlado por el hardware) se utiliza para verificar permisos específicos de los segmentos y/o las páginas, por ejemplo para impedir la escritura de segmentos/páginas que solo tienen permisos de lectura y ejecución y no de escritura. Este chequeo se realiza POSTERIORMENTE a determinar la validez de una dirección (por ejemplo, controlando contra el registro límite de un segmento).

3, 4.
El espacio requerido para el heap y el stack está incluido dentro de la memoria que demanda el proceso. Luego, heap y stack pueden crecer mientras no se pisen. Puedes ver ejercicios que modelan este comportamiento en el práctico 8, casi todos los ejercicios plantean espacios para datos y stack por separado, que se apuntan de manera diferente por parte de las tablas de páginas porque el stack se aloja a partir de las direcciones más altas de memoria y crece hacia las direcciones más baja y el heap viceversa.

6.
Es como lo planteas (o al menos como yo entiendo que lo planteas). La solución de tener un espacio de direcciones no contiguo para evitar la fragmentación externa es el fundamento de la técnica de paginación.

7.
Estás confundiendo acceso a memoria con acceso a dispositivos. Puedes darte cuenta que si un programa necesitara interactuar con el sistema operativo cada vez que realiza un acceso a memoria, su ejecución sería muy muy ineficiente. La traducción de dirección virtual a física se realiza en hardware. Si se usa una TLB también es hardware y la búsqueda en la TLB se hace en hardware en el propio ciclo de instrucción. El sistema operativo interviene cuando se da un fallo de página, para realizar el proceso de carga o reemplazo, como se presenta en la clase de memoria virtual.