43 Arquitectura y programación de ordenadores

3 SISTEMAS OPERATIVOS

3.1 PROCESOS El término proceso fue acuñado por primera vez por los diseñadores de Multics (1960), y se han dado muchas definiciones, entre las que cabe destacar las siguientes: 1. Un programa en ejecución. 2. Entidad que puede ser asignada al procesador y ejecutada por él. 3. Unidad de actividad caracterizada por un sencillo tratamiento de ejecución secuencial, un estado actual, y asociada a un conjunto de recursos del sistema. Este concepto surge como consecuencia de los problemas que surgieron del desarrollo de los propios sistemas operativos, como son la multiprogramación, el tiempo compartido y las transacciones en tiempo real. Una de las herramientas principales de las que disponían los programadores de sistemas para evitar los conflictos anteriores, fue la interrupción. Con interrupción, la actividad de cualquier trabajo puede suspenderse por un hecho determinado, como la culminación de una E/S. El procesador debe entonces salvar algún tipo de contexto ( por ejemplo, el contador de programa y otros registros) y bifurcar a una rutina de tratamiento de la interrupción, que

44 Arquitectura y programación de ordenadores

determina la naturaleza de esta, la procesa y después reanuda la ejecución del proceso de usuario en el trabajo interrumpido o en algún otro trabajo. Un sistema operativo capaz de controlar varias aplicaciones simultáneamente, con recursos compartidos y varios usuarios, puede dar lugar a conflictos, entre los que caben destacar los siguientes: Sincronización incorrecta: un diseño incorrecto del mecanismo de generación de señales puede dar como resultado la pérdida de señales o la recepción de señales duplicadas. Fallos de exclusión mutua: debe existir algún tipo de mecanismo de exclusión mutua que permita que sólo una rutina pueda realizar una transacción al mismo tiempo, sobre una determinada parte de los datos. Funcionamiento no determinista del programa: el orden en que se organiza la ejecución de varios programas puede influir en los resultados de un programa en particular, ya que estos pueden compartir memoria y sus ejecuciones se intercalan el procesador. Interbloqueos: es posible que dos o más programas están suspendidos a la espera uno del otro, debido a la aleatoriedad de la asignación y liberación de recursos compartidos. Para evitar estos problemas necesitamos supervisar y controlar los diferentes programas que puedan estar ejecutándose en el procesador. El concepto de proceso ofrece esta base, y se puede considerar esta formado por los siguientes componentes: Un programa ejecutable. Los datos asociados necesarios para el programa ( variables, espacio trabajo, buffers, etc...). El contexto de ejecución del programa o estado del proceso.

45 Arquitectura y programación de ordenadores

Este último elemento es esencial, pues incluye toda la información que el sistema operativo necesita para administrar el proceso y que el procesador necesita para ejecutarlo correctamente. El contexto incluye los contenidos de varios registros del procesador, tales como el contador de programa y los registros de datos. Además, en el contexto se guarda el estado de un proceso que ha sido temporalmente interrumpido . También incluye información de utilidad al sistema operativo, como la prioridad del proceso y si el proceso esta esperando la terminación de un suceso particular de E/S. A cada proceso se le asigna un bloque de memoria que contiene el programa, los datos y la información del contexto. Cada proceso también es registrado en una línea de procesos construida y guardada por el sistema operativo en la memoria principal. Esta lista contiene una entrada para cada proceso, la cual dispone de un puntero para la posición del bloque de memoria que contiene al proceso. Esta entrada también puede incluir parte o todo el contexto de ejecución del proceso. En el propio procesador se guardan valores relativos a los procesos que están teniendo lugar. Así , el registro índice del proceso contiene el índice, dentro de la lista de procesos, del proceso que está actualmente controlando al procesador. El contador de programa apunta a la siguiente instrucción del proceso que se ejecutará. Los registros base y límite definen la región de memoria ocupada por el proceso. El registro base contiene la dirección de comienzo de la región de memoria y el registro límite indica el tamaño de la región (en butes o palabras). Contador de programa y toda la referencias a datos se interpretan como relativas al registro base y no deben exceder el valor del registro límite. Esto impide las interferencias entre procesos. Un proceso puede estar ejecutándose o esperando su ejecución. Todo el estado del proceso en un instante determinado, está contenido en su contexto. Esta estructura permite el desarrollo de técnicas potentes, que aseguran la coordinación y la cooperación entre procesos. Se pueden diseñar e incorporar nuevas características al sistema operativo (por ejemplo , prioridades) mediante la ampliación del contexto para incluir cualquier nueva información que sea necesaria para dar soporte al nuevo atributo.

46 Arquitectura y programación de ordenadores

2

3.2 GESTIÓN DE MEMORIA

