Res P1 ArqSO (2023)

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 14

Sistema operativo: Es un programa que controla la ejecución de aplicaciones y programas y

que actúa como interfaz entre las aplicaciones y el hardware.

Objetivos:
Facilidad de uso: Un SO facilita el uso de un computador.
Eficiencia: Un SO permite que los recursos de un sistema de computación se puedan
utilizar de una manera eficiente.
Capacidad para evolucionar: Un SO se debe construir de tal forma que se puedan
desarrollar, probar e introducir nuevas funciones en el sistema sin interferir con su
servicio.

Funciones principales:
SO Máquina Extendida: Se encarga de presentar una interfaz agradable para el programador
u operador por medio de archivos ocultando las peculiaridades del hardware como las
interrupciones, administración de memoria, temporizadores y otras funciones de bajo
nivel.
SO Controlador de Recursos: Consiste en efectuar un reparto ordenado y controlado de los
procesadores memoria dispositivos de e/s, entre diversos programas que compiten por él.
También se mantiene al tanto de quien está usando qué recurso concede solicitudes de
recurso y media entre las solicitudes de los programas y usuarios que entren en
conflicto.

Generaciones:
Primera generación: Tubos de vacío y tableros
En esta generación las computadoras eran enormes, muy lentas, con miles de tubos de
vacío, su función general era de operaciones numéricas simples. Toda la programación se
efectuaba en lenguaje de máquina absoluto, a menudo alambrando tableros de conexión.
Segunda generación: Transistores y sistemas por lotes
Estas máquinas llamadas mainframes se alojaban en grandes habitaciones manejadas por
operadores profesionales. Gracias a los transistores las computadoras se volvieron
fiables para la venta a clientes comerciales. El sistema por lotes fue implementado para
reducir el alto costo.
Tercera generación: Circuitos integrados y multiprogramación
En esta generación las computadoras lograron cumplir dos funciones básicas: manejar
cómputos tanto científicos como comerciales. También fue planteada la idea de familia de
computadoras compatibles, y multiprogramación. Que consistía en dividir la memoria en
varias partes con distintos trabajos en cada una de las partes. El spooling y el sistema
de tiempo compartido también fueron claves en la tercera generación.
Cuarta generación: Computadoras personales
Con el desarrollo de circuitos integrados o chips surgió la era de las computadoras
personales trayendo consigo el desarrollo de interfaz gráfica y SO de red o SO
distribuidos.
Procesos: Es básicamente un programa en ejecución, consta de un programa ejecutable sus,
datos y pila, contador y otros registros. Los procesos son interrumpidos o liberados
periódicamente para dar tiempo de cpu a otros procesos, cuando este se detiene toda su
información se almacena explícitamente en un lugar, para cuando vuelva a ejecutarse su
estado es el mismo en el cual fue interrumpido.

Llamadas al sistema: Los procesos de usuario se comunican con el SO y le solicitan


servicios por medio de llamadas al sistema, a cada llamada le corresponde un
procedimiento de biblioteca que pueden llamar los
procesos de usuario, este procedimiento pone los parámetros de la llamada en un lugar
específico. Las llamadas al sistema pueden crear procesos, controlar la memoria, leer y
escribir, y hacen labores de E/S.

Archivos: Las llamadas al sistema crean, eliminan, abren y cierran archivos. Los archivos
se guardan en directorios donde los archivos que se encuentran en él pueden determinarse
mediante “nombre de ruta de acceso“ desde el directorio raíz.

Shell: El shell o intérprete de comando es la interfaz principal entre el usuario y el


SO, aunque no es parte del SO, pero hace uso extenso de muchas características del
sistema. Este reconoce a la terminal como entrada y salida estándar.

Kernel: Es un programa multihilo que reside permanentemente en memoria. Se ocupa


básicamente de tres tareas primordiales: gestión de memoria, gestión de E/S a disco, y
control de las tareas en ejecución.

Clasificación de los SO por estructura:


Estructura monolítica: Es la estructura de los primeros SO constituidos fundamentalmente
por un solo programa compuesto de un conjunto de rutinas entrelazadas de tal forma que
cada una puede llamar a cualquier otra.
Características: Módulos compilados separadamente, buena definición de parámetros de
enlace entre las distintas rutinas existentes, carecen de protecciones y privilegios,
generalmente están hechos a medida.
Estructura jerárquica (capas): Se dividió el SO en pequeñas partes de tal forma que cada
una de ellas estuviera perfectamente definida y con una clara interfaz con el resto de
elementos. Se constituyó una estructura jerárquica o de niveles en los SO el primero de
los cuales fue denominado THE (Technische Hogeschool Eindhoven), de Dijkstra que se
utilizó con fines didácticos.

