Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CAP 1
Introduccion
El sistema operativo (SO) proporciona servicios a usuarios y programadores que permiten
utilizar una computadora sin tener que tratar con los comandos de hardware de bajo nivel
difíciles de usar. Porporciona interfaces relativamente uniformes para acceder a la amplia
variedad de dispositivos con los que interactua una computadora, desde dispositivos E/S
(impresoras,cámaras digitales) hasta componentes inhalambricos de red que permiten la
comunicación de las computadoras.
Permite que los usuarios creen, gestionen y organicen diferentes tipos de archivos, además los
S.O modernos porporcionan diferentes interfaces graficas fáciles de usar (GUI, graphical user
interfaces)
¿De que tratan los SO?
Desfasaje o Asincronicidad es la ocurrencia de eventos al azar o en momentos inersperados,
ej: en juegos manuales a botones cuando presionan todas las teclas.
Vista del Usuario contra Vista del sistema en un SO
Para un Sistema operativo las dos perspectivas mas importantes son la Vista del usuario y la
Vista del sistema.
La vista del usuario concierne a como los usuarios o los programas – los programas son los
usuarios mas importantes del SO – ellos utilizan el SO; por ejemplo la forma en que un
programa lee la pulsación de una tecla. A la vista del sistema concierne la forma en que el
software del SO ejecuta realmente la acción requerida: como obtiene las pulsaciones de las
telcas, separa algunas teclas especiales como el Shift, y las pone a disposicon del usuario o del
programa.
Tipos de usuarios
Hay varios tipos de usuarios por ejemplo, usuarios finales ¸programadores de aplicaciones,
programadores del sistema y los administradores del sistema.
Un usuario final o usuario de aplicaciones incluye a todos generalmente usa programas de
aplicación o del sistema operativo.
Los programadores de aplicaciones describe a quienes escriben programas de aplicaciones
como procesadores de apalbras o sistemas de correo electrónico. Los programadores de
aplicaciones son muy exigentes al Sistema Operativo “¿Cómo leo y escribo en un archivo?” son
algunas de las preguntas típicas de ellos cuando aprenden a usar un nuevo SO. Las facilidades
con las que cuenta el SO son la vista de los programadores acerca del SO. Algunas veces
denominadas Llamadas al sistema o Interfaz de programación de aplicaciones (API), además
de esto, los programadores también desean que el software que desarrollan sea fácilmente
transferible a otras plataformas.
Programadores del sistema Se trata de quienes escriben Software – programas o
componentes – esta estrechamente relacionado con el SO, ejemplo de estos son: una utilidad
que muestre el estado de la conexión de una red de computadoras o de un controlador
inestable para una pieza de hardware. Los programadores del sistema necesitan comprender
en detalle el funcionamiento interno del SO, y en muchos casos requieren acceder a
estructuras de datos especiales del SO o llamadas previlegiadas al sistema.
Los administradores del sistema incluyen a los que gestionan facilidades de la comutadora y
por tanto son responsabels de instalar y actualizar el sistema operativo, también son
responsables de crear y mantener las cuentas de los usuarios, asi como proteger el sitema,
deben comprender en detalle como se instala y actualiza el SO, y como interactua con otros
programsa y utilidades, también comprender las características de seguridad y autorización del
SO a fin de proteger de manera efectiva su sistema y a los usuarios.
La figura (1.4) representa un enfoque por capas del SO donde el circulo exterior representa la
capa utilidades/aplicaciones que accede a la capa del nucleo del SO, que a su vez gestiona el
acceso a la capa de hardware.
El SO de una computadora personal (PC)
La figura 1.5 muestra mas detalles de un Sistema Operativo de una computadora Personal o
PC, El SO tiene dos componentes adicionales que no aparencen en la figura 1.3 : Controladores
de dispositivos y BIOS (Sistema básico de entrada/salida )
BIOS: Abstrae el hardware, es decir, gestiona dispositivos comunes, como teclados, video
básico y reloj del sistema. Esto permite que la parte principal o de nivel superior del SO trate
con todos los dispositivos del mismo tipo – por ejemplo, todos los teclados – de la misma
manera, Asi el nucleo del SO no cambia, sin importar el teclado que tengas.
Capas de abstracción
En los inicios de la época de las computadoras personales, los aficionados se divertían
ensamblando y contruyendo el hardware, y haciendo funcionar programas simples,
normalmente escritos en lenguaje asamblador o en lenguaje maquina, esto era una buena
herramienta para algunas personas, aunque la programación era muy tediosa, la gente
deseaba disfrutar la experiencia de esribir programas mas interesantes y por tanto mas largos
y complicados, Asi requerían mejores herramientas como editores fáciles de usar y
compiladores o interpretaes para el lenguaje de alto nivel, sin embargo para los usuarios
fianles, el deseo era usar la computadora como herramienta de negocios o prodcutividad.
Estos usuarios necesitaban el procesamiento de palabras, hojas de calculo y software de
comunicaciones, se contruian muchos sistemas de hardware para computadora bastante
diferentes. Estos sistemas podían contrar con una CPU elaborada por el mismo fabricante o
una CPU compatible con el mismo conjunto de instrucciones, sin embargo podían tener
dispositivos de video distintos. Por ejemplo, un sistema podía tener un dispositivo semejante a
una terminal que estaba conetado a un puerto serie, mientras que otro podía contar con un
controlador de video integrado con muchas capacidades para elaborar graficas avanzadas. Los
teclados podían difrerir típicamente en cuento a los teclas de función o “felcha” o a telcas de
movimiento del cursos, con la adicion o remoción de otras teclas.
A fin de que de que los programadores pudiesen crear programas ejecutables en estos
sistemas diferentes con cambios menores o ningún cambio al programa cuando se moviera a
otros sistemas, el SO proporcionaba la misma interzas al hardware para todos los distintos
dispositivos soportados por él. Por ejemplo, un programa podía leer el puslo de una tecla
desde un teclado sin importar que tipo de teclado fuera por medio de una llamada al sistema
que leyese una tecla.
El SO se haría cargo de traducir las teclas ubicadas en sitios distintos en teclados diferentes o
que se hubieran codificado de otra manera.
A fin de evitar complicaciones y costo por el hecho de tener varias versiones del SO para
teclados , monitores y discos diferentes, entre otros, el SO se dividio en una parte que estaba
adaptada a los distintos disporitivoos de hardware ( el BIOS y controladores de dispositivos )
y una parte que permanecia igual para todo el harware ( la cual se muestra como el nucleo en
fig 1.5 ). Esta técnica de trabajo complicado en varias capas o niveles es una técnica
establecida de software usada para grandes y complicados sistemas de software incluyendo los
SO.
Asi adaptar un SO a un nuevo sistema de computo compatible con diferentes dispositivos
implicada modificar o escribir un BIOS, pero usando el mismo modulo para el resto del nucelo
y los mismos programas y utilidades. Esto era una idea bastante atractiva para todo el mundo:
usuarios, fabricantes y escritores de SO.
Surgia un problema cada vez que un fabricante de periféricos de computadora ( por ejemplo
fabricante de video de tarjetas ) diseñaba un nuevo dispositivo y deseaba venderlo a los
usuarios a fin de que pudiera actualizar su computadora a diseños mas recientes de hardware.
A menudo el BIOS existente en la computdora era instalado en la ROM (memoria de solo
lectura ) y su remplazo era difícil y costoso. La solución a este problema fue la creación de un
BIOS modificable que permitia que los controladores de dispositivos fueran cargables en el
momento en el que el SO se cargaba en la moemoria. Contar con un código BIOS que sea
posible sustituir el arranque del sistema perimite agregar nuevas caracterisiticas a la
computadora o sustituir características en el BIOS con nuevo software y quizá soportar nuevas
funciones en hardware existente.
Algunos de los recuros por un SO típico son: CPU, Memoria principal y caches, alacenamiento
secundario y dispositivos E/S al nivel mas bajo, asi como el sistema de archivos e interfaces del
usuario a nivel superior. El SO también gestiona el acceso a redes y proporciona seguirdad para
proteger los diversos recursos
CPU
El SO necesita planear cual proceso ejecutar en cada CPU en cualquier instante. En sistemas de
proceso único mas antiguos es mas simple, porque un solo proceso reside en la memoria de
modo que el SO es el responsable de iniciar el proceso residente en la memoria al
proporcionarle el control de la CPU.
Aun asi en estos sistemas tan simples, el SO debe efectuar otras tareas, como establecer
cualquier registro de protección de la memoria y cambiar al modo de ejecución del usuario
antes de otorgar al proceso el control de la CPU.
En sistemas multitareas, la gestión del recurso CPU es muy complicada porque en la memoria
hay multiples porcesos, Ademas pude ser mas complicado si en elsistema hay multiples CPU.
El SO mantiene varias listas de procesos. La cola mas relevante para la programación de la CPU
se denomina Cola lista, la cual contiene todos los procesos que están listos para su ejecución.
Si los procesos tiene prioridades distintas, para cada nivel de prioridad puede haber una cola
lista por separado. A cada proceso se le asigna, por lo regular, control de la CPU durante un
lapso máximo, denominado Cuanto temporal. Si el Cuanto temporal expira antes de que el
proceso termine la ejecución, un einterruptor de tiempo puede iniciar un proceso del SO
denominado Conmutacion de contexto, que puede cambiar el control de la CPU a otro
proceso.
Memoria principal y cachés
El SO necesita asignar espacio de memoria a un proceso antes de poder ejecutarlo. El código
ejecutable de un programa suele almacenarse en el disco duro ( o en algún otro medio de
almacenamiento secundario). Cuando un usuario o un programa desea ejecutar un programa
que se encuentra en un disco, el SO debe localizar el archivo del código del programa en el
disco y asignar suficiente espacio de memoria para mantener una parte inicial del programa.
Debido a que muchos programas son bastantes grandes, el So debe cargar solo parte del
programa desde el disco. Una de las funciones de gestión de la memoria consiste en la
asignación de espacio de memoria inicial a un proceso y quizá cargar partes adicionales del
programas desde un disco a medida que el proceso las necesita. Si todo el espacio de la
memoria esta lleno, el modulo de gestión de la memoria del SO debe intercambiar a un medio
externo algo de la información residente en la memoria, a fin de poder cargar las porciones
adicionales necesarias por el proceso.
Almacenamiento secundario
Generalmente suelen ser los discos duros, La mayoría de los archivos de código del programa y
los archivos de datos están almacenados en el disco duro hasta que hay una petición para
cargar algunas partes de estos en la memoria principal. Siempre que un proceso requiere datos
o códigos que no están en la memoria, se envía una petición al modulo de planificación del
disco del SO. El SO típicamente suspende el proceso de la petición hasta que los datos
requeridos se leen en la memoria. En un sistema ultitareas puede haber muchas peticiones
para leer ( cargar en memoria ) y escribir datos en el disco ( almacenar en el disco ). El SO suele
mantener una o mas colas para las solicitudes de lectura y escritura en el disco, y usa varios
algoritmos para optimizar la atención de estas solicitudes. Como parte de nuestro análisis de
gestión de E/S.
Dispositivos de E/S
El SO también debe controlar y gestionar varios dispositivos de E/S conectados a un sistema
de computo. El SO incluye modulos denominados controladores de dispositivos que vigilan el
acceso a estos dispositivos, y a menudo que los usuarios agregan nuevos dispositivos de E/S a
sus sistemas, los SO modernos cuentan con la capidad de detectar nuevo hardware e instalar
dinámicamente los controladores de dispositivos idóneos. Un controlador de dispositivo
manipula la interaccion a bajo nivel con los controladores de dispositivos de hardware y
presenta una vista de nivel superior de los dispositivos de E/S al resto del SO. De esta forma el
SO puede manipular dispositivos semejantes en una forma abstracta y uniforme.
Sistemas de archivos
Los recursos de bajo nivel son los del hardware E l SO gestiona recursos de nivel superior que se
crear por medio del software. Uno de los mas importantes es el sistema de archivos, este
sistema es un modulo del SO que proporciona una interfaz de nivel superior que permite que
los usuarios y los programas creen, borren, modifiquen, abran , cierren y apliquen otras
operaciones a varios tipos de archivos, El sistema de archivo permite a los usuarios poner
nombres a los archivos, organizar los archivos en directorios, proteger archivos y acceder a
estos usando diversas operaciones de archivos.
Intefaces del usuario
Muchos SO incluyen otro componente de alto nivel para manipular la interaccion con el
usuario. Esto incluye la funcionalidad para crear y gestionar ventanas en la pantalla de una
computadora a fin de permitir que los usuarios interactúen con el sistema. Al tener este
componente el SO , el usuario puede acceder a varios recursos en forma uniforme por
ejemplo: acceder al directorio del sistema de archivos.
Acceso a redes
El acceso a redes permite que los usuarios y los programas en una PC accedan a otros servicios
y dispositivos en una red de computadoras. Un SO es capaz de proporcionar funcionalidad
tanto de bajo como de alto nivel para el acceso a redes. Un ejemplo de funcionalidad de bajo
nivel es la capacidad otorgada a un programa para crear puertos de redes y conectarse con un
puerto en otra maquina, y un ejemplo de funcionalidad de alto nivel es la capacidad de
acceder a un archivo remoto.
Suministro de protección y seguridad
El SO cuenta con mecanismos para proteger los diversos recursos de algún acceso no
autorizado, asi como técnicas de seguridad para permitir que los adm del sistema refuercen
sus políticas de seguridad. El tipo de seguridad mas simple es la autorización de acceso
mediante contraseñas, aunque en general no son suficientes.
Modulos mas importantes de un SO
En la siguiente figura podemos ver los modulos mas importantes de un SO a un nivel abstracto
( muchos de estos modulos corresponden a los recursos que se estén gestionando).
Los modulos proporcionan funciones a las que acceden usuarios y programas del sistema, asi
como los otros modulos del SO. Se restringe algo de funcionalidad de modo que solo sea
posible acceder a esta en modo privilegiado por otros modulos del SO, por ejemplo: las
funciones de los controladores de dispositivos a menudo están restringidas para el acceso al
SO. Otra funcionalidad esta disponibles para modulos del SO, usuarios y programas de
aplicación, como funciones del sistema de archivos.
En la figura no se muestra la forma en que los modulos interactúan entre si, esto se debe a que
los tipo de interaccion dependen de la arquitectura particular usuada para implementar el SO.
Por ejemplo, en una arquitectura por capas los modulos estarían separados en capas, en
general los modulos de un nivel deben llamar a las funciones proporcionadas por los modulos
que están en el mismo nivel o en niveles inferiores. Por otra parte, en una Arquitectura
orienda a objetos cada modulo esta implementado como uno o mas objetos con servicios, y
cualquier objeto puede invocar los servicios proporcionados por otros, y en una Arquitectura
Monolitica todos los modulos están implementados como un programa gigante.
Definicion de proceso y estados del proceso
BCP ( bloque de control de procesos ) es la estructura de datos que mantiene el SO para seguir
la pista de cada proceso
Un Proceso es un programa que esta corriendo o en ejecución, para ser un proceso, un
programa necesita haber sido iniciado por el SO, sin embargo un proceso no necesariamente
esta en ejecución todo el tiempo durante su existencia; puede estar en esepera de E/S (como
esperando que se presione una tecla) o esperando que el SO le asigne algún recurso ( un
bloque de ram).
Todo proceso tiene una secuencia particular de ejecución y, por tanto, un contador de
programa que especifica la ubicación de la siguiente instrucción a ejecutar, tambien cuenta
con varios recursos que le asigna el SO. Por ejemplo, algo de espacio de la memoria en donde
almacenar todo o parte de su código y datos del programa ( como variables del programa ).
Seguramente accedera a archivos, de modo que tal vez tenga asociados con el algunos
archivos abiertos. Ademas un proceso también se denomina trabajo o t areas.
Una vez que se crea un proceso puede estar en varios estados:
En ejecución (si tiene el control de la CPU)
Listo para su ejecución ( si otros procesos están usando actualmente todas las CPU)
Y asi sucesivamente, en la sig figura se muestran los estados típicos por lo que puede pasar un
proceso; esta figura se denomina Diagrama de transición de estados. Los nodos ( exagonos )
representan los estados del proceso y las líneas dirigas (flechas) representan las transiciones
de estados.
La transición de estado 0 (cero) crea un nuevo proceso, que puede ser provocado por uno de
los sig eventos:
1) Un proceso del SO en ejecución puede crear o generar un nuevo proceso, ej: cuando
un usuario interativo entra a un sistema de computo, el proceso del SO que manipula
los registros de entrada crea, un nuevo proceso para manipular algunas funciones del
SO como un proceso manejador de interrupciones o de errores
2) Un proceso de un usuario también puede crear un nuevo proceso al llmaar a la función
de lSO para su creación. Por ejemplo un buscador de la red podría crear un nuevo
proceso para ejecutar un modulo externo “enchufado” para manipular un tipo
particular de contenido multimedia que esté en un sitio de la red.
3) Cuando el SO inicia un trabajo como un evento programado ( por ejemplo, un trabajo
“cron” en un sistema UNIX), el SO crea un proceso para ejecutarlo.
A medida que se crea un nuevo trabajo, este se encuentra en el estado nuevo. El SO debe
elaborar la tabla que contiene información sobre el proceso, asignar recursos necesarios (
memoria ), localizar el archivo ejectuale del programa y cualquier dato inicial para el proceso, y
ejecutar las rutinas idóneas para cargar en la memoria las partes iniciales del proceso. La
transición de estado 1 ( en la fig ) muestra que el SO mueve un proceso desde el nuevo estado
hasta el estado listo, lo cual indica que el proceso ya esta listo para la ejecución.Una vez que ha
ocurrido todo este inicio, el proceso puede ser movido al estado listo.
Incluso después de que un proceso se encuentra en el estado listo, no inicia su ejecución hasta
que el SO le proporciona el control de la CPU. (transición 2 de la fig). El proceso ahora esta en
ejecución y se encuentra en el estado ejecución. Si en el estado listo hay mas de un proceso la
parte del SO que escoge uno de estos para su ejecución se denomina planificador de la CPU o
planificador del proceso.
Si un proceso se ejecuta hasta el final o tiene un error que provoca que el SO lo aborte (origina
la transición de estado 6 en la fig ). Esto conduce a un proceso llamado terminado, en cuyo
momento el SO efectua operaciones de limpieza en el proceso, como borrar la información del
proceso y las estructuras de datos, asi como memoria del proceso y otros recursos, cuando la
limpieza esta lista, pasa a (transición 7 de fig ) lo cual original que el proceso salga del sistema.
Otras dos transiciones de estado pueden ocurrir cuando un proceso se encuentra en su estado
de ejecución: (transiciones 3 y 5 en la fig)
La transición de estado 3 ocurri si el proceso requiere algún recurso que no esta disponible o si
requiere que ocurra alguna operación de E/S (presionar una tecla) Esto conduce a un proceso
al estado espera o bloqueo
Un proceso permanece en estado de espera hasta que se le asigna un recurso que requiere o
su petición de E/S se ha completado, en cuyo momento la transición de estado 4 regresa el
proceso desde el estado de espera hasta el estado de listo. Por otro lado, la transición de
estado 5 directamente desde el estado de ejecución hasta el estado de listo suele ocurrir
cuando el SO dedice suspender el proceso debido a que tiene procesos mas urgentes que
ejecutar. Esto puede deberse a un cronometro o algún otro tipo de interrupción, lo cual puede
ocurrir por varias razones. La razón mas común es asignar la CPU a otro proceso debido al
algoritmo de planificación de la CPU.
Informacion del proceso mantenida por el SO
Para seguir una pista del proceso el SO suele asignarle un identificador único de proceso (o ID
del proceso). Tambien crea una estructura de datos denominada bloque de control de
proceso (o BCP) para seguir la pista de la información del proceso, como la id del proceso, los
recursos que éste usado solicita, su prioridad, sus derechos de acceso a varios recursos o
archivos del sistema, etc.
El BCP también incluye referencias a otras estructuras de datos del SO, que incluyen
información sobre como localizar el espacio en la memoria y archivos abiertos en uso por el
proceso. Para procesos que no están en el estado de ejecución el BCP guarda información en el
hardware estado del procesador del proceso, como los valores almacenados en el registro
contador del programa y otros registros del procesador. Esta información es necesaria para
reiniciar el proceso cuando regresa al estado de ejecución. (fig muestra algo de la info que por
lo regular se mantiene en un BCP)
La información sobre archivos abiertos que esta usando el proceso suele mantenerse en una
estructura de datos del SO por separado, que crea y usa el modulo de gestión de archivos de
SO.
La información sobre que áreas de la memoria están ocupadas por el proceso suele
mantenerse en tablas de paginas o registros limite creados y usados por el modulo de gestión
de memoria del SO. Se hace referencia a estas dos tablas desde la estructura de datos del BCP.
Ademas en el BCP se incluye información adicional como el nivel de prioridad del proceso y
una referencia a los niveles de seguridad o protección de este.
Tipos de procesos y modos de ejecución
Los procesos pueden clasificarse en varios tipos:
1. Procesos del usuario o de aplicación. Estos son los procesos que se encuentran
ejecutando programas de aplicación en representación de un usuario. Algunos
ejemplos incluyen un proceso que esta ejecutando un programa de contabilidad, una
transacción de base de datos o en un juego de compuitadora
2. Porcesos del programa del sistema. Son otros programas de aplicación que efectúan
un servicio del sistema común en lugar de un servicio especifico de un usuario final.
Tales programas a menudo interactúan estrechamente con el SO y requieren
información especial sobre interfaces y estructuras del sistema, como el formato de un
modulo de programa relocalizable o un archivo de programa ejecutable. Algunos
ejemplos son los compiladores de lenguaje de programación y los entornos de
desarrollo de programas.
3. Procesos del SO. Tambien se les conoce como demonios, y se trata de procesos que se
encuentran ejecutando servicios y funciones del SO. Algunos ejemplos son: gestión de
memoria, planificación de procesos, control de dispositivos, manipulación de
interrupciones, servicios de archivos y de red.
La mayoría de los procesadores cuentan con dos modos de ejecución para los procesos: el
modo pivilegiado y el modo regular ( o del usuario ).
Los procesos del nucleo del SO por lo regular se ejecutan en Modo privilegiado – también
llamado modo supervisor, modo nucleo o modo del monitor – permitiéndoles ejecutar todos
los tipos de operaciones de hardware y acceder a todos los dispositivos de memoria y de E/S.
Otros procesos se ejecutan en Modo del usuario, que les prohíbe ejecutar algunos comandos,
como los comandos de E/S de bajo nivel.
El modo del usuario también introduce el mecanismo de hardware de protección de la
memoria, de modo que un proceso solo puede acceder a la memoria dentro de su espacio de
memoria predefinido. Esto protege al resto de la memoria – usada por el SO y otros procesos –
de acceso erróneo o malisioso a su espacio de la memoria que puede dañar sus datos o el
código del programa.
Sistemas operativos Monotarea y Monousuario
Este SO ejecuta un solo proceso a la vez. Los primeros SO eran de este tipo, asi como los SO de
las primeras PC – Como las CP/M – y las primeras versiones del MS-DOS. Hoy es posible
encontrar SO semejantes en sistemas con recursos limitados como lso sistemas embebidos.
Existen algunas cuestiones que deben manipular. Los servicios principales que prporciona son
la manipulación de eE/S e iniciar y terminar programas. La gestión de la memoria es bastante
simple, ya que solo el SQ y un proceso residen en memoria en cualquier instante, no hay
necesidad de planificación de la CPU.
Sistemas operativos Multitareas
Un SO asi controla la ejecución simultanea de multiples procesos. Por tanto, debe contar con
un componente de planificación de la CPU que escoja cuales de los procesos listos ejecutar a
continuación. La mayoría de las computadoras modernas admiten la característica multitareas.
Una de las razones para crear SO multitareas fue para mejorar la utilización del procesador al
mantener ocupada la CPU mientras se efectuaban operaciones E/S y requiere esperar a que
termine la operación, entonces la CPU permanece sin hacer nada hasta que se completa la
solicitud de E/S. Al tener varios procesos listos en memoria para ejecutar, la CPU puede
cambiar a la ejecución de otro proceso mientras se efectúan las operaciones de E/S. Cambiar
de la ejecución de un proceso a la ejecución de otro se denomina cambiar de contexto. Pero
hay un costo muy elevado para hacer esto. Es necesario guardar todo el estado de la CPU, de
modo que sea posible restaurarlo una vez que el proceso se reanude mas tarde. Basicamente,
cuando un proceso en ejecución – por ejemplo , un proceso A – solicita operaciones E/S que
puede manipular un controlador E/S, el modulo de palnificacion de la CPU del SO debe
comprobar si hay algún proceso en el estado listo. En caso afirmativo, uno de los procesos
listos – por ejemplo , el proceso B – se selecciona con base en el algortimo de planificación del
a CPU. El SO guarda el estado de procesador del proceso A ( en el BCP de A) y carga el estado
de procesador del proceso B (del BCP de B) en los registros idóneos de la CPU. Luego, otorga el
control de la CPU al proceso B, que se mueve al estado de espera (o bloqueado) hasta que se
completa la operación de E/S
La característica multitarea ahora esta disponible en los SO de casi todas las computadoras,
incluyendo las personales. Aun cuando una PC tiene por lo general un solo usuario interactivo,
este puede crear multiples tareas. Por ejemplo si hay ventanas multiples en la pantalla a
menudo cada una es manipulada por una tarea o proceso por separado, además en el fondo
puede haber otras tareas en ejecución. Algunos de los primeros SO multitarea podían
manipular solo trabajos por lotes, que eran gcargados en el disco por volumen mediante
lectoras de tarjetas o otros dispositivos de E/S. Muchos sistemas actuales manipulan tanto
trabajos por lotes como interactivos. Los trabajos interactivos son procesos que manipula un
usuario al interactuar directamente con la computadora atravez del raton, teclado, la pantalla,
y otros dispositivos E/S.
Es posible distintguer aun entre dos itpos de SO multitatarea:
Los que suelen interactúan con usuario único y los que adminten usuarios interactivos
multiples. Los sistemas multitarea de usuario único incluyen la mayor parte de las PC
modernas que admiten la apertura de ventanas. En tales sistemas es común que un usuario
interactue con el sistema aunque el usuario pueda tener varias tareas que iniciaron a la vez,
cada uno en ventanas separadas. La tarea que constituyte el centro de atención actual del
usuario se denomina tarea de primer plano, mientras que las otras se denominan tarea de
fondo. El otro tipo de sistema multitarea manipula usuarios interactivos multiples en forma
simultanea, por lo que se denomina SO de tiempo compartido.
SO y Servidores de tiempo compartido
Un SO multiusuario o de tiempo compartido también admite multitareas, pero con un gran
numero de tareas ( procesos ) en ejecución son usuarios que interactúan con la maquina. Estos
sistemas se llamaban asi pues el tiempo de la computadora era “compartido” por los multiples
usuarios simultaneos. En termino de las partes internas del SO la diferencia principal entre
procesos interactivos y por lotes consiste en sus requerimientos de respuesta.
Los trabajos interactivos por lo regular admiten muchas interacciones cortas y requieren que el
sistema responda rápidamente a cada interaccion. Pero una respuesta pronta a los requisistos
de los usuarios interactivos demanda un gran nivel de intercambio de contexto, lo cual
introduce bastantes gasstons indirectos improductivos. Los trabajos por lotes, no cuentan con
usuarios vivos, por lo que la respuesta rápida no es un requerimiento. En consecuencia se
requiere menos intercambio de contexto y se gast amas tiempo en cálculos productivos. Un SO
de tiempo compartido admite tanto trabajos interactivos como por lotes, y generalmente
porporciona prioridades mas altas para los trabajos interactivos. Los primeros sistemas de
tiempo compartido en las décadas de 1960 y 1970, como el OS 360 TSO de IBM y el MULTICS
de Honeywell admitían grandes cantidades de usuarios interactivos que estraban conectados
al mismo sistema mediante monitores y terminales falsos, debido a que en esa época los
terminales costaban varios ordenes ed magnitud menos que el sistema de la computadora en
si.
A medida que el precio del hardware y de los procesadores se reducia en forma dramática la
necesidad por tiempo compartido declinaba. En computación moderna la nueva generación
de sistemas que puede considerarse como la sucesora de los sistemas interactivos de tiempo
compartido la contituyen los sistemas que se usan en servidores de archivos, y en bases de
datos y de la red. Los servidores de archivos y los servidores de bases de datos manipulan
solicitudes para el acceso a archivos y bases de datos desde decenas hasta miles de usuarios.
En lugar de localizarse en terminales falsas conectadas a procesos de ejecución en el servidor,
lo usuarios trabajan en PC o en estaciones de servicio y las solicitudes llegan al servidor
mediante la red.
Grandes servidores de bases de datos a menudo se denominan sistema de procesamiento de
transacciones ,ya que manipulan una multitud de transacciones de usuario por segundo. Los
servidores de red manipulan solicitudes para documentos de la red y amenudo recuperan algo
de la información desde los servidores de base de datos. Los servidores de base de datos y de
la red requieren que los SO sean capaces de manipular cientos de procesos actuales.
La Red y los SO Distribuidos
Sabemos que las computadoras están conectadas permanentemente a una red, esto permite
compartir información y recursos entre multiples maquinas, y requiere que el SO proporcione
funcionalidad adicional para estas conexiones, esta funcionalidad puede clasificarse en dos
niveles principales:
1 –Servicios de bajo nivel de acceso a redes El SO incluye por lo regular una funcionalidad
adicional para establecer conexiones a redes y para enviar y recibir mensajes entre las
maquinas conectadas
2 –Servicios de alto nivel. Los usuarios desean poder conectarse a otras maquinas para buscar
información, descargar archivos o programas, esto suele llevarse a cabo mediante
buscadores de la red o servicios especializados, como el telnet para etrar a maquinas
remotas o FTP para transferencia de archivos.
Supongamos que estamos creando un proceso que consta de dos modulos. Contamos con un
procedimiento principal que denominamos subrutina XYZ que hemos escrito previamente.
A medida que pasamos hacia modelos mas complejos, la idea es que nos enfocamos es una
cuestión de vinculación . Vincular es el proceso de determinar en que parte de la memoria
física debe ir la subrutina y de hacer referencia en el punto de la rutina principal hacia
subrutina.
VINCULACION EN TIEMPO DE CODIFICAR
En un entorno muy simple como un sistema embebido BIOS muy delgado, podríamos decidir
manualente el sitio en que debe ir cada parte del programa. Podriamos colocar el modulo
principal en la ubicación 100 y la subrtuina XYZ en la ubicación 500. Si codificamos el modulo
principal en lenguaje ensamblador, podríamos inculir una directriz ensambladora comc ORG
100, y en la subrutina podríamos incluir un ORG 500. Estas directrices hacen que el
ensamblador genere un código que haga referencia absoluta a estas direcciones de la
memoria. En nuestro modulo principal debemos saber que la subrtuina XYZ estará en la
dirección 500 de modo que en elugar de emitir una llamada XYZ podemos producir la llamada
a la ubicación 500.
Ejemplo: En las primeras computadoras y microcomputadoras, los primeros sistemas tenían
muy poco software y pocos periféricos. Los programadores no solo asignaban estas direcciones
manualmente; escribían los programas en lenguaje maquina, e incluso los introducían
manualmente en la memoria al manipular interruptores y botones en el panel delantero de las
mquinas. En algunas, había dispositivos periféricos que usaban una dirección de la memoria
fija como bufer, de modo que el programador nisiquiera tenia opciones, el hecho de que los
programadores asignaran manualmente la memoria era algo propenso a errores y consumia
tiempo.
Cuando los programas se perforaban rutinariamente en tarjetas y no se contaba con cintas
magnéticas o memorias giratorias, era un proceso bastante complicado cargar el programa
ensamblador en la memoria, alimentar el programa fuente, obtener un modulo objeto
perforado en las tarjetas, cargar el programa ligador en la memoria, alimentar ese modulo
objeto en el ligador, perforar un programa ejecutable y, finalmente cargar el programa objeto
en la computadora y ejecutarlo. Como resultado, era común parchar programas ejecutables
que se habían perforado en tarjetas. Los listados en ensamblador incluían el lenguaje de
maquina que se producia para cada instrucción, lo que permitia a los programadores encontrar
la tarjeta que contenia una instrucción incorrecta, cargarla en la perforado y reparar el
programa al modificar el lenguaje maquina. Desafortunadamente, esa practica continuo
durante algún tiempo, y era propensa a errores. Finalmente el numero de parches se volvió
poco manejable, de modo que el programador debía regresar al mazo fuente, hacer todos los
cambios al programa fuente y volver a ensamblar. Lamentablemente resultaba demasiado fácil
perder uno de los cambios realizados en el fuente, de modo que era raro encontrarse
arreglando errores en el código fuente que ya se habían reparado con un parche.
VINCULACION EN TIEMPO DE LIGAR
En el entorno CP/M, se suponía que todos los programas empezaban en la ubicación 100, de
modo que era impsoible incluir la declaración ORG 100 en el modulo principal. Sim embargo,
quizá no tengamos cuidado respecto a donde termina la subrutina XYZ, de modo que en
nuestra rutina principal usamos el nombre simbolico XYZ. Cuando el ensamblador produce
nuestro modulo objeto, incluye todas nuestras instrucciones y datos, aunque también
información que indica al programa ligador que tenemos algunas referencias que requiere
reparar. Una vez que el ligador procesa nuestra rutina principal, contara con una lista de
nombres que requiere resolver. Entonces comenzara a procesar otros modulos que le dijimos
que incluyera. A medida que incluye estos modulos en el paso de cargar, encontrará en ellos
los nombres que se definiern ahí. En este caso “XYZ” estará definido en uno de los modulos, al
que le dijimos que procesara el ligador. Cuando el ligador supone donde reside el modulo XYZ
en el espacio de direcciones, regresa y liga las referencias en el modulo principal con las
direcciones en el modulo de la subrutina. Ahora ya se ha tomado la decisión de vinculación en
tiempo de ligado en vez de en tiempo de codificación. Observemos que cuando aplazamos la
vinculación hasta un paso después ganamos algo de flexibilidad. Si en el tiempo de codificación
hubiéramos decido colocar el modulo XYZ en la ubicación 500 y después encontráramos que
era necesario moverlo a alguna otra ubicación, hubiéramos tenido bastantes problemas para
cambiar todas las referencias a esa dirección. El hecho de deajr que el ligador decida donde
colocar el modulo lo hace mas sencillo. Sim embargo, pagamos un poco por la flexibilidad
aumentada. En este caso estamos transportando información extra en los moduls bojetos que
define los nombres y las referencias a los nombres, y dedicamos un poco de tiempo extra en el
paso de ligado mientras se efectua la viunculacion. A medida que las computadoras se volvían
mas grandes y veloces, no obstante este tiempo y espacio extra se han vuelto muy poco
costosos, de modo que ni siquiera pensamos en ello.
UN PROCESO UNICO
En el entorno CP/M, el SO residia en la parte superior de la memoria. Los programas de
aplicación empezaban en la ubicación 100 para evitar el vector de interrupción en la memoria
baja y crecían hacia arriba. Desafortunadamente, a medid aque el SO crecia, podía volverse tan
grande que un SO actualizado podría utilizar la memoria que necesitaba un programa que
estaba ejecutándose bien antes de la actualización. MS-DOS cambio el enfoque: el SO se
cargaba en la RAM baja y el programa se cargaba arriba de esta. Cuando la aplicación
intentaba carga el programa, si había suficiente memoria disponilble, este se cargaba y
comenzaba su ejecución. En caso contrario, cuando se creaba una aplicación bajo el MS-DOS,
este se cargaba para su ejecución en una versión especifica del SO. Este paso definia la
dirección de las rutinas de servicio en el SO y dirección en que la aplicación debía empezar a
cargarse. Lamentablemente est significaba que cuando salía una versión de MS-DOS que
modificaba el tamaño absoluto del SO residente, todas las aplicaciones debían volver a ligarse
para su ejecución en la nueva versión.
En la sig figura vemos la arquitectura típica de uno de los primeros SO para una computadora
central que solo ejecutaba un proceso único. El programa ejecutable podía crease para residir
en una dirección particular arriba del nucleo del SO. Ademas, un registro base podía cargase
con una dirección baja que el programa ejecutable no podía redireccionar. Si el programa hacia
una referencia a memoria baja de esta dirección, se generaba una interrupción y el programa
no terminaba. Estos sistemas siguen presentando el problema de que, si el SO crece, los
programas deben ligarse con nuevas direcciones. La solución a este problema era modificar de
alguna manera la función del registro base.
REUBICACION DINAMICA
Lo que antes se llamaba registro base ahora es registro de reubicación , el valor cargado en el
registro ya no era un limite, en lugar de ello se creo el programa ejecutable para actuar como si
estuviera ubicado en la dirección 0, y el valor en el registro de reubicación se añadió a cada
referencia a la memoria que hacia el programa. Ahora el programa no tenia que ligarse cada
vez que cambiaba el SO, puesto que toda referencia a la memoria se reubicaba de manera
automática a medida que se ejecutaba el programa.
ESPACIO DE RAM FISICO CONTRA ESPACIO DE RAM LOGICO
La diferencia entre el espacio de dirección lógico y el físico, cuando se compilaba un programa
se creaba un programa que había que cargar en la RAM en la dirección que se le asignaba, ya
fuera en el paso de traducción o en ligado. El programa ejecutable se compilaba para referir un
rango de dirección que correspondían uno a uno con las direcciones de memoria física. En
realidad había dos espacios de direcciones en uso, el primer espacio es el conjunto de
direcciónes que genera la CPU a medida que se ejecutaba el programa, este espacio se llama
espacio de direcciones lógicas. El programa ejecutable se cargaba en memoria primaria. El
conjunto de direcciones usado para acceder a esta memoria se denomina espacio de
direcciones físicas, Cuando se introdujo el registro de reubicación se hizo evidente que ambos
espacios eran diferentes. El programa ejecutable en el disco se había creado de modo que
generara direcciones con una dirección baja de cero. Pero cuando se ubico en la memoria, en
realidad cargaba en lad ireccion lógica 10000. El hardware de la dirección de la memroai
reubicaba dinámicamente las direcciones lógicas que generaba el programa a medida que se
ejecutaba, y al añadir el valor en el registro de ubicación transformaba el espacio de
direcciones lógicas en el espacio de direcciones físicas. La aplicación cuando se esta ejecutando
en la CPU genera una referencia a memoria. Esta podría ser la dirección de la siguiente
instrucción en el programa, una llamada a un subrutina, una referencia a un dato o muchas
otras cosas, en esta caso la referencia es a la dirección 456 en el espacio de direcciones lógicas
del programa. El SO, ha cargado el registro de ubicacon con la dirección física del inicio del
programa, en este caso 10000. El hardware de la memoria agrega el valor en el registro de
ubicación a la dirección lógica y genera la dirección física de 10456.
SUPERPOSICIONES ( OVERLAYS )
Los programadores requieren agregar funciones que pueden ejecutarse en estas memorias
pequeñas, sigue siendo bastante común tener un programa integrado por 3 partes, fase inicio,
bucle principal de computación y alguna fase final de reporte. Ellos se percataron de que estas
partes de un programa no necesitaban estar en la memoria al mismo tiempo, de modo que
decidieron dejar que se superpusieran entre si en la memoria. La parte fundamental del
programa es justo una seria de llamadas a subrtuinas que implementan las tres fases, quizá
“init”, “main- loop” y “wrap-up”. Las llamadas a la función del SO pueden agregarse al
programa para cargar la subrutina idónea antes de que se efectue la llamada. La parte principal
siempre estaba en la memoria, y las otras fases se traían antes de ser llamadas. Un programa
simple como un ensamblador o un compilador, fácilmente podía ajustarse a la memoria sin
utilizar ninguna superposición, pero si se separaba en fases podía permitir que el traductor
procesara programas fuente mas grandes en un espacio de memoria dado.
La MP continuaba volviéndose mas barata, de modo que empzaron a pensar en formas para
man tener multiples programas en la MP y ejecutar mas el alternar entre ellos sin intercambio
– donde el intercambio es una operación que requiere muchos recursos – terminaron
dandonse cuenta que el registro de reubicación podía ejecutar un programa en cualquier
parte, y no solo en la parte superior del SO residente. S desplazaron a una organización de la
memoria del SO como la que se muestra en la fig de arriba (a). Al principio el registro base se
había usado para evitar que las apliaciones dañaran el SO. Luego, el uso de este registro se
modifico como un registro de reubicación, esencialmente para resolver el problema del
crecimeitno del SO. Ahora que el SO ejecuta multiples programas y un programa realiza una
operación de E/S hacia algún dispositivo lento, el SO simplemente coloca la dirección de la
memoria del segundo programa en el registro de rebuicacion y empieza a ejecutar el segundo
programa (b).
Ademas, había otras aplicaciones en ejecución, asi que era necesario arreglar las cosas de
modo que las aplicaciones no pudieran dañarse entre si. La solución era agregar un registro
limite que pudiera establecer una cota superior mas alla de la cual un programa no puede
direccionar, justo como no podía direccionar mas abajo del establecimiento del registro de
reubicación, este registro contiene el tamaño del programa mas que la dirección alta. El
hardware agrega esta dirección a la dirección de reubicación con la intención de establecer el
limite superior. Asi como es el caso con el limite inferior, si el programa intenta acceder a la
memoria mas alla del limte establecido por el registro limite, el hardware genera una
interrupción y el SO aborta la aplicación, asi cuando el SO cambia de la ejecuion de un
programa a la de otro, ahora debe fijar tanto el registro de reubicación como el registro limite.
FRAGMENTACION INTERNA
Cuando se instala este tipo de SO, el administrador debe decidir cuanta memoria apartar para
cada área del programa: una partición. El SO no modifica el tamaño de estas particiones a
medida que el sistema esta en operación, como en los primeros SO un programa podía no usar
toda la memoria. Ahora el SO esta tratando de colocar mas programas en la misma memoria.
El espacio sin usar se denomina fragmentación interna y se muestra en la sig figura. Podriamos
establecer una o dos particiones pequeñas
Para ejecutar pequeños trabajos rapidos y una o dos particiones mas grandes para las
aplicaciones grandes. Esto haría teneder a minimazar el espacio desperdiciado debido a la
framentacion interna.
DISTRIBUCION DE TIEMPO
Otro caso en que el intercambio se utiliza en sistemas diseñados para soportar muchos
usuarios en terminales en un modo denominado distribución de tiempo . Cuando los usuarios
editan y prueban los programas, la mayoría del tiempo ese proceso esta en espera del usuario
en la terminal. En este caso el sistema puede intercambiar el proceso mientras el usuario esta
pensando o tecleando. Cualquier otro proceso podría intercambiarse al almacenamiento
secundario. En el caso de la districuon de tiempo es mas problable que haya varias particiones.
Podriamos tener la memoria solo aquellas que no estén esperando que el usuario termine de
introducir una línea y estén ya sea en ejecución o esperando cualquier cosa que no sea E/S de
la terminal. El tamaño fijo de las particiones desperdicia memoria, recordemos que la
fragmentacon interna. En este caso solo teníamos fragmentación en una sola partición. Ahora
tenemos fragmentación interna en todas las particiones. Seria conveniente poder usar alguno
de estos fragmentos. Si ahorramos suficiente memoria, tal vez podamos ejecutar otro
programa y asi mantener ocupada ala CPU.
MULTIPLES PROCESOS CON UN NUMERO VARIABLE DE PROCESOS
Una solución parcial a la fragmentación interna cosnsiste en no hacer las particiones de
tamaño fijo o en numero; en lugar de ello, usamos tanta memoria como se necesite para
ejecutar un programa, requerimos que antes de ejecutar el programa el programador estime la
cantidad de memroai máxima de MP que necesitara. Cuando empezamos el programa le
asignamos toda esa memoria. Si este intenta usar mas dela indicada, entonces el SO termina
con un error. Cuando un programa termina, el SO vuelve a poner disposición esa memoria para
otro programa. Este espacio suele denominarse hueco o fragmento externo – un bloque de
memoria que no estamos usando en absoluto – en la sig fig lo vemos en un sistema ejecutando
4 apps (a). En la fig (b) se ve que las apps dos y cuatro han terminado. El SO suele mantener
una lista de huecos disponibles En la fig (c ) se ve que el SO ha iniciado la apps 5 en una parte
del hueco que quedo donde estaba la apps 2. Ahora quedando un hueco mas pequeño
Pero..Supongamos que el SO tiene otro programa para ejecutar pero hay muchos huecos, que
hueco escoge? El primer algoritmo simplemente consiste en explorar la lista de huecos y usar
el primero que contremos lo suficiente mente grande para ejecutar el programa, este se
denomina primer ajuste; presenta la ventaja de que es siemple pero puede no ser la mejor
opción. Otro algoritmo consiste en usar el hueco mas pequeños que se ajuste al programa,
este algoritmo se llama mejor ajuste – desperdiciamos la menor cantidad de MP – este
algortimo desafortunadamente requiere explorar toda la lista o mantenerla en orden de
tamaño.
Pero que ocurre si el programa necesita 10MB, se tiene un programa a ejecutar que requiere 8
MB y se tienen huecos de 12 MB y 18 MB , si usamos el hueco de 12 MB entonces quedara un
hueco de 4 MB, y en general no podremos usarlo. Si usamos una parte del 18 MB, entonces
tendremos un hueco de 10 MB que podremos utilizar, asi el sig algoritmo dice que debemos
usar el hueco de peor ajuste, ya que deja el mayor hueco ( y por tnato el mas útil ) ,
nuevamente este algoritmo requiere la lista de huecos o mantenerla en orden de tamaño.
Una variante del primer algoritmo se llama ajuste siguiente, en este cada búsqueda no se
inicia desde el frente de la lista, no mantenemos ordenada la lista y siempre iniciamos la
siguiente búsqueda desde el sitio donde quedo la ultima, el algoritmo de primer ajsute tiende
a romper los huecos en el frente de la lista, de modo que terminamos con varios huecos
pequeños que seguimos buscando aunque son de uso raro, la variante del ajuste siguiente
tiene a distribuir esta fragmentación en toda la lista. En la practica el peor ajuste resulta ser el
peor, son mejores ya sea el mejor ajuste o el ajuste siguiente.
Ahora supongamos que tenemos dos huecos, cada uno de 5 MB, y que tenemos un proceso
por ejecutar que inidica que requiere 8 MB, tenemos 10 MB de bloques de memoria libre en
los dos huecos – memoria suficiente para ejecutar este proceso – .Pero la memoria libre no
esta en una pieza, de modo que no podemos ejecutar el programa. Esta situación se denomina
fragmentación externa. Recordemos que nuestros porceos son reubicables – pueden
ejecutarse en cualquier parte dela memoria física porque el hardware de la memoria reubica
su espacio de direcciones dinamico en la medida que se ejecutan – Asi es posible mover un
programa en la memoria aun después que ha comenzado su ejecución. Normalmente el
proceso se suspende, se mueve a otra ubicación y vuelve a empezar. El SO solo tiene que
modificar el valor colocado en el registro de reubicación de modo que indique el inicio de la
nueva ubicación de la aplicación en la memoria física. Por ej: en la fig (a) si los dos huecos
(indicados como “sin usar” ) juntos fueran muy grandes como para ejecutar la app 6 , entonces
el SO dentria la app 3, la movería al espacio justo arriba de la app 5 y colocaría esa dirección en
el registro de reubicación siempre que se reinicie la app 3. Luego podría iniciar la app 6
ejecutandose en el hueco resultante mas grande. Ese resutlado se muestra en (b). Este proceso
se denomina compactación .Es posible aprecia que cuando el SO esta moviendo programas en
la memoria no se realiza ningún trabajo en representación de las apps. El SO esta decidiendo
gastar la CPU y el ancho de banda de la memoria para efectos de ejecutar mas trabajos en
paralelo.
Fig compactacion
Ahora podemos apreciar que el hardware de reubicación usa una longitud para un limite
superior en lugar de usar el extremo superior del programa. Si usara la dirección superior
entonces cuando reubicaramos un programa también seria necesario volver a calcular el limite
superior. Este no es un calculo complicado y no es necesario hacerlo tan a menudo, pero si el
hardware puede trabajar tan bien como de la otra manera, entonces tenemos suerte de no
tener que hacerlo.
Una complicación en este proceso puede ser que el hardware de E/S puede no usar el
hardware de reubicación. En otras palabras, la E/S se lleva a cabo usando direcciones físicas,
mas que lógicas. Esto significa que si un proceso tiene E/S pendiente, entonces no es posible
moverlo en la memoria. Asi, los procesos que empiezan E/S deben marcase temporalmente
como inamovibles.
Tambien podríamos sufrir a causa de la fragmentación interna, ya que los huecos pueden
hacerse cada vez mas pequeños. Para el SO no resulta eficiente seguir la pista de trozos muy
pequeños en la memoria, de modo que hay una cantidad minima de memoria que el SO
intenta gestionar.
CARGA DINAMICA
Con los overlays (superposiciones) no es aconsejable cargar todo el programa en MP al mismo
tiempo. En lugar a ello, el programador decide cuando cargar las superposiciones y cuando
llamar a las rutinas que están en la superposocion. Tambien es posible que el sistema haga
algo semejante. Cuando el SO carga un programa en MP, podría cargar solo el cuerpo principal
del programa en memoria. Para acceder a varias subrutinas, podría usar una tabla que muestre
cuales rutinas ya están cargadas en memoria y cuales no, muchos programas siguen una regla,
entonces, si no cargamos las subrutinas cuando el programa empieza por primera vez quizá
jamas se necesite cargarlas en absoluto. En consecuencia, el programa empieza algo mas
rápido. Si mas tarde el programa llama a la rtuina, entonces podemos cargarla en ese instante
y habremos pagado muy poca penalización por la espera.
BIBLIOTECA DE ENLACE DINAMICO
Podemos posponer la vinculación aun un paso mas. Podemos aplzar incluso la vinculación de la
subrutina con el modulo principal. En este caso la rutian de biblioteca en si no se vuelva parte
del programa ejecutable. Dejamos intacta la referencia simbolica a la rutina de bilbioteca que
produjo el compilador. Asi como con la carga dinámica, si nunca se hace referencia a la rutina,
entonces no solo no nos preocupamos por cargarla en la memoria; ni siquiera vinculamos el
símbolo con una dirección lógica. Dejamos las rutinas en bibliotecas especiales que suelen
denominarse bibliotecas de enlace dinamico o DLL. Cuando se hace referencia a una subrutina
en una biblitoeca de estas, entonces , el SO carga la rutina en la memoria y vincula el enlace en
el momento en que se ejecuta el programa.
Observemos que con este mecanismo se obtienen otros beneficios al mismo tiempo:
● Puesto que las rutinas no son parte del programa ejecutable, el programa es mas
pequeño, requiere menos espacio en disco y se carga mas rapdio en RAM
● Se tienen muchos programas que usan los mismos modulos de la biblioteca
● Si en uno de los modulos de la biblioteca se corrigio un error fijo, solo se necesita
corregir esa biblioteca encaminándola y cargándola en el sistema, lo que corrigue
automáticamente ese error en todo programa que haga mension de esa DLL
ElMasri CAP 12 (GESTION DE ARCHIVOS)
SISTEMAS DE ARCHIVOS
Los archivos constituyen una de las abstracciones mas importantes con que cuenta un SO. Los
programadores no quieren pensar en unidades de discos o cualquier otro medio; mas bien se
quieren ocupar de los datos que están procesando y los consideran como una recopilación. En
una computadora, esta recopilación se abstrae como un archivo. Los programas necesitan
datos con los cuales trabajar. Solemos guardar los datos en dispositivos de almacenamiento
secundario porque la MP es demasiado costosa. En la actualidad estos dispositivos donde
almacenamos son discos magnéticos giratorios o de estado solido. Una de las funciones mas
importantes de los SO es contar con la abstracción de una archivo en almacenamiento
secundario. El contenido de un archivo suele ser significativo solo para los programas de
aplicación. Con esto queremos decir que en general el SO no esta consciente de la estructura
interna de los archivos. Hay unas cuantas expciones, como los programas ejecutables (binarios)
que pueden ejecutar el SO y los modulos objeto que se usan para hacer estos archivos. Tales
archivos tienen estructuras definidas por el SO mismo. Estas estructuras son conocidas por
todas las utilidades del ligador o cargador que se usa para hacer los archivos ejecutalbes y los
compiladores y emsambladores utilizados para producir los modulos objetos apartir del
programa fuente.
INTRODUCCION
Los sistemas de archivos suelen tener diseños por capas, donde cada capa proporciona
servicios ala capa que esta arriba de ella. Todo SO cuenta con una partición única de las
funciones por medio de estas capas. Respecto a los sistemas de archivos, hay dos cosas que
son verdaderas; la capa superior API es una abstracción del concepto de archivos y la capa
inferior interactura directamente con el hardware
DIRECTORIOS
Para que un programa pueda usar un archivo, primero debe encontrarlo. El SO requiere contar
con algún tipo de índice de los archivos que el programa puede buscar. Estos índices se
denominan directorios. ( también llamados folder o carpetas ) resulta evidente que estos
directorios deben almacenar el nombre del archivo, pero también otros datos sobre el mismo.
Esta otra info sobre el archivo que no forma parte de los datos del mismo se denomina
metadatos del archivo.
ESTRUCTURA LOGICA
Hay muchas estructuras lógicas diferentes que pueden usarse a fin de almacenar una
estructura de directorio para un sistema de archivos. Como por ejemplo:
● De un solo nivel : La forma de organizar lógicamente el directorio en un disco depende
en cierta medida del tamaño de este ultimo. Normalmente había un solo directorio
para todo el disco
● Estructura de árbol : A medida que el tiempo fue avanzando las unidades de disco
cuentan con capacidades de miles de millones de bytes ( GB ). Es normal que un disco
asi contenga miles de archivos. Un solo direcotrio no podría funcionar en tales
unidades de disco. Asi un desarrollo clave en la organización dela estructura lógica de
los directorios de discos fue permitir directorios multiples. El truco era permitir que los
directorios se refirieran a otros, además de referirse a archivos. Con esta organización
jerarquica de directorio es posible dividir los archivos en varias categorías. Pero un
efecto lateral a esta organización es que puede haber muchos archivos con el mismo
nombre con solo manterlos en directorios por separado, sim embargo, por esta
característica los nombre de archivos no pueden especificarse de manera única solo
por el nombre, para hacer referencia sin ambigüedad a un archivo es necesario
porporcionar la ruta completa de los directorios que llevan a ese archivo, suele ser
común separar los nombres de los subdirectorios por medio de “/”.
ESTRUCTURA FISICA
En sistemas antiguos se prestaba mucha atención a la velocidad para ubscar directorios. Como
resultado, algunas técnicas usadas como el hashing (picando) para acelerar las búsquedas en
directorios. La gran parte de los SO modernos no se preocupan por estas cuestiones, y los
directorios no están ordenados en ningún orden particular. Por lo tanto la busuqeda es
simplemente secunecial.
OPERACIONES EN DIRECTORIOS
El SO debe atender varias operaciones en diferentes directorios. Podria pensarse que estas
deben ser solo las operaciones atendidas en los archivos, ya que los directorios son archivos.
Pero con algunas diferencias, debido a las consecuencias catastróficas de cometer un error en
el sistema de archivos, la mayoría de los SO no permiten que un programa de aplicación
escriba en un directorio. En lugar de eso, la aplicación debe llamar a rutinas especiales para
crear un nuevo archivo o un nuevo direcotorio o cualquier operación en directorios, en la sig
tabla se muestran el num de operaciones que un SO podría atender en directorios.
● Acceso HASH : Es otro método de acceso de nivel superior que aveces tienen los SO.
Puede aplicarse la técnica hash a un campo clave para crear un valor clave aleatorio
para tener acceso a un archivo de acceso aleatorio cuando no se usan todos los valores
clave. Pero el hecho de generar claves hash probablemente crea números de registro
que chocan para diferentes valores de la clave fuente, de modo que debe contarse con
un mecanismo para reslver estas colisiones.
ACCESO EN BRUTO
Para algunas apps, los servicios proporcionados por el sistema de archivos pueden ser
contraproducentes. Esto puede ocurrir cuando una app tiene altos requerimientos de
desempeño y los desarrolladores de la app conocen muy bien los patrones de acceso a los
archivos que esta utiliza. El SO algunas veces cuenta con un método de acceso en bruto . en
este caso el SO no suministra ninguna estructura de archivos, sino que reserva un área del
disco donde las apps pueden proporcionar su propia estructura. Algunos ej: almacen de
paginación del SO en si y sistemas de bases de datos.
RASTREO DEL ESPACIO LIBRE
El SO almacena archivos y directorios en bloques del disco. Para hacerlo, debe saber cuales
bloques aun no se han usado. Hay dos formas para seguir la pista de ese espacio libre, Listas
ligadas y Mapas de bits. Inicialmente los sistemas de archivos seguían la pista del trozo mas
pequeño de espacio al que era posible tener acceso en una unidad de disco: un sector. A
medida que el disco aumentaba también aumentaban los apuntadores a los sectores en el
disco. La simple asignación de dos vectores juntos podía duplicar el alcance del apuntador. El
proceso era ampliado, y en algunos casos los sistemas de archivos asignaban hasta 64 sectores.
La estrucura se denomina Bloque o algunas veces clúster.
RASTREO DEL ESPACIO LIBRE DE UNA LISTA LIGADA
Una forma de seguir la pista del espacio libre es colocar todos los bloques libres en una lista. El
SO debe seguir la psita del primer bloque de la lista. Cada bloque libre contiene entonces un
apuntador hacia el siguiente bloque libre. La lista no esta en cualquier orden. Podriamos
ordenarla, pero cuando la aplicación libera un bloque es necesario poder colcoarlo en la parte
frontal de la lista, de modo que tengamos que preocuparnos por cambiar cualquier otro sector
en el disco para apuntar a este nuevo bloque recientemente liberado. Tomamos el aputnador
hacia el bloque que se encuentra en la cabeza de la lista yl o colocamos en el nuevo bloque
recientemente liberado. Escribimos el sector del bloque que contiene el apuntador del
siguiente bloque libre al disco y registramos el bloque reciente liberado como el primer bloque
en la lista. Otros problemas con este mecanismo es que para obtener la dirección del siguiente
bloque libre, el SO debe leer el bloque libre porque contiene el apuntador hacia el siguiente.
ASIGNACION DE ARCHIVOS
Otra decisión fundamental es como los archivos en si deben organizarse en la unidad de disco.
La abstracción que el SO presenta al usuario por medio de la API ( interfaz de programa de
aplicación) determina parcialmente los tipos de organización que puede usar el SO. Hay
básicamente 3 mecanismos para asignar el espacio a un archivo. Son los mecanismos
contiguo,ligado e indexado. No es necsario que un SO utilice solo uno, algunos atienden
multiples tipos de asignación de archivos, solo necesita las API que atiendan ambos tipos de
solicitudes de asignación y seguir la pista del espacio libre correctamente.
ASIGNACION CONTIGUA
Esto siginifca que los bloques fijados a un archivo tienen números en una secuencia
estrictamente creciente por 1. Por ejemplo en la sig figura vemos que el archivo B ocupa de
manera contigua los bloques 1000-1799. Estos bloques no necesariamente empiezan en el lite
de una pista. Simplemente son adyacentes en el esquema de numeración. Este esquema de
asignación de espacio de archivos presenta varias ventajas. Para encontrar los datos se
requiere poca información. Basta con la dirección del sector del primer bloque y la longitud del
archivo en los bloques. El método de asignación efectua un acceso aleatorio a los datos de
manera muy simple. El mecanismo de la API varia del SO y del tamaño del bloque que va a ser
asignado.
Un problema de la asignación contigua es que una vez que se ha asignado un archivo, puede
ser difícil hacerlo mas grande porque es probable que algún otro archivo sea asignado después
del que queremos hacer mas grande. Por ejemplo en la fig vemos que no es posible hacer mas
grande el archivo A sin mover el archivo B. Para evitar este problema, se tiende a asignar mas
almacenamiento para que el archivo que esta siendo requerido por los datos.
De esa forma, el archivo puede crecer durante un tiempo antes de que sea necesario hacerlo
mas grande. Por ejemplo, el programador podría saber que el sistema tiene 100 registros y
suele agregar dos registros mas al mes. El archivo se asigna entonces con espacio para 130
registros y puede operar durante algo mas de dos años sin llenarse. Esto se denomina
fragmentación del programador. Esto desperdicia mucho almacenamiento. Si no hay
suficiente espacio para la nueva copia, es necesario descargar el archivo a un dispositivo de
almacenamiento terciario, borrar el archivo anterior, mover otros archivos para hacer
suficiente espacio contiguo para el nuevo archivo, asignar el nuevo archivo y cargar los datos.
Lo tedioso de este mecanismo condujo a una variante del mecanismo de asignación de
espacio: el uso de extensiones. En este esquema un archivo no esta limitado a una asignación
contigua única. La asignación inicial es un bloque contiguo, pero si esta lleno, en lugar de hacer
una nueva copia se efectua la asignación secundaria, no necesariamente contiuga al asignación
inicial.
Otro incoveniente del mecanismo de asignación por lista ligada es que algunas veces es difil
efectuar métodos de acceso aleatorio en tales archivos, pero no imposible.
El lado bueno es que con archivos vinculados no hay fragmenacion del programador, no hay
presión para sobreasignar el espacio inicial del archivo.
El problema con los archivos vinculados es que a medida que crece el archivo, el bloque
“siguiente disponible” puede estar en cualquier parte del disco. Como resultado, la lista ligada
tiende a rebotar de un lado a otro en el disco, dependiendo de cual bloque estaba disponible
cuando fue alargado el archivo. El procesamiento de tal archivo con un programa que esta
haciendo mucha E/S y muy poco procesamiento puede ser muy costoso. El hecho de volver a
agrupar los archivos de modo que los bloques asignados a cada uno estén en orden y sean
contiguos se denomina fragmentación. Esta puede acelerar significativamente el prcesamiento
de los archivos.
Muchos SO tienen ambos tipos (asignación contigua y vinculada) y el resultado es que tienen
tanto el problema de fragmentación externa como el de cadena aleatorioa. En tales sistemas,
la desfragmentación puede ayudar con estos problemas.
ASIGNACION INDEXADA
Asi como hay un método indexado para seguir la pista del espacio libre, hay un mecanismo
semejante par aseguir la pista de la estructura de un archivo. La estrucuta de archivo indexada
es algo asi como una lista vinculada exepto que separamos un bloque inidice para mantener
los apuntadores, en lugar de colocar los aputnadores en cada bloque de datos. Asi como el
mecanismo de rastreo de espacio libre, en la implementación mas simple estamos limitados a
un bloque índice único. Esta restricción limita el tamaño del archivo, puesto que los bloques
son de tamaño fijo y en consecuencia el índice solo puede mantener apuntadores hacia un
numero máximo de bloques. Hay dos formas en que es posible expandir el mecanismo para
eliminar este limite: podemos usar multiples niveles de inidices, en forma semejnate a como se
hizo con las tablas de pagina de RAM o podemos vincular los bloques de inidices mismos en
una lista.
● Indices multinivel: con inidices multinivel de nuevo usaremos un bloque para contener
apuntadores en forma sejemante como se hizo con la estrucuta de inidice único. Pero en este
caso el primer bloque inidice no contiene apuntadores aun bloque de datos. En lugar de ello,
contiene apuntadores a bloques de inidice de segundo nivel. Con una estrucuta de inidices de
dos capas, estos bloques inidices contienen aputandores hacia bloques de datos. Si un bloque
índice contiene 100 apuntadores, cuand se introduce una estructura de dos capas, lo anterior
se multiplica por 100. Entonces es posible direccionar un archivo que contiene 10 000 bloques.
Si esto no es suficiente podríamos introducir otra capa de inidices, multiplicando cada vez el
espacio original por 100. El siguiente nivel seria 1 mill. De bloques . Observemos que no
necesariamente se requiere leer todo el conjunto de bloques de inidices en la memoria cuando
el archivo se abre por primera vez. Podemos esperar hasta que la aplicación intente tener
acceso a la porción del archivo cubierta por un índice para leerlo. Esto es especialmente útil
para archivos muy grandes abiertos y leídos brevemente: por ejemplo para buscar una palabra
en un diccionario.
● Listas ligadas de bloques indexados: Asi como con las listas ligadas de espacio libre,
podemos simplemente ligar bloques indexados entre si en una cadena. Cada bloque indexado
contiene asi un apuntador menos hacia bloques de datos porque necesitamos uno para tener
acceso al siguiente bloque inidice, pero es poco porbable que esto sea un factor importante
para la mayor parte de los bloques y tamaños del disco. Si se esta teniendo acceso aleatorio a
un archivo, este mecanismo requiere seguir la cadena ligada una vez que se abre el archivo y
leer los bloques inidice en la MP. Por supuesto, podemos postergar la lectura de todos los
bloques hasta que sea necesario. Si se esta teniendo acceso al archivo secuencialmente, es
posible leer cada bloque índice cuando estamos próximos al ultimo apuntador en el bloque
previo.
CAP 14 (ELMARSI)
Dispositivos de Bloque
Dispositivos de Caracteres
Para efectuar una operación que no se ajusta a la semántica del modelo del
sistema de archivos, un programa puede usar la llamada al sistema ioctl.
Dispositivos de Red
Tecnología de E/S
Tecnología de E/S
● Buffers.
● Cachés.
● Operaciones en bloque.
Almacenamiento en Búfer
Otra razón para usar los búfers podría ser que estamos tratando con dos
dispositivos que son de acceso a bloques, aunque el tamaño de bloque de los
dispositivos sea distinto.
Almacenamiento en Caché
Los sectores son la unidad de datos más pequeña que una unidad de discos
puede transferir.
La técnica de grabación por zonas de bits divide las pistas del disco en zonas
de pistas de tamaño semejante y cambian la sincronización para las pistas en
cada zona.
Particiones
Consiste en dividir una unidad de disco única en múltiples partes y que cada
una sea tratada como una unidad por separado.
Bloque de Arranque
Notas
INTRODUCCION
MS-DOS también conocido como DOS, fue desarrollado para su ejecución en computadoras de
escritorio de usuario único e independiente. MS-DOS era el SO normal entregado con millones
de estas maquinas.
Este SO ejemplifica los primeros SO porque administra trabajos en forma secuencial desde un
usuario único. Sus ventajas son: su operación fundamental y sus comandos de usuario directos
MS-DOS fue escrito para una sola familia de microprocesadores: los chips Intel 8088,8088,
80186 y 80286.
MS-DOS fue el primer SO para una generación de microcomputadoras.
Este SO fue el sucesor de CP/M. Se ejecutaba en las primeras PC, maquinas de 8 bits
comercializadas por Apple y Tandy. Pero cuando las primeras PC de 16bits fueron desarrolladas
requerían un SO con mas capacidad que CP/M.
IBM junto a Digital Research ofrecio el nuevo SO para las computadoras de 16 bits CP/M-86 y
Softech su sistema P. Mientras que Bill Gates y Paul Allen, descubrieron un SO innovador
denominado 86-DOS, diseñado por Seattle Computer Products para ejecutar esa línea de
productos de PC de 16bits. Microsoft lo compro y lo denomino MS-DOS (Microsoft Disk
Operating System ) y lo puso a disposición para IBM.
IBM escogio MS-DOS y lo denomino PC-DOS y lo proclamo la norma para su línea de PC.
Mientras MS-DOS se volvia el SO normal para PC.
Los programas escritos para esu ejecución en versiones antiguas también eran compatibles en
versiones mas actuales, también significaba que entre fabricantes diferentes, con los mismo
comandos se obtenia la misma respuesta del SO, sin importan quien había fabricado el
hardware.
OBJETIVOS DE DISEÑO
Este SO fue diseñado para atender a un usuario único en un entorno de proceso único. ( como
se muestra en la fig ) Su soporte normal de E/S incluye, teclado,monitor,impresora y unidad de
almacenamiento secundario. Sus comandos de usuario están basados en palabras y frases en
ingles y son indicativos de la acción a realizar. Estos comandos son interpretados por el
procesador de comandos.
El enfoque por capas es fundamental para el diseño de todo el sistema MS-DOS, que es
“proteger” al usuario de no tener que trabajar con los bits y bytes de la maquina desnuda que
integran la capa inferior. Cada capa esta construida sobre la capa precedente empezando de
abajo hacia arriba.
La capa inferior del MS-DOS es el BIOS ( Basic Input/Output System ). Esta capa del SO se
interconecta directamente con los distintos dipositivos E/S. el BIOS contiene los controladores
de dispositivos que controlan el flujo de datos hacia y desde cada dispositivo exepto las
unidades de disco. Recibe información de estado sobre el éxito o fracaso de cada operación
E/S y le pasa al procesador. BIOS se ocupa de las pequeñas diferencias entre unidades de E/S,
de modo que el usuario puede comprar cualquier impresora de cualquier fabricante sin tener
que escribir un cntrolador de dispositivo para ella.
La capa del medio, el nucleo DOS, contiene las rutinas necesarias para conectarse con las
unidades de disco. Se lee en la memoria en el momento de iniia desde el archivo MSDOS.SYS
que reside en el disco de arranque. El nucleo del DOS es un programa registrado
proporcionado por Microsoft Corporation que implementa MS-DOS. Al nucleo tienen acceso
los Programas de aplicación y el nucleo porporciona una colección de servicios independientes
del hardware, como administración de memoria y administración de archivos y registros. Estas
se denominan funciones del sistema. Como BIOS, el nucleo DOS compensa diferencias de un
fabricante a otro, de modo que todas las unidades de disco funcionan del mismo modo. El
nucleo hace que la administración de archivos sea transparente para el usuario, de modo que
no es necesario recordar en que pistas y sectores están almacenados sus archivos, y que
sectores del disco están dañados y deben evitarse. El nucleo hace este trabajo por el usuario;
administra el almacenamiento y la recuperación de archivos, asigna y libera dinámicamente el
almacenamiento secundario según sea necesario.
La tercera capa, el procesador de comandos, también llamado Shell. Esta es la parte del
sistema que envía desplegados al usuario, acepta los comandos escritos, ejecuta los comandos
y emite las respuestas idóneas. El procesador de comandos reside en un archivo denominado
COMMAND.COM, Que consta de dos partes almacenadas en dos secciones diferentes de la
MP. Este es solo uno de varios programas que integran el MS-DOS; los demás están ocultos
(COMMAND no es donde reside el SO).
El trabajo del procesador de comandos consiste en llevar a cabo los comandos del usuario
introducidos desde el signo del sistema sin tener que esperar las instrucciones de algún
controlador de dispositivos. Por ejemplo, cuando el usuario emite el comando PRINT, el
procesador de comandos dirige el resultado hacia la línea de impresión mediante el BIOS.
La debilidad del procesador de comandos es que no es interpretativo, es decir no pueden
tomarse atajos para abreviar los comandos. Debía aprenderse a introducir cada comando
correctamente y de forma completa.
Administración de memoria
Su tarea es sencilla, porque solo administra un solo trabajo para un usuario único. Para
ejecutar un segundo trabajo, el usuario debe cerrar o hacer una pausa en el primer archivo
antes de abrir el segundo. El administrador de la memoria usa un esquema de asignación de
memoria del primer ajuste. El primer ajuste fue escogido para las primeras versiones de DOS
porque es la estrategia mas eficiente en un entorno de usuario único.
Estructura
La MP viene en dos formas: memoria de solo lectura ( ROM ) y memoria de acceso aleatorio (
RAM).
La ROM es tamaño pequeño y contiene a un programa, una sección de BIOS con la única tarea
de iniciar el sistema. El proceso de inicialización es llamado rutina de arranque debido a que
efectivamente el sistema sale adelante por si mismo por medio de sus rutinas de arranque.
Este programa en ROM inicia la computadora. Tambien recupera el resto de la porción
residente del sistema operativo de almacenamiento secundario y lo carga en RAM.
RAM es la parte de la MP donde se cargan y ejecutan los programas. La disposición de la RAM
para una computadora con 1 MB de memoria se muestra en la fig
La parte inferiror de la RAM denominada memoria baja porque es donde empieza la memoria:
0,1,2 .. esta ocupada por 256 vectores de interupcion y sus tablas.
Un vector de interrupción especifica donde esta ubicado el programa manejador de
interrupciones para un tipo de interrupción especifico. Lo anterior es seguido por tablas BIOS y
tablas DOS, y por el nucleo DOS con controladores adicionales instalables, en caso de haber
alguno, que se especifican en el archivo de configuración del sistema denominado CONFIG.SYS.
Esto es seguido por la parte residente del interprete de comandos COMMAND.COM; la sección
necesaria para ejecutar programas de aplicación.
Cualquier programa del usuario puede cargarse ahora en el área transitoria de programas TPA.
Si un gran programa requiere mas espacio, el área superpuesta de COMMAND.COM, localizada
en la ubicación de memoria alta, también puede usarse por el programa de aplicación. Los
programas COMMAND.COM en esta área se consideran transitorios porque se usan para
jeecutar comandos, como FORMAT, que no puede ejecutar el usuario cuando esta
ejecutándose un programa de aplicación, de modo que es posible que otros porgramas se
superpongan ( o sobreescriban ).
ASGINACION DE LA MEMORIA PRINCIPAL
Las primeras versiones de MS-DOS porpocionaban toda la memoria disponible al programa
residente, pero esto es ineficiente porque el esquema simple de asignación de memoria
contigua no permitia que los programas de aplicación asignaran y liberaran de manera
dinámica bloques de memoria. Con la versión 2.0, MS-DOS comenzó a entender asignación y
modificación dinámica, y a liberar de la MP bloques por medio de programas de aplicación.
La cantidad de memoria que realmente pertenece a cada programa de aplicación depende
tanto del tipo de archivo como del programa que se cargue y del tamaño del área transitoria
de la TPA.
Toda la TPA se proporciona a los programas con la extensión COM, la necesiten o no.
A los programas con extensión EXE solo se les proporciona la cantidad de memoria que
necesitan. Estos archivos tienen un encabezado que incida la cantidad minima y máxima de
memoria necesarias para la ejecución del programa. Si el minimo es mas que la cantidad de
espacio disponible, no es posible ejecutar el programa.
Exepto por archivos COM, en la TPA puede haber cualquier numero de archivos a la vez, pero
¿Por qué un sistema puede tener dos porramas en la memoria cuando solo puede ejecutar
uno? RTA: al contar con varios archivos en memoria, un usuario puede abrir rápidamente uno,
trabajar con el y cerrarlo antes de abrir el siguiente. No es posible abrir ambos al mismo
tiempo, pero esto se vuelve mas rápido al usuario.
Si un programa que ya esta en ejecución requiere mas memroia, como para buffers a dicionales
de E/S, el administrador de memoria verifica si queda bastante memoria suficiente. En caso
afirmativo, la asigna al programa mientras actualiza la tabla de asignación de bloques de
memoria para ese programa. En caso contrario, se regresa un mensaje de error al usuario y el
programa se detiene.
ASIGNACION DE BLOQUES DE MEMORIA
El administrador de memoria asigna la memoria usando un algoritmo del primer ajuste y una
lista enlazada de bloques de memoria. Pero con la versión 3.3 y posteriores, es posible escoger
la estrategia de primer o ultimo ajuste. Cuando se usa ultimo ajuste DOS asigna el bloque de
mmeoria direccionable mas alto suficientemente grande para satisfacer la solicitud del
programa.
El tamaño del bloque puede varias desde tan pequñeo como 16 bytes denominado párrafo
hasta tan grande como la máxima memoria disponible. Cuando se forma un bloque, los cinco
primeros bytes de un bloque de memoria definen las caracterisitcas estructurales del bloque.
Siempre que llega una solicitud por memoria, DOS busca en la lista de bloques
libres/ocupados, hasta que encuentra un bloque libre que se ajusta a la solicitud. Si la lista de
bloques se desconecta se genera un mensaje de error y el sistema se detiene, es necesario
reiniciarlo.
Un programa de aplicación bien diseñado libera el bloque de memoria que ya no necesita. Y si
no esta bien diseñado amontona sus bloques de memoria hasta que termina su ejecución; solo
entonces MS-DOS puede liberar los bloques de memoria usados por ese programa.
Si dos bloques de memoria son libres contiguos, de inmediato se fusionan en un bloque y se
enlazan a la lista.
ADMINISTRACION DEL PROCESADOR
ADMINISTRACION DE PROCESOS
Como no es posible ejecutar dos trabajos al mismo tiempo, ya que MS-DOS fue diseñado para
un entorno de tarea única y de usuario único. Pero algunos programas de software dan esa
ilusión como Microsoft Windows, por ejemplo parecen interrumpir el programa padre,
cambiar lo que aparece por pantalla, ejecutar programas no relacionados y luego regresar al
padre; pero eston o es multitarea ( multitarea es sinónimo de la industria de
microcomputadoras para multiprogramación ). Estos programas se ven y se siente como
operaciones multitareas porque retienen su área de la memoria y ejecutan programas
ejecutables, pero no están en el estado de ejecución al mismo tiempo. Esta ejecución es
posible porque los manejadores de interrupciones integrados en MS-DOS proporcionan a los
programadores la capacidad de guardar toda la información sobre su programa padre, lo cual
permite su reicinio idóneo una vez que termina el programa hijo.
MANEJADORES DE INTERRUPCIONES
Los manejadores de interrupciones son los responsables de la sincronización de procesos. Una
PC cuenta con 256 interrupciones y manejadores de interrupciones, a los que tiene acceso por
medio de la tabla de vector de interrupciones residente en los bytes inferiores de la memoria,
(como se muestra en la fig). Las interrupciones pueden dividirse en 3 grupos:
● interrupciones internas de hardware son generadas por ciertos eventos que ocurren
durante la ejecución de un programa, como división por cero.
● interrupciones externas de hardware son ocasionadas por controladores de
dispositivos periféricos. El software no puede modificar estas asignaciones porque
están conectadas directamente; implementadas como conexiones eléctricas físicas
● Interrupciones de software son generadas por el sistema y por programas de
aplicación. Tienen acceso a funciones del DOS y del BIOS, las que a su vez tienen
acceso a los recursos del sistema.
Algunas interrupciones de software se usan para activar programas de aplicación
especializados que asumen el control de la computadora. Este tipo de manejador de
interrupciones denomina Terminate y Stay Resident ( TSR ).Su función consiste en terminar un
prceso sin liberar memoria, proporcionando asi facilidades de programas residentes en la
memoria. El TSR suele ser utilizado por bibliotecas de subrtuinas que son llamadas una vez
desde el nivel de comandos MS-DOS y luego son puestas a disposición para proporcionar
servicios a otras aplicaciones a travez de una interrupción de software. Cuando un TSR
empieza a funcionar, establece sus tablas de la memoria y se prepara para su ejecución al
conectarse a una interrupción DOS; cuando todo esta listo, el programa determina cuanta
memoria debe mantener. Luego, cuando el programa sale, se hace pasar un código de regreso
al padre.
Como se sincronizan estas interrupciones? Cuando la CPU detecta una interrupción, hace dos
cosas: 1) coloca en una pila el contenido del PSW ( programa de estado de palabra ), el
segmento del código de registro y el registro del apuntador de instrucciones; y 2) deshabilita el
sistema de interrupciones de modo que todas las otras interrupciones se apaguen hasta que se
haya resulto la interrupción actual. La CPU usa el numero de 8 bits colocado sobre el bus del
sistema por el dispositivo de interrupciones idóneo de la tabla del vector de interrupciones y
obtiene ejecución en esa dirección.
Finalmente, el manejador de interrupciones reactiva la interrupción del sistema para permitir
que interrupciones de alta prioridad ocurran, salvando cualquier registro que este necesite
usar y procesando la interrupción lo mas rápido posible.
Este procedimiento es delicado. La sincronización de las actividades del TSR con funciones del
DOS ya en progreso debe diseñarse e implementarse con cuidado para evitar modificar cosas
que no deben modificarse o la caída del sistema.
ADMINISTRACION DE DISPOSITIVOS
Como MS-DOS esta diseñado para un entorno de usuario único, todas las solicitudes se
manejaban sobre el base primero en llegar, primero en salir , pero desde la versión 3.0, BIOS
puede antender spooling a l permitir que los usuarios planifiquen la impresión de varios
archivos uno después de otro. Para hacer esto, BIOS transfiere de manera continua datos
desde un buffer espeficio de la memoria hacia la impresora hasta que se vacia el buffer.
El administrador de dispositivos de MS-DOS permite trabajar con cualquier dispositivo de
almacenamiento, disquetes, disco duros, etc.
Estos sistemas solo usan un tipo de dispositivo E/S para cada puerto, de modo que lso canales
de dispositivos no forman parte del MS-DOS y debido a que cada dispositivo cuenta con su
propia unidad de control dedicada, los dispositivos no requieren administración espcial del SO.
En consecuencia, los manejadores de dispositivos son los únicos dispositivos necesarios para
que el administrador de dispositivos haga funcionar el sistema. Un contrlador de dispositivos
es un modulo de software que controla un dispositivo de E/S aunque maneja sus
interrupciones. Cada dispositivo tiene su propio controlador. BIOS es la porción de
administrador de dipsotivios que manipula el software del controlador de dispositivos.
El BIOS esta almacenado en ROM y en RAM. En muchos otros sistemas MS-DOS, las partes mas
primitivas de los contrladores están ubicadas en ROM, dem odo que pueden usar las
aplicaciones y diagnosticos independientes, asi como el programa bootstrpping del sistema.
Una segunda sección se carga desde el disco hacia la RAM y extiende las capacidades de las
funciones básicas almacenadas en RM, de modo que BIOS puede manejar todas las solicitudes
de E/S al sistema. BIOS responde interrupciones generadas por hardawre y software.
ADMINISTRACION DE ARCHIVOS
MS-DOS atiende organizaciones de archivos secuenciales, directos e indexados secuenciales.
Los archivos secenciales pueden tener registros de longitud variable o fija. Sin embargo, los
archivos directos y los indexados secuenciales solo pueden tener registros de longitud fija.
CONVENCIONES DE NOMEMCLATURA DE ARCHIVOS
Un nombre no contiene espacios en blanco y consta de la identificación de la unidad, el
directorio. DOS no es sensible a minisculas o mayúsculas de modo que ls nombres de archivos
pueden escribirse de cualquier forma.
La identificacicon de la unidad ( A ; B ; C ; D ) esta seguida por dos puntos ( : ).
Los directorios o subdirectorios pueden tener entre uno y ocho caracteres de longitud y van
precedidos por un backslash ( \ ) . el nombre de archivo puede tener entre 1 y 8 caracteres de
longitud y la extensión de 1 a 3 caracteres ( ej : exe ). El nombre base y las extensiones van
separadas por un punto.
Un nombre relativo de archivo consta de su nombre base y una extensión, en caso de usarse.
Un nombre absoluto de archivo consta de su identificación de unidad y la ubicación de su
directorio ( denominado ruta ) seguidas por su nombre relativo.
Cuando un usuario esta trabajando en un idrectorio o en un subdirectorio, el directorio en
cuestión se denomina directorio de trabajo y a cualquier archivo en ese directorio puede
tenerse acceso median su nombre relativo. Pero para tener acceso a un archivo que esta en
otro directorio se requiere el nombre absoluto.
Si estoy en el directorio actual y tengo un archivo “trabajo.doc” entonces lo llamo de la misma
manera.
Si estoy en otro directorio debo incluir el nombre del directorio cuando llame a ese archivo
/Tomi/TPS/trabajo.doc
Si estoy en otra unidad, debo poner la unidad donde esta ubicado C:\Tomi\TPS\trabajo.doc
ADMINISTRACION DE ARCHIVOS
Las primeras versiones de MS-DOS mantenían cada archivo en un solo directorio. Esto era
lento y engorroso, especialmente a medida que se agregaban mas archivos.
Para recuperar un solo archivo, el administrador de archivos buscaba desde el principio de la
lista hasta encontrar el archivo o llegar al final de la lista. Si un usuario olvidaba el nombre de
un archivo, había posibilidad de no verlo nunca mas. Para resolver esto Microsoft implemento
una estructura jerarquica de directorios en la versión 2.0; una estructura de árbol invertida (
raíz en parte superior y hojas en la parte inferiror)
Cuando se formatea un disco ( usando el comando FORMAT ) sus pistas se dividen en sectores
de 512 bytes cada uno. ( esto corresponde al tamaño del buffer de 512 bytes ) Los discos de un
solo lado tiene una superficie grabable; los de dos lados tienen dos, y los discos duros tienen
de dos a cuatro platos, cada uno con dos superficies grabables.
Los sectores ( de dos a ocho ) están agrupados en clusters y esa es la manera en que el
administrador de archivos asigna espacio a los archivos. Cuando un archivo requiere espacio
adicional, DOS le asigna mas clusters. Ademas de divdir el espacio del disco, FORMAT crea tres
áreas especiales sobre el disco:
el registro de arranque es el primer sector de todo disco lógico, ya sea una unidad – entidad
totalmente física (como un disco duro o disquete) o solo un disco virtual (como un disco RAM).
Empezando con la versión 2.0 el registro de arranque contiene el programa del disco de
arranque y una tabla con las características del disco.
el directorio raíz es donde el sistema empieza su interaccion con el usuario cuando arranca. El
directorio raíz contiene una lista de los subdirectorios y archivos primarios del sistema,
incluyendo cualquier archivo de configuración generado por el sistema y cualquier intruccion
de arranque generada por el usuario que pudiera estar incluida en un archivo AUTOEXEC.BAT
se trata de un archivo por lotes que contiene una serie de comandos definidos por el usuario.
Cada vez que se enciende o restablece la CPU, el sistema ejecuta de manera automática los
comandos de este archivo.
La información que contiene el directorio raíz es:
- Nombre del archivo
- Extension del archivo
- Tamaño del archivo en bytes
- Fecha y hora que se realizo la ultima modificación
- Numero del cluster inicial para el archivo
- Los códigos de los atributos del archivo
Con el comando DIR se muestran los primeros 4 elementos.
El numero de entradas en el directorio raíz es fijo. Ej: para un disco duro de 20MB solo se
permiten 512 entradas. El tamaño del directorio raíz es limitado porque DOS requiere saber
donde empieza el área de datos del disco.
FAT que significaba Tabla de Asignacion de Archivos contiene información critica de estado,
incluyendo la capacidad de cada sector para ser asignado o no, lo que puede ser el resultado
de errores de formateo que interpretan al sector como no utilizable.
El directorio nota el numero del primer sector o cluster del archivo; ese numero se registra en
el directorio cuando se crea el archivo. Todos los sectores o clusters sucesivos asignados a ese
archivo se registran en la FAT, y se enlazan entre si para formar una cadena, donde cada
entrada del aFAT proporciona el numero de sector/cluster a la sig entrada. La ultima entrada
de cada cadena contiene el valor Hex FF para indicar el final de la cadena. Como se ve en la sig
fig
MS-DOS busca en los datos en un archivo del disco cmomo una cadena continua de bytes. En
consecuencia, las operaciones de E/S solicitan los datos por byte relativo (relativo con respecto
al inicio del archivo ) en vez de por sector relativo. La transformación de un sector físico ( o
cluster) en una dirección relativa de byte la efectua el administrador de archivos de modo que
parece que el acceso a los datos sobre un disco es justo como el acceso a los datos en la MP.
Como ya sabemos, MS-DOS atiende el almacenamiento de archivos no contiguo y asigna de
manera dinámica espacio de disco a un archivo, en el supuesto de que en el disco no hay
suficiente espacio. Lamentablemente a medida que en el disco se agregan y borran archivos,
un archivo puede volverse demasiado fragmentado haciendo cada vez mas engorroso y
consumidora de tiempo de recuperación.
La compactación se volvió una característica de la versión 6.0 de MS-DOS con la inclusión de
DEFRAG.EXE, una utilidad usada para desfragmentar discos al escoger los fragmentos de un
archivos reposicionarlos como una sla pieza en espacio contiguo.
Para determinar la necesidad de compactación puede usarlas otro comando. Dado CHKDSK (
nombre del archivo ) el sistema responde con el numero de bloques no contiguos donde esta
almacenado el archivo. Es decisión del usuario compactar al archivo, en caso de ser necesario,
de modo que se almacena en el menor numero de bloques no contiguos para acelerar el
tiempo de acceso y reducir el mantenimiento sobre el mecanismo de búsqueda.
La habilidad para restringir el acceso del usuario al sistema de computo y sus recursos no esta
incluida en MS-DOS. Se cuenta con software de seguridad que puede agregarse aunque para la
mayoría de los usuarios, los datos se mantienen seguros al mantener la computadora cerrada
físicamente o al retirar los discos y guardarlos en un sitio seguro.
INTERFAZ DE USUARIO
MS-DOS es una interfaz controlada por comandos. El símbolo C:> es el símbolo para el disco
duro y A:> es para disquetes, el símbolo del sistema predeterminado puede cambiarse usando
el comando PROMPT.
Algunos comandos también eran DIR,CD,COPY,DEL,RENAME, etc.
Los comandos son ejecutados por el archivo COMMAND.COM, que forma parte de MS-DOS,
cuando COMMAND.COM se carga durante el inicio del sistema, una de sus secciones se
almacena en la sección baja de la memoria: esta es la porción residente del código. Contiene el
interprete de comandos y las rutinas necesarias para atender un programa activo. Ademas
contiene las rutinas necesarias para procesar CTRL-C , CTRL-BREAK y los errores críticos.
El código transitorio, la segunda sección de COMMAND.COM, se almacena en las direcciones
mas altas de la memoria y pueden sobreescribirse por programas de aplicación si necesitan
usar su espacio de memoria. Desp cuando termina el programa, la porción residente de
COMMAND.COM verifica si el código transitorio sigue intacto. En caso negativo, carga otra
copia.
A medida que un usuario escribe un comando, cada carácter se almacena en la memoria y
aparece por pantalla. Cuando se oprime la tecla enter, el SO transfiere el control a la porción
del interprete de comandos de COMMAND.COM, que entonces tiene acceso a la rutina que
lleva a cabo la solicitud o muestra un mensaje de error. Si la rutina reside en la memoria,
entonces el control se le proporciona de manera directa. Si la rutina reside en almacenamiento
secundario, se carga en la memroia y después se le proporciona el control.
Como no es posible describir todos los comandos de MS-DOS merece la pena destacar la
flexibilidad de este SO.
ARCHIVOS POR LOTES
Al crear archivos por lotes personalizados, los usuarios pueden ejectuar rápidamente
combinaciones de comandos DOS para configurar sus sistemas, realizar tareas de rutina o
facilitar que usuarios no técnicos puedan ejecutar software.
Por ejemplo si un usuario verifica rutinariamente la fecha y hora del sistema, carga un
controlador de dispositivos para un raton, se desplaza cierto subdirectorio y carga un
programa denominado MAIL.COM, entonces ese programa, denominado START.BAT, realiza
cada uno de esos pasos a su vez.
Para ejecutar este programa, el usuario solo necesita escribir START en el símbolo del sistema.
Para que este programa se ejecute automáticamente cada que se reinicia el sistema, entocnes
el archivo debe volverse a nombrar AUTOEXE.BAT y cargarse en el directorio raíz del sistema.
Al usar archivos por lotes cualquier combinación tediosa puede reducirse a unos cuantos
comandos personalizados fáciles de usar.
REDIRECCION
MS-DOS puede redirigir la salida desde un dispositivo de entrada o salida normal hacia otro.
Por ejemplo, el comando DATE envía el resultado directamente a la pantalla pero al usar el
símbolo de redirección ( > ) en lugar de lo anterior la salida se redirige a otro dispositivo o
archivo.
La sintaxis: command > destination
Por ejemplo para enviar una lista del directorio a la impresora
DIR > PRN y la lista aparece en la pagina impresa , en lugar de en pantalla.
Es posible redirigir y agregar nuevos resultados hacia un archivo existente al usar el símbolo
agregar (>>). Por ejemplo: si ya se ha creado el archivo DIRFILE con el comando de redirección
y se desea generar una lista del directorio y agregarla en el archivo DIRFILE creado
previamente, debe escribirse: DIR >> B:DIRFILE
Ahora DIRFILE contiene dos listas del mismo directorio.
La redirección también funciona de manera opuesta. Si se quiere modificar la fuente a un
dispositivo o archivo especifico, debe usarse el símbolo ( < )
Por ejemplo : se tiene un programa INVENTRY.EXE que espera datos de entrada desde el
teclado, aunque para efectos de prueba y depuración se requiere que acepte datos de entrada
desde un archivo de prueba de datos. En este caso debe escribrse:
INVENTRY < B:TEST.DAT
FILTROS
Los comandos filtro aceptan datos de entrada desde el dispositivo predeterminado, manipulan
los datos de alguna manera y envían lso resultados al dispositivo de salida predeterminado. Un
filtro de uso común es el SORT, que acepta los datos de dentrada desde el teclado, ordena esos
datos y los muestra por pantalla. Este comando filtro se vuelve mas útil al usar esos
parámetros de redirección. Por ejemplo, si usted desea ordenar un archivo de datos
denominado STD.DAT y almacenarlo en otro SORTSTD.DAT, debe escribir:
SORT < STD.DAT> SORTSTD.DAT
El archivo almacenado puede estar en orden creciente empezando con el primer carácter en
cada línea del archivo. Si desea que el archivo este almacenado en orden inverso, debe
escribir:
SORT / R < STD.DAT> SORTSTD.DAT
Es possible ordenar el archive por columnas tambien, usando
SORT /+14 <EMP.DAT> SORTSTD.DAT
TUBERIAS
Una tuberia puede ocasionar que la salida normal de un commando sea utilizada como
entrada normal para otro commando; este simoblo es una barra vertical ( | ) Es posible
ordenar alfabéticamente el directorio y mostrar la lista ordenada en la pantalla al escribir:
DIR | SORT
Tambien es posible combiar tuberías y otros filtros. Por ejemplo para mostrar en la pantalla el
contenido del archivo INVENTRY.DAT a la vez, seria:
TYPE INVENTRY.DAT | MORE
Es posible ordenar el archivo y mostrar el resultado en la pantalla a la vez al usar tuberías con
este comando
DIR | SORT | MORE
COMANDOS ADICIONALES
Habia 3 comandos adicionales que se usan a menudo en MS-DOS son FIND, PRINT y TREE
FIND es un comando filtro que busca una cadena especifica en un archivo o archivos datos y
despliega todas las líneas que contienen la cadena de esos archivos.
PRINT permitia que el usuario establezca una seria de archivos para imprimir mientras libera al
COMMAND.COM para aceptar otros comandos. El comando PRINT tiene muchas opciones
pero para usar las dos siguientes estás deben proporcionarse la primera vez que se usa el
comando PRINT después de arrancar el sistema.
● El comando PRINT/B permite cambiar el tamaño del buffer interno. Por defecto es de
512 bytes, pero aumentar su valor acelera el proceso PRINT.
● El comando PRINT/Q especifica el numero de archivos permitidos en la siguiente cola
de impresión. El valor minimo para Q es 4 y el máximo 32.
TREE muestra los directorios y subdirectorios en una lista jerarquica y con sangría. Tambien
tiene opciones que permite que el usuario borre archivos mientras se esta generando el
árbol.Tambien puede usarse para borrar archivos duplicdos en diferentes directorios.
CONCLUSION
MS-DOS fue escrito para rendir servicio a los usuarios de PC, incluyendo las primeras versiones
del as computadoras personales de IBM. Tuvo éxito pero su flexibilidad limitada lo hicieron
inutilizable a medida que evolucionaban las PC.
MS-DOS se recuerda como el primer SO normal que fue adoptado por muchos fabricantes de
maquinas de calculo personales.
La debilidad de MS-DOS fue su diseño de sistema de usuario único de tarea única que no podía
atender multitarea, redes y otras aplicaciones sofisticadas requeridas por computadoras de
todos tamaños.
TERMINOS
Archivo por lotes: Archivo que incluye una serie de comandos que se ejcutan en secuencia sin
ningún dato de entrada de parte del usuario. Contrasta con una sesión interativa.
Asignacion de memoria del primer ajuste: Esquema de asignación de memoria que busca
desde el principio del bloque de árbol y escoge para su asignación el primer bloque de
memoria suficiente grande para satisfacer la solicitud. Contrasta con la asignación de memoria
del mejor ajuste.
Bootstrapping: proceso de arrancar una PC inactiva al usar un pequeño programa de inicio
para cargar otros programas
BIOS: sistema básico de entrada-salida, un conjunto de programas codificados en un chop para
cargarse en ROM al inicio.
Comando filtro: comando que dirige los datos de entrada desde un dispositivo o archivo, los
modifica y después envía el resultado a una impresora o pantalla
Compactacion: proceso de reunir fragmentos de espacio de memoria disponible en bloques
contiguos al mover programas y datos en la memoria o en almacenamiento secundario de una
PC
Controlador de dispositivo: modulo deprograma especifico que maneja las interrupciones y
controla un tipo particular de dispositivo
Extension: parte del nombre del archivo que indica cual compilador o paquete de software es
necesario para ejecutar los archivos
FAT ( tabla de asignación de archivos): tabla usada para seguir la pista de segmentos de un
archivo
Tuberia: símbolo que dirige al SO para diversificar los resultados de un comando, de modo que
se vuelvan los datos de entrada de otro comando. En MS-DOS símbolo (|)
PLANIFICACION DE PROCESOS
Como habíamos visto, un proceso puede abandonar el estado de ejcucion por varias razones.
Cuando lo hace, puede ir de inmediato al estado listo, por ejemplo si fue interrumpido por
haber llegado a los limites de su quantum. Si un proceso esta esperando algún evento, quizá
que concluya alguna operación de E/S, y el evento ocurre, entonces es necesario colocar el
proceso en el estado listo, de modo que pueda llegar al estado de ejecución y manipular el
evento. Cuanod un proceso se coloca en el estado listo, es necesario decidir cuando debe
ejecutarse en realacion con los procesos que ya se encuentra en el estado listo. Esta decisión la
toma un modulo del SO denominado Planificador a corto plazo.
Algunos algoritmos utilizados
Planificacion Primero en llegar, primero en ser atendido
El meto mas simple e históricamente usado por muchos SO, consiste en ejecutar un programa
primero en entrar, primero en salir ( FIFO ) con una cola normal. Este algoritmo se denomina
FCFS (firts come, first served : primero en llegar, primero en ser atendido ) Presenta algunas
ventajas. Es el mas justo ( bajo ninguna circunstacina favorece a un proceso en detrimento de
otro ). FCFS es mejorado a menudo al perimitir que un proceso en ejecución haga una llamada
al sistema que otorgue control al siguiente proceso en el estado listo. Esto se denomina
multitarea cooperativa. Por supuesto, los procesos en ejecución podrían tener un error o
podrían intentar contar con una mejor respuesta del usuario al usar mas tiempo de CPU de lo
debido, por lo que no era una solución ideal.
PLANIFICACION POR PRIORIDAD
Hay algunas circunstacias en la que no es aconsejable utilizar FCFS por alguna que otra razón,
podrían tenerse algunos procesos mas importantes que otros. En este caso podemos utilizar el
algortimo de planificación por prioridad. En este algoritmo damos precedencia a cada
proceso, por ejemplo nuestro manipulador de teclazos y del raton puede tener la prioridad
mas alta.
Siempre que permitimos que algunos trabajos tengan prioridad sobre otros hay un problema
especial, es posible que los procesos con prioridad mas alta estén postergando un proceso de
baja prioridad hasta el punto en que este ultimo jamas sea ejecutado. Este problema se
denomina inanición. Hay varias formas en que es posible tratar este problema, colectivamente
se denominan envejecimiento. En general monitoreamos los procesos que se han postergado
y siempre que un proceso se pospone demasiadas veces, simplemente elevamos
temporalmente su prioridad, finalmente el proceso obtendrá una prioridad suficientemente
alta que origina que sea ejecutado una vez, luego hacemos descender la prioridad a donde
estaba originalmente, al final incluso los procesos con prioridad baja terminan, aunque a
trabajos con prioridad superior se les proporcionara la mayor parte del tiempo.
PLANIFICACION GARANTIZADA
La programación FCFS proporciona a cada proceso una posibilidad justa de ser ejecutado, pero
si un proceso tiene demasiadas llamadas a bloqueos no recibe ninguna cantidad justa de
tiempo de CPU si otros procesos con menos llamadas a bloques están en ejecución. En
planificación garantizada, el SO necesita seguir la pista de la cantidad total de tiempo de CPU
por proceso y el total del tiempo reloj, luego calcula la razón del tiempo de CPU que el proceso
uso en realidad a la cantidad de tiempo que el proceso estuvo autorizado y ejecuta el que tiene
la razón mas pequñea. Esto también se llama algunas veces planificación por participación
equitativa. Seria una especia de programación por prioridad.
PLANIFICACION SRTF
Este algoritmo se llama Primero con el tiempo de ejecución mas corto ( también denominado
algunas veces como primero con el tiempo restante mas corto; STRF ) o menor trabajo
siguiente (SJN) Este simplemente selecciona el siguiente trabajo a ejecutar tal que se ejecute
durante la menor cantidad de tiempo posible. Pero como no es posible saber cuando será el
siguiente arrebato de un proceso de parte de la CPU, es posible rastrear el desempeño pasado
de cada proceso y pronosticar que en el siguiente arrebate de la CPU se comportará en forma
muy semejante a como lo hizo en arrebatos previos.
ALGORITMO HRRN ( SIGUE EL DE RAZON DE RESPUESTA MAS ALTA )
La planficiacion es semejante a la planificación menor trabajo siguiente, donde la prioridad de
cada trabajo es dependiente respecto a su tiempo de ejecución estimado. Pero HRRN también
incluye la cantidad de tiempo que el proceso emplea en espera. Un proceso obtiene prioridad
mas alta mientras mas tiempo espere. Esta variante se usa principalmnte porque disminuye la
probabilidad de inanición (cuando es posible que un proceso de prioridad mas alta estén
postergando un proceso de baja prioridad hasta el punto en que este ultimo jamas sea
ejecutado)
APROPRIACION
Suponiendo que otro proceso de prioridad superior ha estado esperando la terminación de un
evento de E/S. Puesto que sabemos que la prioridad de este proceso es superior a la del
proceso que estaba ejecutándose, podemos detener este ultimo e iniciar el de prioridad
superior. El hecho de alejar un recurso de un proceso se denomina Apropiacion. En este caso
el recurso que estamos apropiando es la CPU en si.
Podemos aplicar apropiación a cada uno de los algoritmos vistos mas arriba, si permitimos la
apropiación al algoritmo FCFS se convierte en el algoritmo Round-Robin. En este caso la
apropiación no esta basada en la prioridad sino en un cuanto de tiempo. Dejamos que cada
proceso se ejecuta una cantidad especifica de tiempo sin hacer ninguna operación de E/S. Si el
proceso exede ese tiempo, apropiamos la CPU y colocamos ese proceso al final de la cola de
ejecución.
Si aplicamos apropiación al algoritmo NJS( menor trabajo siguiente), se convierte en el
algoritmo primero la menor cantidad de tiempo que queda. Cuando se apropia un proceso en
ejecución por un proceso de prioridad mas alta, en el BCP anotamos la cantidad de tiempo que
queda en nuestra conjetura del tiempo de ejecución de ese proceso. Cuando lo reinciamos
mas tarde, no hacemos ninguna conjetura nueva.
En el algoritmo por prioridad podemos aplicacar la apropiación cuando un proceso de
piroridad superior entra en el estado listo. Este algoritmo especial carece de una denominación
especial, se le conoce como Prioridad con apropiación.
COLAS MULTINIVEL
Los SO mas modernos, usan un algoritmo de planificación mas complicado denominado colas
multinivel. En lugar de tener una cola única se tienen varias. Un nuevo trabajo se colca en una
de las colas. Todas las colas individuales pueden usar el mismo algoritmo de planificación, o
pueden usar algoritmos distintos. Si todos los algoritmos emplean espacios de tiempo, cada
una de las colas puede tener asignado un cuanto de tiempo diferente. Las colas tienen
prioridades diferentes y la cola con la prioridad mas alta se atiende primero. Una cuestión que
es necesario decidir es el mecanismo utilizado para compartir la CPU entra las colas. Hay Dos
enfoques. Primero podemos hacer que el mecanismo sea de prioridad estricta, osea que en la
medida en que haya procesos en las colas de prioridad superior, estas se ejecuten primero.
La mayoría de los SO modernos cuentan con un mecanismo feedback ( retroalimentación ) a
las colas multinivel. El supuesto inicial es que un nuevo proceso es interactivo, demodo que se
coloca en una cola de alta prioridad. Si el proceso se ejecuta por mas tiempo del permitido por
el cuanto de tiempo para esta cola sin hacer ninguna llamada de bloqueo al SO, entonces el SO
supone que en realidad no es proceso interactivo, de modo que lo mueve hacia la siguiente
cola de prioridad menor, esta cola tmabien puede tener un cuanto de tiempo mas largo.
Entonces si el proceso no termina su cuanto de tiempo en la cola rápida, quizá sea conveniente
darle mas tiempo a la cola inferior. Por lo regular hay al menos 3 de esas colas. Asi en caso de
que un proceso en ejecución en la segunda cola aun no haya realizado ninguna llamada de
bloqueo en el cuanto de tiempo apra esa cola, es desplazando a una cola inferior, quizá con un
cuanto de tiempo mas grande.
SELECCIÓN DEL MEJOR ALGORITMO
Con tantos algoritmo como compararlos? Hay vairas medidas del desempeño del sistema que
se han usado para comparar algoritmos de planificación. Algunas incluyen lo siguiente:
● Produccion : numero de trabajos que se ejecutan por hora o por minuto.
● Tiempo promedio de retorno : tiempo transcurrido desde el inicio hasta el final de
trabajo.
● Tiempo promedio de repuesta : tiempo transcurrido desde que se presenta el trabajo
hasta el inicio del resultado.
● Utilizacion de la CPU : porcentaje del tiempo en que la CPU ejecuta trabajos reales (
sin intercambiar entre procesos o hacer alguna otra tarea)
● Tiempo promedio de espera : Tiempo que el proceso pasa a la cola de listo.
La forma mas fácil de comparar el tiempo promedio de espera de los diversos algoritmos
consiste en aplicar un método denominado modelado discreto. Se toma una muestra de
procesos y sus tiempo de ejecución y manualmente se simula laejcucion de cada proceso en la
muestra de daots, luego se calcula el tiempo de espera de los procesos que no están en
ejecución y se compraran los valores.
UN PLANIFICADOR A LARGO PLAZO.
Algunos SO cuentan con otro modulo planificador denominado planificador a largo plazo. En
un SO PC con una GUI, normalemente no existe este planificador.
La tarea del programador a largo plazo es decidir cuantos trabajos tratar de ejcutar al mismo
tiempo y cuales ejecutar cuando. El primer aspecto de esta decisión es que hay algún numero
minimo de trabajos que se quiere ejcutar al mismo tiempo. La ejecución empieza con este
numero minimo de trabajos, en el supuesto de que haya mas de los que es posible ejecutar a
la vez. Un aspecto de esta decisión tiene que ver con el nivel de utilización de la CPU. Todos los
trabajos en ejcucion son esencialmente trabajos que usan bastante E/S, entonces el
planificador a largo plazo trata de encontrar algunos trabajos que considera que pueden elevar
el nivel de utilización de la CPU.
AFINIDAD DE LOS PROCESADORES
Sabemos que hay considerables gastos generales implicados cuando una CPU cambia de un
proceso a otro, debido al uso de la memoria cache que lleva a cabo el hardware, la ejecución
del proceso aminora drásticamente su velocidad durante un lapso hasta que los bufers de la
memoria cache cambian del proceso anterior al nuevo.
En un sistema multiprocesamiento a menudo es posible que el SO mantenga afinidad de
procesadores para un proceso dado (afinidad es parecido, similar , etc ) Esta afinidad
constituye un valor que el SO usara para indicar una preferencia para ejecutar este proceso en
alguna CPU particular siempre que sea posible. En algunas instancias, un administrador de
sistema puede indicar que un proceso particular debe estar estrechamente acoplado con una
CPU especifica. En otros casos, el SO simplemente intenta ejecutar un proceso en la misma
CPU que uso la ultima vez que ejecuto un proceso. En algos SO es posible dedicar una CPU a un
proceso, de modo que solo este sea ejecutado en ella.
UN BUEN PROCESO MERECE OTRO ( CREO QUE ES MODELO DE CREACION DE PROCESOS)
Cuando un usuario manda señales al interprete de comandos para iniciar un nuevo proceso,
debe haber alguna manera para que el proceso de ese interprete de comandos inicie el
proceso del usuario. El interprete de comandos envía una llamada normal al supervisor para
iniciar otro proceso.
Esta llamada al supervisor se denomina fork. El proceso que hace la llamada se denomina
proceso padre, y el proceso iniciado como resultado se denomina proceso hijo. Todo el
mecanismo se denomina “bifurado un hijo” o “ generando un hijo “. Asi resulta evidente que la
necesidad de que el interprete de comandos inicie otro proceso. Pero porque debe hacer eso
la aplicación de un usuario? La primera razón es el desempeño. Si un proceso tiene muchas
tareas por efectuar que pueden iniciarse al mismo tiempo, puede iniciar procesos adicionales
para ejecutar algunas de esas tareas y el SO puede hacer que todos los procesos se ejecuten.
Esto es factible si el sistema cuenta con multiples CPU’s . Pero hay varias complicaciones que
surgen cuando se deja que un proceso inicie otro. Por ejemplo Si por alguna razón el proceso
padre termina ¿ dejamos que cualquier proceso hijo continue su ejecución o también lo
terminamos? La mayor parte de los SO terminan de manera automática cualquier proceso hijo
si el proceso padre termina. Algunos no, en los SO modernos es posible elegir. Un proceso hijo
cuyo proceso padre ha terminado se denomina proceso huefano.
Otracuestión tiene que ver con la propiedad de los recursos. Si un proceso padre tiene un
archivo abierto ¿ El proceso hijo puede tener acceso al archivo? Todavia otra cuestión esta
relacionada con el programa que esta ejecutando el proceso hijo. En la mayor parte de los
casos de una llamada fork, el proceso hijo tiene una copia exacta del proceso padre en otro
bloque de la memoria. Observa que tanto el proceso padre como el hijo a continuación
ejecutan la instrucción que sigue a la llamada fork. Pero como sabe cada uno de los procesos
cual instacia es el padre y cual el hijo? En general el código de regreso proviene del fork y se
fija en cero para el proceso hijo y un numero positivo distinto de cero para el proceso padre.
Por lo regular contar con otra instancia en ejecución del proceso padre no es lo que se quiere.
No es aconsejable tener otra copia del interprete de comandos, lo que desea es ejecutar algún
otro programa, lo que realmente se quiere es la ejecucuion de otro programa en un proceso
hijo. Asi luego de la llamda fork, se hace otra llamada para cargar un nuevo programa en el
espacio de la memoria asignada para el proceso hijo. Esta suele ser una llamada al sistema
EXEC.
Por supuesto, si en realidad lo que se desea es la ejecución de otro programa, entonces el paso
inicial de copiar el proceso padre en otro bloque de la memoria es un desperdicio de muchos
recursos. Por tanto, algunos SO proporcionan una llamada diferente denominada comando
Shell. Este comando crea un nuevo proceso pero nunca copia el proceso padre en el espacio
hijo – carga el programa deseado inmediatamente – Algunos SO ofrecen tanto el par FORK /
EXEC como el comando SHELL y otros solo ofrecen uno u otro.
QUE ES UN HILO?
es una secuencia de tareas encadenadas muy pequeña que puede ser ejecutada por un
sistema operativo.
Un BCH (bloque de control de hilos o TCB (thread control block ) es una tabla donde se
guardan todos los datos que representaban el estado dela CPU.
Supongamos que iniciamos un proceso desde el principio y lo guardamos en esa tabla, ahora
supongamos que iniamos otro proceso. De nuevo lo dejamos en ejecución durante algún
tiempo, luego lo detenoms y guardamos el estado de la CPU en otro BCH. Ahora podemos
regresar y restituir el estado guardado de la CPU del primer hilo y reanundar su ejecución
¿Cómo seria esto diferente de la ejecución de multiples procesos? Hay varias maneras de
utilizar diversos hilos que pueden ser mejores que el uso de varios procesos. Por una razón
solo contamos con una copia del programa y los datos en al memoria, de modo que hay mas
memoria por utilizar para otras cosas. Por otra razón hay menos gastos generales para
intercambiar entre hilos que para cmabiar entre procesos puesto que solo estamos guardando
el estado de la CPU. En general esto significa almacenar unos cuantos registros ( incluyen el
apuntador de instrucciones ) y el apuntador al espacio de la pila. Finalmente cuando se están
usando multiples procesos para implementar un sistema, tiene un difícil problema de
comunicación temporal. Los diseñadores han experimentado bastantes problemas para aislar
procesos entre si, de modo que un proceso no puede modificar el contenido de la memoria de
otro proceso, ya sea intencionalmente o no. Se han inventado muchos mecanismos para
permitir que los procesos cooperativos se comuniquen. Sin embargo los hilos no tienen ese
problema. Por definición todos los hilos creados por un proceso único están en ejecución en el
mismo espacio de direcciones y comparten tanto el código como los datos, en consecuencia
los hilos tienen acceso a las mismas variables. La dificultad mas importante es impedir que los
hilos individuales manipulen los mismos datos al mismo tiempo.
Cuando iniciamos un segundo hilo, no lo comenzamos al principio del proceso, recordando que
simplemente afirmamos que diversos hilos comparten una simple copia del código del
programa y los datos que posee el proceso. Normalmente una de las primeras cosas que hace
un proceso es iniciar talbas de datos, pero solo la hace el primer hilo.
HILOS A NIVEL DEL USUARIO CONTRA HILOS A NIVEL DEL NUCLEO.
El uso de multiples procesos apareció antes que la idea de hilos. Cuando los programadores se
dieron cuenta de que el intercambio entre procesos usaba tantos recursos y aminoraba tanto
la velocidad, empezaron a desarrollar el concepto de hilos,Asi el desarrollo original de los hilos
se hizo como un conjunto de subrutinas de biblioteca. Por supuesto, esto significaba que todo
el paquete de hilos se ejecutaba en el modo del usuario y el SO no estaba consciente de que
una aplicación estaba intentando mantener multiples actividades ejecutándose en paralelo. En
consecuenca, si cualquiera de los hilos en un sistema hacia una llamada al sistema que pudiera
bloquear por alguna razón toda la aplicación, incluso todos los hilos de esa aplicación
quedarían bloqueados al mismo tiempo. Este paquete de hilos se denomina paquete de hilos
al nivel de usuario porque se ejecuta completamente en el modo usuario.
Finalmente, los diseñadores de SO decidieron que los hilos eran tan buena idea que
incorporaron sus funciones en el nucleo. Ahora el SO estaba consciente de que la aplicación
estaba utilizando hilos. Estos paquetes de hilos se denominan paquete de hilos al nivel del
nucleo también puesto que el SO esta consciente de los hilos individuales, es posible que los
hilos se ejecuten en una CPU por separado en un sistema con multiples CPU. Esta es una
ventaja fundamental para los hilos al nivel del nucleo.
En general, los hilos a nivel del nucleo son mucho mas fáciles de usar que los a nivel de usuario,
porque el programador no tiene que evitar llamadas a bloqueos.
MODELOS DE SOPORTE DE HILOS
Cuando los SO empezaron a ofrecer paquetes de hilos al nivel del nucleo, había 3 metodos
comunes para hacer que las rutinas de la bibliotecas del usuario usen hilos al nivel del nucleo.
La cuestión mas importante que los distingue es el método de mapeo de los hilos al nivel del
usuario a hilos al nivel del nucleo. Los 3 metodos son:
uno a uno : cuando la aplicación llama ala rutina de la biblioteca para crear un nuevo hilo,
dicha rutina llama al mecanismo de hilos al nivel del nucleo para crear un hilo a ese nivel. Este
modelo tiene la ventaja de ser rápido y fácil de desarrollar y comprender para el usuario
muchos a uno : Recuerda que la biblioteca del usuario que se esta modificando bloquea todo
el proceso cuando cualquier hilo en la aplicación hace una llamada de bloqueo al SO. Este
modelo hace exactamente lo mismo, solo se crea un hilo al nivel del nucleo y todos los hilos al
nivel del usuario se mapean sobre el mismo hilo al nivel del nucleo. Este modelo es menos
aconsejable que el modelo uno a uno porque no ofrece la ventaja de hilos a nivel del nucleo
muchos a muchos : En este modelo, el programador indica al sistema cuantos hilos al nivel del
usuario y cuantos hilos al nivel del nucleo serán necesarios y como deben mapearse. La idea
básica es tener un grupo de hilos al nivel del nucleo disponible y asignarles dinámicamente
hilos al nivel del usuario según sea necesario.
Aunque los hilos son mas fáciles de crear y destruir que los procesos, sigue habiendo algo de
trabajo adicional implicado en la creación de aquellos, como resutado algunos paquetes
dehilos crean un grupo de estructuras de hilos cuadno el procedimiento llama por primera vez
al paquetes de hilos. Este paquete se llama banco de hilos.
PROCESOS CONTRA HILOS
Los hilos y los procesos son – ambos – métodos para agregar paralelizacion a una aplicación.
Los procesos son entidades independientes, donde cada uno contiene su propia información
de estado y espacio de direcciones. Solo interactúan atravez de mecanismos de comunicación
interprocesos mediante el SO. Las aplicaciones suelen dividirse típicamente en procesos
durante la fase de diseño. Un único proceso de control invoca a los otros procedimientos
cuando tiene sentido separar lógicamente la funcionalidad de aplicaciones importantes.
Por el contrario, un hilo es una técnica de codificación que no afecta la arquitectura de una
aplicación. Un proceso único a menudo contiene multiples hilos. Todos los hilos en un proceso
comparten el mismo estado y mismo espacio de la memoria e implícitamente se comunican
entre si de forma directa mediante la manipulación de los datos compartidos.
Los hilos se crean para su uso a corto plazo, que suele considerarse como una tarea en serie
que no requiere ser ejecutada en secuencia, sino que mas bien puede ejecutarse en paralelo.
Una vez que dejan de ser necesarios se destruyen, el alcance de un hilo esta dentro de un
modulo de codificación especifico de modo que el hilado puede introducirse en un proceso sin
afectar al diseño global de la aplicación.
ElMasri CAP 11 de 11.1 a 11.6.2 (GESTION AVANZADA DE MEORIA)
PAGINACION
En lugar de usar el registro base para verificar una dirección, lo utilizamos para reubicarla. Esto
nos permitió la reubicacion dinámica. Sin embargo, encontramos que el hecho de permitir que
programas de tamaño variable entren y salgan de la memoria provocaba fragmentación
externa. Desafortunadamente, la compactación es solo una tarea que hace el SO para que las
cosas funcionen mejor en sentido global.
Finalmente se desarrolló otra solución: dividimos el espacio de la memoria en bloques de
tamaño fijo, y en lugar de asignar a una aplicación todo el espacio que necesita en un gran
segmento, le asignamos una cantidad suficiente de bloques más pequeños para proporcionarle
lo que necesita. Los bloques que asignamos pueden estar en cualquier parte de la memoria
porque solicitamos a la MMU que reasigne dinámicamente cada bloque por separado. Esta
técnica se denomina paginación.
Dividimos el espacio en direcciones físicas en bloques de tamaño uniforme, que denominamos
marcos. El numero de bytes en un bloque siempre es una potencia de 2.
La CPU genera una dirección de la memoria. En general, el programa ignora el hecho de que la
memoria se manipula en paginas separadas. La MMU considera que al dirección está
compuesta por dos partes, mostradas aquí como el numero de pagina, p, y el desplazamiento,
d. El desplazamiento es la dirección del byte especifico dentro del marco. El resto de la
dirección lógica es el numero de página.
El segundo diseño sigue habiendo una tabla de segmentos pero, en lugar de apuntar a tablas
de páginas separadas para cada segmento, las direcciones en la tabla de segmentos están
dentro de un espacio de dirección lineal, que luego se mapea a la memoria física de la misma
manera en que funciona un sistema paginado.
La mayor parte de los SO modernos usan este ultimo mecanismo de una u otra forma aunque
limitan el uso de los segmentos. Los segmentos se usan para restringir el direccionamiento y
controlar el acceso.
Si la referencia es una página que no está en el espacio de direcciones lógicas del proceso, el
programa ha cometido un error y se origina una excepción de direccionamiento, con lo cual es
muy probable que aborte el proceso.
Si la dirección que ha provocado un fallo está en el espacio de direcciones lógicas del proceso,
simplemente la página no se ha asignado en la memoria física, ya sea porque nunca ha sido
llevada a ésta o porque ha sido sacada de ahí. Esta condición se denomina fallo de página.
→ EAT CON PÁGINA POR DEMANDA
Consideremos lo que ocurre cuando tenemos acceso a una página que no está en la memoria.
Nuestro tiempo de acceso efectivo consta de cuatro componentes.
La tabla E/S del disco rebasa ampliamente las velocidades de la memoria. Esta dominación
conduce a varios mecanismos que parecen complicados que se han desarrollado simplemente
para evitar efectuar una operación de E/S en un sólo disco para paginación por demanda.
→ EL CONJUNTO DE TRABAJO Y REEMPLAZO DE PÁGINA
A medida que se ejecuta un programa, este hace referencia a algún conjunto de páginas, este
grupo al que hace referencia un proceso en un breve lapso se denomina conjunto de trabajo.
Este conjunto se lo mide sobre un intervalo fijo denominado ventana deslizante. Resulta
normal encontrar que un proceso tiene varias páginas en la memoria a las que ya no hace
referencia. Lo que sería lógico es identificar esas páginas y eliminarlas de la memoria una vez
que ya no sean necesarias. Desafortunadamente, el no haber referenciado alguna página
durante un tiempo no significa que la siguiente instrucción no lo haga. Por suerte, eliminar una
página que será necesaria más tarde no causa ningún problema, sólo que no es eficiente, la
siguiente referencia a la página originaria un fallo de página , de modo que la buscaría de
nuevo.
Existe una estrategia de reemplazo muy simple:
● FIFO (primera en entrar, primera en salir): El SO mantiene una cola con los números
de páginas de acuerdo a cómo estas van entrando para cada proceso y simplemente se
expulsa la más antigua. El algoritmo es de baja sobrecarga (poca carga de parte del
SO), es barato y fácil de comprender e implementar.
● Algoritmo de reemplazo de página óptimo: Cuando es necesario reemplazar una
página, el SO sustituye la página cuyo uso siguiente será el más alejado en el futuro.
Imposible de implementar ya que necesita saberse si una página será usada en un
futuro.
● Página menos usada recientemente: Se establece la hipótesis de cual página es la que
tiene mayor probabilidad de no ser usada nuevamente, de modo que se la quita.
● Algoritmo del reloj: Es el más sencillo, el hardware puede asegurar cuando se hace
referencia a una página, en una entrada de la tabla de páginas se establece un bit,
denominado bit de referencia a la página o bit de acceso o bit de uso, el hardware
verifica ese bit. Si ya está establecido, no se hace nada. Caso contrario es encendido. El
SO puede limpiar estos bits para las páginas que están actualmente en memoria.
El hardware enciende a los bits para todas las páginas a las que se está haciendo
referencia. Cuando se requiere sacar una página se busca en la tabla y si se encuentra
una página con un bit válido encendido y un bit de referencia que se limpia, podrá ser
reemplazado.
→ PÁGINAS SUCIAS
Cuando una parte de un programa se carga en una página y se sustituye por otra cosa, no es
necesario guardarlo, porque es posible volver al programa original y obtener la página se de
nuevo se hace referencia a ella. Sin embargo, si una página contiene datos y se ha modificado
parte del contenido, entonces no es posible reemplazarla.
Las páginas que han sido modificadas se denominan páginas sucias, las cuales se escriben en
un sitio especial del almacenamiento secundario, denominado archivo de intercambio (swap)
o almacenamiento de respaldo (backing store). En consecuencia, este archivo de intercambio
actúa como una extensión de la memoria primaria del sistema, dando origen a la expresión
memoria virtual.
→ MÁS ALGORITMOS DE REEMPLAZO DE PÁGINAS
● Algoritmo de segunda oportunidad: Modificación del algoritmo de reloj, busca a
través de la tabla de páginas, si el bit de referencia está establecido, entonces lo
limpia. Actualiza los bits de referencia. A medida que se desplaza a través de la tabla, si
no encuentra ninguna que esté libre en la primera revisión, encuentra algo en la
segunda.
Las operación de fondo son tareas que se efectúan cuando en el estado de listo no hay
procesos de alta prioridad. Así, las instrucciones que se ejecutan en una tarea de fondo no lo
hacen a costa del proceso de cualquier usuario, de modo que son más o menos libres.
● Algoritmo no utilizado recientemente (NRU) o Algoritmo no utilizado (NUR): Las
páginas se dividen en cuatro clases según las posiciones de estos dos bits:
○ Limpio y sin referencia
○ Sucio pero sin referencia
○ Limpio pero con referencia
○ Sucio con referencia
En la primera clase se busca encontrar páginas sin referencia y limpia para poder usarse de
inmediato. Si no se encuentra, vuelve a buscarse de nuevo en la clase dos y así sucesivamente.
→ CUANTAS PÁGINAS PARA CADA PROCESO?
Podemos estudiar programas en ejecución en un sistema prototipo y fijar algún límite
arbitrario. Pero si no se cuenta con los suficiente procesos en ejecución para llenar con páginas
toda la memoria, se producen fallos de páginas cuando no se las desea. Por lo que no es buena
idea. Es posible hacer que el sistema sea un poco más dinámico.
● Asignación equitativa: Dividir el número de páginas disponibles entre el número de
procesos en ejecución.
● Asignación proporcional: Deducir que programas puedan utilizar más páginas
comparar sus tamaños.
→ BALANCE AUTOMÁTICO DEL LÍMITE DE PÁGINAS
La mayor parte de los SO usan este mecanismo. Alguno de estos son variantes del algoritmo
de la frecuencia de fallo de página y depende de la ide de que la tasa de fallo de un proceso es
un buen indicador de si se tiene el número correcto de páginas. Si hay muy pocas páginas, la
tasa de fallo de página aumenta rápidamente. Si no se está generando ningún fallo, también
puede tener páginas en la RAM que no se utilicen. Este mecanismo establece un límite
superior y un límite inferior para la tasa de fallo.
Este mecanismo tiende a mantener a todos los procesos del sistema que están ejecutándose a
una tasa de fallos de página semejantes y sólo asigna tantos marcos a un proceso como sea
necesario para permanecer en ese intervalo.
→ Hiperpaginación
La hiperpaginación es un fallo generado por la sustitución de páginas en un proceso ya
asignado dando como consecuencia poco trabajo real y reflejando en el sistema una
excesiva cantidad de E/S en el disco. Si la suma de los conjuntos de trabajo de todos los
procesos en ejecución es mayor que la memoria principal real, todo el sistema dedica
más tiempo reemplazando páginas que el que dedica para la ejecución de procesos y
entonces se dice que el sistema está efectuando hiperpaginación.
→ Bloqueo de la Página
Un SO que está haciendo paginación por demanda debe permitir que una aplicación
asegure una página de modo que el mecanismo de paginación no la seleccione.
→ Mecanismos de Página Limpia
Para el reemplazo resulta importante usar una página limpia, en lugar de una sucia,
para que ésta no tenga que ser escrita en el archivo de intercambio.
Podemos reducir el impacto de usar una página sucia al mantener disponible para su
uso un grupo de marcos libres que estén limpios. Cuando el algoritmo de reemplazo de
página selecciona una página sucia para esta acción, el SO puede usar uno de los
marcos limpios del grupo de marcos disponibles. Luego, en el fondo, el contenido de la
página sucia suele escribirse fuera del disco. Cuando la página está limpia, el marco
puede colocarse en el grupo de marcos disponibles.
Otra tarea que es posible efectuar en el fondo es limpiar páginas que estén sucias.
→ Diseño de Programas y Tasas de Fallo de Página (11.5.10)
(No le encontré nada importante)
GESTION DE LA MEMORIA
Sabemos que el SO Mac tiene un espacio de direcciones único, se dice que esta arquitectura es
plana, lo cual quiere decir que en cualquier instante cualquier instrucción puede hacer
referencia directamente a la memoria. En este SO no hay protección de la memoria, de modo
que cualquier programa puede modificar cualquier cosa en ella, incluyendo el SO en si. Ademas
el código de la aplicación se ejcuta en modo supervisor, por lo que no existe protección de
instrucciones para limitar lo que puede hacer la aplicación. El tamaño de espacio de
direcciones es determinado cuando arranca el SO. Una partición del sistema ocupa la parte
inferior de la memoria. Esta área contiene algunos valores globales del sistema a los que las
aplicaciones no deben acceder directamente. En vez de lo anterior deben usar las interfaces de
programación de aplicaciones ( API ) del SO para leer y manipular cualquier dato del sistema.
Pero sin protección de la memoria o de las instrucciones no hay nada para prevenir a una
aplicación de tomar un atajo y acceder directamente a tal información.
Se asigna una partición de la aplicación desde la parte superior de la memoria hacia abajo. En
la parte superior hay un bloque de datos de tamaño fijo llamado A5world que contiene los
datos estatitcos de la aplicación y algunos metadatos sobre ella. Debajo esta la pila con su
parte “superior” creciendo hacia abajo. El montículo crece desde el fondo de la partición de la
aplicación hacia arriba, e incluye segmentos de código. Asi un problema que debe manejar el
SO es asegurarse de que estas dos áreas no queden una junto a la otra.
ROM
En las mayor parte de las PC solo se suaba una ROM para contener el código de POST (
power-on self-test ) y algunas rutinas de BIOS. La ROM del Mac contenia mucho del SO actual
ya que era mucho mas grande que los otros SO. El objetivo inicial de contar con tanto código
en la ROM era evitar llenar el almacenamiento limitado disponible en un disquete, dado que
las pimeras Mac no tenían disco duro. También ayudaba al sistema arrancar mas rápido, ya
que no era necesario leer ese código desde la unidad del disquete. Esta arquitectura ayudo a
asegurar que solo las PC de Apple y clones autorizados pudieran ejecutar el SO de Mac y evitar
clones truchos.
SISTEMA 2
Este aparte de ser una versión mayor, carecia de características importantes des del punto de
vista teorico. El finder era algo mas rápido. Se eliminaron ciertos iconos/comandos y se
añadieron otros para crear una carpeta nueva, asi como para apagar el sistema. Ahora los
disquetes podían expulsarse simplemente al arrastrar su icono a la papelera, en lugar de
seleccionar el comando EjectDisk y luego arrastrarlo a la papelera. Al escritorio se le agrego el
accesorio Choose Printer, que permitia que el usuario escogiera una impresiona por defecto.
Esta utilidad mas tarde se volvió el Chooser, una utilidad para acceder a recursos compartidos
como impresoras, módems y volúmenes de discos alojados en otros sistemas y puestos a
disponibilidad atraves de una red.
GUI
A los usuarios les agradaba la GUI y la capacidad de copiar y pegar información de una
aplicación a otra. Pero esto significaba cortar los datos de un programa, detenerlo, iniciar el
nuevo programa y luego pegarle los datos, una operación que normalmente se hacia en
minutos, en cada nuevo modelo de Macintosh se incluyo mas RAM que en los previos y
contenia 4 veces mas RAM que la Mac original. Esto era suficiente para hacer posible alguna
forma de multitarea. Primero se implemento en el programa swit-cher, que permitia que un
usuario iniciara varios programas. Luego el usuario podía cambiar entre estas aplicaciones al
hacer clic en un icono sobre la barra del menú. La aplicación que se estaba utilizando se
deslizaba horizontalmente de la vista y aparecia la siguiente. Cuando un usuario cambiaba a
uno de los programas en ejecución se decía que “tenia el foco”. Asi, el usuario podía cortar y
pegar entre aplicaciones en segundos, en lugar de hacerlo en minutos.
MULTITAREA
Switcher creo varias ranuras fijas en RAM, en las que se cargaban las aplicaciones. El programa
swtcher asignaba un montículo por separado para cada aplicación que iniciara el usuario
obviamente sujeto a la disponibilidad de memoria. Cuando el usuario activaba o desactivaba
una función con la misma tecla de un proceso a otro, el programa switcher podía realizar un
interruptor de contexto y arreglar la gestión de datos del SO de la memoria de modo que el SO
podía empezar a trabajar con la nueva aplicación. Pero como no había protección de la
memoria o de las instrucciones, el switcher podía ajustar las estructuras de memoria del SO
para afectar al interruptor. A todo esto, esta multitarea era muy limitada, en el sentido que
aun había un proceso en ejecución a la vez. El usuario podía cambiar de un proceso a otro,
pero mientras un proceso no tenia el foco no estaba en ejecución realmente. A pesar de este
inconveniente, este enfoque funciono con el esquema existente de gestión de memoria, ya
que no se requeria cambiar los programas con switcher para trabajar. Los cambios también
eran transparentes para el nucleo del SO.
SISTEMA 3
SISTEMA DE ARCHIVOS JERARQUICO ( HFS )
Como sabemos, las unidades disco iban creciendo en consecuencia había mas cantidad de
archivos, asi que se estreno un nuevo sistema de archivos HFS. Este reemplazo al sistema de
archivo Macintosh MFS. Las carpetas eran verdaderos subdirectorios en lugar de etiquetas en
las entradas de los archivos y podían contener otras carpetas. Fue mucho mas útil que se
denomino sistema estándar de archivos del SO Mac. Las entradas del directorio contenían
marcas de tiempo que mostraban cuando se había creado el archivo y cuando se había
modificado, el tipo de archivo y los códigos de su creador y otros metadatos del archivo. El
espacio libre era seguido por un mapa de bits y los directorios se almacenaban como arboles
binarios.
REDES
Las redes de área local (LAN) se volvieron populares, pues permitían el acceso compartido a
dispositivos costosos, como grandes unidades de disco, impresoras laser de alta gama, grupos
de módems, etc. Tambien facilitaban la comunicación atravez de archivos y directorios
compartidos en servidores centrales. Asi Apple agrego soporte para AppleShare, un protocolo
registrado para compartir archivos. El protocolo de la pila también incluia tecnología registrada
en otras capas: AppleTalk en redes y LocalTalk en las capas de enlace de datos y física.
Entonces Chooser adquiria mucho mas importancia que solo la selección de impresoras por
defecto.
SISTEMA 4
Este sistema se introdujo con el SO Macintosh y Macintosh 2. Este sistema agrego soporte para
unidades disco mayores que 32 Mb.
En este sistema el SO Mac posibilito una versión del Finder que pudiera lanzar multiples
aplicaciones. Apple lanzo en el SO dos opciones Finder y Multifinder, pero como este ultimo
era nuevo y Apple no estaba seguro de que todos los programas pudieran operar bajo este,
finder continuo distribuyéndose con el SO.
MULTIFINDER
Cuando el SO implemento el multifinder, los usuarios podían cambiar entre finder, que admitia
solo un programa a la vez y multifinder que podía manejar multiples programa. A diferencia de
switcher que simplemente cambiaba el SO de la ejecución de una aplicación a la ejecución de
otra, multifinder permitia que cada programa continuara su ejecución, dando a cada una
tiempo de la CPU. El SO Mac no fijaba limites establecidos respecto al tiempo que un proceso
podía continuar su ejecución sin cambiar a otros procesos. La técnica que usaba se
denominaba multitarea cooperativa. Con esta técnica, un proceso podía ejecutarse el tiempo
que quisiera. Si el proceso hacia una llamada al SO que este no podía atender de inmediato,
como la lectura de un disco, entonces hacia esperar al proceso, mecanismo denominado
bloqueo. Cuando un proceso lleva a cabo un bloque de proceso asi, entonces el SO añade el
proceso bloqueado a una cola de procesos que están en espera de algo y cambia a la ejecución
de otro proceso. Si un proceso no hace llamadas de bloqueo, entonces puede ejecutarse tanto
como quiera. A fin de que todos los procesos proporcionen una pronta respuesta a las
solicitudes de los usuarios, todos requieren algo de tiempo de la CPU. Asi si un proceso se
ejecuta durante mucho tiempo, puede hacer que el desempeño del sistema sea desparejo.
Para evitar eso, se supone que todos los procesos hacen una llamada especial al sistema a
menudo para indicar al SO que el proceso aun no termina pero que esta renunciado
voluntariamente al control y que esta listo para ejcutarse nuevamente. Esto permite que los
demás procesos compartan de una manera justa el tiempo de la CPU.
LA GUI BAJO EL MULTIFINDER
Multifinder contaba con una forma para la coexistencia de ventanas de aplicaciones distintas
por medio de un modelo por capas. Ahora que era posible tener multiples aplicaciones en
ejecución, cada una podía tener abierta multiples ventanas en el escritorio al mismo tiempo.
Cuando un programa obtenia el foco, todas sus ventanas eran traídas hacia delante en una
capa. Esto era necesario para efectos de compatibilidad con ventanas de la interfaz del
programa de aplicación (API) existentes.
GESTION DE RAM CON MULTIFINDER.
Multifinder también contaba con un mecanismo para que las aplicaciones comunicaran sus
requerimientos de memoria al SO, demodo que pudiera asignar RAM a cada programa según
sus necesidades. Lamentablemente la cantidad especifica podría no ser suficiente para algunas
tareas, de modo que al usuario se le proporcionaba una interfaz para sobreescribir ese
numero. A menudo a un programa se le otorgaba mas memoria de la necesaria, y a otro se
daba demasiado poco, como resultado, la aplicación poco alimentada de memoria podía
desempeñarse defectuosamente. Cuando se ejecutan multiples aplicaciones, la gestión de
RAM suele ser mucho mas complicada que cuando se ejecuta una sola aplicación. Pero cuando
se estaba desarrollando Multifinder, una consideración clave era que los programas que
corrian bajo finder debían trabajar sin cambio bajo multifinder. Asi la arquitectura de memoria
es bastante semejante, aunque ligeramente mas complicada. A medida que la ejecución se
desplaza de una aplicación a otra, el SO modifica el contenido de ciertas variables del sistema a
fin de reflejar los tamaños y las ubicaciones de la partición de la aplicación y sus partes para
nuevas aplicaciones. Este cambio se denomina intercambio de contexto.
SISTEMA 5
Algunas referencias dicen que el sistema 5 nunca fue lanzado, se reconoce como sistema 4/5 y
otras afirman que se lanzo por un tiempo nomas, pero no hay nada importante en este sistema
para efectos de estudio de evolución de SO.
SISTEMA 6
Este sistema fue la primera actualización verdadera del SO Mac. La RAM estaba siendo mas
barata y mas grande y los usuarios siempre querían mas de ella. Asi el sistema 6 comenzo la
migración para manejar la Mac en modos verdaderos de direccionamiento de memoria de
32bits que ya habían aparecido con la CPU 68020 de Motorola. Estas direcciones de 32 bits
permitieron que la Mac pudiera manjear hasta 64Gb de RAM. Versiones anteriores usaban los
24 bits inferiores para direccionamiento y los 8 superiores para banderas que indicaban por
ejemplo que el bloque al que se apuntaba estaba marcado como “bloqueado”, etc. Habia sido
esto una solución efectiva para hardware anterior con RAM limitada, pero después se volvió un
estorbo. Apple se referia a un código que usaba el modelo de direccionamiento 24+8 bits como
no limpio de 32 bits y sugeria que los desarrolladores elminaran este código de sus
aplicaciones. Sabemos que mucho del SO Mac estaba en ROM. Pero lamentablemente mucho
de ese código ROM era no limpio de 32 bits, de modo que las Mac anteriores no podían migrar
a este nuevo modo. El nuevo modo requeria nuevas versiones de hardware. El cambio al modo
de direccionamiento de 32 bits facilito multitud de cuestiones que persistían incluso hacia
versiones actuales del SO Mac. El SO mantiene la capacidad de ejecutar aplicación en un modo
de 24 bits aunque es mucho mas lento que el modo de 32 bits.
En ese tiempo la RAM se veía como un recurso muy apretado y querían dirigirse a grandes
longitudes para ahorrar uno o dos bytes aca y alla. Con el transcurso del tiempo, se
encontraban tales ahorros de bytes que tuvo un impacto negativo, el error Y2K (año 200) Pues
se acorto el formato de parte de la fecha del año hasta los dos últimos bytes.
SISTEMA 7
Este sistema fue el mayor cambio de software del sistema. Continuo con la migración del SO
Mac hasta el direccionamiento completo de 32bits y mejoro su manipulación de graficas,
establecimiento de contactos profesionales y multitarea e introdujo una forma de memoria
virtual. Esta versión elimino la versión del Finder, Asi la multitarea cooperativa se converitio en
el modo normal de operación del sistema. Tambien establecer contactos profesionales por
medio del AppleTalk y compartir archivos mediante AppleShare se integraron al SO en lugar de
ser opciones.
LA GUI
El sistema 7 contaba con varias mejoras en cuanto a usabilidad, muchas en el área de la GUI,
en el extremo derecho de la barra de menus, se agrego uno denominado menú de
aplicaciones, que mostraba una lista de programas en ejcucion y permitia a los usuarios
cambiar entre ellos. Ahora los usuarios pueden arrastrar y soltar: un bloque de texto podía
arrastre de un programa a otro con el raton en lugar de tener que copiar y pegar.
El finder del sistema 7 utlizo características cromáticas e hizo que algunos elementos de la
interfaz parecieran mas tridimensionales. Otras caracterisitcas de usabilidad también se
agregaron al SO en versiones del sistema 7. WorldScript contaba con lenguaje a nivel del
sistema para diferentes idiomas además del ingles. Tambien se lanzaron tecnologías como
AppleScript, un macrolenguaje para automatización de tareas, ColorSync,software multimedia
QuickTime y gestión de fuentes TrueType.
MEMORIA VIRTUAL
Aveces un usuario quería ejecutar mas programas de los que cabian al mismo tiempo en la
RAM. O quizá el programa se usaba con un archivo de datos que era muy grande. Una solución
a esto es la memoria virtual o MV. La MV es una técnica que se usa algo de espacio en una
unidad de disco duro para simular una memoria RAM mas grande. Para hacer posible el
trabajo requiere hardware extra de gestión de la memoria. Poco después la memoria se divide
en bloques denominados paginas. Cuando un programa empieza su ejecución , solo la primera
pagina del programa se lleva a la RAM. Cuando el programa en ejecución hace refencia a una
parte del programa que aun no esta en memoria, el hardware provoca una interrupción
llamada fallo de pagina y el SO lee la pagina que falta en la RAM desde la unidad de disco.
Para que el SO pueda admitir MV se requiere hardware especial en un sistema de computo. La
computadora debe tener una unidad de gestión de la memoria ( MMU ) especial capaz de
traducir las direcciones lógicas generadas por el programa en ejecución de la CPU y traducirlas
en una dirección física, de modo que las paginas del programa puedan localizarse en cualquier
parte de la RAM. La MV se implemento por primera vez en este sistema 7.
UNA NUEVA CPU
Apple para ese entonces formo una alianza con IBM y Motorola para desarrollar una nueva
familia de procesadores basada en una combinación de la arquitectura de la IBM y la línea de
la PC de Intel. Esto se conocería como PowerPC. La Mac inicial con la CPU PowerPC se
proporciono con el sistema 7, requirió cambios en el diseño del SO Mac.
Una pieza de código doblaba un nanonucleo gestionado por la CPU PowerPC. Se ejecutaba en
modo supervisior y proporcionaba interfaces de bajo nivel para gestión de hardware para el
resto del sistema. La API de este nanonucleo estaba restringida a software y depuradores del
sistema. Poseia compatibilidad universal, asi el SO era capaz de comenzar a ejecutarse en los
sistemas basados en la PowerPC casi de inmediato.
El principal bus del sistema de Apple se llamaba NuBus, fue desarrollado por ellos a diferencia
del bus ISA que tenían las PCs de otros fabricantes. Para ese entonces Intel desarrollo el bus
PCI lo cual fue algo competitivo para Apple hasta que lo termino incorporando en las PC
PowerMacintosh.
MEJORAS DE E/S
Los disquetes de PC IBM y de Mac Apple eran físicamente idénticos, se utilizaban en forma
diferente en dos sentidos, primero , el formateo de bajo nivel es distinto. Este formateo de
bajo nivel escribe encabezados en las pistas, que mas tarde indican al hardware donde
empieza cada sector, cuales son los números de la pista y el sector, y cual es su longitud.Una
vez que se hace el formateo de bajo nivel, el usuario puede dar formato del disquete a un nivel
superior, creando un sistema de archivo vacio en el disco. En caso de IBM y de Mac era
diferente, asi como el formateo de bajo nivel. El hecho de añadir al SO Mac la capacidad de
leer y escribir en disquetes MS-DOS hizo mucho mas acpetables las Mac en el mundo de
oficina, donde el intercambio de archivos fácilmente era una necesidad.
Las laptops para ese momento incluían una ranura llamada PC Card que permitían la inserción
de un dispositivo que no estaba integrado en la laptop original. Como por ejemplo: tajertas de
redes, controladores para unidades de disco externas, unidades de disco en si y tarjetas RAM.
Pero una tarejta de RAM no podía direccionarse como MP porque la ranura PC Card no estaba
conectada al bus de E/S. Asi una técnica común era considerarlas como un tipo especial de
unidad de disco y crear un sistema de archivos en ellas. puesto que el formato del disquete era
idóneo, lo anterior se creaba a menudo con un sistema de archivos compatible con el MS-DOS
ya que entonces también podían utilizarse para mover datos de las PC con IBM a las Mac, pues
el SO Mac también podía leer estos dispositivos. En versiones posteriores del sistema 7 se
quería un disco duro en la PC.
SISTEMA 8
El sistema 8 agrego soporte para nuevos modelos Mac con multiples CPU. Estas maquinas
experimentaban mejor desempeño en un rol de servidores. El soporte en SO modernos para
tales sistemas se denomina multiprocesamiento simétrico o SMP. El SO se ejecuta en
cualquier CPU disponible. Esto puede plantear problemas especiales para el SO porque puede
estar ejecutándose en dos o mas CPU a la vez. Esto significa que es necesario tomar
precauciones peciales para evitar que haya dos instancias de ejcucion manipulando cualquier
elemento de datos al mismo tiempo. Este sistema también introdujo la posibilidad de
compartir web personal. Esta herramienta permitio que los usuarios fueran anfitriones de
paginas de la red en sus computadoras.
SISTEMA DE ARCHIVOS JERARQUICO PLUS
Con el tiempo los discos duros fueron incrementando de tamaño, pero los sistemas de archivos
se habían diseñado para unidades de disco mas pequeñas a fin de ahorrar espacio valioso
tanto en el disco como en RAM. Estos apuntadores no podían direccionar todos los sectores en
unidades mas grandes, de modo que se inventaron mecanismos para extender los primeros
sistemas de archivos a unidades mas grandes. La primera técnica fue asignar bloques multiples
en lugar de sectores únicos.Si la asignación se hacia con base en dos sectores entonces el
mismo apuntador de 16 bits podía direccionar una unidad de disco de 64Mb. Esto podía
aumentarse a cualquier numero de sectores que fuera una potencia de dos. Esta técnica ya se
había implementado en CP/M. Pero esta asignación de bloque tenia algunos problemas, por
eso este sistema 8 incluyo una versión mejorada del sisteam de archivos jerarquico
denominada sistema de archivo jerarquico plus o HFS+. Usaba un apuntador de 32 bits y era
capaz de direccionar una unidad de disco de 4Gb. Utilizaba un bloque de asignación de 32
sectores y podía emitir unidades de disco de hasta 127Gb. Tambien permitio que los nombre
de los archivos fueran hasta de 255bytes de longitud.
OTROS CAMBIOS EN EL HARDWARE
Para este entonces el sistema 8.6 añadio gestión de energía mejorada y mejoro el soporte para
nuevas clases de dispositivos como USB y FireWire
A fin de permitir que una aplicación única use mas de una CPU, el sistema 8.6 introdujo la idea
de permitir que una aplicación se dividiera en multiples hilos de ejecución ( threads)
independientes ( denominados tareas en el SO de Mac ) que luego el SO planifica para
ejecutarlos en multiples procesadores. Apple modifico el nanonucleo para hacer posible este
multihilo. Tambien añadió soporte para que las prioridades se asociaran con tareas. Esto
permitio que la aplicación diseñara algunas tareas como mas importantes que otras. Si una
tarea había estado esperando algún evento que había finalizado y esa tarea tenia una prioridad
mas alta que la tarea en ejecución actual, entonces el SO se adelantaría a la CPU al detener la
tarea en ejecución e iniciar la tarea con prioridad mas alta.
SOPORTE UNICODIGO
Apple comenzó a desarrollar un nuevo mecanismo para exhibir otros idiomas diferentes del
ingles, utilizando una norma denominada Unicode – una norma mundial de codificación de
caracteres – En comparación con otros mecanismos mas antiguos, este simplifica lo anterior al
hacer que el software trabaje con otros idiomas, un proceso denominado localización.
Al usar esta norma para representar cadenas de caracteres y datos, un programador puede
facilitar el intercambio de datos al usar un archivo binario único para cada código de caracteres
posible. Ademas también admite numerosos guiones ( script ) usados por diferentes idiomas
en el mundo y cubre muchos símbolos técnicos y caracteres especiales. Unicode puede
representar la amplia mayoría de caracteres en el uso de las computadoras.
FIN