En un sistema monoprogramado, la memoria principal se divide en dos partes: una para el sistema operativo ( monitor residente, núcleo) y otra para el programa que se ejecuta en ese instante. En sistema multiprogramado, la parte de usuario de la memoria debe subdividirse aún más para hacer sitio a varios procesos. La tarea de subdivisión la lleva a cabo dinámicamente el sistema operativo y se conoce como gestión de memoria, repartiendo eficazmente la memoria, para introducir tantos procesos como sea posible. Se parte de la necesidad de que un programa esté cargado en la memoria principal para poder ser ejecutado. Para satisfacer estos requisitos, el sistema operativo debe cumplir las siguientes tareas:. Aislamiento del proceso: el sistema operativo debe procurar que cada proceso independiente no interfiera en los datos y la memoria de ningún otro. Asignación y gestión automáticas: el sistema operativo puede lograr eficiencia asignando memoria dinámicamente a los trabajos, según la vayan necesitando. Soporte para programación modular: El programa se ha de construir en módulos de tamaño variable para optimizar el uso de la memoria. Protección y control de acceso: el sistema operativo debe permitir que las secciones de memoria estén accesibles de diferentes maneras para los diversos usuarios, de manera que esto no amenaza de la integridad de los programas y del mismo sistema. Almacenamiento a largo plazo: muchos programas de aplicaciones necesitan ser almacenados en memoria después de apagar el computador.

47 Arquitectura y programación de ordenadores

Requisitos de la gestión de memoria Al realizar un estudio de los diversos mecanismos asociados con la gestión de memoria, es conveniente tener en cuenta los requisitos mínimos que se intentan satisfacer, como son la reubicación, la protección, compartición, organización lógica y organización física. La reubicación se refiere a la capacidad de traducir las referencias a la memoria encontradas en el código del programa, a las direcciones físicas reales que reflejen la posición actual del programa en la memoria principal Cada proceso debe protegerse contra interferencias no deseadas de otros procesos. Así pues, el código de un proceso no puede hacer referencia a posiciones de memoria de otros procesos, confines de lectura o escritura, sin permiso. Normalmente un proceso de usuario no puede acceder a ninguna parte del sistema operativo, ni programas ni datos.El programa de un proceso, normalmente, no puede bifurcarse hacia una instrucción de otro proceso. El procesador debe ser capaz de abortar estas instrucciones el momento de la ejecución. Es el procesador y no al sistema operativo, el que debe satisfacer las exigencias de protección de la memoria. Este es debido a que el sistema operativo no puede anticiparse a todas las referencias a la memoria que hará un programa. Cualquier mecanismo de protección que se implemente debe tener la flexibilidad de permitir el acceso de varios procesos a la misma zonal de memoria principal. El sistema de gestión de memoria debe, permitir accesos controlados a las áreas compartidas de la memoria sin comprometer la protección básica. De forma casi invariable la memoria principal de un sistema informático se organiza como un espacio de direcciones lineal o unidimensional, que consta de una secuencia de bytes o palabras. La memoria secundaria, físicamente, se organiza de forma similar. Si bien esta organización refleja fielmente el jaguar de la máquina, no se corresponde con la forma en la que los programas están construidos habitualmente. La mayoría de los programas se organizan en módulos, que pueden escribirse o compilarse independientemente, otorgando distinto grado

48 Arquitectura y programación de ordenadores

de protección a cada uno, siendo posible introducir mecanismos por medio de los cuales los procesos puedan compartir módulos. Este tipo de organización de la memoria es lógica, y la herramienta más utilizada es la segmentación. Organización física. La gestión de la memoria en sistema jerárquico, y el flujo información entre los diferentes niveles debe ser tarea de sistema operativo. Esta tarea es la esencia de la gestión de memoria. Partición de la memoria La tarea principal de sistema de gestión de memoria es cargar los programas en la memoria principal para su ejecución en el procesador. En casi todos los sistemas mulprogramados modernos, esta tarea requiere un sofisticado esquema llamado memoria virtual. La memoria virtual ésta, a su vez, basada en el uso de una de dos técnicas básicas: segmentación o paginación. Antes de ver estas técnicas de memoria virtual, consideraremos técnicas más simples que no requieren el uso de memoria virtual. Una de estas técnicas, la partición, se ha venido usando con distintas variantes en algunos sistemas operativos ahora obsoletos. Las otras dos técnicas, la paginación simple y la segmentación simple, se usan conjuntamente. No obstante, el estudio de la memoria virtual resultará más sencillo si se consideran en primer lugar estas dos técnicas sin tener en cuenta la memoria virtual. Particiones estáticas En la mayoría de los esquemas de gestión de memoria, se puede suponer que sistema operativo ocupa una parte fija de la memoria principal y que el resto de la memoria está disponible para ser usado por varios procesos. El esquema más sencillo de gestión de la memoria disponible es dividirla en regiones con límites fijos. Aquí nos encontramos con dos alternativas. Una posibilidad es emplear particiones de igual tamaño, pero esto plantea dos dificultades. Un programa puede ser demasiado grande para caber en la partición, en cuyo caso el programa debe dividirse en módulos, para que sólo una parte de este esté en la memoria principal en cada instante. El otro inconveniente se debe a que el uso de la memoria