Estructura jerárquica (anillos): En el sistema de anillos, cada uno tiene una apertura,
conocida como puerta o trampa (trap), por donde pueden entrar las llamadas de las capas
inferiores. De esta forma, las zonas más internas del SO o núcleo del sistema estarán más
protegidas de accesos indeseados desde las capas más externas.
Máquina virtual: Se trata de un tipo de SO que presenta una interfaz a cada proceso
mostrando una máquina que parece idéntica a la máquina real subyacente. Estos SO separan
dos conceptos que suelen estar unidos en el resto de sistemas: la multiprogramación y la
máquina extendida. El objetivo de los SO de máquina virtual es el de integrar distintos
SO dando la sensación de ser varias máquinas diferentes.

Cliente-Servidor (microkernel): Este sistema sirve para toda clase de aplicaciones por
tanto, es de propósito general y cumple con las mismas actividades que los SO
convencionales. El núcleo tiene como misión establecer la comunicación entre los clientes
y los servidores. Los procesos pueden ser tanto servidores como clientes

Clasificación de los SO por servicios:


Por el número de usuarios:
Monousuarios: Son aquéllos que soportan a un usuario a la vez sin importar el número de
procesadores que tenga la computadora ó el número de procesos o tareas que el usuario
pueda ejecutar en un mismo instante de tiempo. Las computadoras personales típicamente se
han clasificado en este renglón.
Multiusuarios: Son capaces de dar servicio a más de un usuario a la vez, ya sea por medio
de varias terminales conectadas a la computadora o por medio de sesiones remotas en una
red de comunicaciones. No importa el número de procesadores en la máquina ni el número de
procesos que cada usuario puede ejecutar simultáneamente.
Por el número de tareas:
Monotareas: Son aquellos que sólo permiten una tarea a la vez por usuario. Puede darse el
caso de un sistema multiusuario y monotarea en el cual se admiten varios usuarios al
mismo tiempo pero cada uno de ellos puede estar haciendo solo una tarea a la vez.
Multitareas: Es aquél que le permite al usuario estar realizando varias labores al mismo
tiempo. Por ejemplo puede estar editando el código fuente de un programa durante su
depuración mientras compila otro programa a la vez que está recibiendo email en un
proceso en background.
Por el número de procesadores:
Monoprocesador: Es aquél que es capaz de manejar solamente un procesador de la
computadora de manera que si la computadora tuviese más de uno le sería inútil. El
ejemplo más típico de este tipo de sistemas es el DOS.
Multiprocesador: Refiere al número de procesadores del sistema que es más de uno y éste
es capaz de usarlos todos para distribuir su carga de trabajo. Asimétrica: el SO
selecciona a uno de los procesadores el cual jugará el papel de procesador maestro y
servirá como pivote para distribuir la carga a los demás procesadores que reciben el
nombre de esclavos. Simétrica: los procesos o partes de ellos (threads) son enviados
indistintamente a cualquiera de los procesadores disponibles.

Interrupciones (IRQ): Una interrupción es un evento producido por el hardware del sistema
que altera la secuencia en la cual el procesador ejecuta las instrucciones. Se genera
cuando es necesario llamar la atención del procesador para realizar alguna acción
importante. Cuando se llevan a cabo se realizan las siguientes operaciones: El control
pasa al SO, el SO almacena el estado completo del proceso interrumpido, se analiza la
interrupción producida, se ejecuta la rutina de servicio, se restaura el proceso
interrumpido, se ejecuta el siguiente proceso que seleccione el planificador.
Clases de interrupciones:
De programa: Generada por alguna condición que se produce como resultado de la ejecución
de una instrucción, tales como un desbordamiento aritmético, una división por cero, un
intento de ejecutar una instrucción de máquina ilegal, y las referencias fuera del
espacio de la memoria permitido para un usuario.
Por temporizador: Generada por un temporizador del procesador. Permite al SO realizar
ciertas funciones de forma regular.
De E/S: Generada por un controlador de E/S para señalar la conclusión normal de una
operación o para indicar diversas condiciones de error.
Por fallo del hardware: Generada por un fallo, como un fallo en el suministro de energía
o un error de paridad en la memoria.

Procesos: Instancia de un programa en ejecución. Incluye el código que se ejecuta,


registros, contador de programa, áreas de memoria y todo lo relacionado para caracterizar
y gestionar dicha ejecución. Varios procesos pueden compartir un procesador y se usa
algún algoritmo de calendarización para determinar que termine y comience otro. Ejemplo
FCFS, Round Robin Prioridades, SJF, etc.

Modos de ejecución:
Modo usuario: permite la ejecución de instrucciones que no afectan a otros
procesos.
Modo kernel: permite la ejecución de todas las instrucciones.

Creación: Inicialización del sistema Llamadas al sistema para crear un proceso (fork +
exec, createProcess). Petición de usuario, lanzamiento de una nueva aplicación desde la
interfaz de usuario. Inicio de un proceso por lotes, sistema de cola de trabajos en
servidores.

Finalización: Voluntarias: Normal (Exit/exitProcess). Por error: falta algún parámetro


por ejemplo. Involuntarias: Error fatal: excepciones, violación de segmento, etc. Por
otro proceso (kill / terminateProcess).

