Documentos de Académico
Documentos de Profesional
Documentos de Cultura
I (PROGRAMA 2022)
1.1.Sistemas operativos
El sistema operativo es el principal programa que se ejecuta en toda computadora de
propósito general.
Está formado por 3 capas principales.
La capa más cercana al hardware es la que se denomina núcleo (kernel) y es la que
gestiona los recursos del hardware del sistema y la que suministra la funcionalidad básica
del Sistema Operativo. Esta capa ha de ejecutar en nivel núcleo, mientras que las otras
pueden ejecutar en niveles menos permisivos. La función del núcleo se centra en la
gestión de recursos como el CPU, tratamiento de interrupciones y las funciones básicas de
manipulación de memoria.
La capa de Servicios o Llamadas al Sistema ofrece a los programas unos servicios en
forma de una interfaz de programación. Desde el punto de vista, esta capa extiende la
funcionalidad de la computadora por lo que se suele decir que el S.O ofrece una máquina
virtual extendida a los programas. De esta forma se facilita la elaboración de estos, puesto
que se apoyan en las funciones que le suministra el S.O.
La capa de intérprete de mandatos o Shell suministra una interfaz a través de la cual el
usuario puede dialogar de forma interactiva con la computadora. El Shell recibe los
mandatos u órdenes de los usuarios, los interpreta y si puede los ejecuta. Dado que el
shell ejecuta en nivel de usuario algunos autores consideran que no forman parte del S.O.
1.1.Conceptos
Es difícil definir qué es un sistema operativo aparte de decir que es el software que se
ejecuta en modo kernel (además de que esto no siempre es cierto). Parte del problema es
que los sistemas operativos realizan dos funciones básicas que no están relacionadas:
proporcionar a los programadores de aplicaciones (y a los programas de aplicaciones,
naturalmente) un conjunto abstracto de recursos simples, en vez de los complejos
conjuntos de hardware; y administrar estos recursos de hardware. Dependiendo de quién
se esté hablando, el lector podría escuchar más acerca de una función o de la otra.
1.1.Objetivos
Un sistema operativo es un programa que controla la ejecución de los programas de
aplicación y que actúa como interfaz entre el usuario de un computador y el hardware de
esta. Puede considerarse que un sistema operativo tiene tres objetivos o lleva a cabo tres
funciones:
Comodidad: Un sistema operativo hace que un computador sea más cómodo de utilizar.
Eficiencia: Un sistema operativo permite que los recursos de un sistema informático se
aprovechen de una manera más eficiente.
Capacidad de evolución: Un sistema operativo debe construirse de modo que permita el
desarrollo efectivo, la verificación y la introducción de nuevas funciones en el sistema y, a
la vez, no interferir en los servicios que brinda
1.1.Funciones
- Gestión de los Recursos de la PC
- Ejecución de Servicios para los programas
- Ejecución de los mandatos de los usuarios
La ejecución de servicios para los programas es una función fundamental del sistema
operativo. Los servicios del sistema operativo son programas o rutinas que proporcionan
funcionalidades adicionales a las aplicaciones y a los usuarios, permitiéndoles realizar
tareas específicas o acceder a recursos del sistema de una manera más sencilla y
estandarizada.
El sistema operativo actúa como intermediario entre las aplicaciones y el hardware, y los
servicios que proporciona son esenciales para que los programas funcionen
correctamente y puedan realizar diversas tareas. Algunos ejemplos comunes de servicios
que proporciona el sistema operativo incluyen:
Servicios de entrada/salida: Permiten que las aplicaciones interactúen con dispositivos de
entrada y salida, como teclados, ratones, impresoras, pantallas, etc.
Servicios de red: Facilitan la comunicación entre aplicaciones y otros dispositivos a través
de la red, como la conexión a internet, la transferencia de datos entre computadoras, etc.
Servicios de gestión de archivos: Proporcionan a las aplicaciones la capacidad de crear,
leer, escribir y eliminar archivos en el sistema de almacenamiento.
Servicios de seguridad: Garantizan que las aplicaciones y usuarios tengan los permisos
adecuados para acceder a ciertos recursos y protegen el sistema contra amenazas y
accesos no autorizados.
Servicios de gestión de memoria: Administran la asignación de memoria a las aplicaciones
y se aseguran de que cada una tenga suficiente espacio y no interfieran entre sí.
Servicios de planificación de procesos: Deciden qué programas se ejecutan y cuándo,
asignando recursos de manera eficiente y equitativa.
Servicios de tiempo compartido: Permiten que múltiples usuarios compartan el sistema y
ejecuten sus programas de forma concurrente.
En resumen, los servicios del sistema operativo son esenciales para que los programas
puedan funcionar correctamente y aprovechar los recursos del hardware de manera
eficiente. El sistema operativo proporciona una interfaz y un conjunto de funciones
estándar que las aplicaciones pueden utilizar para realizar diversas tareas sin tener que
preocuparse por la complejidad del hardware subyacente. Esto hace que el desarrollo de
aplicaciones sea más sencillo y permite que los usuarios interactúen con la computadora
de manera más intuitiva y conveniente.
• El sistema operativo debe intercalar la ejecución de un conjunto de procesos para maximizar la utilización
del procesador ofreciendo a la vez un tiempo de respuesta razonable.
• El sistema operativo debe asignar los recursos a los procesos en conformidad con una política específica
(por ejemplo, ciertas funciones o aplicaciones son de prioridad más alta), evitando, al mismo tiempo, el
interbloqueo.
• El sistema operativo podría tener que dar soporte a la comunicación entre procesos y la creación de
procesos por parte del usuario, labores que pueden ser de ayuda en la estructuración de las aplicaciones.
Sistemas operativos monolíticos: Un sistema operativo de este tipo no tiene una estructura clara y bien
definida. Todos sus componentes se encuentran integrados en un único programa (el sistema operativo) que
ejecuta en un único espacio de direcciones. En este tipo de sistemas todas las funciones que ofrece el
sistema operativo se ejecutan en un modo núcleo. Estos sistemas operativos han surgido, normalmente, de
sistemas operativos sencillos y pequeños a los que se les ha ido añadiendo un número mayor de
funcionalidades. Esto les ha hecho evolucionar y crecer hasta convertirlos en programas grandes y
complejos formados por muchas funciones situadas todas ellas en un mismo nivel. Ejemplos claros de este
tipo de sistemas son MS-DOS y UNIX. Ambos comenzaron siendo pequeños sistemas operativos, que fueron
haciéndose cada vez más grandes debido a la gran popularidad que adquirieron. El problema que plantean
este tipo de sistemas radica en lo complicado que es modificar el sistema operativo para añadir nuevas
funcionalidades y servicios. En efecto, añadir una nueva característica al sistema operativo implica la
modificación de un gran programa, compuesto por miles de líneas de código fuente y funciones, cada una de
las cuales puede invocar a otras cuando así lo requiera. Además, en este tipo de sistemas no se sigue el
principio de ocultación de la información. Para solucionar este problema es necesario dotar de cierta
estructura al sistema operativo.
a) Sistemas por capa. En un sistema por capas, el sistema operativo se organiza como una jerarquía de
capas, donde cada capa ofrece una interfaz clara y bien definida a la capa superior y solamente utiliza
los servicios que le ofrece la capa inferior. La principal ventaja que ofrece este tipo de estructuras es la
modularidad y la ocultación de la información. Una capa no necesita conocer como se ha
implementado la capa sobre la que se construye, únicamente necesita conocer la interfaz que ofrece.
Esto facilita enormemente la depuración y verificación del sistema, puesto que las capas se pueden ir
construyendo y depurando por separado. Este enfoque lo utilizo por primera vez el sistema operativo
THE [Dijkstra, 1968], un sistema operativo sencillo que estaba formado por seis capas, como se muestra
en la Figura 2.6. Otro ejemplo de sistema operativo diseñado por capas es el OS/2 [Deitel, 1994],
descendiente de MS-DOS.
b) Modelo cliente-servidor En este tipo de modelo, el enfoque consiste en implementar la mayor parte de
los servicios y funciones del sistema operativo en procesos de usuario, dejando solo una pequeña parte del
sistema operativo ejecutando en modo núcleo. A esta parte se le denomina micronúcleo y a los procesos
que ejecutan el resto de funciones se les denomina servidores. La Figura 2.7 presenta la estructura de un
sistema operativo con estructura cliente-servidor, Como puede apreciarse en la figura, el sistema operativo
está formado por diversas partes, cada una de las cuales puede desarrollarse por separado. No hay una
definición clara de las funciones que debe llevar a cabo un micronúcleo. La mayoría incluyen la gestión de
interrupciones, gestión básica de procesos y de memoria y servicios básicos de comunicación entre
procesos. Para solicitar un servicio en este tipo de sistemas, como por ejemplo crear un proceso, el proceso
de usuario (proceso denominado cliente) solicita el servicio al servidor del sistema operativo
correspondiente, en este caso al servidor de procesos. A su vez, el proceso servidor puede requerir los
servicios de otros servidores, como es el caso del servidor de memoria. En este caso, el servidor de procesos
se convierte en cliente del servidor de memoria. La ventaja de este modelo es la gran flexibilidad que
presenta. Cada proceso servidor sólo ocupa de una funcionalidad concreta, lo que hace que cada parte
pueda ser pequeña y Esto a su vez facilita el desarrollo y depuración de cada uno de los procesos servidores.
En cuanto a las desventajas, citar que estos sistemas presentan una mayor sobrecarga en el tratamiento de
los servicios que los sistemas monolíticos. Esto se debe a que los distintos componentes de un sistema
operativo de este tipo ejecutan en espacios de direcciones distintos, lo que hace que su activación requiera
más tiempo.
1.3.Servicios del Sistema Operativo.
Un sistema operativo proporciona un entorno para la ejecución de programas. El sistema presta ciertos
servicios a los programas y a los usuarios de dichos programas. Por supuesto, los servicios específicos que se
suministran difieren de un sistema operativo a otro, pero podemos identificar perfectamente una serie de
clases comunes. Estos servicios del sistema operativo se proporcionan para comodidad del programador,
con el fin de facilitar la tarea de desarrollo. Un cierto conjunto de servicios del sistema operativo
proporciona funciones que resultan útiles al usuario:
Interfaz de usuario. Casi todos los sistemas operativos disponen de una interfaz de usuario (UI, user
interface), que puede tomar diferentes formas. Uno de los tipos existentes es la interfaz de línea de
comandos (CLI, command-line interface), que usa comandos de textos y algún tipo de método para
introducirlos, es decir, un programa que permite introducir y editar los comandos. Otro tipo
destacable es la interfaz de proceso por lotes, en la que los comandos y las directivas para controlar
dichos comandos se introducen en archivos, luego dichos archivos se ejecutan. Habitualmente, se
utiliza una interfaz gráfica de usuario (GUI, graphical user interface); en este caso, la interfaz es un
sistema de ventanas, con un dispositivo señalador para dirigir la E/S, para elegir opciones en los
menús y para realizar otras selecciones, y con un teclado para introducir texto. Algunos sistemas
proporcionan dos o tres de estas variantes.
Ejecución de programas. El sistema tiene que poder cargar un programa en memoria y ejecutar
dicho programa. Todo programa debe poder terminar su ejecución, de forma normal o anormal
(indicando un error).
Operaciones de E/S. Un programa en ejecución puede necesitar llevar a cabo operaciones de E/S,
dirigidas a un archivo o a un dispositivo de E/S. Para ciertos dispositivos específicos, puede ser
deseable disponer de funciones especiales, tales como grabar en una unidad de CD o DVD o borrar
una pantalla de TRC (tubo de rayos catódicos). Por cuestiones de eficiencia y protección, los
usuarios no pueden, normalmente, controlar de modo directo los dispositivos de E/S; por tanto, el
sistema operativo debe proporcionar medios para realizar la E/S.
Manipulación del sistema de archivos. El sistema de archivos tiene una importancia especial.
Obviamente, los programas necesitan leer y escribir en archivos y directorios. También necesitan
crearlos y borrarlos usando su nombre, realizar búsquedas en un determinado archivo o presentar
la información contenida en un archivo. Por último, algunos programas incluyen mecanismos de
gestión de permisos para conceder o denegar el acceso a los archivos o directorios basándose en
quién sea el propietario del archivo.
Detección de errores. El sistema operativo necesita detectar constantemente los posibles errores.
Estos errores pueden producirse en el hardware del procesador y de memoria (como, por ejemplo,
un error de memoria o un fallo de la alimentación) en un dispositivo de E/S (como un error de
paridad en una cinta, un fallo de conexión en una red o un problema de falta papel en la impresora)
o en los programas de usuario (como, por ejemplo, un desbordamiento aritmético, un intento de
acceso a una posición de memoria ilegal o un uso excesivo del tiempo de CPU). Para cada tipo de
error, el sistema operativo debe llevar a cabo la acción apropiada para asegurar un funcionamiento
correcto y coherente. Las facilidades de depuración pueden mejorar en gran medida la capacidad
de los usuarios y programadores para utilizar el sistema de manera eficiente.
Hay disponible otro conjunto de funciones del sistema de operativo que están pensadas para ayudar al
usuario, sino para garantizar la eficiencia del propio sistema. Los sistemas con múltiples usuarios
pueden ser más eficientes cuando se comparten los recursos del equipo entre los distintos usuarios:
Asignación de recursos. Cuando hay varios usuarios, o hay varios trabajos ejecutándose al mismo
tiempo, deben asignarse a cada uno de ellos los recursos necesarios. El sistema operativo gestiona
muchos tipos diferentes de recursos; algunos (como los ciclos de CPU, la memoria principal y el
espacio de almacenamiento de archivos) pueden disponer de código software especial que gestione
su asignación, mientras que otros (como los dispositivos de E/S) pueden tener código que gestione
de forma mucho más general su solicitud y liberación. Por ejemplo, para poder determinar cuál es
el mejor modo de usar la CPU el sistema operativo dispone de rutinas de planificación de la CPU
que tienen en cuenta la velocidad del procesador, los trabajos que tienen que ejecutarse, el
número de registros disponibles
Responsabilidad. Normalmente conviene hacer un seguimiento de qué usuarios emplean que clase
de recursos de la computadora y en qué cantidad. Este registro se puede usar para propósitos
contables (con el fin de poder facturar el gasto correspondiente a los usuarios) o simplemente para
acumular estadísticas de uso. Estas estadísticas pueden ser una herramienta valiosa para aquellos
investigadores que deseen el sistema con el fin de mejorar los servicios informáticos.
Intérprete de comandos
Algunos sistemas operativos incluyen el intérprete de comandos en el kernel. Otros, como Windows XP y
UNIX, tratan al intérprete de comandos como un programa especial que se ejecuta cuando se inicia un
trabajo o cuando un usuario inicia una sesión (en los sistemas interactivos). En los sistemas que disponen de
varios intérpretes de comandos entre los que elegir, los intérpretes se conocen como Shell. Por ejemplo, en
los sistemas UNIX y Linux, hay disponibles varias Shell diferentes entre las que un usuario puede elegir,
incluyendo la Shell Bourne, la Shell C, la Shell Bourne-Again, la Shell Korn, etc. La mayoría de las Shell
proporcionan funcionalidades similares, existiendo sólo algunas diferencias menores, casi todos los usuarios
seleccionan una Shell u otra basándose en sus preferencias personales. La función principal del intérprete de
comandos es obtener y ejecutar el siguiente comando especificado por el usuario. Muchos de los comandos
que se proporcionan en este nivel se utilizan para manipular archivos: creación, borrado, listado, impresión,
copia, ejecución, etc.; las Shell* de MS-DOS y UNIX operan de esta forma. Estos comandos pueden
implementarse de dos formas generales.
Uno de los métodos consiste en que el propio intérprete de comandos contiene el código que el comando
tiene que ejecutar. Por ejemplo, un comando para borrar un archivo puede hacer que el intérprete de
comandos salte a una sección de su código que configura los parámetros necesarios y realiza las apropiadas
llamadas al sistema. En este caso, el número de comandos que puede proporcionarse determina el tamaño
del intérprete de comandos, dado que cada comando requiere su propio código de implementación.
Un método alternativo, utilizado por UNIX y otros sistemas operativos, implementa la mayoría de los
comandos a través de una serie de programas del sistema. En este caso, el intérprete de comandos no
"entiende" el comando, sino que simplemente lo usa para identificar el archivo que hay que cargar en
memoria y ejecutar. Por tanto, el comando UNIX para borrar un archivo “rm file.txt” buscaría un archivo
llamado “rm“ , cargaría el archivo en memoria y lo ejecutaría, pasándole el parámetro file. txt. La función
asociada con el comando rm queda definida completamente mediante el código contenido en el archivo rm.
De esta forma, los programadores pueden añadir comandos al sistema fácilmente, creando nuevos archivos
con los nombres apropiados. El programa intérprete de comandos, que puede ser pequeño, no tiene que
modificarse en función de los nuevos comandos que se añadan.
Una segunda estrategia para interactuar con el sistema operativo es a través de una interfaz gráfica de
usuario (GUI) suficientemente amigable. En lugar de tener que introducir comandos directamente a través
de la línea de comandos, una GUI permite a los usuarios emplear un sistema de ventanas y menús
controlable mediante el ratón. Una GUI proporciona una especie de escritorio en el que el usuario mueve el
ratón para colocar su puntero sobre imágenes, o iconos, que se muestran en la pantalla (el escritorio) y que
representan programas, archivos. directorios y funciones del sistema. Dependiendo de la ubicación del
puntero, pulsar el botón del ratón puede invocar un programa, seleccionar un archivo o directorio (conocido
como carpeta) o desplegar un menú que contenga comandos ejecutables. las primeras interfaces gráficas de
usuario aparecieron debido, en parte, a las investigaciones realizadas en el departamento de investigación
de Xerox Parc a principios de los años 70. La primera GUI se incorporó en la computadora Xerox Alto en
1973. Sin embargo, las interfaces gráficas sólo se popularizaron con la introducción de las computadoras
Apple Macintosh en los años 80. La interfaz de usuario del sistema operativo de Macintosh (Mac OS) ha
sufrido diversos cambios a lo largo de los años, siendo el más significativo la adopción de la interfaz Aqua en
Mac OS X. La primera versión de Microsoft Windows (versión 1.0) estaba basada en una interfaz GUI que
permitía interactuar con el sistema operativo MS-DOS. Las distintas versiones de los sistemas Windows
proceden de esa versión inicial, a la que se le han aplicado cambios cosméticos en cuanto su apariencia y
diversas mejoras de funcionalidad, incluyendo el Explorador de Windows. Tradicionalmente, en los sistemas
UNIX han predominado las interfaces de línea de comandos, aunque hay disponibles varias interfaces GUI,
incluyendo el entorno de escritorio CDE (Common Desktop Environment) y los sistemas X-Windows, que son
muy habituales en las versiones comerciales de UNIX, como Solaris 0 el sistema AIX de IBM. Sin embargo,
también es necesario resaltar el desarrollo de diversas interfaces de tipo CUI en diferentes proyectos de
Código fuente abierto, como por ejemplo el entorno de escritorio KDE (K tx•sktop Environment) y el entorno
GNOME, que forma parte del proyecto GNU. Ambos entornos de escritorio, KDE y GNOME. se ejecutan
sobre Linux y otros varios sistemas UNIX, y están disponibles con licencias de código fuente abierto, 10 que
quiere decir que Su código fuente es del dominio público. La decisión de usar una interfaz de línea de
comandos o GUI es, principalmente, una opción personal. Por regla general, muchos usuarios de UNIX
prefieren una interfaz de línea de coman dos, ya que a menudo les proporciona interfaces de tipo Shell más
potentes. Por otro lado, la mayor parte de los usuarios de Windows se decantan por el uso del entorno GUI
de Windows y casi nunca emplean la interfaz de tipo Shell MS-DOS. Por el contrario, los diversos cambios
experimentados por los sistemas operativos de Macintosh proporcionan un interesante caso de estudio:
históricamente, Mac OS no proporcionaba una interfaz de línea de comandos, siendo obligatorio que los
usuarios interactuaran con el sistema operativo a través de la interfaz GUI; sin embargo, con el lanzamiento
de Mac OS X (que está parcialmente basado en un kernel CXIX). el sistema operativo proporciona ahora
tanto la nueva interfaz Aqua. como una interfaz de línea de comandos.
1.4.Llamadas a Sistemas.
Las llamadas al sistema proporcionan una interfaz con la que poder invocar servicios que el sistema
operativo ofrece. Estas llamadas, generalmente, están disponibles como rutinas escritas en C y C", aunque
determinadas tareas de bajo nivel, como por ejemplo aquéllas en las que se tiene que acceder al hardware,
pueden necesitar escribirse con lenguaje ensamblador
Antes de ver cómo pone un Sistema Operativo a nuestra disposición las llamadas al sistema. vamos a ver un
ejemplo para ilustrar cómo se usan llamadas: suponga que deseamos escribir un programa sencillo para leer
datos de un archivo y copiarlos en otro archivo, El primer dato de entrada que el programa va a necesitar
Son los nombres de los archivos, el de entrada y el de salida. Estos nombres pueden especificarse de muchas
maneras. dependiendo del diseño del sistema operativo; un método consiste en que el programa pida al
usuario que introduzca nombres de los dos archivos. En un sistema interactivo, este método requerirá una
secuencia de llamadas al sistema: primero hay que escribir un mensaje en el indicativo de comandos de la
pantalla y luego leer del teclado los caracteres que especifican los dos archivos En los sistemas basados en
iconos y en el uso de un ratón, habitualmente se suele presentar un menú de archivo en una ventana. El
usuario puede entonces usar el ratón para seleccionar el nombre del archivo de origen y puede abrirse otra
ventana para especificar el del archivo de destino. Esta secuencia requiere realizar numerosas llamadas al
sistema de E/S
Una vez que se han obtenido los nombres de los dos archivos. el programa debe abrir el archivo de entrada
y crear el archivo de salida. Cada una de estas requiere otra llamada al sistema. Asimismo, para cada
operación, existen posibles condiciones de error. Cuando el programa intenta abrir el archivo de entrada,
puede encontrarse con que no existe ningún archivo con ese nombre o que está protegido contra accesos.
En estos casos, el programa debe escribir un mensaje en la consola (otra secuencia de llamadas al sistema) y
terminar de forma anormal (otra llamada al sistema). Si el archivo de entrada existe, entonces se debe crear
un nuevo archivo de salida. En este caso, podemos encontrarnos con que ya existe un archivo de salida con
el nombre; esta situación puede hacer que el programa termine (una Llamada al sistema) o podemos borrar
el archivo existente (otra llamada al sistema) y crear otro (otra llamada más). En un sistema Interactivo, otra
posibilidad sería preguntar al usuario (a través de una secuencia de al sistema para mostrar mensajes en el
indicativo de comandos y leer las respuestas desde el terminal) si desea reemplazar el archivo existente o
terminar el programa.
Una vez que ambos archivos están definidos, hay que ejecutar un bucle que lea del archivo de entrada (una
llamada al sistema) y escriba en el archivo de salida (Otra llamada al sistema). Cada lectura y escritura
devolver información de estado relativa a las distintas condiciones posibles de error. En la entrada, el
programa puede encontrarse con que ha llegado al final del archivo o con que se ha producido un fallo de
hardware en la lectura (como por ejemplo un error de paridad) En la operación de escritura pueden
producirse varios errores, dependiendo del dispositivo de salida (espacio de disco insuficiente. la impresora
no tiene papel, etc.) Finalmente, después de que ha copiado el archivo completo, el programa cierra ambos
archivos (otra llamada al sistema), escribe un mensaje en la consola o ventana (más llamadas al sistema) y,
por último. termina normalmente (la última llamada al sistema). Como puede ver. incluso los programas
más sencillos pueden hacer un uso intensivo del sistema operativo. Frecuentemente, los sistemas ejecutan
miles de llamadas al sistema por segundo. Esta secuencia de llamadas al sistema se muestra en la Figura 2.1.
Sin embargo. lo mayoría de los programadores no ven este nivel de detalle. Normalmente. Desarrolladores
de aplicaciones diseñan sus programas utilizando una API (application programming interface, interfaz de
programación de aplicaciones). La API especifica un conjunto de funciones que el programador de
aplicaciones puede usar, indicándose los parámetros que hay que pasar a cada función y los valores de
retorno que el programador debe esperar. Tres de las API disponibles para programadores de aplicaciones
son la API Win32 para sistemas Windows, la API PCFIX para sistemas basados en POSIX (que incluye
prácticamente todas las versiones de UNIX, Linux y Mac OS X) y la API Java para diseñar programas que se
ejecuten sobre una máquina virtual de Java.
Observe que los nombres de las llamadas al sistema que usamos a lo largo del texto son ejemplos genéricos.
Cada sistema operativo tiene sus propios nombres de llamadas al sistema.
Entre bastidores, las funciones que conforman una API invocan, habitualmente, a las llamadas al sistema por
cuenta del programador de la aplicación. Por ejemplo, la función Create Process () de Win32 (que, como su
propio nombre indica, se emplea para crear un nuevo proceso) lo que hace, realmente, es invocar la llamada
al sistema NTCreateProcess() del kernel de Windows. ¿Por qué un programador de aplicaciones preferiría
usar una API en lugar de invocar las propias llamadas al sistema? Existen varias razones para que sea así.
Una ventaja de programar usando una API está relacionada con la portabilidad: un programador de
aplicaciones diseña un programa usando una API cuando quiere poder compilar y ejecutar su programa en
cualquier sistema que soporte la misma API (aunque, en la práctica, a menudo existen diferencias de
arquitectura que hacen que esto Sea más difícil de Io que parece). Además, a menudo resulta más difícil
trabajar con las propias llamadas al sistema y exige un grado mayor de detalle que usar las API que los
programadores de aplicaciones tienen a su disposición. De todos modos, existe una fuerte correlación entre
invocar una función de la API y Su llamada al sistema asociada disponible en el kernel. De hecho, muchas de
las API Win32 y IOSIX son similares a las llamadas al sistema nativas proporcionadas por los sistemas
operativos UNIX, Linux y Windows.
El sistema de soporte en tiempo de ejecución (un conjunto de funciones de biblioteca que suele incluirse
con los compiladores) de la mayoría de los lenguajes de programación proporciona una interfaz de llamadas
al sistema que Sirve como enlace Con las llamadas al sistema disponibles en el sistema operativo. La interfaz
de llamadas al sistema intercepta las llamadas a función dentro de las API e invoca la llamada al sistema
necesaria. Habitualmente, cada llamada al sistema tiene asociado un número y la interfaz de llamadas al
sistema mantiene una tabla indexada según dichos números. Usando esa tabla, la interfaz de llamadas al
sistema invoca la llamada necesaria del kernel del sistema operativo y devuelve el estado de la ejecución de
la llamada al sistema y los posibles valores de retorno.
Quien realiza la llamada no tiene por qué saber nada acerca de cómo se implementa dicha llamada al
sistema o qué es lo que ocurre durante la ejecución. Tan sólo necesita ajustarse a lo que la API específica y
entender lo que hará el sistema operativo como resultado de la ejecución de dicha llamada al sistema. Por
tanto, la API oculta al programador la mayor parte de los detalles de la interfaz del sistema operativo, los
cuales son gestionados por la biblioteca de soporte en tiempo de ejecución. Las relaciones entre una API, la
interfaz de llamadas al sistema y el sistema operativo se muestran en la Figura 2.3, que ilustra cómo
gestiona el sistema operativo una aplicación de usuario invocando la llamada al sistema open ).
Las llamadas al sistema se llevan a cabo de diferentes formas, dependiendo de la computadora que se
utilice. A menudo, se requiere más información que simplemente la identidad de la llamada al sistema
deseada. El tipo exacto y la cantidad de información necesaria varían según el sistema operativo y la llamada
concreta que se efectúe. Por ejemplo, para obtener un dato de entrada, podemos tener que especificar el
archivo o dispositivo que hay que utilizar como origen, así como la dirección y la longitud del búfer de
memoria en el que debe almacenarse dicho dato de entrada. Por supuesto, el dispositivo o archivo y la
longitud pueden estar implícitos en la llamada.
Para pasar parámetros al sistema operativo se emplean tres métodos generales. El más sencillo de ellos
consiste en pasar los parámetros en una serie de registros. Sin embargo, en algunos casos, puede haber más
parámetros que registros disponibles. En estos casos, generalmente, los parámetros se almacenan en un
bloque o tabla, en memoria, y la dirección del bloque se pasa como parámetro en un registro (Figura 2.4).
Éste es el método que utilizan Linux y Solaris. El programa también puede colocar, o insertar, los parámetros
en la pila y el sistema operativo se encargará de extraer de la pila esos parámetros. Algunos sistemas
operativos prefieren el método del bloque o el de la pila, porque no limitan el número o la longitud de los
parámetros que se quieren pasar.
Las llamadas al sistema comúnmente usan una instrucción especial de la CPU que causa que el procesador
transfiera el control a un código privilegiado (Generalmente es el núcleo) previamente especificado. Esto
permite al código privilegiado especificar donde va a ser conectado, así como el estado del procesador.
Cuando una llamada es invocada, la ejecución del programa que invoca es interrumpida y sus datos son
guardados normalmente en BCP (Bloque de control de procesos: es un registro especial donde el sistema
operativo agrupa toda la información que necesita conocer respecto a un proceso particular. Cada vez que
se crea un proceso el sistema operativo crea el BCP correspondiente para que sirva como descripción en
tiempo de ejecución durante toda la vida del proceso) para poder ejecutarse luego. El procesador entonces
comienza a ejecutar las instrucciones de código de alto nivel de privilegio para realizar la tarea requerida,
cuando esta finaliza se retorna al proceso original y continua su ejecución. EL retorno al proceso
demandante no es obligatoriamente, es inmediato, depende del tiempo de ejecución de la llamada al
sistema y del algoritmo de planificación del CPU.
Las llamadas al sistema pueden agruparse de forma muy general en cinco categorías principales control de
procesos, manipulación de archivos, manipulación de dispositivos, mantenimiento de información y
comunicaciones.
Control de procesos
terminar, abortar
cargar, ejecutar
crear terminar procesos
obtener atributos del proceso, definir atributos del proceso
esperar para obtener tiempo
esperar suceso, señalizar suceso
asignar y liberar memoria
Administración de archivos
Administración de dispositivos
Mantenimiento de información
Comunicaciones
Un sistema distribuido es una colección de procesadores conectados en red, la cual es imprescindible para
su funcionamiento. Estos procesadores no comparten memoria entre sí, en lugar de eso, cada procesador
tiene su propia memoria local. Desde el punto de vista de un procesador especifico en un sistema
distribuido, el resto de los procesadores y sus respectivos recursos son remotos, mientras que sus propios
recursos son locales.
Ventajas
Compartir recursos
Los usuarios de un host (servidor que provee servicios a otras computadoras) pueden disponer de los
recursos de los demas host. En general se ofrecen mecanismos para compartir archivos remotos, procesar
informacian en sistemas de bases de datos distribuidos, imprimir archivos en host remotos, usar equipos de
hardware especializados, etc.
Aumentar la velocidad
Confiabilidad
Si un host de un sistema distribuido falla el resto de los hosts pueden continuar funcionando. Si el sistema
esta compuesto por una cantidad de instalaciones autónomas (por ejemplo, computadoras de propósito
general) la falla de un host no afectara el resto, sin embargo si el sistema esta formado por pequeñas
maquinas y cada una de ellas tiene alguna responsabilidad crucial, una simple falla afectara la operación.
Para resolver esta situación debe tenerse suficiente redundancia de recursos (en hardware y datos).
La falla de un host debe detectarse por el sistema, el cual tendra que tomar una accion adecuada para
recuperarse de ella, entre las acciones esta ver si existe la posibilidad de que otro host se encargue de la
tarea de aquel que falla haciendo la oportuna transferencia de funciones.
Comunicación
Como los host están conectados entre si, pueden intercambiar información. La información se puede
transferir aun cuando los host están a distancias considerables.
Desventajas
La desventaja principal de los S.O.D. es que el software no obstante más compacto y disperso, tiene
una responsabilidad hasta cierto punto crítica; es complejo en términos de su diseño, implantación
y uso
Una vez que el sistema llega a depender de la red, la pérdida o saturación de ésta puede negar
algunas de las ventajas que el S.O.D. debía conseguir.
Los sistemas integrados (embedded), que también se conocen como incrustados o embebidos, operan en
las computadoras que controlan dispositivos que no se consideran generalmente como computadoras, ya
que no aceptan software instalado por el usuario.
Algunos ejemplos comunes son los hornos de microondas, las televisiones, los autos, los grabadores de
DVDs, los teléfonos celulares y los re- productores de MP3. La propiedad principal que diferencia a los
sistemas integrados de los dispositivos de bolsillo es la certeza de que nunca se podrá ejecutar software que
no sea confiable. No se pueden descargar nuevas aplicaciones en el horno de microondas; todo el software
se encuentra en ROM. Esto significa que no hay necesidad de protección en las aplicaciones lo cual conlleva
a cierta simplificación.
Sistemas operativos en tiempo real: Otro tipo de sistema operativo es el sistema en tiempo real. Estos
sistemas se caracterizan por tener el tiempo como un parámetro clave. Por ejemplo, en los sistemas de
control de procesos industriales, las computadoras en tiempo real tienen que recolectar datos acerca del
proceso de producción y utilizarlos para controlar las máquinas en la fábrica. A menudo hay tiempos de
entrega estrictos que se deben cumplir. Por ejemplo, si un auto se desplaza sobre una línea de ensamblaje,
deben llevarse a cabo ciertas acciones en determinados instantes. Si un robot soldador realiza su trabajo de
soldadura antes o después de tiempo, el auto se arruinará. Si la acción debe ocurrir sin excepción en cierto
momento (o dentro de cierto rango), tenemos un sistema en tiempo real duro. Muchos de estos sistemas se
encuentran en el control de procesos industriales, en aeronáutica, en la milicia y en áreas de aplicación
similares. Estos sistemas deben proveer garantías absolutas de que cierta acción ocurrirá en un instante
determinado. Otro tipo de sistema en tiempo real es el sistema en tiempo real suave , en el cual es
aceptable que muy ocasionalmente se pueda fallar a un tiempo predeterminado. Los sistemas de audio
digital o de multimedia están en esta categoría. Los teléfonos digitales también son ejemplos de sistema en
tiempo real suave. Como en los sistemas en tiempo real es crucial cumplir con tiempos predeterminados
para realizar una acción, algunas veces el sistema operativo es simplemente una biblioteca enlazada con los
programas de aplicación, en donde todo está acoplado en forma estrecha y no hay protección entre cada
una de las partes del sistema. Un ejemplo de este tipo de sistema en tiempo real es e -Cos. Las categorías de
sistemas para computadoras de bolsillo, sistemas integrados y sistemas en tiempo real se traslapan en
forma considerable. Casi todos ellos tienen por lo menos ciertos aspectos de tiempo real suave. Los sistemas
integrados y de tiempo real sólo ejecutan software que colocan los diseñadores del sistema; los usuarios no
pueden agregar su propio software, lo cual facilita la protección. Los sistemas de computadoras de bolsillo y
los sistemas integrados están diseñados para los consumidores, mientras que los sistemas en tiempo real
son más adecuados para el uso industrial. Sin embargo, tienen ciertas características en común.
Sistemas operativos por Lotes: procesan un conjunto de trabajos (con características afines) al mismo
tiempo, es decir, con poca o ninguna interacción entre los usuarios y los programas en ejecución. Estos
sistemas no son convenientes para el desarrollo de programas de poco tiempo de respuesta, sino que están
diseñados para conjuntos de programas de largos tiempos de ejecución los cuales no pueden ser
interrumpidos. Un ejemplo de estos lotes puede ser: análisis estadísticos, nóminas de personal, etc.
Sistemas operativos interactivos: Un sistema operativo interactivo o de utilización directa ofrece una
comunicación en la línea del usuario y el sistema operativo. El usuario proporciona instrucciones
directamente al sistema operativo y recibe una respuesta inmediata. En lo general para proporcionar la
entrada se utiliza un teclado y para la salida una impresora o un monitor. Cuando el sistema operativo
termina de ejecutar el mandato busca el siguiente enunciado de control del teclado o usuario. Este
proporciona un mandato, espera la respuesta y decide sobre el siguiente mandato dependiendo del
resultado anterior.
Sistema operativo de tiempo compartido: Varias tareas se pueden ejecutar al mismo tiempo y funcionar sin
problema. También se les llama sistemas multitarea, y las tareas pueden ser de un solo usuario o de
diferentes usuarios. El tiempo que cada tarea llega a ejecutar se llama quantum. Una vez transcurrido este
intervalo de tiempo, el sistema operativo cambia a la siguiente tarea.
2.1. Procesos. Conceptos. Modelos de procesos. Estados de un Proceso. Estados básicos. Modelos
de Procesos de Cinco Estados.
2.2. Implementación de Procesos. Control de Procesos. Operaciones sobre Procesos. Crear.
Eliminar. Procesos Usuarios. Procesos de Sistema
2.3. Procesos e Hilos. Multihilos. Funciones de los Hilos. Estados de los hilos.
2.4. Planificación Uniprocesador. Tipos de Planificaciones. Planificación de Procesos. Planificador
de CPU. Algoritmos de Planificación: Apropiativa – No Apropiativa. Evaluación de Algoritmos.
Medidas para Estudiar el Comportamiento de los Algoritmos de Planificación.
2.1.Procesos.Conceptos
Un proceso es un programa en ejecución. Sin embargo, es importante resaltar que un proceso es algo más
que el código de un programa (que en ocasiones se denomina sección de texto). Además del código, un
proceso incluye también la actividad actual, que queda representada por el valor del contador de programa
y por los contenidos de los registros del procesador. Generalmente, un proceso incluye también la pila del
proceso, que contiene datos temporales (como los parámetros de las funciones, las direcciones de retorno y
las variables locales), y una sección de datos, que contiene las variables globales. El proceso puede incluir,
asimismo, un cúmulo de memoria, que es la memoria que se asigna dinámicamente al proceso en tiempo de
ejecución. En la Figura 3.1 se muestra la estructura de un proceso en memoria.
Insistamos en que un programa, por sí mismo, no es un proceso; un programa es una entidad pasiva, un
archivo que contiene una lista de instrucciones almacenadas en disco (a menudo denominado archivo
ejecutable), mientras que un proceso es una entidad activa, con un contador de programa que especifica la
siguiente instrucción que hay que ejecutar y un conjunto de recursos asociados. Un programa se convierte
en un proceso cuando se carga en memoria un archivo ejecutable. Dos técnicas habituales para cargar
archivos ejecutables son: hacer doble clic sobre un icono que represente el archivo ejecutable e introducir el
nombre del archivo ejecutable en la línea de comandos (como por ejemplo, prog . exe o a. out.)
Aunque puede haber dos procesos asociados con el mismo programa, esos procesos se consideran dos
secuencias de ejecución separadas. Por ejemplo, varios usuarios pueden estar ejecutando copias diferentes
del programa de correo, o el mismo usuario puede invocar muchas copias del explorador web. Cada una de
estas copias es un proceso distinto y, aunque las secciones de texto sean equivalentes, las secciones de
datos, del cúmulo (heap) de memoria y de la pila variarán de unos procesos a otros. También es habitual que
un proceso cree muchos otros procesos a medida que se ejecuta. En la Sección 3.4 se explican estas
cuestiones.
En contraposición con proceso, en un sistema por lotes se habla de tareas. Una tarea requiere mucha menos
estructura, típicamente basta con guardar la información relacionada con la contabilidad de los recursos
empleados. Una tarea no es interrumpida en el transcurso de su ejecución. Ahora bien, esta distinción no es
completamente objetiva y se pueden encontrar muchos textos que emplean indistintamente una u otra
nomenclatura. Si bien el sistema brinda la ilusión de que muchos procesos se están ejecutando al mismo
tiempo, la mayor parte de ellos típicamente está esperando para continuar su ejecución en un momento
determinado sólo puede estar ejecutando sus instrucciones un número de procesos igual o menor al
número de procesadores que tenga el sistema.
2.1.Modelo de procesos.
En este modelo, todo el software ejecutable en la computadora, que algunas veces incluye al sistema
operativo, se organiza en varios procesos secuenciales (procesos, para abreviar). Un proceso no es más que
una instancia de un programa en ejecución, incluyendo los valores actuales del contador de programa, los
registros y las variables. En concepto, cada proceso tiene su propia CPU virtual; en la realidad, la CPU real
conmuta de un proceso a otro, pero para entender el sis- tema es mucho más fácil pensar en una colección
de procesos que se ejecutan en (pseudo) paralelo, en vez de tratar de llevar la cuenta de cómo la CPU
conmuta de programa en programa. Esta conmutación rápida de un proceso a otro se conoce como
multiprogramación, como vimos en el capítulo I.
La figura 2-I(a) muestra una computadora multiprogramando cuatro programas en memoria; la figura 2-1 (b)
lista cuatro procesos, cada uno con su propio flujo de control (es decir, su propio contador de programa
lógico) y cada uno ejecutándose en forma independiente. Desde luego que sólo hay un contador de
programa fisico, por Io que cuando se ejecuta cada proceso, se carga su contador de programa lógico en el
contador de programa real. Cuando termina (por el tiempo que tenga asignado), el contador de programa
fisico se guarda en el contador de programa lógico alma- cenado, del proceso en memoria. En la figura 2-1
(c) podemos ver que durante un intervalo suficientemente largo todos los procesos han progresado, pero en
cualquier momento dado sólo hay un proceso en ejecución.
La información que debe manipular el sistema operativo relativa a cada uno de los procesos actuales se
suele almacenar en una estructura llamada bloque de control de proceso (PCB - Process Control Block). El
PCB incluye campos como:
2.1.Estados de proceso
Un proceso, a lo largo de su vida, alterna entre diferentes estados de ejecución. Estos son:
Nuevo: Se solicitó al sistema operativo la creación de un proceso, y sus recursos y estructuras están siendo
creadas.
Listo: Está listo para iniciar o continuar su ejecución, pero el sistema no le ha asignado un procesador.
En ejecución: El proceso está siendo ejecutado en este momento. Sus instrucciones están siendo procesadas
en algún procesador.
Bloqueado: En espera de algún evento para poder continuar su ejecución (aun si hubiera un procesador
disponible, no podría avanzar).
Terminado: El proceso terminó de ejecutarse; sus estructuras están a la espera de ser limpiadas por el
sistema operativo
2.1.Estados básicos.
MODELOS DE PROCESO DE DOS ESTADOS:
El modelo más sencillo que puede construirse tiene en cuenta que en un momento dado, un proceso puede
estar ejecutándose en el procesador o no, Así, un proceso puede estar en uno de dos estados: Ejecución o
No ejecución. Cuando el Sistema Operativo crea un nuevo proceso, este entra en el Sistema en estado de No
ejecución. El proceso existe, es conocido por el Sistema Operativo y está esperando la oportunidad de
ejecutarse. De cuando en cuando, el proceso que está ejecutándose será interrumpido y el programa
distribuidor (Planificador) del Sistema Operativo seleccionará un nuevo proceso para que se ejecute. El
proceso anterior pasa del estado de Ejecución al estado de No ejecución y uno de los otros procesos pasará
al estado de Ejecución.
Cada proceso debe representarse de forma que el Sistema Operativo pueda seguirle la pista, es decir, que
debe haber información relativa a cada proceso, incluyendo su estado actual y su posición en la memoria.
Aquellos procesos que no estén ejecutándose tienen que guardarse en algún tipo de cola, para que esperen
su turno de ejecución.
Expedir
No
Entrar Ejecución Salir
ejecución
Pausar
COLA
Entrar Expedir
Procesador Salir
Pausa
Modelo de 3 estados
Aunque cada proceso es una entidad independiente, con su propio contador de programa y estado interno,
a menudo los procesos necesitan interactuar con otros. Un proceso puede generar cierta salida que otro
proceso utiliza como entrada.
Cuando un proceso se bloquea, lo hace debido a que por lógica no puede continuar, comúnmente porque
está esperando una entrada que todavía no está disponible. También es posible que un proceso, que esté
listo en concepto y pueda ejecutarse, se detenga debido a que el sistema operativo ha decidido asignar la
CPU a otro proceso por cierto tiempo. Estas dos condiciones son completamente distintas. En el primer caso,
la suspensión está inherente en el problema (no se puede procesar la línea de comandos del usuario sino
hasta que éste la haya escrito mediante el teclado). En el segundo caso, es un tecnicismo del sistema (no hay
suficientes CPUs como para otorgar a cada proceso su propio procesador privado). En la figura 2-2 podemos
ver un diagrama de estados que muestra los tres estados en los que se puede encontrar un proceso:
En sentido lógico, los primeros dos estados son similares. En ambos casos el proceso está
deseoso de ejecutarse; sólo en el segundo no hay temporalmente una CPU para él. El tercer estado es
distinto de los primeros dos en cuanto a que el proceso no se puede ejecutar, incluso aunque la CPU no
tenga nada que hacer.
Nuevo: Se solicitó al sistema operativo la creación de un proceso, y sus recursos y estructuras están siendo
creadas.
Listo: Está listo para iniciar o continuar su ejecución, pero el sistema no le ha asignado un procesador.
En ejecución: El proceso está siendo ejecutado en este momento. Sus instrucciones están siendo procesadas
en algún procesador.
Bloqueado: En espera de algún evento para poder continuar su ejecución (aun si hubiera un procesador
disponible, no podría avanzar).
Terminado: El proceso terminó de ejecutarse; sus estructuras están a la espera de ser limpiadas por el
sistema operativo
Nulo a Nuevo: Se crea un nuevo proceso para ejecutar un programa. Este suceso se produce por algunas de
las razones enumeradas en la tabla 3.1.
Nuevo a Listo: El sistema operativo pasará un proceso del estado Nuevo al estado Listo cuando esté
preparado para aceptar un proceso más. La mayoría de los sistemas ponen un límite en función del número
de procesos existente o en la cantidad de memoria virtual dedicada a los procesos existentes. El motivo de
este limite es asegurar que no haya tantos procesos activos como para degradar el rendimiento.
Listo a Ejecución: Cuando es hora de seleccionar un nuevo proceso para ejecutar, el sistema operativo elige
a uno de los procesos del estado Listo.
Ejecución a Terminado: El proceso que se está ejecutando es finalizado por el sistema operativo si indica
que terminó o si se abandona.
Ejecución a Listo: La razón más común de esta transición es que el proceso que está en ejecución ha
alcanzado el tiempo máximo permitido de ejecución interrumpida; casi todos los sistemas operativos con
multiprogramación imponen este tipo de norma de tiempo. Hay otras causas alternativas para esta
transición que no están implementadas en todos los sistemas operativos. Por ejemplo, si el sistema
operativo asigna diferentes niveles de prioridad a los diferentes procesos. Supóngase que un proceso A está
ejecutándose con un cierto nivel de prioridad y que el proceso B, con un nivel de prioridad mayor, está
bloqueado. Si el sistema operativo se entera de que el suceso que B estaba esperando se ha producido,
pasando así B al estado Listo, entonces puede interrumpir al proceso A y expedir a B. Por último, otro caso
es que un proceso ceda voluntariamente el control del procesador
Ejecución a Bloqueado: Un proceso se pone en el estado Bloqueado si solicita algo por lo que debe esperar.
Cola de listos
Admitir Expedir Salir
Procesador
Cola de bloqueados
Esperar suceso 1
Ocurre
suceso 1
Esperar suceso N
Ocurre
suceso N
Cola bloqueados
Una de las razones para implementar el estado de Bloqueado era poder que los procesos se puedan
mantener algún suceso, sin embargo puede ocurrir que todos los procesos en memoria estén esperando en
el estado bloqueado y que no haya más memoria disponible para nuevos procesos. Podría conseguirse más
memoria, pero esto significaría procesos mayores, no más procesos (Cantidad).
Entonces otra solución es el Intercambio, que implica mover una parte del proceso o todo el proceso de la
memoria principal al disco. Cuando ninguno de los procesos en memoria principal está en estado Listo, El
Sistema Operativo pasa un proceso que este bloqueado, a una cola en estado suspendido, transfiriéndolo al
disco. Entonces el espacio liberado, puede utilizarse para aceptar un nuevo proceso o traer otro proceso
suspendido anteriormente.
El problema que se presenta ahora es que puede sr que si se decido traer a memoria un proceso que está en
el estado de suspendido, el mismo todavía se encuentre bloqueado. Solo convendrá traerlo cuando ya está
listo para ejecutar, esto implica que ya aconteció el suceso que estaba esperando cuando se bloqueo. Para
tener esta diferenciación entre procesos suspendidos ya sean como listo o bloqueados, se utilizan los
siguientes estados:
Expedir
Admitir Salir
Listo Ejecución Terminado
Fin plazo
Nuevo
Nuevo Suspender
Admitir
Admitir
Expedir
Salir
Activar
Listo/Suspendido Listo Ejecución Terminado
Fin plazo
Suspender
Bloqueado/ Bloqueado
Suspender
Las líneas punteadas indican transiciones posibles pero no necesarias.
Transiciones:
2.2.Implementación de Procesos.
Para implementar el modelo de procesos, el sistema operativo mantiene una tabla (un arreglo de
estructuras) llamada tabla de procesos, con sólo una entrada por cada proceso (algunos autores llaman a
estas entradas bloques de control de procesos). Esta entrada contiene información importante acerca del
estado del proceso, incluyendo su contador de programa, apuntador de pila, asignación de memoria, estado
de sus archivos abiertos, información de contabilidad y planificación, y todo lo demás que debe guardarse
acerca del proceso cuando éste cambia del estado en ejecución a listo o bloqueado, de manera que se
pueda reiniciar posteriormente como si nunca se hubiera detenido.
Ahora que hemos analizado la tabla de procesos, es posible explicar un poco más acerca de cómo la ilusión
de varios procesos secuenciales se mantiene en una (o en varias) CPU. Con cada clase de E/S hay una
ubicación asociada (por lo general, en una ubicación cerca de la parte final de la memoria), a la cual se le
llama vector de interrupción. Esta ubicación contiene la dirección del procedimiento del servicio de
interrupciones. Suponga que el proceso de usuario 3 está en ejecución cuando ocurre una interrupción de
disco. El contador de programa, la palabra de estado del programa y algunas veces uno o más registros del
proceso del usuario 3 se meten en la pila (actual) mediante el hardware de interrupción. Después, la
computadora salta a la dirección especificada en el vector de interrupción. Esto es todo lo que hace el
hardware. De aquí en adelante, depende del software y en especial del procedimiento del servicio de
interrupciones. Todas las interrupciones empiezan por guardar los registros, a menudo en la entrada de la
tabla de procesos para el proceso actual. Después, se quita la información que la interrupción metió en la
pila y el apuntador de pila se establece para que apunte a una pila temporal utilizada por el manejador de
procesos. Las acciones como guardar los registros y establecer el apuntador de pila no se pueden expresar ni
siquiera en lenguajes de alto nivel tales como C, por lo que se realizan mediante una pequeña rutina en
lenguaje ensamblador, que por lo general es la misma para todas las interrupciones, ya que el trabajo de
guardar los registros es idéntico, sin importar cuál sea la causa de la interrupción.
Cuando termina esta rutina, llama a un procedimiento en C para realizar el resto del trabajo para este tipo
de interrupción específico (suponemos que el sistema operativo está escrito en C, la elección usual para
todos los sistemas operativos reales). Cuando ha terminado su trabajo y tal vez ocasionando que algún otro
proceso esté entonces listo, el planificador es llamado para ver qué proceso se debe ejecutar a continuación.
Después de eso, el control se pasa de vuelta al código en lenguaje ensamblador para cargar los registros y el
mapa de memoria para el proceso que entonces es el actual y se empieza a ejecutar. En la figura 2-5 se
sintetizan el manejo de interrupciones y la planificación de proceso. Vale la pena recalcar que los detalles
varían dependiendo del sistema.
Cuando el proceso termina, el sistema operativo muestra un carácter indicador y espera un nuevo comando.
Cuando recibe el comando, carga un nuevo programa en memoria, sobrescribiendo el anterior.
2.2.Control de procesos.
Modos de ejecución
Antes de continuar la discusión sobre la forma en que el sistema operativo gestiona los procesos, hace falta
distinguir entre el modo de ejecución del procesador que normalmente se asocia con el sistema operativo y
el modo que normalmente se asocia con los programas de usuario. La mayoría de los procesadores dan
soporte para dos modos de ejecución por lo menos. Ciertas instrucciones pueden ejecutarse solo en modo
privilegiado. Entre éstas están la lectura o modificación de registros de control (como la palabra de estado
del programa), instrucciones primitivas de E/S e instrucciones relativas a la gestión de memoria. Además, se
puede acceder a ciertas regiones de memoria solo en el modo más privilegiado. El modo menos privilegiado
a menudo se conoce como modo de usuario, ya que los programas de usuario ejecutan normalmente en ese
modo. Al modo más privilegiado normalmente se le conoce como modo del sistema, modo de control o,
modo del núcleo.
La razón por la que se usan dos modos debe quedar clara. Es necesario proteger al sistema operativo y a las
tablas importantes del mismo, tales como los bloques de control de procesos, de las injerencias de los
programas de usuario. En el modo del núcleo, el software tiene control completo del procesador y de todas
sus instrucciones, registros y memoria. Este nivel de control no es necesario y, por seguridad, tampoco
conveniente para los programas de usuario.
Surgen dos preguntas: ¿Cómo conoce el procesador en qué modo va a ejecutar? ¿Cómo se cambia de
modo? Para la primera pregunta, normalmente hay un bit en la PSW (Program Status Word) que indica el
modo de ejecución.
Cuando el usuario hace una llamada a un servicio del sistema o cuando una interrupción transfiere el control
a una rutina del sistema, la rutina ejecuta CHM para entrar en un modo más privilegiado y la ejecuta de
nuevo para pasar a un modo menos privilegiado, antes de devolver el control al proceso del usuario.
2.2.Operaciones sobre Procesos. Crear. Eliminar.
Una vez que el sistema operativo decide crear un nuevo proceso, éste puede proceder como sigue:
1. Asignar un único identificador al nuevo proceso. En ese momento se añade una nueva entrada a la tabla
principal de procesos, que contiene una entrada por proceso.
2. Asignar espacio para el proceso. Esto incluye todos los elementos de la imagen del proceso. Así pues, el
sistema operativo debe saber cuánto espacio se necesitará para el espacio privado de direcciones del
usuario (programas y datos) y para la pila del usuario. Estos valores se pueden asignar por omisión en
función del tipo de proceso o bien se puede asignar a partir de la solicitud del usuario cuando se crea el
trabajo. Si un proceso es generado por otro, el proceso padre puede pasarle al sistema operativo los valores
necesarios como parte de la solicitud de creación del proceso. Si algún espacio de direcciones existente se va
a compartir con este nuevo proceso, entonces se deben establecer los enlaces adecuados. Por último, se
debe asignar espacio para el bloque de control del proceso.
3. Debe inicializarse el bloque de control del proceso. La parte de identificación del proceso contiene el ID
de este proceso junto a otros ID apropiados, tales como el del proceso padre. La parte de información del
estado del procesador se inicializa con la mayor parte de las entradas a cero, excepto para el contador de
programa (que se prepara con el punto de entrada del programa) y los punteros a las pilas del sistema (que
establecen los límites de la pila del proceso). La parte de información de control del procesador se inicializa a
partir de los valores estándares por omisión y los atributos que se han solicitado para el proceso.
4. Se deben establecer los enlaces apropiados. Por ejemplo, si el sistema operativo mantiene cada cola de
planificación como una lista enlazada, entonces el proceso nuevo se debe poner en la cola de Listos o de
Listos y suspendidos.
Se define proceso Suspendido como aquel que tiene las características siguientes:
4. El proceso no puede apartarse de este estado hasta que el agente lo ordene explícitamente.
2.3.Procesos e hilos
Como se vio, la cantidad de información que el sistema operativo debe manejar acerca de cada proceso es
bastante significativa. Si cada vez que el planificador elige qué proceso pasar de Listo a En ejecución debe
considerar buena parte de dicha información, la simple transferencia de todo esto entre la memoria y el
procesador podría llevar a un desperdicio burocrático de recursos. Una respuesta a esta problemática fue la
de utilizar los hilos de ejecución, a veces conocidos como procesos ligeros (LWP, Lightweight processes).
Cuando se consideran procesos basados en un modelo de hilos, se puede proyectar en sentido inverso que
todo proceso es como un sólo hilo de ejecución. Un sistema operativo que no ofreciera soporte expreso a
los hilos los planificaría exactamente del mismo modo. Pero visto desde la perspectiva del proceso hay una
gran diferencia: si bien el sistema operativo se encarga de que cada proceso tenga una visión de virtual
exclusividad sobre la computadora, todos los hilos de un proceso comparten un sólo espacio de direcciona-
miento en memoria y los archivos y dispositivos abiertos. Cada uno de los hilos se ejecuta de forma
(aparentemente) secuencial y maneja su propio contador de programa y pila (y algunas estructuras
adicionales, aunque mucho más ligeras que el PCB).
Lo que agregan los hilos al modelo de procesos es permitir que se lleven a cabo varias ejecuciones en el
mismo entorno del proceso, que son en gran parte independientes unas de las otras. Tener varios procesos
ejecutándose en paralelo en un proceso es algo similar a tener varios procesos ejecutándose en paralelo en
una computadora- En el primer caso, los hilos comparten un espacio de direcciones y otros recursos; en el
segundo, los procesos comparten la memoria fisica, los discos, las impresoras y otros recursos. Como los
hilos tienen algunas de las propiedades de los procesos, algunas veces se les llama procesos ligeros. El
término multihilamiento también se utiliza para describir la situación de permitir varios hilos en el mismo
proceso. Como vimos en el capitulo 1, algunas CPUs tienen soporte directo en el hardware para el
multihilamiento y permiten que las conmutaciones de hilos ocurran en una escala de tiempo en
nanosegundos- En la figura 2-Il(a) podemos ver tres procesos tradicionales. Cada proceso tiene su propio
espacio de direcciones y un solo hilo de control- Por el contrario, en la figura 2-11(b) vemos un solo proceso
con tres hilos de control. Aunque en ambos casos tenemos tres hilos, en la figura 2-11(a) cada uno de ellos
opera en un espacio de direcciones distinto, mientras que en la figura 2-11 (b) los tres comparten el mismo
espacio de direcciones.
Cuando se ejecuta un proceso con multihilamiento en un sistema con una CPU, los hilos toman tumos para
ejecutarse- En la figura 2-1 vimos cómo funciona la multiprogramación de procesos. Al conmutar de un
proceso a otro entre varios procesos, el sistema da la apariencia de que hay procesos secuenciales
separados ejecutándose en paralelo. El multihilamiento funciona de la misma manera. La CPU conmuta
rápidamente entre un hilo y otro, dando la ilusión de que los hilos se ejecutan en paralelo, aunque en una
CPU más lenta que la verdadera. Con tres hilos limitados a cálculos en un proceso, los hilos parecerían
ejecutarse en paralelo, cada uno en una CPU con un tercio de la velocidad de la CPU verdadera-
Los distintos hilos en un proceso no son tan independientes como los procesos. Todos los hilos tienen el
mismo espacio de direcciones, lo cual significa que también comparten las mismas variables globales. Como
cada hilo puede acceder a cada dirección de memoria dentro del espacio de direcciones del proceso, un hilo
puede leer, escribir o incluso borrar la pila de otro hilo. No hay protección entre los hilos debido a que (1) es
Imposible y (2) no debe ser necesario. A diferencia de tener procesos diferentes, que pueden ser de distintos
usuarios y hostiles entre sí, un proceso siempre es propiedad de un solo usuario, quien se supone que ha
creado varios hilos para que puedan cooperar, no pelear. Además de compartir un espacio de direcciones,
todos los hilos pueden compartir el mismo conjunto de archivos abiertos, procesos hijos, alarmas y señales,
etc., como se muestra en la figura 2-12. Por ende, la organización de la figura 2-11(a) se utilizaría cuando los
tres procesos no estén esencialmente relacionados, mientras que la figura 2-11(b) seria apropiada cuando
los tres hilos en realidad formen parte del mismo trabajo y estén cooperando en forma activa y estrecha
entre sí.
Los elementos en la primera columna son propiedades de un proceso, no de un hilo. Por ejemplo, si un hilo
abre un archivo, ese archivo está visible para los demás hilos en el proceso y pueden leer y escribir datos en
él. Esto es lógico, ya que el proceso es la unidad de administración de recursos, no el hilo. Si cada hilo tuviera
su propio espacio de direcciones, archivos abiertos, alarmas pendientes, etcétera, sería un proceso
separado. Lo que estamos tratando de lograr con el concepto de los hilos es la habilidad de que varios hilos
de ejecución compartan un conjunto de recursos, de manera que puedan trabajar en conjunto para realizar
cierta tarea. Al igual que un proceso tradicional (es decir, un proceso con sólo un hilo), un hilo puede estar
en uno de varios estados: en ejecución, bloqueado, listo o terminado. Un hilo en ejecución tiene la CPU en
un momento dado y está activo. Un hilo bloqueado está esperando a que cierto evento lo desbloquee. Por
ejemplo, cuando un hilo realiza una llamada al sistema para leer datos del teclado, se bloquea hasta que se
escribe la entrada. Un hilo puede bloquearse en espera de que ocurra algún evento externo o que algún otro
hilo lo desbloquee. Un hilo listo se programa para ejecutarse y lo hará tan pronto como sea su tumo. Las
transiciones entre los estados de los hilos son las mismas que las transiciones entre los estados de los
procesos y se ilustran en la figura 2-2. Es importante tener en cuenta que cada hilo tiene su propia Pila,
como la figura 2-13 lo ilustra. La pila de cada hilo contiene un conjunto de valores para cada procedimiento
llamado, pero del que todavía no se ha regresado. Este conjunto de valores contiene las variables locales del
procedimiento y la dirección de retomo que se debe utilizar cuando haya terminado la llamada al
procedimiento. Por ejemplo, si el procedimiento X llama al procedimiento Y y Y llama al procedimiento Z,
entonces mientras se ejecuta Z, los conjuntos de valores para X, Y y Z estarán todos en la pila. Por lo general,
cada hilo llama a distintos procedimientos y por ende, tiene un historial de ejecución diferente. Esta es la
razón por la cual cada hilo necesita su propia pila.
Cuando hay multihilamiento, por lo general los procesos empiezan con un solo hilo presente. Este hilo tiene
la habilidad de crear hilos mediante la llamada a un procedimiento de biblioteca, como thread créate.
Comúnmente, un parámetro para thread create especifica el nombre de un procedimiento para que se
ejecute el nuevo hilo. No es necesario (ni posible) especificar nada acerca del espacio de direcciones del
nuevo hilo, ya que se ejecuta de manera automática en el espacio de direcciones del hilo creador. Algunas
veces los hilos son jerárquicos: con una relación padre-hijo, pero a menudo no existe dicha relación y todos
los hilos son iguales. Con o sin una relación jerárquica, el hilo creador generalmente recibe un identificador
de hilo que da nombre al nuevo hilo. Cuando un hilo termina su trabajo, puede salir mediante la llamada a
un procedimiento de biblioteca, como thread_exit_ Después desaparece y ya no puede planificarse para
volver a ejecutarse. En algunos sistemas con hilos, un hilo puede esperar a que un hilo (especifico) termine
mediante la llamada a un procedimiento, por ejemplo thread_join. Este procedimiento bloquea al hilo
llamador hasta que un hilo (especifico) haya terminado- En este aspecto, la creación y terminación de hilos
es algo muy parecido a la creación y terminación de procesos, conteniendo casi las misma opciones.
Otra llamada de hilos común es thread_yeld, que permite a un hilo entregar voluntariamente la CPU para
dejar que otro hilo se ejecute Dicha llamada es importante, ya que no hay una interrupción de reloj para
implementar en realidad la multiprogramación, como en los procesos. Por ende, es importante que los hilos
sean amables y entreguen de manera voluntaria la CPU de vez en cuando, para dar a otros hilos la
oportunidad de ejecutarse. Otras llamadas permiten a un hilo esperar a que otro termine cierto trabajo, y
que otro anuncie que ya terminó cierto trabajo, y así sucesivamente.
2.4.Planificación Uniprocesador.
En un sistema de un único procesador, sólo puede ejecutarse un proceso cada vez; cualquier otro proceso
tendrá que esperar hasta que la CPU quede libre y pueda volver a planificarse. El objetivo de la
multiprogramación es tener continuamente varios procesos en ejecución, con el fin de maximizar el uso de
la CPU. La idea es bastante simple: un proceso se ejecuta hasta que tenga que esperar, normalmente porque
es necesario completar alguna solicitud de E/S- En un sistema informático simple, la CPU permanece
entonces inactiva y todo el tiempo de espera se desperdicia; no se realiza ningún trabajo útil. Con la
multiprogramación, se intenta usar ese tiempo de forma productiva. En este caso, se mantienen varios
procesos en memoria a la vez. Cuando un proceso tiene que esperar, el sistema operativo retira el uso de la
CPU a ese proceso y se lo cede a otro proceso
Este patrón se repite continuamente y cada vez que un proceso tiene que esperar, Otro proceso puede
hacer uso de la CPU.
Este tipo de planificación es una función fundamental del sistema operativo; casi todos los recursos de la
computadora se planifican antes de usarlos. Por supuesto, la CPU es uno de los principales recursos de la
computadora, así que su correcta planificación resulta crucial en el diseño del sistema operativo.
2.4.Tipos de planificadores.
En muchos Sistemas, esta actividad de planificación se divide en 3 niveles o funciones independientes:
Planificación a largo, mediano y corto plazo.
El planificador a largo plazo determina que programas se admiten en el sistema para su procesamiento. De
esta forma se controla el grado de multiprogramación. Una vez admitido un trabajo o programa de usuario
se convierte en un proceso y se añade a la cola del planificador a corto plazo. En algunos sistemas, un
proceso de reciente creación comienza en la zona de intercambio, en cuyo caso se añaden a la cola del
planificador a medio plazo.
En un Sistema por lotes, o en la parte de lotes de un Sistema Operativo de propósito general, los nuevos
trabajos enviados se mandan al disco y se mantienen en una cola de lotes. El planificador a largo plazo
creara procesos desde la cola siempre que pueda. En este caso hay que tomar dos decisiones. La primera, el
planificador debe decidir cuando el Sistema Operativo puede tomar uno o más procesos adicionales. La
segunda, el planificador debe decidir que trabajo o trabajos se aceptan y son convertidos en procesos.
Para los programas interactivos en un Sistema de tiempo compartido, la petición de la creación de un
proceso, puede estar generada por un usuario intentando conectarse al sistema. Aquí el Sistema Operativo
aceptará a todos los usuarios autorizados hasta que el Sistema se sature.
Decide cuáles procesos es conveniente bloquear en determinado momento, sea por escasez/saturación de
algún recurso (como la memoria primaria) o porque están realizando alguna solicitud que no puede
satisfacerse momentáneamente; se encarga de tomar decisiones respecto a los procesos conforme entran y
salen del estado de bloqueado (esto es, típicamente, están a la espera de algún evento externo o de la
finalización de transferencia de datos con algún dispositivo).
El planificador a corto plazo, conocido como activador, se ejecuta mucho más frecuentemente y toma las
decisiones sobre qué proceso ejecutar.
Se invoca siempre que ocurre un evento que pueda conllevar el bloqueo del proceso actual y que puede
proporcionar la oportunidad de expulsar al proceso actualmente en ejecución en favor de otro. Ejemplos de
estos eventos son:
Interrupciones de reloj.
Llamadas al sistema.
Interrupciones de Entrada y Salida.
Señales (semáforos).
Podrían ubicarse a estos tres planificadores en las siguientes transiciones entre estados:
El planificador a largo plazo se encarga de admitir un nuevo proceso: La transición de Nuevo a Listo.
El planificador a mediano plazo maneja la activación y bloqueo de un proceso relacionado con
eventos — Esto es, las transiciones entre En ejecución y Bloqueado, y entre Bloqueado y Listo.
El planificador a corto plazo decide entre los procesos que están listos para ejecutarse y determina
a cuál de ellos activar, y detiene a aquellos que exceden su tiempo de procesador — Implementa
las transiciones entre los estados Listo y En ejecución.
Activador (Dispatcher)
Es el módulo del S.O. que pone a ejecutar un proceso seleccionado por el planificador. Esta función implica:
Cambio de contexto
Cambio al modo usuario
Salto a la posición correcta dentro del programa de usuario para reiniciar dicho
programa.
El despachador debe ser lo más rápido posible ya que se invoca en cada conmutación de proceso. El tiempo
que tarda el despachador en detener un proceso e iniciar la ejecución de otro se conoce como latencia de
despachador. Actúa para poner listo al proceso. Busca el BCP necesario para que comience la ejecución del
proceso seleccionado (Debe ubicar recursos, referencias, saber el espacio de memoria que ocupa, etc
Como ya se ha visto, los procesos típicamente alternan entre ráfagas (periodos, en inglés bursts) en que
realizan principalmente cómputo interno (están limitados por CPU, CPU-Bound) y otras en que la atención
está puesta en transmitir los datos desde o hacia dispositivos externos (están limitados por entrada-
salida,I/0-bound). Dado que cuando un proceso se suspende para realizar entrada-salida deja de estar listo
(y pasa a estar bloqueado), y desaparece de la atención del planificador a corto plazo, en todo momento los
procesos que están en ejecución y listos pueden separarse en:
Procesos largos: Aquellos que por mucho tiempo han estado en listos o en ejecución, esto es, procesos que
estén en una larga ráfaga limitada por CPU.
Procesos cortos: Aquellos que, ya sea que en este momento estén en una ráfaga limitada por entrada-salida
y requieran atención meramente ocasional del procesador, o tienden a estar bloqueados esperando a
eventos (como los procesos interactivos).
Por lo general se busca dar un tratamiento preferente a los procesos cortos, en particular a los interactivos.
Cuando un usuario está interactuando con un proceso, si no tiene una respuesta inmediata a su interacción
con el equipo (sea proporcionar comandos, recibir la respuesta a un teclado o mover el puntero en el GUI)
su percepción será la de una respuesta degradada.
2.4.Planificación de procesos.
El objetivo de la multiprogramación es tener en ejecución varios procesos al mismo tiempo con el fin de
maximizar la utilización de la CPU. El objetivo de los sistemas de tiempo compartido es conmutar la CPU
entre los distintos procesos con tanta frecuencia que los usuarios puedan interactuar con cada programa
mientras éste se ejecuta. Para conseguir estos objetivos, el planificador de procesos selecciona un proceso
disponible (posiblemente de entre un conjunto de varios procesos disponibles) para ejecutar el programa en
la CPU. En los sistemas de un solo procesador, nunca habrá más de un proceso en ejecución: si hay más
procesos, tendrán que esperar hasta que la CPU esté libre y se pueda asignar a otro proceso.
Colas de planificación
A medida que los procesos entran en el sistema, se colocan en una cola de trabajos que contiene todos los
procesos del sistema. Los procesos que residen en la memoria principal y están preparados y en espera de
ejecutarse se mantienen en una lista denominada cola de procesos preparados. Generalmente, esta cola se
almacena en forma de lista enlazada. La cabecera de la cola de procesos preparados contiene punteros al
primer y último bloque de control de procesos (PCB) de la lista. Cada PCB incluye un campo de puntero que
apunta al siguiente PCB de la cola de procesos preparados.
El sistema también incluye otras colas. Cuando Se asigna la CPU a un proceso, éste se ejecuta durante un
rato y finalmente termina, es interrumpido o espera a que se produzca un determinado suceso, como la
terminación de una solicitud de E/S. Suponga que el proceso hace una solicitud de E/S a un dispositivo
compartido, como por ejemplo un disco. Dado que hay muchos procesos en el sistema, el disco puede estar
ocupado con la solicitud de E/S de algún otro proceso. Por tanto, nuestro proceso puede tener que esperar
para poder acceder al disco. La lista de procesos en espera de un determinado dispositivo de E/s se
denomina cola del dispositivo. Cada dispositivo tiene su propia cola (Figura 3.6).
Una representación que habitualmente se emplea para explicar la planificación de procesos es el diagrama
de colas, como el mostrado en la Figura 3.7, donde cada rectángulo representa una cola. Hay dos tipos de
colas: la cola de procesos preparados y un conjunto de colas de dispositivo. Los círculos representan los
recursos que dan servicio a las colas y las flechas indican el flujo de procesos en el sistema.
Cada proceso nuevo se coloca inicialmente en la cola de procesos preparados, donde espera hasta que es
seleccionado para ejecución, es decir, hasta que es despachado. Una vez que se asigna la CPU al proceso y
éste comienza a ejecutarse, se puede producir uno de los sucesos siguientes:
El proceso podría ejecutar una solicitud de E/S y ser colocado, como consecuencia, en una cola de
E/S.
El proceso podría crear un nuevo subproceso y esperar a que éste termine.
El proceso podría ser desalojado de la CPU como resultado de una interrupción y puesto de nuevo
en la cola de procesos preparados.
2.4.Planificador de CPU.
Cuando la CPU queda inactiva, el sistema operativo debe seleccionar uno de los procesos que se encuentran
en la cola de procesos preparados para ejecución. El planificador a corto plazo (o planificador de la CPU)
lleva a cabo esa selección del proceso. El planificador elige uno de los procesos que están en memoria
preparados para ejecutarse y asigna la CPU a dicho proceso.
Observe que la cola de procesos preparados no necesariamente tiene que ser una cola FIFO (first-in, first-
out). Como veremos al considerar los distintos algoritmos de planificación, una cola de procesos preparados
puede implementarse como una cola FIFO, una cola prioritaria, un árbol o simplemente una lista enlazada
no ordenada. Sin embargo, conceptualmente, todos los procesos que se encuentran en la cola de procesos
preparados se ponen en fila esperando la oportunidad de ejecutarse en la CPU. Los registros que se
almacenan en las colas son, generalmente, bloques de control de proceso (PCB) que describen los procesos
en cuestión.
Apropiativo: El proceso que se está ejecutando actualmente puede ser interrumpido y pasado al
estado de Listos por parte del sistema operativo. La decisión de apropiarse de la CPU puede
llevarse a cabo cuando llega un nuevo proceso, cuando se produce una interrupción que lleva a un
proceso Bloqueado al estado Listo o periódicamente, en función de una interrupción del reloj.
Las políticas apropiativas suponen un mayor coste que las no apropiativas pero dan un servicio
mejor al conjunto de todos los procesos, puesto que evitan que un proceso pueda monopolizar el
procesador durante mucho tiempo. Además, el coste de la apropiación puede mantenerse
relativamente bajo por medio de mecanismos eficientes de cambio de contexto (con tanta ayuda
del hardware como sea posible) y usando mucha memoria principal para que el porcentaje de
programas en memoria sea grande.
Para llevar a cabo la planificación apropiativa es necesario que ocurra una interrupción de reloj al
final del intervalo de tiempo para que la CPU regrese el control al planificador. Si no hay un reloj
disponible, la planificación no apropiativa es la única opción.
ALGORITMOS
El algoritmo más simple de planificación de la CPU es el algoritmo FCFS o FIFO. Con este esquema
se asigna primero la CPU al proceso que primero la solicite. La implementación de la política FIFO
se gestiona fácilmente con una cola FIFO. Cuando un proceso entra en la cola de procesos listos, su
BCP se coloca al final de la cola. Cuando la CPU queda libre se asigna al proceso que esta al
principio de la cola y ese proceso que pasa a ejecutarse se elimina de la cola.
Con este esquema NO se interrumpe debido a que in proceso ha ejecutado demasiado tiempo, por
lo que tiende a favorecer a los procesos más largos. Pero es equitativo. El tiempo medio de espera
es bastante largo.
Este algoritmo resulta problemático en Sistema de tiempo compartido, donde es importante que
cada usuario obtenga una cuota del procesador a intervalos regulares.
El algoritmo consiste en seleccionar para ejecución al proceso listo con menor tiempo de ejecución. No se
plantea expulsión, por lo que el proceso sigue ejecutándose mientras lo desee. La ventaja de este algoritmo
es que produce el menor tiempo de respuesta, pero a costa de penalizar los trabajos de mayor tiempo de
ejecución.
También puede sufrir de inanición, puesto que, en el caso de que estén continuamente apareciendo
procesos con tiempo de ejecución pequeño, un proceso largo puede no llegar a ejecutar.
El algoritmo de planificación SRTF es similar al algoritmo de planificación SJF, que selecciona al proceso con
el próximo tiempo de ejecución más corto. Pero el SRTF selecciona al proceso con el próximo tiempo de
ejecución restante más corto. En SRTF se penaliza a las ráfagas largas (como en SJF). Un punto débil de este
algoritmo se evidencia cuando una ráfaga muy corta suspende a otra un poco más larga, siendo más larga la
ejecución en este orden al ser preciso un cambio adicional de proceso y la ejecución del código del
planificador.
Planificación Próximo proceso el de índice más alto (HPRN): (También conocido como Mayor
tasa de respuesta:
El método HPRN, trata de ser justo sin introducir la apropiación. Cuando un proceso nuevo está esperando
en la cola de listos, el valor de su índice de penalización (Cuyo valor inicial será de 1), empezara a crecer.
Después de haber esperado un tiempo “w” en la lista de procesos listos, tendremos que P= (w+T) / T . Donde
P es la tasa de respuesta, w es el tiempo esperando y T es el tiempo requerido del proceso.
Cuando un proceso antiguo sale del procesador el proceso listo que tenga la mayor tasa de respuesta o
índice de penalización será el que se seleccione para su ejecución. El método HPRN no postergará
indefinidamente ni siquiera a los procesos muy largos ya que siempre llegara un momento en que su índice
de penalización alcanzara un valor alto.
Su desventaja, es que un proceso corto que llegue justo después de un proceso largo que ya ha comenzado
a ejecutarse, tendrá que esperar mucho tiempo.
Otra desventaja, es que es más costoso llevar a la práctica ya que el índice de penalización debe calcularse
para todos los procesos que estén en espera, siempre que termine el proceso que se está ejecutando.
La asignación por turnos tiene la finalidad de producir buenos tiempos de respuesta o espera tanto para los
procesos cortos como para los largos.
Con la planificación por turnos, el tema clave de diseño es la longitud del quantum de tiempo. Si se
establece el quantum demasiado corto, se producen demasiadas conmutaciones de procesos y se reduce la
eficiencia de la CPU, pero si se establece demasiado largo, se puede producir una mala respuesta a las
peticiones interactivas cortas. Un quantum intermedio constituye una solución razonable.
Asignación cíclica a los más antiguos (SRR) (Selfish Round Robin) (Apropiativo):
Este algoritmo es una variante del algoritmo Round Robin. Se basa en dar un mejor servicio a los procesos
parcialmente ejecutados. Para ello emplea dos colas, una para los procesos nuevos (Cola de nuevos) y otra
para los procesos antiguos (Cola de procesos aceptados).
El funcionamiento es muy simple, al principio los procesos entran en la cola de procesos nuevos en la que
esperan hasta ser aceptados.
En esta cola la prioridad de los procesos crece al ritmo del parámetro previamente ajustado. AL principio la
prioridad es igual a 0 y se acepta en la segunda cola (Cola de aceptados) el primer proceso de la cola de
nuevos.
Los procesos de la cola de aceptados son atendidos con el algoritmo de Round Robin y su prioridad crece al
ritmo del parámetro que también se habrá ajustado previamente. Cuando la prioridad de un procesos nuevo
alcanza la prioridad de un proceso aceptado, el proceso nuevo pasa a ser aceptado.
Si terminan todos los procesos aceptados en la segunda cola, se acepta el proceso nuevo con mayor
prioridad.
Si b/a ≥ 1 no se aceptaran más procesos en la cola de nuevos, se atenderán los procesos ya aceptados y por
lo tanto el algoritmo SRR se degenera en el algoritmo RR.
2.4.Evaluacion de algoritmos.
Modelo Determinista
En este tipo de evaluación de algoritmo lo que se hace es tomar una carga de trabajo determinada y definir
el rendimiento de cada algoritmo en función a la carga elegida. Este tipo de evaluación es simple y eficiente,
ya que nos brindan valores exactos fáciles y rápidos de calcular, para comparar los algoritmos entre sí.
Modelo De Colas
Este tipo de evaluación se toman las colas de CPU y E/S y se generan distribuciones estadísticas la cuales se
utilizarán para comparar algoritmos.
Modelos De Simulación
Se programa un software el cual genera un escenario real donde se analizan los algoritmos por su
funcionamiento
En relación al usuario podemos analizar el TIEMPO DE RESPUESTA, tiempo entre la llegada y la respuesta, y
el TIEMPO DE RETORNO, tiempo entre la llegada de un proceso y su finalización.
en relación al sistema podemos analizar la PRODUCTIVIDAD, numero de procesos terminados por unidad de
tiempo, y la UTILIZACION DEL PROCESADOR, tiempo en el que el procesador se encontró activo.
UNIDAD Nº 3. ADMINISTRACIÓN DE MEMORIA.
3.1. Administración de Memoria. Espacio de Direcciones Lógico y Físico. Registros Base y Limite.
Intercambio. Grado de Multiprogramación.
3.2. Paginación. Soporte de Hardware. Protección. Paginas Compartidas. Segmentación Simple.
3.3. Memoria Virtual. Paginación. Tablas de Paginas. Tablas de Páginas Invertidas. Tablas de
Páginas Jerárquicas. Algoritmos de Reemplazo de Pagina. Hiperpaginación.
3.4. Condiciones de Diseños para Sistemas Paginados: Tamaños de Paginas. Políticas de Vaciados.
Control de Carga. Grado de Multiprogramación. Suspensión de Proceso. Políticas de Asignación.
3.5. Segmentación. Tabla de Segmento. Segmentación Paginada. Ejemplos.
3.1.Administración de Memoria.
La memoria principal es un recurso que se debe administrar con mucho cuidado, ya que para que un
programa se ejecute debe residir dentro de ella, por lo que existe una parte del sistema operativo, conocida
como administrador de memoria, que se encargar registrar que partes de la misma se encuentran en uso,
asignar espacios a procesos y reclamarles cuando estos dejen de ejecutarse.
Todo conjunto de direcciones lógicas generadas por un programa se conoce como espacio de direcciones
logicas, y el conjunto de direcciones físicas asociadas a las lógicas se conocen como espacio de direcciones
fisicas. La correspondencia entre las direcciones lógica y físicas lo hace la unidad de gestion de memoria.
3.1.Intercambio.
Debido a que no se puede tener tantos programas en la memoria principal, ya que esta no cuenta con
mucho espacio para tener varios programas activos al mismo tiempo (sobrecarga de memoria), se
implementa una solución sencilla para combatirla la cual se denominó intercambio.
El método de intercambio consta en llevar cada proceso completo a la memoria principal, ejecutarlos por un
determinado tiempo y una vez cumplido el tiempo, regresarlo al disco.
Esta técnica va generando huecos entre los espacios usados y los espacios libres, ya que no todos los
programas tienen un mismo tamaño. Estos huecos se pueden agrupar en un solo de mayor tamaño
desplazando los procesos lo más abajo posible, esta técnica se conoce como compactación de memoria,
aunque por lo general, ya que requiere de mucho tiempo de ejecución¸ no suele implementarse.
Generalmente cuando un proceso se carga en la memoria principal, se le asigna un espacio adicional por si el
programa crece, ya que si asignamos el espacio justo de memoria y el programa necesita más, deberá hacer
varios intercambios de programas hasta generar un espacio mínimo para poder cederle al programa
solicitante.
3.1.Grado de multiprogramación.
Se denomina grado de multiprogramación al número de procesos activos que mantiene el sistema. Si el
grado de multiprogramación se hace demasiado alto, el número de fallos de página se dispara y el
rendimiento del sistema baja drásticamente. A esta situación se le denomina hiperpaginación.
3.2.Paginación.
La paginación es una técnica que nos permite que el espacio de direcciones físicas de un proceso no sea
contiguo.
Consiste en descomponer la memoria lógica en bloques de mismo tamaño llamados páginas, y descomponer
la memoria física en bloques de igual tamaño llamados marcos. Cuando un proceso se quiere ejecutar,
primero se debe cargar en la memoria principal las páginas del proceso.
Toda dirección generada por el CPU se va a componer de dos partes, un numero de página (p) y un
desplazamiento (d). Dicho número de página sirve como índice para la tabla de páginas. Dentro de esta tabla
de páginas se encuentra la dirección base de cada página en la memoria, a la cual se le va a sumar el
desplazamiento de la página para determinar cuál es la dirección a la que hace referencia el CPU.
Cuando llega un proceso, el sistema analiza dicho proceso en función a la paginas, cada página necesita un
marco en la memoria principal, por lo que, si el proceso está compuesto por n páginas, necesitara n marcos
en la memoria.
Puesto a que el sistema operativo está gestionando la memoria física, este debe llevar un registro de cuales
marcos están cedidos y cuales están disponibles, por lo que utiliza una estructura denominada tabla de
marcos, donde cada entrada de esta tabla es un marco con la información de si está ocupado o no, y en el
caso de que lo estuviese, por cual página del proceso lo está.
En el método básico de paginación es necesario que todas las páginas de un proceso se encuentren dentro
de la memoria principal para que este pueda ser ejecutado.
Los esquemas de paginación no van a producir una fragmentación externa, debido a que todos los marcos
pueden utilizarse, pero si se producirá una fragmentación interna debido a que en algunos casos los
programas ocupen menos tamaño del que nos permite la frontera del marco, por lo que quizás el ultimo
marco del programa no se llene.
3.2.Soporte de hardware.
El soporte en hardware de la paginación consiste en utilizar una memoria cache muy pequeña que se llama
buffer de consulta de traducciones, el cual solo contiene la información de unas cuantas páginas, que
generalmente suelen ser las más usadas. Cuando la CPU genera una dirección lógica, lo que hace este
dispositivo es analizar si dentro de su memoria se encuentra el número de página a la que se hace
referencia, y en el caso de que se lo encuentre, devolver el marco correspondiente para acceder a la
memoria.
La finalidad de este dispositivo de hardware es la de reducir el tiempo de acceso a la memoria por parte de
los procesos.
3.2.Proteccion.
Dentro de la paginación la protección de la memoria consiste en utilizar unos bits adicionales de protección con cada
marco, que generalmente se los mantiene en la tabla de páginas.
Estos bits podrían indicarnos si la página a la que se está haciendo referencia es de lectura o escritura, con lo que,
además de hacer el cálculo de la dirección física del mismo, controla que no se esté escribiendo sobre una página de solo
lectura.
Otro bit que se suele incorporar con cada entrada de la tabla de páginas es el de valido-invalido , cuando una página
está configurada como válida, quiere decir que dicha página se encuentra dentro del espacio de direcciones lógica por lo
que puede acceder a ella. Sin embargo, si una página se encuentra configurada como invalida, la página no se encuentra
dentro del espacio de direcciones lógica del proceso, por lo cual se denegaría su acceso.
3.2.Paginas compartidas.
Una gran ventaja que presenta la técnica de paginación es la de compartir paginas entre varios procesos,
situación que se suele presentar en sistemas operativos de tiempo compartido.
En el caso de que se esté trabajando con varios usuarios que están utilizando el mismo programa, teniendo
páginas de programa y páginas de datos, en vez tener en memoria su propia página del programa que están
ejecutando para los “n” usuarios, lo que se hace tener una sola copia del mismo programa en la memoria y
que cada tabla de página de los usuarios contenga la misma dirección física del programa, pero sus datos en
diferentes direcciones, por lo que por consecuente, se reduce de manera considerable el espacio utilizado.
3.2.Segmentación simple.
De manera similar a la paginación, la segmentación es una técnica que nos permite dividir la memoria logica
en bloques, aunque, a diferencia de la paginación, en este caso no es necesario que tengan el mismo
tamaño, solo no tienen que superar el tamaño máximo. De manera similar a la paginación, una dirección
lógica segmentada está compuesta por un numero de segmento y su longitud, calculando la dirección física
de la misma manera.
Como en este caso no se trabaja con bloques del mismo tamaño, trabajaría de manera similar a una
partición dinámica, con la diferencia que en esta técnica un segmento puede ocupar más de una partición y
no estar necesariamente continuas.
Al trabajar con la segmentación simple un proceso se divide en segmentos de distintos tamaños, por lo que
cuando se carga en la memoria principal, tiene que trasladar todos los segmentos en espacios libres de la
misma.
Estructura de la tabla de segmento.
Cuando se genera una dirección lógica, el desplazamiento del mismo no debe superar el LIMITE DEL
SEGMENTO.
3.3.Memoria Virtual.
La memoria virtual es una técnica de gestión de espacio de memoria que tiene como objetivo
intentar que la información que un proceso está utilizando en un preciso momento resida en la
memoria principal y dejar que el resto no utilizado resida en la memoria secundaria.
Además, esta técnica no acelera el proceso de la ejecución, sino que es capaz de hasta ralentizar el
ritmo, debido al constante cambio de información entre la memoria principal y secundaria, por lo
que no es muy óptimo para s.o. En tiempo real.
3.3.Paginacion
La paginación es igual a cuando no se utiliza memoria virtual, la diferencia yace en:
Si se hace referencia a una dirección no asociada, la MMU lo detecta y hace que la CPU haga un trap al
sistema operativo. A este trap se le llama fallo de página. El sistema operativo selecciona un marco de
página que se utilice poco y escribe su contenido de vuelta al disco (si no es que ya está ahí). Después
obtiene la página que se acaba de referenciar en el marco de página que se acaba de liberar, cambia la
asociación(página que antes estaba en el marco se le pone bit ausente y a la página que va a ocupar su lugar
se le pone el bit presente y el registro base) y reinicia la instrucción que origino el trap.
3.3.Tabla de paginas
Como se había detallado anteriormente, una tabla de páginas contiene la información sobre que marco o no
tiene asociado dicha página, además de información adicional sobre la página con respecto a su utilización.
NUMERO DE MARCO DE PAGINA: este campo INDICA CUAL ES EL MARCO QUE TIENE ASOCIADO LA
PÁGINA en el caso que lo tuviere
BIT PRESENTE/AUSENTE: este campo INDICA SI LA PÁGINA SE ENCUENTRA DENTRO O NO DE LA
MEMORIA PRINCIPAL, siguiendo una lógica positiva, si este bit se encuentra en 1 quiere decir que la
página se encuentra dentro de la memoria, en el caso de que sea 0 indica que se encuentra fuera
de la misma.
BITS DE PROTECCION: este campo INDICA SI LA PÁGINA ES DE LECTURA/ESCRITURA O LECTURA
SOLO. De manera más sofisticada este campo se divide en 3, uno para escritura, uno para lectura y
uno para ejecución.
MODIFICADA: este campo INDICA SI LA PAGINACIÓN SUFRIÓ UNA MODIFICACIÓN POR ESCRITURA.
Este campo es importante dentro de las paginas ya que, si este no se encuentra modificado, cuando
se reemplace esta página no es necesario que se transfiera al disco, ya que la copia que se
encuentra dentro del disco es igual a la de la memoria principal, por lo que se la puede descartar,
no es así en el caso de que si haya sufrido una modificación.
REFERENCIADA: este campo INDICA SI LA PÁGINA FUE SOLICITADA O NO EN UN DETERMINADO
TIEMPO. Este campo le sirve al sistema operativo para determinar cuál de las páginas en memoria
es la más apta para ser reemplazada cuando ocurre un fallo, ya que si reemplazamos una página
que se utiliza frecuentemente, puede presentar más fallos en un futuro.
USO DE CACHE DESHABILITADO: este campo INDICA SI LA PAGINA TIENE HABILITADA O NO EL USO
DEL CACHE. Este campo no es muy utilizado en algunos sistemas operativos, pero de igual forma
hay que tenerlos en cuenta.
Aunque la implementación de la paginación para reducir el espacio utilizado por cada proceso en la
memoria principal se presenta como una gran solución, sigue existiendo el limitante del espacio disponible,
ya que las tablas de páginas ocupan un espacio dentro de la memoria principal.
Por lo que, para dar solución a este inconveniente, se presenta la técnica de tabla de paginas invertida, que
consta en una tabla que, en vez de tener una entrada por cada página, tiene una entrada por cada marco de
página en la memoria real. Por lo que en cada entrada se indica quien está ocupando dicho marco de la
página.
Aunque resuelven el problema del espacio utilizado por las paginas, tiene como desventaja el tiempo de
acceso a la memoria principal, ya que ahora tiene que buscar en toda la tabla una página “p” referenciada
por un proceso “n”, y no tomar la página “p” como índice como se realizaba en la paginación común. Para
solucionar este inconveniente se puede implementar el soporte por hardware (buffer de consulta de
traducciones).
Otra manera de solucionar el problema del espacio ocupado por las tablas de páginas es con la técnica de la
tabla de paginas jerarquica
De manera simplificada esta técnica consiste en paginar las tablas de página, es decir, dividir la tabla de
páginas a su vez en bloques, formando así una tabla de páginas externa, formada por páginas que contienen
porciones de la tabla de páginas del proceso, y una tabla de páginas interna, formada por pociones de
direcciones lógicas del proceso. Por lo que, por consecuente, una dirección lógica quedaría de la siguiente
forma:
En el caso de que aun paginando la tabla de páginas en dos niveles seguiría siendo de un tamaño
considerado, se podría profundizar aún más la técnica llegando a tener 3, o 4 niveles
Aunque se podría reemplazar cualquier página al azar, existen algoritmos de reemplazo hacen más eficiente
el reemplazo de páginas. Estos son:
Optimo
Este tipo de algoritmo en realidad no es posible implementarlo. Se basa en reemplazar la página la cual no
vaya a ser referenciada por un largo periodo, pero al igual que la planificación de trabajo más corto, el
sistema operativo no sabe cuándo se va a referenciar una página luego de que ocurre un fallo de pagina
No Usadas Recientemente
Este tipo de algoritmo de reemplazo trabaja con los bits de referenciada y modificada de las tablas de
página. Se basa en agrupar las paginas en 4 niveles de acuerdo a los valores de estos bits:
FIFO
Este algoritmo, como su nombre lo indica, tiene una lista en donde las paginas se encuentran ordenadas por
llegada, una vez que ocurre un fallo de página toma la primera página que entro a la memoria y la reemplaza
por la entrante, colocando esta al último de la lista.
Segunda oportunidad
Es una versión mejorada del FIFO. Cuando ocurre un fallo de página, primero analiza si la página fue
referenciada o no, si no lo fuere es reemplazada de inmediato, pero en el caso de que si, se resetea la
referenciada a la página y se la carga al final. El problema de este método es que desordena constantemente
el orden de las paginas
Reloj
Método que soluciona el problema del anterior. Se implementa ubicando las paginas en una lista circular y
coloca un puntero en la página más antigua, cuando ocurre un fallo verifica si la página fue referenciada, en
el caso de que lo fuere el puntero avanza a la siguiente página y resetea el valor de referenciada de la
página, y continua así hasta que encuentra una página sin referenciarse y la reemplaza.
LRU
La política de reemplazo LRU selecciona como candidata la página de memoria que no se ha referenciado o
utilizado durante el mayor periodo de tiempo. Debido al principio de proximidad referenciada, esta página
sería la que tiene menos probabilidad de volver a tener referencias en un futuro próximo y de hecho la
política LRU proporciona unos resultados casi tan buenos como la política óptima. EL problema con este
algoritmo es la dificultad de su implementación. Además requiere un considerable apoyo del hardware.
Una forma de implementación es utilizando contadores. Utilizando un contador que se incremente por cada
referencia a memoria, cada posición de la tabla de páginas ha de tener un campo de tamaño suficiente para
que quepa el contador.
Cuando se referencia a una página, el valor actual del contador se copia por hardware a la posición de la
tabla correspondiente a esa página. Cuando se produce un fallo de página, el Sistema Operativo examina los
contadores de todas las páginas residentes en memoria y selecciona como víctima aquella que tiene el
menor valor. Esta implementación es factible aunque requiere un hardware complejo y muy específico.
Otra forma es utilizando una matriz. En una maquina con n marcos para página, el hardware LRU puede
utilizar una matriz de nxn bits, cuyos datos iniciales son todos cero. En una referencia al marco K, el
hardware primero activa todos los bits del renglón K y desactiva después todos los bits de la columna K. En
cualquier instante, el renglón cuyo valor binario es mínimo es el de uso menos reciente.
3.3.Hiperpaginación.
Este fenómeno sucede cuando se generan demasiado fallos de páginas en un periodo, por lo que entorpece
la eficiencia de trabajo. Los motivos por los que se puede generar la hiperpaginacion son:
Cuando el grado de multiprogramación es muy alto, es decir cuando existen muchos procesos
activos en memoria.
Cuando un proceso tiene asignada pocas páginas, por lo que le imposibilita realizar su trabajo.
Cuando se inicializa un proceso, generalmente hay que llenar diversas estructuras en memoria física, lo que
nos producirá diversos fallos de página. Estos fallos de página harán que el rendimiento del sistema
operativo decrezca a gran escala debido a que el disco secundario es millones de veces mas lento que las
ram. Cuando el sistema operativo detecta que su rendimiento bajó considerablemente empieza a realizar
tareas de mantenimiento que se cargan en ram, disminuyendo aún más el rendimiento.
Una solución a esta problemática sería la de bajar el grado de multiprogramación del sistema, suspendiendo
uno o mas procesos hasta que el sistema vuelva a su estado normal.
3.4. Condiciones de Diseños para Sistemas Paginado: Tamaño de
paginas.
Los tamaños de página son invariablemente potencias de 2, que generalmente son de 512 (2^9) a los 16384
(2^14) bytes.
Para determinar el mejor tamaño de página se requiere balancear varios factores competitivos. Como
resultado no hay un tamaño óptimo general.
Hay quienes favorecen el tamaño de página pequeño, otros tamaños más grandes
Con un tamaño de página menor, permite que cada página se ajuste con mayor precisión a la localidad del
programa, es decir, obtenemos una mejor resolución lo que no permite aislar la memoria que realmente se
necesita. Si el tamaño de página es mayor, tenemos que transferir y asignar no solo lo que se necesita sino
todo lo demás que se encuentre en la página. Se requiera o no.
Por otra parte, un tamaño de página pequeño produciría muchos fallos de página, lo que puede derivar en
una hiperpaginacion. Por lo cual sería conveniente un tamaño de página más grande.
La tendencia histórica va hacia tamaños mayores de página. Como consecuencia de que la velocidad de la
CPU y la capacidad de la memoria principal han aumentado con mayor rapidez que la velocidad de los
discos.
3.4.Vaciado de paginas
La política de vaciado se centra en cuál es el momento óptimo para actualizar la información de una página
que ha sido modificada. Existe dos políticas: por demanda y vaciado previo
El vaciado por demanda se basa en actualizar las paginas modificadas en el momento que se las
desee reemplazar por paginas nuevas. Tiene como desventaja que aumenta el tiempo de espera de
las paginas cuando ocurre un fallo de página.
El vaciado previo se basa en actualizar los cambios de las paginas antes de que se las reemplace. El
problema radica en que algunas páginas pueden ser vaciadas en un periodo y luego volver a ser
modificadas antes del siguiente periodo de vaciado.
Una solución para resolver los inconvenientes que encontramos en ambas políticas de vaciado, seria la
de implementar una memoria intermedia(buffering de pagina). En este caso solo se vacían aquellas
paginas que pueden ser reemplazadas.
3.4.Control de carga.
El control de carga determina el número de procesos que residirán en la memoria principal, eso se
denomina, grado de multiprogramación. Cuando el número de procesos en memoria principal es demasiado
bajo, la CPU puede estar inactiva durante largos periodos. Por otro lado si hay muchos procesos residentes,
entonces el tamaño de conjunto residente de cada proceso no es adecuado y se producirán frecuentes fallos
de páginas. El resultado de eso se deriva en la hiperpaginacion.
3.4.Grado de multiprogramación.
Se denomina grado de multiprogramación al número de procesos activos que mantiene el sistema. Si el
grado de multiprogramación se hace demasiado alto, el número de fallos de página se dispara y el
rendimiento del sistema baja drásticamente. A esta situación se le denomina hiperpaginación.
3.4.Suspension de procesos
- Asignación fija: Se asigna a cada proceso un número fijo de marcos de página. Este
número se decide en el momento de la carga inicial del proceso. Con esta política siempre
que se produzca un fallo de página del proceso en ejecución, la página que se necesite
reemplazar se hará con un reemplazo local, es decir se selecciona únicamente entre la
paginas residentes del proceso que ha generado el fallo de página.
-
La desventaja de esta estrategia son dos: Si las reservas de memoria (Marcos) resulta
pocas va a haber una alta tasa de fallos, haciendo que se relentice el sistema. Si la reserva
son demasiado granes, habrá pocos programas en memoria principal y habrá tiempo
ocioso por parte de la CPU.
-
- Asignación variable: El número de marcos asignados a un proceso varía según las
necesidades que tenga el proceso en diferentes instantes de tiempo. Con este tipo de
asignación se pueden usar estrategias de reemplazo locales y también globales.
* Con reemplazo local, el proceso se va aumentado o disminuyendo su conjunto residente
dependiendo de sus necesidades en distintas fases de ejecución del programa, cuando
ocurra un fallo de página, la página que se seleccionara para reemplazar pertenecerá al
conjunto residente del proceso que cause el fallo.
* Con reemplazo global: Con esta política, cuando ocurre un fallo de página, se permite
que un proceso seleccione un marco para reemplazar de entre todo el conjunto de
marcos, incluso si ese marco está asignado a otro proceso. De esta forma se incrementara
el número de procesos que tiene asignados. El problema es que un proceso no puede
controlar su propia tasa de fallos de página.
El reemplazo local puede afectar a un proceso al no permitir que tenga acceso a otras
páginas de memoria menos usadas.
Esta técnica se basa en juntar las dos técnicas anteriores, tanto paginación como segmentación.
El espacio de memoria de cada proceso se divide en segmentos, donde cada uno de estos
segmentos alojan un conjunto de páginas de igual tamaño para todo el mapa de memoria del
proceso, los cuales estos últimos estarán apuntando a los marcos donde se alojarían dichas
páginas.
Dispositivos de E/S: son elementos que se conectan a la CPU a través de las unidades de E/S. Son
el componente mecánico que se conecta a la máquina. Se pueden clasificar en 3 categorías:
- Dispositivos de interfaz de usuario: Permiten la comunicación entre los usuarios y la computadora.
Se incluyen todos los dispositivos que sirven para proporcionar interfaz con el usuario tanto para
entrada como para salida.
- Dispositivo de almacenamiento: Se usan para proporcionar almacenamiento no volátil de datos y
memoria. Su función primordial es abastecer de datos y almacenamiento a los programas que se
ejecutan en la computadora.
- Dispositivo de comunicaciones: Permiten conectar a la computadora con otras a través de una red.
Los dos más importantes son el modem y las tarjetas de red.
El sistema de entrada/salida está construido como un conjunto de controladores apilados, cada uno de los
cuales está asociado a un dispositivo de entrada/salida (archivos, red, etc.). Ofrece a las aplicaciones y
entornos de ejecución servicios genéricos que permiten manejar los objetos de entrada/salida del sistema.
A través de ellos se puede acceder a todos los manejadores de archivos y de dispositivos tales como discos,
cintas, redes, consola, tarjetas de sonido, etc.
Interfaz del sistema operativo para entrada/salida. Proporciona servicios de E/S síncrona y
asíncrona a las aplicaciones y una interfaz homogénea para poderse comunicar con los
manejadores de dispositivo ocultando los detalles de bajo nivel.
Sistemas de archivos. Proporcionan una interfaz homogénea, a través del sistema de archivos
virtuales, para acceder a todos los sistemas de archivos que proporciona el sistema operativo (FFS,
SV, NTFS, FA T, etc.). Permite acceder a los manejadores de los dispositivos de almacenamiento de
forma transparente, incluyendo en muchos casos, como NFS o NTFS, accesos remotos a través de
redes. En algunos sistemas, como Windows NT, los servidores para cada tipo de sistema de archivos
se pueden cargar y descargar dinámicamente como cualquier otro manejador.
Gestor de redes. Proporciona una interfaz homogénea para acceder a todos los sistemas de red
que proporciona el sistema operativo (TCP/IP, Novell, etc.). Además, permite acceder a los
manejadores de cada tipo de red particular de forma transparente.
Gestor de bloques. Los sistemas de archivos y otros dispositivos lógicos con acceso a nivel de
bloque se suelen limitar a traducir las operaciones del formato del usuario al de bloques que
entiende el dispositivo y se las pasan a este gestor de bloques. El gestor de bloques admite
únicamente operaciones a nivel de bloque e interacciona con la cache de bloques para optimizar la
E/S.
Manejadores de dispositivo. Proporcionan operaciones de alto nivel sobre los dispositivos y las
traducen en su ámbito interno a operaciones de control de cada dispositivo particular. Como ya se
ha dicho, los manejadores se comunican con los dispositivos reales mediante puertos o zonas de
memoria especiales.
Esta alternativa propone que el procesador genere la orden de E/S para un módulo y acto seguido continúe
realizando algún otro trabajo útil. El módulo de E/S interrumpirá más tarde al procesador para solicitar su
servicio cuando esté listo para intercambiar datos con el mismo. El procesador ejecutará la transferencia de
datos y después reanudará el procesamiento previo.
Desde el punto de vista del módulo o controlador de E/S: El módulo recibe un mandato de lectura del
procesador. El módulo de E/S pasa entonces a leer los datos del periférico asociado. Una vez que los datos
están en el registro de datos del módulo, el módulo genera una interrupción al procesador a través de una
línea de control. El módulo entonces espera hasta que el procesador pida sus datos. Cuando se hace la
petición, el módulo sitúa sus datos en el bus de datos y ya está listo para otra operación de E/S.
Desde el punto de vista del procesador: El procesador genera un mandato de lectura, salva el contexto
(Guarda) del programa actual y lo abandona, pasando a hacer otra cosa. Al final de cada ciclo de instrucción,
el procesador comprueba si hay interrupciones. Cuando se produce la interrupción del módulo de E/S, el
procesador salva el contexto del programa que se está ejecutando actualmente y comienza a ejecutar un
programa de manejo de interrupción que procesa la interrupción. En este caso el procesador lee la palabra
de datos del módulo de E/S, (O de algún otro programa) y reanuda su ejecución.
La E/S dirigida por interrupciones es más eficiente que la E/S programada, pero todavía consume mucho
tiempo de procesador, puesto que cada palabra de datos que va desde o hacia la memoria debe pasar a
través del procesador.
Casi invariablemente, habrá múltiples módulos de E/S en un computador, por lo que se necesitan
mecanismo para permitir que el procesador determine que dispositivo causo la interrupción y para decidir,
en caso de múltiples interrupciones, cual debe manejar primero. En algunos Sistemas, hay múltiples líneas
de interrupción de manera que cada módulo de E/S usa una línea diferente.
La función de DMA(acceso directo a memoria) puede llevarla a cabo un módulo separado
conectado en el bus del Sistema o puede estar incluida en un módulo de E/S.
Esta técnica consiste en que el controlador del dispositivo se pueda encargar de efectuar la
transferencia de datos, entre el periférico y la memoria principal, liberando de este trabajo a la
CPU, e interrumpir a la CPU solo cuando haya terminado la operación completa de E/S.
Cuando el procesador desea leer o escribir un bloque de datos, genera o envía una orden al
controlador de DMA, enviándole la siguiente información:
Cuando el módulo ha completado la transferencia, genera una interrupción que activa la rutina de
tratamiento correspondiente, de tal manera que se sepa que la operación ha concluido.
El módulo de DMA necesita tomar el control del bus para transferir datos hacia la memoria o
desde ella. Debido a esta competencia en el uso del bus, puede haber veces en la que el
procesador necesita el bus y debe esperar al módulo de DMA. (Esto no es una interrupción ya que
el procesador no salva el contexto y pasa a hacer otra cosa). El efecto global es causar que el
procesador ejecute más lentamente durante una transferencia de DMA en el caso de que el
procesador requiera acceso l bus.
Sin embargo, para una transferencia de E/S de múltiples palabras, el DMA es mucho más eficiente
que la E/S dirigida por interrupciones o la programada.
4.3.Principios de Software de Entrada-Salida.
El software de E/S se organiza en cuatro capas, cada una tiene una función bien definida que
realizar.
Los procesos de usuarios emiten peticiones de E/S al Sistema Operativo, cuando un proceso
solicita una operación de E/S, el Sistema Operativo prepara dicha operación y bloquea al proceso
hasta que se recibe una interrupción del controlador del dispositivo indicando que la operación
está completa. Las peticiones se procesan de forma estructurada en las siguientes capas.
Manejadores de interrupciones.
Manejadores de dispositivos y drivers.
Software de E/S independiente de los dispositivos. (Formado por la parte del alto
nivel de los manejadores, el gestos de caché, el gestor de bloques y el servidor de
archivos).
Interfaz del Sistema Operativo. Llamadas al Sistema que usan las aplicaciones de
usuario. Software de E/S de capa de usuario.
Manejadores de interrupción:
Los manejadores de interrupción se encargan de tratar las interrupciones que generan los
controladores de dispositivos una vez que estos están listos para la transferencia de datos o bien
han leído o escrito los datos de memoria principal en caso de acceso directo a memoria. Para
tratar dicha interrupción se ejecuta el correspondiente manejador de interrupción cuyo efecto es
el de salvar los registros, comunicar el evento al manejador del dispositivo y restaurar la ejecución
de un proceso (Que no tiene por qué ser interrumpido).
Los manejadores de interrupción suelen hacer algo más que comunicar el evento al manejador de
dispositivo. Cuando una interrupción ocurre muy frecuentemente, caso del reloj, o cuando la
cantidad de información a transferir es muy pequeña, caso del teclado, sería muy costoso
comunicar siempre el evento al manejador del dispositivo asociado. En estos casos el propio
manejador de interrupción registra la ocurrencia del evento, bien mediante el incremento de una
variable global para el reloj o la acumulación de caracteres en un buffer del teclado. La notificación
al manejador se hace únicamente con cierto número de ocurrencias del evento en el caso del
reloj, o activando una bandera que indica que hay datos en el buffer del teclado.
Cada dispositivo de E/S o cada clase de dispositivo, tienen un manejador asociado en el Sistema
Operativo. Dicho manejador incluye código independiente del dispositivo para proporcionar al
nivel superior del Sistema Operativo, una interfaz de alto nivel y el código dependiente necesario
para programar el controlador del dispositivo a través de sus registros y mandatos.
La tarea del manejador de dispositivos es aceptar peticiones en formato abstracto, de la parte del
código de E/S independiente del dispositivo, traducir dichas peticiones a términos que entienda el
controlador, enviar al mismo las ordenes adecuadas en la secuencia correcta y esperar a que se
cumplan.
Todos los manejadores tienen una lista de peticiones pendientes por dispositivo donde se encolan
las peticiones que llegan de niveles superiores. El manejador explora la lista de peticiones, extrae
una petición pendiente y ordena su ejecución. Una vez enviada la petición al controlador, el
manejador se bloquea o no, dependiendo de la velocidad del dispositivo. Para los lentos (Discos
por ej...), se bloquea esperando una interrupción. Para los rápidos, (Pantallas, memorias RAM),
responde inmediatamente.
Después de recibir el fin de operación, controla la existencia de errores y devuelve al nivel superior
el estado de terminación de la operación. Si tiene operaciones pendientes en la cola de peticiones,
atiende a la siguiente, en caso de que le toque ejecutar después de la operación de E/S. En caso
contrario se bloquea.
En los Sistemas Operativos modernos, los manejadores se agrupan en clases. Para cada clase
existe un manejador genérico que se encaja de las operaciones de E/S para una clase de
dispositivos, tales como el disco, la cinta, etc... . Cuando se instala un dispositivo particular como
por ejemplo el disco SEAGATE S300, se crea una instalación de manejador de clase con los
parámetros específicos de ese objeto. Todas las funciones comunes al manejador de una clase se
llevan a cabo en el manejador genérico y las particulares en el del objeto. De esta forma se crea un
apilamiento de manejadores que refleja muy bien en que operaciones son independientes del
dispositivo y en cuáles no.
La mejor parte del Sistema de E/S es el software independiente del dispositivo. Esta capa o niveles,
incluye el Sistema de archivos y el de gestión de red, el gestor de bloques, la cache de bloques y
una parte de los manejadores de dispositivo. La función principal de esta capa de software es
ejecutar las funciones de E/S que son comunes a todos los dispositivos a través de una interfaz
uniforme. Internamente, en este nivel se proporciona acceso a nivel de bloques o caracteres,
almacenamiento intermedio, gestión de los dispositivos, planificación de la E/S y control de
errores.
El tamaño de acceso al nivel de bloques se hace usando tamaños de bloques de acceso comunes
para todo un Sistema de archivos, lo que permite ocultar que el dispositivo pueda tener distinto
tamaño de sectores y distinta geometría. Estos detalles quedan ocultos por la capa de software
independiente del dispositivo que ofrece una interfaz sobre la base de bloques lógicos del Sistema
de archivos. Lo mismo ocurre con los dispositivos de caracteres, algunos de los cuales trabajan con
un carácter cada vez como el teclado, mientras otros trabajan con flujos de caracteres como el
modem o las redes.
Para optimizar las E/S y para armonizar las peticiones de usuario, que pueden ser de cualquier
tamaño, con los bloques que maneja el Sistema de archivos, el software de E/S proporciona
almacenamiento intermedio en memoria del Sistema Operativo. Esta facultad se usa para tres
cosas:
El Sistema de E/S mantiene buffers en distintos componentes. Por ejemplo, en la parte del
manejador del teclado independiente del dispositivo existe un buffer para almacenar los
caracteres que teclea el usuario hasta que se pueden entregar a los niveles superiores.
La gestión de los dispositivos agrupa a su vez tres servicios: Nombrado, protección y control de
acceso. El nombrado permite traducir los nombres de usuario a identificadores del sistema. Cada
dispositivo tienen asociado una información de protección y este nivel de software asegura que los
requisitos de protección se cumplen. Además proporciona control de acceso ara que un
dispositivo dedicado, (como una impresora), sea accedido por un único usuario cada vez.
Una de las funciones principales del Sistema de E/S es la planificación de E/S de los distintos
componentes. Para ellos se usan colas de peticiones para cada clase de dispositivo, de las que se
extraen las peticiones de cada dispositivo en particular. Cada una de estas colas se ordena
siguiendo una política de planificación, que puede ser distinta en cada nivel.
Esta capa proporciona gestión de errores, para aquellos casos que el manejador de dispositivo no
puede solucionar. Un error transitorio de lectura de un bloque se resuelve en el manejador
reintentando su lectura. Un error permanente de lectura no puede ser resuelto y debe ser
comunicado al usuario para que tome las medidas adecuadas. En general, todos los Sistemas
Operativos incluyen alguna forma de control de errores internos y de notificación al exterior en
caso de que esos errores no se puedan resolver.
Interfaz de aplicaciones:
Las aplicaciones tienen acceso al Sistema de E/S a través de las llamadas al Sistema Operativo,
relacionadas con la gestión de archivos y con la E/S.
En muchos casos, las aplicaciones no acceden directamente a las llamadas del Sistema, sino a
utilidades que llaman al Sistema en representación del usuario. Las principales utilidades de este
estilo son:
- Las bibliotecas de los lenguajes como las que traducen la petición del usuario a llamadas
del Sistema, convirtiendo los parámetros allí donde es necesario.
- Los demonios del Sistema, como los de red o los Spooler de las impresoras. Son programas
privilegiados que pueden acceder a recursos que las aplicaciones normales no tienen
acceso.
Esta forma de relación a través de representantes existe principalmente por razones de seguridad
y control de acceso.
La interfaz de ES de las aplicaciones en la que define el modelo de E/S que ven los usuarios, por lo
que, cuando se diseña un Sistema Operativo, hay que tomar varias decisiones relativas a la
funcionalidad que se va a ofrecer al mundo exterior en las siguientes cuestiones:
La elección de unas u otras características determina la visión del Sistema de E/S del usuario.
Sin embargo la mayoría de las aplicaciones efectúan operaciones de E/S con lógica bloqueante, lo
que significa que emiten la operación y esperan hasta tener el resultado antes de continuar su
ejecución. En este tipo de operaciones, el Sistema Operativo recibe la operación y bloquea al
proceso emisor hasta que la operación de E/S ha terminado. Momento en que se desbloquea a la
aplicación y le envía el estado del resultado de la operación. En este caso, la aplicación puede
acceder a los datos inmediatamente ya que los tiene disponibles en la posición de memoria
especificada, a no ser que hubiera un error de E/S. Este modelo de programación es claro y
sencillo, por lo que las principales llamadas al Sistema de E/S bloquean al usuario y complementan
la operación antes de devolver el control al usuario.
Las llamadas de E/S no bloqueantes se comportan de forma muy distinta, reflejando mejor la
propia naturaleza del comportamiento de los dispositivos de E/S. Estas llamadas permiten a la
aplicación seguir su ejecución, sin bloquearla, después de hacer una petición de E/S. El
procesamiento de la llamada de E/S consiste en recuperar los parámetros de la misma, asignar un
identificador de operación de E/S pendiente de ejecución y devolver a la aplicación que sigue
ejecutando su código. Es responsabilidad de la aplicación preguntar por el estado de la operación
de E/S usando una llamada al Sistema especial para realizar esta consulta o cancelarla si ya no le
interesa o tarda demasiado.
Este modelo es más complejo pero se ajusta muy bien al modelo de algunos Sistemas que emiten
peticiones y reciben la respuesta después de un cierto tiempo.
Una de las funciones más importantes de la interfaz de usuario es dar indicaciones de control de
acceso a los dispositivos e indicar cuales son compartidos y cuales son dedicados.
La seguridad es un aspecto importante de control de accesos. No basta con que se resuelvan los
conflictos de acceso. Hay que asegurar que el usuario que accede al Sistema de E/S tiene derechos
de acceso suficientes para llevar a cabo las operaciones que solicita.
Indicaciones de error:
Las operaciones del Sistema Operativo pueden fallar debido a cuestiones diversas. Es importante
decidir cómo se va a indicar al usuario esos fallos.
Uso de estándares:
Proporcionar una interfaz de usuario estándar garantiza a los programadores la posibilidad de sus
aplicaciones, así como un comportamiento totalmente predecible de las llamadas al sistema, en
cuanto a definición de sus prototipos y resultados
4.4.Discos.
EL Sistema de almacenamiento secundario se usa para guardar los programas y datos en dispositivos
rápidos, de forma que sean fácilmente accesibles a las aplicaciones a través del Sistema de archivos. Hay dos
elementos principales involucrados en este Sistema: Discos y manejadores de disco.
Discos: Los discos son dispositivos básicos para llevar a cabo el almacenamiento masivo y no volátil de datos.
Además se usan como plataforma para el Sistema de intercambio que usa el gestor de memoria virtual. Son
dispositivos electromecánicos u opto mecánicos que acceden a nivel de bloque lógico por el Sistema de
archivos.
Discos duros: Dispositivos de gran capacidad compuestos por varias superficies magnetizadas y
cuyas cabezas lectoras funcionan por efecto electromagnético.
Discos Ópticos: Dispositivos de gran capacidad compuestos por una sola superficie y cuyas cabezas
lectoras funcionan por láser. (Por ejemplo CD, DVD etc...)
4.4.Estructura de discos.
Estructura física de los discos: Un disco duro es un dispositivo de gran capacidad compuesto por varios
platos, cada plato tiene forma circular plana como un CD. Los diámetros comunes de los platos varían entre
1,8´a 5,25´ pulgadas. Las dos superficies de cada plato están recubiertas de un material magnético. La
información se almacena grabándola magnéticamente sobre los platos.
un cabezal de lectura-escritura “vuela” justo por encima de cada una de las superficies de cada plato. Los
cabezales están conectados a un brazo del disco que mueve todos los cabezales como una sola unidad.
En el ámbito organizativo, las superficies de cada plato están divididas en pistas circulares, que a su vez se
dividen en sectores. El conjunto de pistas que están situadas en una determinada posición del brazo forman
un cilindro (Por la figura geométrica que forman las cabezas al moverse en paralelo simultáneamente sobre
los discos).
Cuando se está usando el disco, un motor hace que gire a una velocidad constante. La mayoría de los
motores rotan entre 60 y 200 veces por segundo.
Para leer o escribir la cabeza se debe posicionar en la pista deseada y en el principio del sector requerido de
dicha pista.
EL tiempo que se tarda en situar la cabeza en la pista se denomina “Tiempo de búsqueda”. Una vez que se
selecciona la pista, el controlador del disco espera hasta que el sector apropiado rote debajo de la cabeza. El
tiempo que tarda en llegar el comienzo del sector hasta debajo de la cabeza se conoce como “Retardo
rotacional”, o “Latencia rotacional”, también “Tiempo de latencia”). La suma del tiempo de búsqueda y el
retardo rotacional dan lugar al tiempo de acedo, que es el tiempo que se tarda en llegar a estar en posición
para realizar la lectura o escritura. Una vez que la cabeza está en posición, la operación de lectura o escritura
se realiza cuando el sector se mueve debajo de la cabeza, esta es la parte de la transferencia de datos de la
operación, el tiempo requerido para la transferencia es el tiempo de transferencia.
Puesto que el cabezal del disco vuela sobre un colchón de aire extremadamente fino, existe el peligro de que
el cabezal entre en contacto con la superficie del disco. Aunque los platos del disco están recubiertos de una
fina capa protectora, a veces el cabezal puede llegar a dañar la superficie magnética, siendo necesario
sustituir el disco.
Para conectar una unidad de disco a una computadora se utiliza un conjunto de cables denominados bus de
E/S. Hay disponibles varios tipos de buses, incluyendo ATA, SATA, USB etc...
1) El diseño del fabricante, que define su velocidad de rotación, ancho de banda del bus etc…
2) La operación de formato físico, que define el tamaño del sector y l posición de los sectores en las
pistas. Los discos duros suelen venir con formato físico de fábrica.
Tiempo de búsqueda:
El tiempo de búsqueda es el tiempo requerido par amover el brazo del disco a la pista requerida. El tiempo
de búsqueda consta de dos componentes fundamentales: El tiempo de arranque inicial y el tiempo que se
tarda en atravesar las pistas que tienen que cruzarse una vez que el brazo de acceso empieza a moverse. Por
desgracia el tiempo para atravesar las pistas no es una función lineal del número de pistas sino que incluye
un tiempo de establecimiento (el tiempo que transcurre desde un tiempo normal de búsqueda medio en los
discos duros actuales está por debajo de los 10 milisegundos).
Retarde rotacional:
Los discos rotan a velocidades que van desde los 3600 rpm hasta 15000 rpm, a esta última velocidad se
produce una revolución cada 4 milisegundos.
Tiempo de transferencia:
El tiempo de transferencia de un disco depende de la velocidad de rotación de acuerdo con la siguiente
expresión:
T= b/rN
Donde:
T= Tiempo de transferencia.
R= Velocidad de rotación.
Por lo tanto, el tiempo de acceso total medio se puede expresar de la siguiente manera:
- Política FIFO: Es la forma más sencilla de planificación, procesa las peticiones en orden
secuencial. Esta estrategia tienen la ventaja de ser equitativa, porque toda petición se
acaba sirviendo y además las peticiones se sirven en el orden recibido.
Pero su desventaja es que generalmente no permite optimizar el tiempo de búsqueda
especialmente cuando hay que desplazarse a posiciones muy alejadas.
- Política SSF: Primero el trabajo más cortó. Consiste en seleccionar la petición de disco que
requiera un menor movimiento del brazo desde su posición actual. De este modo, siempre
se realiza una selección de manera que se produzca el mínimo tiempo de búsqueda.
Sin embargo este algoritmo tiene un serio problema, se puede producir inanición de
algunas solicitudes. Debido a que las peticiones pueden llegar en todo momento, siempre
se da prioridad a las solicitudes más próximas por lo que peticiones más alejadas pueden
sufrir un retraso o espera indefinida. Aquí la equidad es un conflicto.
- Política SCAN o Algoritmo del ascensor: Su nombre se debe a que es la política que se usa
en edificios altos para controlar eficientemente los ascensores. Esta política consiste en
mover las cabezas de un extremo a otro del disco, sirviendo todas las peticiones que van
en ese sentido. Al volver se sirven todas las del sentido contrario. El cabezal está
continuamente explorando el disco en una y otra dirección. Además requiere que el
software mantenga 1 bit de control de la dirección actual (Arriba o abajo).
EL comportamiento de este algoritmo es óptimo cuando las peticione se distribuyen
uniformemente por todo el disco, pero es algo que casi nunca ocurre. El tiempo de
búsqueda es menor que un FCFS pero considerablemente mayor a un SSF, debido
fundamentalmente al último desplazo que obliga a recorrer el disco entero.
Una buena propiedad que tiene este algoritmo es que dada cierta colección de peticiones,
el límite superior en el movimiento total es fijo, solo es el doble del número de cilindros.
Puede retrasar mucho algunas peticiones si no se insertan en el momento adecuado.
- Política C-SCAN (Cyclic Scan): Es una variación de la SCAN, para mejorar el tiempo de
respuesta o espera del disco.
C-Scan mueve el cabezal de un extremo al otro, atendiendo las peticiones en ese sentido,
sin embargo cuando el cabezal alcanza el otro extremo, vuelve al principio del disco, sin
atender a ninguna petición de vuelta.
El tiempo de respuesta de este algoritmo es mucho menor que el Scan, y casi similar a SSF.
En dispositivos con muchas peticiones de E/S, esta política tiene un rendimiento medio
superior a las otras.
- Planificación LOOK: Es una optimización de la política-SCAN, consiste en evitar el
desplazamiento hasta el final del disco, es decir volviendo de la última petición en un
sentido a la primera del otro.
Se denomina LOOK, ya que este algoritmo mira (Look), si hay una petición antes de
continuar moviéndose en una determinada dirección.
EL algoritmo C-SCAN es el más usado actualmente. Se usa en prácticamente todas las versiones de
UNIX, LINUX y Windows, debido a que da el mejor rendimiento en Sistemas muy cargados. Sin
embargo su rendimiento depende mucho de la distribución de las operaciones de E/S por el disco
y de la situación de los bloques que se acceden con más frecuencia. Por ellos, suele ser una técnica
habitual en el Sistema Operativo situar en el centro del disco aquellos datos que se acceden más a
menudo.
- Política SCAN de N pasos: Divide la cola de peticiones del disco en varias colas de longitud
N. En cada momento se procesa solo una cola, utilizando SCAN. Mientras se está
procesando una cola, las nuevas peticiones se deben añadir a otra cola. Si hay menos de N
peticiones disponibles al final de una búsqueda, todas ellas se procesan en la próxima
búsqueda.
Para valores grandes de N, el rendimiento de SCAN de N pasos se aproxima al de SCAN,
para un valor de N=1 se convierte en una política FIFO.
- FSCAN: Es una política que utiliza dos colas. Cuando comienza una búsqueda, todas las
peticiones están incluidas en una de las colas, estando la otra vacía. Durante la búsqueda,
todas las nuevas peticiones se incluyen en la otra cola. Por lo tanto, se difiere el servicio de
las nuevas peticiones hasta que se han procesado todas las peticiones antiguas.
Existen otras políticas para casos de las aplicaciones de tiempo real y multimedia como las
políticas EDF, SCAN EDF, SCANRT.