49 Arquitectura y programación de ordenadores

principal es extremadamente ineficiente. Cualquier programa, sin importar lo pequeño que sea, ocupará una partición completa, produciendo fragmentación interna. Puedan reducirse, aunque no solventarse, ambos problemas por medio del empleo de particiones de distintos tamaños. El uso de la partición estática es casi nulo hoy día. Como ejemplo de un sistema operativo que empleaba esta técnica, se tiene un antiguo sistema operativo de grandes computadoras de IBM, el OS/MFT (multiprogramación con un número fijo de tareas) Con particiones del mismo tamaño la ubicación de un proceso en la memoria es trivial, con particiones de distintos tamaños, hay dos maneras posibles de asignar los procesos a las particiones. La forma más simple es asignar cada proceso a la partición más pequeña en la que quepa. En este caso hace falta una cola de planificación para cada partición, que albergue los procesos expulsados cuyo destino es dicha partición. La ventaja de este enfoque es que los procesos están siempre asignados de forma que se minimiza la memoria desaprovechada dentro de cada partición ( fragmentación interna). Sin embargo esta técnica no es óptima desde el punto de vista del sistema global, y una solución mejor sería emplear una única con la para todos los procesos. Cuando se va a cargar un proceso en la memoria principal, se selecciona de partición más pequeña disponible que pueda albergar al proceso. Si todas las particiones están ocupadas, se debe tomar una decisión de intercambio. Puede darse preferencia al intercambio de la partición más pequeña que pueda contener al proceso entrante. También es posible considerar otros factores, tales como prioridades y preferencia a descargar procesos bloqueados antes que procesos listos. Particiones dinámicas Con la partición dinámica, las particiones son variables en número y longitud. Cuando se carga un proceso en la memoria principal, se le asigna exactamente tanto memoria, necesita y no más. Este método comienza bien, pero, finalmente, desemboca en una situación en la que hay un gran número de huecos pequeños en la memoria. Conforme pasa tiempo, la memoria

50 Arquitectura y programación de ordenadores

comienza a estar más fragmentada y su rendimiento decae. Este fenómeno se denomina fragmentación externa y se refiere al hecho de que la memoria externa a todas las particiones se fragmenta cada vez más. Una técnica utilizada para evitar la fragmentación, es la compactación: de vez en cuando, el sistema operativo desplaza los procesos para estén contiguos, de forma que toda la memoria libre quede junta en un bloque. Los tres algoritmos ubicación que se utilizan en este tipo de particiones son el de mejor ajuste (best-fit), el primer ajuste (first-fit) y siguiente ajuste (next-fit). Todos ellos se limitan a elegir entre los bloques de memoria libres que son mayores o iguales que el proceso a cargar. El algoritmo de primer ajuste no sólo es el más sencillo, sino que normalmente es también el mejor y más rápida. El algoritmo del siguiente ajuste tiende a generar resultados algo peores que el anterior, pues lleva frecuentemente al asignación de bloques libres al final de la memoria, y hará falta una compactación más frecuente. Con el algoritmo del mejor ajuste, a pesar de su nombre, se obtienen los peores resultados, porque este algoritmos buscar el hueco más pequeño que cumple con los requisitos, garantizando que el fragmento que se deja es lo más pequeño posible. Aunque cada solicitud de memoria desperdicia siempre la menor cantidad de memoria, el resultado es que la memoria principal se llena rápidamente de bloques demasiado pequeños como para satisfacer la solicitudes de asignación de memoria. Así pues, se debe compactar más frecuentemente que con los otros algoritmos. Sistema de colegas Tanto los esquemas de partición estática como dinámica tienen inconvenientes. Los esquemas de partición estática limitan el número de procesos activos y pueden utilizar el espacio ineficientemente si hay poca concordancia entre los tamaños de las particiones disponibles y los tamaños de los procesos. Un esquema de partición dinámica es mucho más complejo de mantener e incluye la sobrecarga de compactar. Un equilibrio interesante es el sistema de colegas.

51 Arquitectura y programación de ordenadores

Para empezar, el espacio entero disponible para la asignación se trata como solo bloque de tamaño 2U, siendo este el máximo espacio disponible en la memoria principal. Si se hace una solicitud de tamaño s tal que 2U-1 < s