Bloque de control de procesos (BCP): Es un registro especial donde el SO agrupa toda la


información que necesita conocer respecto a un proceso en particular. Cada vez que se
crea un proceso el SO crea el BCP correspondiente, sirve como descripción en tiempo de
ejecución durante toda la vida del proceso. Cuando el proceso termina, el BCP es borrado
y el registro puede ser usado por otro proceso. Información almacenada: Id del proceso,
estado del proceso (Ej listo, bloqueado, etc), contador del programa (dirección de la
próxima instrucción a ejecutar), valores de registro de CPU (se usa para el cambio de
contexto), espacio de direcciones de memoria, prioridad en caso de utilizarse dicho
algoritmo para planificación de CPU, lista de recursos asignados, estadísticas del
proceso, datos del usuario, permisos asignados, signals pendientes de ser servidos.

Cambio de contexto (context switch): Consiste en la ejecución de una rutina perteneciente


al kernel del SO para la ejecución de un proceso para dar paso a la ejecución de otro
distinto. Una computadora que dispone un único microprocesador solo puede ejecutar un
programa al mismo tiempo. Para simular ejecución simultánea de 2 o más programas sería
posible detener un programa y reanudarlo en otro momento sin perder información. Los
programas alternan ejecución durante cortos periodos de tiempo aparentando que se
ejecutan todos a la vez, a esto se lo llama ejecución concurrente. Se necesita la
intervención del hardware. Gracias a las interrupciones por el propio computador es
posible expulsar el programa en ejecución para dar paso al SO. Realiza lo siguiente:
salva el estado del programa que se está ejecutando, selecciona otro programa para
ejecutar, restaura el estado del programa seleccionado, ejecuta el programa seleccionado.

Estados de un proceso: Es la situación en la que este se encuentra dentro del sistema.


Cuando se produce un suceso que altera las condiciones del sistema puede modificar el
estado de uno o varios procesos, a esto se lo llama evento y a la modificación del estado
se lo llama transición de estado.

Ejecutando: El proceso está actualmente en ejecución. Para este capítulo asumimos que el
computador tiene un único procesador, de forma que sólo un proceso puede estar en este
estado en un instante determinado.
Listo: Un proceso que se prepara para ejecutar cuando tenga oportunidad.
Bloqueado. Un proceso que no puede ejecutar hasta que se cumpla un evento determinado o
se complete una operación E/S.
Nuevo: Un proceso que se acaba de crear y que aún no ha sido admitido en el grupo de
procesos ejecutables por el SO. Típicamente, se trata de un nuevo proceso que no ha sido
cargado en memoria principal, aunque su bloque de control de proceso (BCP) si ha sido
creado.
Saliente: Un proceso que ha sido liberado del grupo de procesos ejecutables por el SO,
debido a que ha sido detenido o que ha sido abortado por alguna razón.

Procesos suspendidos: Podemos analizar el concepto de procesos suspendidos como los


procesos que no se encuentran en memoria principal, que cumple las
siguientes características: el proceso no está inmediatamente disponible para su
ejecución, el proceso puede estar o no a la espera de un evento, si es así, la condición
de bloqueo es independiente de la condición estar suspendido, y si sucede el evento que
lo bloquea, eso no habilita al proceso para su ejecución inmediata, el proceso fue puesto
en estado suspendido por un agente: bien el proceso mismo, el proceso padre o el SO, con
el propósito de prevenir su ejecución, el proceso no puede ser recuperado de este estado
hasta que el agente explícitamente así lo indique.

Planificación: El planificador (scheduler) del SO decide qué algoritmo de planificación


utilizar (SJF, prioridades, Round Robin). Los algoritmos de planificación se utilizan
cuando hay 2 o más procesos listos para su ejecución.

Colas de planificación: El SO usa una serie de colas para planificar los recursos. Estas
pueden ser: cola de trabajos (procesos de almacenamiento secundario esperando memoria
principal), cola de procesos listos (procesos en memoria, listos y esperando su
ejecución), cola de dispositivos (para cada dispositivo hay una cola de procesos
esperando utilizarlo).

Funciones del planificador de procesos: llevar control del estado de cada proceso,
decidir qué proceso usa el procesador y durante cuánto tiempo, para ello emplea un cierto
criterio en base al cual tomar las decisiones, asignar el procesador al proceso, quitar
el procesador al proceso.

Tipos de planificación:
Largo plazo: cuando se crea un proceso se puede decidir alguno de los criterios para su
planificación, como por ejemplo la prioridad o quantum (tiempo máximo que se permite a un
proceso el uso del procesador).
Corto plazo: cada vez que un proceso abandona la CPU, toma la decisión de qué proceso
planificar en función de la política de planificación establecida y del valor de los
parámetros planificados.
Mediano plazo: otras partes del sistema operativo pueden intervenir en la planificación
de forma indirecta (al sacar un proceso de memoria, etc hace que este no sea planificable

Evaluación de rendimiento de planificación:


Equidad: procesan la CPU de forma equitativa.
Eficiencia: utilización del CPU al 100%.
Tiempo de Retorno/Finalización/Ejecución: tiempo que tarda en ejecutarse un proceso en
concreto.
Tiempo de respuesta: minimizar el tiempo de atención para usuarios interactivos.
Tiempo de espera: tiempo que un proceso espera en cola de procesos listos.
Rendimiento (productividad): número de trabajos procesados por unidad de tiempo.

Tipos de planificación:
No apropiativo: el proceso en ejecución conserva el uso de la CPU mientras lo desee.
Ejemplo: FCFS, SJF y prioridades.
Apropiativo: el SO puede expulsar a un proceso de la CPU. Ejemplo: prioridades, SRTF y
Round Robin

FCFS (First come, first served): El primer proceso que entró en la cola de procesos
listos es el primero al que se le asigna CPU Se implementa con una cola FIFO (first in,
first out). Es un algoritmo del tipo ejecución hasta terminación. Sensible al orden de
llegada de los procesos.

SJF (Short Job First): Primero el trabajo corto. Se asocia a cada proceso la longitud de
su siguiente ráfaga de CPU. Si CPU disponible se le asigna al proceso de menor longitud
de ráfaga, si hay 2 con igual longitud de ráfaga se usa FCFS. Solamente se puede aplicar
si se conoce de antemano la duración de cada trabajo. Posibilidad de inanición si
continuamente llegan trabajos cortos, los trabajos largos nunca llegan a ejecutarse.

SRTF (Shortest Remaining Time First): Primero el menor tiempo restante. El planificador
siempre escoge el proceso que tiene el menor tiempo de ejecución restante esperado. El
planificador podría expulsar al proceso actual cuando llega un nuevo proceso con menor
ráfaga. El planificador debe tener una estimación del tiempo de proceso para realizar la
función seleccionada, y existe riesgo de inanición para los procesos más largos.
Prioridades: Se asigna una prioridad a cada proceso. El de menor prioridad se ejecuta en
CPU, si hay 2 procesos de igual prioridad se utiliza FCFS. Se asigna números a la
prioridad

Round Robin: Adecuado para implementar tiempo compartido. Corresponde a FCFS con
expropiación. Cada proceso tiene un quantum de tiempo máximo. Si cuando expira el quantum
de tiempo el proceso continúa en CPU, el planificador lo desaloja y lo ingresa al final
de la cola de listos. Un proceso puede abandonar la CPU libremente (si ráfaga de CPU
quantum) o después de interrupción (si ráfaga de CPU quantum).

Requisitos de la gestión de memoria:


Reubicación: La memoria principal disponible se comparte generalmente entre varios
procesos, por lo que es bueno poder intercambiar los procesos en la memoria principal
para maximizar la utilización del procesador proporcionando un gran número de procesos
para la ejecución. Una vez que un programa se lleva a la memoria secundaria (disco),
sería bastante limitante colocarlo en la misma región de memoria principal donde se
hallaba anteriormente, cuando éste se trae de nuevo a memoria. Podría ser necesario
reubicar el proceso en un área de memoria diferente.
Protección: Cada proceso debe protegerse contra interferencias no deseadas por parte de
otros procesos, sean accidentales o intencionados. Por tanto, los programas de otros
procesos no deben ser capaces de referenciar sin permiso posiciones de memoria de un
proceso, tanto en modo lectura como escritura. Normalmente, un proceso de usuario no
puede acceder a cualquier porción del sistema operativo, ni al código ni a los datos, es
decir, un programa de un proceso no puede saltar a una instrucción de otro proceso. El
procesador debe ser capaz de abortar tales instrucciones en el punto de ejecución.
Compartición: Cualquier mecanismo de protección debe tener la flexibilidad de permitir a
varios procesos acceder a la misma porción de memoria principal. Procesos que estén
cooperando en la misma tarea podrían necesitar compartir el acceso a la misma estructura
de datos. Por tanto, el sistema de gestión de la memoria debe permitir el acceso
controlado a áreas de memoria compartidas sin comprometer la protección esencial.
Organización lógica: La memoria del computador se organiza como un espacio de
almacenamiento lineal o unidimensional, compuesto por una secuencia de bytes o palabras.
A nivel físico la memoria secundaria está organizada de manera similar. Esta organización
no se corresponde a la forma en la cual los programas se construyen normalmente. La
mayoría de los programas se construyen en módulos. Si el SO y el hardware del computador
pueden tratar de forma efectiva los programas y los datos en la forma de módulo, entonces
se logran varias ventajas: los módulos se pueden escribir y compilar independientemente;
con una sobrecarga adicional modesta, se puede proporcionar diferentes grados de
protección a los módulos (sólo lectura, sólo ejecución); es posible introducir mecanismos
por los cuales los módulos se pueden compartir entre los procesos. La ventaja de
proporcionar compartición a nivel de módulo es que se corresponde con la forma en la que
el usuario ve el problema. La herramienta que más adecuadamente satisface estos
requisitos es la segmentación.
Organización física: La memoria del computador se divide en al menos dos niveles: memoria
principal y memoria secundaria. La memoria principal proporciona un acceso rápido a un
coste relativamente alto. Además la memoria principal es volátil, es decir, no
proporciona almacenamiento permanente. La memoria secundaria es más lenta y más barata
que la memoria principal y generalmente no es volátil. La memoria secundaria de larga
capacidad puede proporcionar almacenamiento para programas y datos a largo plazo,
mientras que una memoria principal más pequeñas contiene programación y datos actualmente
en uso. La organización del flujo de información entre la memoria principal y secundaria
supone una de las preocupaciones principales del sistema. La responsabilidad para este
flujo podría asignarse a cada programador en particular, pero no es practicable o
deseable por dos motivos. El primero es que la memoria principal disponible para un
programa más sus datos podría ser insuficiente. En este caso, el programador debería
utilizar una técnica conocida como superposición overlaying), en la cual los datos y
programas se organizan de tal forma que se puede asignar la misma región de memoria a
varios módulos, con un programa principal responsable para intercambiar los módulos entre
disco y memoria según las necesidades. Esto malgasta el tiempo del programador. Y el
segundo es que en un entorno multiprogramado, el programador no conoce en tiempo de
codificación cuánto espacio estará disponible o dónde se localizará dicho espacio. Por lo
tanto, está claro que la tarea de mover la información entre los dos niveles, debería ser
responsabilidad del sistema.

Particionamiento de la memoria:
La operación principal de la gestión de la memoria es traer los procesos a la memoria
principal para que el procesador los pueda ejecutar. En casi todos los sistemas
multiprogramados modernos, esto implica el uso de un esquema sofisticado denominado
memoria virtual. Dicha memoria se basa en una o ambas de las siguientes técnicas básicas:
segmentación y paginación. Antes de ver éstas técnicas, veremos algunas más sencillas
que no utilizan memoria virtual, ellas son particionamiento, ahora obsoleto ý paginación
simple y segmentación simple.

Particionamiento fijo:
En la mayoría de los esquemas para la gestión de la memoria, se puede asumir que el
sistema operativo ocupa alguna porción fija de la memoria principal y que el resto de la
memoria principal está disponible para múltiples procesos. El esquema más simple para
gestionar la memoria disponible es repartirla en regiones con límites fijos.
Veremos dos alternativas. Una posibilidad consiste en hacer uso de particiones del mismo
tamaño. Cualquier proceso cuyo tamaño sea menor o igual que el tamaño de la partición
puede cargarse en cualquier partición disponible. Si todas las particiones están llenas y
no hay ningún proceso en estado Listo o Ejecutando, el S.O. puede mandar a swap a un
proceso de cualquiera de las particiones y cargar otro proceso. Existen dos dificultades
con el uso de las particiones fijas del mismo tamaño.
Existen dos dificultades con el uso de las particiones fijas del mismo tamaño. La primera
es que un programa podría ser demasiado grande para caber en una partición. En este caso,
el programador debe diseñar el programa con el uso de overlays , de forma que solo se
necesite una porción del programa en memoria principal en un momento dado. Cuando se
necesita un módulo que no está presente, el programa debe cargar dicho módulo en la
partición del programa, superponiendo a cualquier programa o datos que haya allí. Y la
segunda es que la utilización de la memoria principal es extremadamente ineficiente.
Cualquier programa ocupa una partición entera. Por ejemplo, podría haber un programa cuya
longitud sea 2Mb, como tratamos de particiones fijas ocuparía una partición de, en este
caso, 8Mb. Se puede observar que hay espacio interno malgastado, debido a que el bloque
de datos cargado es menor que la partición. Este fenómeno se conoce como fragmentación
interna.
Ambos problemas se pueden mejorar, aunque no resolver, utilizando particionamiento de
tamaños diferentes. Siguiendo este ejemplo, un programa de 16 Mb se puede acomodar sin
overlays Las particiones más pequeñas de 8 Mb permiten que los programas más pequeños se
puedan acomodar disminuyendo la fragmentación interna.
Con particiones del mismo tamaño , la ubicación de los procesos en memoria es trivial. En
cuanto haya una partición disponible, un proceso se carga en dicha partición. Si todas
las particiones se encuentran ocupadas por procesos que no están listos para ejecutar,
uno de ellos es llevado al disco para dejar espacio para un nuevo proceso. ¿Cuál de los
procesos es el que se lleva a disco? Es una decisión del planificador.
Con particionamiento de diferente tamaño, hay dos formas posibles de asignar los procesos
a las particiones. La forma más sencilla es asignar cada proceso a la partición más
pequeña en la cual cabe. En este caso, se necesita una cola de planificación para cada
partición que mantenga los procesos en disco destinados a dicha partición. La ventaja de
esta técnica es que los procesos siempre se asignan de tal forma que se minimiza la
fragmentación interna. Aunque esta técnica parece óptima desde el punto de vista de una
partición individual, no es óptima desde el punto de vista del sistema completo. Por
ejemplo, si se considera un caso en el que no hay procesos con un tamaño entre 12 y 16
Mb, la partición de 16 Mb quedará sin utilizarse. Una técnica óptima sería emplear una
única cola para todos los procesos. En el momento de cargar un proceso a la memoria
principal, se selecciona la partición más pequeña disponible para albergar dicho proceso.
Si todas las particiones están ocupadas, se debe llevar a cabo una decisión para enviar a
swap a algún proceso.
El uso de particiones de distinto tamaño proporciona un grado de flexibilidad frente a
las particiones fijas. Se podría decir que los esquemas de particiones fijas son
relativamente sencillos y requieren un soporte mínimo por parte del sistema operativo.
Sin embargo tiene una serie de desventajas, como que el número de particiones
especificadas en tiempo de generación del sistema limita el número de procesos activos
del sistema.; o como que debido a que los tamaños de las particiones son preestablecidos
en tiempo de generación del sistema, puede ser eficiente en entornos donde el requisito
de almacenamiento principal de los trabajos es conocido de antemano. Pero eso no ocurre
en la mayoría de los casos.

Particionamiento dinámico:
Las particiones son de longitud y número variable. Cuando un proceso llega a la memoria
principal, se le asigna exactamente tanta memoria como memoria como requiera y no más.
Un ejemplo: Inicialmente, la memoria principal está vacía excepto por el SO. Los primeros
3 procesos se cargan justo donde el SO finaliza y ocupando el espacio justo. Esto deja un
hueco al final demasiado pequeño para un cuarto proceso. En algún momento, ninguno de los
procesos que se encuentra en memoria está disponible. El SO lleva el proceso 2 al disco,
lo que deja suficiente espacio para cargar un nuevo proceso. Se carga en memoria
principal el proceso 4, debido a que es más pequeño que el proceso 2, se crea otro
pequeño hueco. Posteriormente se alcanza un punto donde ninguno de los procesos de la
memoria principal está listo, pero el proceso 2, en estado suspendido-listo, está
disponible. Porque no hay espacio suficiente para el proceso 2, el SO lleva a disco el
proceso 1. Se lleva a memoria principal el proceso 2. Como podemos ver, el método
comienza correctamente, pero finalmente lleva a una situación en la cual existen muchos
huecos pequeños en la memoria.
A medida que pasa el tiempo, la memoria se fragmenta cada vez más y la utilización de la
memoria decrementa. Este fenómeno se lo conoce como fragmentación externa, indicando que
la memoria que es externa a todas las particiones se fragmenta de forma incremental. Una
técnica para eliminar la fragmentación externa es la compactación: de vez en cuando, el
SO desplaza los procesos en memoria, de forma que se encuentren contiguos y, de este
modo, toda la memoria libre se encontrará unida en un bloque.
Debido a que la compactación de memoria consume una gran cantidad de tiempo, el diseñador
del S.O. debe ser inteligente a la hora de decidir cómo asignar la memoria a los
procesos. Existen cuatro algoritmos de colocación que pueden considerarse: mejor ajuste
(escoge el bloque más cercano en tamaño a la petición), primer ajuste (comienza a
analizar la memoria desde el principio y escoge el primer bloque disponible que sea
suficientemente grande), siguiente ajuste (comienza a analizar la memoria desde la última
colocación y elige el siguiente bloque disponible que sea suficientemente grande), y peor
ajuste (escoge el mayor bloque de memoria libre para un proceso).

Paginación simple:
Tanto las particiones de tamaño fijo como variable son ineficientes en el uso de la
memoria. Los primeros provocan fragmentación interna y los últimos fragmentación externa.
Supongamos, que la memoria principal se divide en porciones de tamaño fijo relativamente
pequeños, y que cada proceso también se divide en porciones pequeñas del mismo tamaño
fijo. Dichas porciones del procesos, conocidas como páginas , se les asigna porciones
disponibles de memoria, conocidas como marcos o marcos de página.
Supongamos un sistema con 15 marcos del mismo tamaño. El SO mantiene una lista de marcos
libres. El proceso A, almacenado en disco está formado por cuatro páginas. En el momento
de cargar este proceso, el SO encuentra cuatro marcos libres y carga las cuatro páginas
del proceso A. El proceso B formado por tres páginas y el proceso C formado por cuatro,
se cargan a continuación. En un instante el proceso B se suspende y deja la memoria
principal. El sistema necesita traer a un nuevo proceso, el proceso D que está formado
por 5 páginas. Si vemos este ejemplo no hay 5 marcos contiguos
disponibles. ¿Significa que el S.O. no pueda cargar el proceso D? No, porque se puede
utilizar el concepto de dirección lógica.
El SO mantiene una tabla de páginas por cada proceso. La tabla de páginas muestra la
ubicación del marco por cada página del proceso. Dentro del proceso, cada dirección
lógica está formada por un número de página y un desplazamiento dentro de la página. Con
paginación, la traducción de direcciones lógicas a físicas las realiza el hardware del
procesador. Por lo tanto, presentando una dirección lógica (n de página, desplazamiento),
el procesador utiliza la tabla de páginas para producir una dirección física (n de marco,
desplazamiento).
Vemos que la paginación simple, es similar al particionamiento fijo. Las diferencias son
que, con la paginación. Las particiones son bastante pequeñas y un programa podría ocupar
más de una partición y no necesariamente contiguas.
En resumen, con paginación simple la memoria principal se divide en muchos marcos
pequeños de igual tamaño; cada proceso se divide en páginas de igual tamaño; procesos
pequeños requieren menos páginas; procesos mayores requieren más páginas; cuando un
proceso se trae a la memoria, todas sus páginas se cargan en los marcos disponibles, y se
establece una tabla de páginas; y esta técnica resuelve muchos de los problemas
inherentes en el particionamiento.
Por ejemplo, sea un sistema de 12 bits con paginación simple, donde 4 bits están
destinados para cantidad de páginas y 8 bits para desplazamiento. Teniendo un proceso con
7 páginas y la siguiente tabla de páginas, calcular la dirección física a partir de la
relativa 321.
Esquema de paginación simple de 12 bits, de los cuales 4 indican la cantidad máxima de
páginas por proceso (2^4=16). Quedan 8 bits para el desplazamiento máximo dentro de la
página o marco (2^8=256), que corresponde al tamaño. Realizamos una división entera para
obtener el n de página y desplazamiento (321/256=1*256+65) donde el cociente indica el n
de página y el resto el desplazamiento. En este caso n de página es 1 y el desplazamiento
65. Con la tabla de página se obtiene el marco y luego se realiza la siguiente operación:
n de marco * tamaño de marco + desplazamiento (7*256+65=1857) (dirección física
relativa).
Otro ejemplo, en binario.

Segmentación simple:
Un programa de usuario se puede subdividir utilizando segmentación, en la cual el
programa y sus datos asociados se dividen en un número de segmentos. No se requiere que
todos los programas sean de la misma longitud, aunque hay una longitud máxima de
segmento. Al igual que la paginación, una dirección lógica está compuesta por dos partes,
en este caso, un n de segmento y un desplazamiento.
Debido al uso de segmentos de distintos tamaños, la segmentación es similar al
particionamiento dinámico. Aunque la diferencia comparada con éste último, es que con la
segmentación podría ocupar más de una partición, y éstas no necesitan ser contiguas.
Elimina la fragmentación interna, aunque sufre de externa, pero debido a que el proceso
se divide en varias piezas más pequeñas, la fragmentación externa es mucho menor.
También tenemos una tabla de segmentos, pero a diferencia que en paginación, la tabla
contiene una entrada más que corresponde a la longitud
o tamaño del segmento. Al realizar las traducciones de memoria lógica a física, hay que
tener en cuenta que el desplazamiento no supere la longitud máxima del segmento, ya que
en ese caso no sería una dirección válida.
Por ejemplo, sea un sistema de 14 bits con segmentación, donde 4 bits son para segmentos
y 10 bits para el tamaño del segmento y desplazamiento dentro de él. Teniendo un proceso
con 5 segmentos y la siguiente tabla de segmentos, calcular la dirección física a partir
de la relativa (3, 875).

Dirección lógica (3, 875) dónde el n de segmento en binario corresponde al 0011 (primeros
4 bits), revisamos la tabla dada anteriormente y obtenemos la longitud 1111101000
(últimos 10 bits) y la memoria base 00101101111010 (14 bits). Como para obtener la
dirección física es necesario sumar el desplazamiento con la memoria base, entonces
realizamos la suma 00101101111010+1101101011=00111011100101.
Otro ejemplo, en binario.

Memoria virtual:
Comparando la paginación simple y la segmentación simple, tenemos una distinción entre
particionamiento estático y dinámico, además tenemos los fundamentos iniciales de la
gestión de memoria. Las características tanto de la paginación como la segmentación que
son claves para este inicio son: todas las referencias a la memoria dentro de un proceso
se realiza a direcciones lógicas, que se traducen dinámicamente a direcciones físicas
durante la ejecución; y un proceso puede dividirse en varias porciones (páginas o
segmentos) y estas porciones no tiene que estar localizadas en memoria de forma continua
durante la ejecución.
Si las dos características anteriores se dan, entonces es necesario que todas las páginas
o todos los segmentos de un proceso se encuentren en la memoria principal durante la
ejecución. Si la porción (segmento o página) en la que se encuentra la siguiente
instrucción a buscar está y si la porción donde se encuentra la siguiente dirección de
datos que se va a acceder también está, entonces al menos la siguiente instrucción se
podrá ejecutar.
Supongamos que se tiene que traer un nuevo proceso de memoria. El SO comienza trayendo
únicamente una o dos porciones. Que incluye la porción inicial del programa y la porción
inicial de datos sobre la cual acceden las primeras instrucciones. Esta parte del proceso
que se encuentra en memoria principal se denomina conjunto residente del proceso. Cuando
el proceso se está ejecutando, las cosas ocurren de forma suave mientras que todas las
referencias a la memoria se encuentren dentro del conjunto residente. Usando una tabla de
páginas o segmentos, el procesador siempre es capaz de determinar si esto es así.
Si el procesador encuentra una dirección lógica que no se encuentra en la memoria
principal, generará una interrupción indicando un fallo de acceso a la memoria. El SO
coloca al proceso interrumpido en estado bloqueado y toma el control. Para que la
ejecución del proceso pueda reanudarse más adelante, el SO necesita traer a memoria
principal la memoria del proceso que contiene la dirección lógica que ha causado el fallo
de acceso. Para eso, el SO realiza una petición de E/S al disco, luego el SO puede
activar otro proceso para que se ejecute mientras el disco realiza la operación de
lectura. Una vez que la porción solicitada se ha traído a la memoria principal, una nueva
interrupción de E/S se lanza, dando el control al SO que coloca al proceso afectado en
estado listo.
Aunque se puede cuestionar la eficiencia de realizar esta tarea, ya que el proceso
necesita ser interrumpido, veremos dos implicaciones que justifican el uso de este
sistema: pueden mantenerse un mayor número de procesos en memoria principal; y un proceso
puede ser mayor que toda la memoria principal. Debido a que un proceso se ejecuta sólo en
memoria principal, esta memoria se denomina memoria real. El programador o usuario
perciben una memoria potencialmente mucho más grande (la cual se encuentra en disco).
Esta última se denomina memoria virtual.
El término memoria virtual se asocia habitualmente con sistemas que emplean paginación, a
pesar de que la memoria virtual basada en segmentación también se utiliza. Cuando vimos
paginación simple, indicamos que cada proceso dispone de su propia tabla de páginas, y
que todas las páginas se encuentran localizadas en memoria principal. Cada entrada en la
tabla consiste en un número de marco de la correspondiente página. Para la memoria
virtual basada en paginación, también se necesita una tabla de páginas, aunque es un poco
más compleja.
Debido a que sólo algunas páginas se encuentran en memoria principal, se necesita que
cada entrada en la tabla de páginas indique si la correspondiente página está presente
(P) en memoria principal. Además, la entrada de la tabla de páginas incluye un bit de
modificado (M), que indica si los contenidos de la correspondiente página han sido
alterados desde que la página se cargó por última vez en la memoria principal.

La segmentación permite al programador ver la memoria como si se tratase de diferentes


espacios de direcciones o segmentos. Esta organización tiene un gran número de ventajas
para el programador sobre los espacios de direcciones no segmentados: simplifica el
tratamiento de estructuras de datos que puedan crecer, con memoria virtual segmentada, a
una estructura de dato se le puede asignar su propio segmento, y el SO expandirá y
reducirá el segmento bajo demanda; permite programas que se modifican o recopilan de
forma independiente; da soporte a la compartición entre procesos; y soporta mecanismos de
protección.
En segmentación simple, indicamos que cada proceso tiene su propia tabla de segmentos.
Cada entrada en la tabla contiene la dirección de comienzo del correspondiente segmento
en la memoria principal, así como la longitud del mismo. En el caso de memoria virtual
basada en segmentación, son un poco más complejas. Debido a que sólo algunos de los
segmentos del proceso pueden encontrarse en la memoria principal, se necesita un bit para
cada entrada de la tabla para indicar si el correspondiente segmento se encuentra
presente en la memoria principal. Otro bit de control es el bit modificado, que tiene la
misma funcionalidad que en la tabla de páginas.

Paginación y segmentación, cada una tiene sus propias ventajas. La paginación es


transparente al programador y elimina la fragmentación externa, y por lo tanto
proporciona un uso eficiente de la memoria principal. La segmentación sí es visible al
programador y tiene la capacidad de manejar estructuras de datos que crecen, modularidad
y dar soporte a la compartición y a la protección. Para combinar las ventajas de ambos,
algunos sistemas por medio del hardware del procesador y del soporte del SO son capaces
de proporcionar ambos.
En un sistema combinado de segmentación /paginación, el espacio de direcciones del
usuario se divide en un número de segmentos. Cada segmento es dividido en un número de
páginas de tamaño fijo, que son del tamaño de los marcos de la memoria principal. Desde
el punto de vista del programador, una dirección lógica sigue conteniendo un número de
segmento y un desplazamiento dentro del segmento. Desde el punto de vista del sistema, el
desplazamiento dentro del segmento es visto como un número de página y un desplazamiento
dentro de la página incluida en el segmento.

También podría gustarte