Teoria Sistemas Operativos
Teoria Sistemas Operativos
Teoria Sistemas Operativos
Así, por ejemplo, el sistema operativo reconoce la conexión del teclado, organiza y
ordena los archivos, controla la impresora, la pantalla, etc. Es como un policía de
tráfico pues, se encarga de que los programas no interfieran entre ellos. Sobre el
sistema operativo se instalan los programas que vaya a usar el usuario. Los
programas, también llamados aplicaciones son muy diversos. Ejemplo: El
procesador de textos Word. Sistemas operativos hay muchos, aunque mucha
gente piensa que sólo existe el famoso Windows.
Veamos algunos:
1. Windows (en sus diferentes versiones): Windows XP, Windows Vista, ... Es un
sistema operativo propiedad de la empresa MicroSoft que es privativo (de pago).
5. FreeBSD: Sistema operativo gratuito y según algunos autores uno de los más
seguros.
La parte más importante del Sistema Operativo se llama núcleo o kernell. Asigna
tareas al procesador siguiendo un orden y administrando los tiempos que lleva
cada tarea. Hoy en día los sistemas operativos llevan incluidas diferentes
aplicaciones. Así, por ejemplo, Windows se vende con aplicaciones como Paint,
Notepad, el juego del solitario, etc. Al conjunto del Sistema Operativo con las
aplicaciones se le llama distribución.
Ejemplo:
Una partición es una división del disco duro, de forma que el sistema operativo la
considera como si fuera una unidad totalmente independiente. Cada partición
puede tener un sistema de archivos distinto. Esto hace que en cada partición
puedas tener sistemas operativos distintos en un mismo ordenador, sin que
interfieran entre sí. Así, puedes tener Windows en una partición y Linux en otra.
Pero, ¿Qué es un sistema de archivos? Es el modo en el que se guardan los
archivos en discos duros.
Los sistemas de archivos más comunes son:
• FAT32: empleado hasta Windows 98.
• NTFS: empleado por Windows XP y Windows Vista
• Ext3: empleado por Linux Si eliges tener un solo sistema operativo, por ejemplo,
el Windows, hoy en día se suele organizar la información del disco duro haciendo
dos particiones. En una de ellas se instala el sistema operativo (Windows) y otras
aplicaciones: en la otra partición se instalan datos, como por ejemplo:
documentos, fotografías, música, etc. De este modo si el sistema operativo queda
inservible y tienes que reinstalarlo, no perderás tus datos, pues están en una
partición independiente.
Desfragmentando el disco duro Hay una herramienta que tiene Windows llamada
Desfragmentador de disco, que mueve los archivos de unos sectores a otros del
disco duro para dejarlo ordenado y agrupar su espacio libre. De este modo, el
disco duro trabaja más rápido y, en general, el ordenador trabaja más rápido. Para
desfragmentar el disco duro se hacen los siguientes pasos: Vete a Inicio Todos
los programas Accesorios Herramientas del Sistema 4º Desfragmentador de
disco Este proceso no es necesario en Linux.
Debido a que pueden existir muchas solicitudes para usar los recursos de una
computadora, el sistema operativo debe decidir a qué solicitudes les asignará
recursos, espacio de memoria y prioridad, de manera que el sistema de cómputo
pueda operar de manera eficiente y sin causar conflictos.
Cada programa que se ejecuta en un sistema operativo, se conoce como proceso
(que se profundizará en el siguiente tema).
Pero los sistemas operativos, así como todo lo que se refiera al campo de la
informática, va cambiando y evolucionando en el transcurso de los años.
Este tipo de equipos fueron diseñados para ser utilizados por una persona a la
vez, carecían de las características necesarias para proteger a un sistema
operativo de los programas del usuario; los sistemas operativos para PC, por lo
tanto, no eran ni multiusuario ni multitarea.
Sin embargo, los objetivos de estos sistemas operativos han cambiado con el
tiempo; en lugar de maximizar la utilización de la CPU y los dispositivos
periféricos, los sistemas optan por maximizar la comodidad y grado de respuesta
para el usuario, actualmente los sistemas operativos que utilizan los equipos PC
son: Microsoft Windows, Macintosh de Apple, Linux, etcétera. 20 de 370 Cuarto
Semestre
Sistemas paralelos
Entre los años de 1970-1980, aparecieron los sistemas paralelos, son aquellos
que tienen más de un procesador (CPU) y están fuertemente acoplados
compartiendo el bus (cables), el reloj y en ocasiones la memoria y los dispositivos
periféricos, lo que les permite tener gran capacidad de realizar varias operaciones
de manera simultánea y manejar grandes volúmenes de información, del orden de
los terabytes.
Sus características más importantes son:
Sistemas de tiempo real Desde la década de los 90 se han desarrollado los
sistemas operativos de tiempo real, se caracterizan porque su parámetro clave es
el tiempo y han sido perfeccionados para aplicaciones que requieren ser
ejecutadas bajo ciertas restricciones de tiempo sobre la operación de un
procesador o flujo de datos, que, en ocasiones, se emplea como dispositivo de
control en aplicaciones delicadas.
Esto dio origen al concepto de “Sistemas distribuidos”, que tiene como ámbito el
estudio de redes, como por ejemplo: Internet, redes corporativas, redes de
telefonía móvil, etcétera.
Los sistemas operativos multiusuario dan la posibilidad de que dos o más usuarios
compartan los mismos recursos de forma simultánea de manera local o remota a
través de las redes de comunicación.
La compartición de recursos es principalmente:
Lo que reduce el tiempo ocioso del uso de los procesadores, costos de energía y
equipamiento para los usuarios.
III. Ejecución de comandos de los usuarios. El módulo del sistema operativo que
permite que los usuarios dialoguen de forma interactiva con el sistema operativo, a
través de una interfaz (línea de comandos o gráfica), es el intérprete de comandos
conocido como Shell. 24 de 370
Procesos
Para lograr esto, se requirió de mayor control y una mayor división de los
diferentes programas y dio por resultado el concepto de proceso. A continuación
se presentan los conceptos más importantes aplicados al proceso en un sistema
de cómputo.
“El sistema operativo mantiene, por cada proceso, una serie de estructuras de
información para identificar las características de éste, así como los recursos que
tiene asignados. (…). El sistema operativo mantiene una tabla de procesos con
todos los bloques de control de proceso (BCP). Por razones de eficiencia, la tabla
de procesos se construye normalmente como una estructura estática, que tiene un
determinado número de BCP” (Carretero, 2001: 78).
Ejecución
• El proceso está actualmente en ejecución. Listo • El proceso está listo para ser
ejecutado. Espera
• El proceso no puede ejecutarse hasta que no se produzca cierto suceso, como la
finalización de una operación de Entrada/Salida solicitada por una llamada al
sistema operativo. Nuevo
Es frecuente que existan procesos en espera (batch) para que puedan ser
ejecutados cuando así lo decida el sistema operativo; es decir, el sistema
operativo analiza este tipo de procesos para ejecutarlos cuando disponga de los
recursos necesarios.
Al suspender los procesos el sistema operativo, les retira los marcos de página y
los deja en una zona de intercambio.
El sistema operativo, elige los procesos de la lista que está en espera (batch) por
medio del uso de la política FIFO (First In First Out). 29 de 370 Cuarto Semestre
Identificadores de procesos.
Los procesos se identifican mediante su identificador de proceso.
Un proceso nuevo se crea por la llamada al sistema fork (bifurcar) y puede tener
procesos hijos; el proceso creador se denomina proceso padre y a los nuevos se
les denominan procesos hijos.
Los procesos nuevos pueden crear otros y formar un árbol de procesos.
Para cada proceso existe un padre, pero puede tener varios hijos, como se
muestra en el siguiente esquema: Jerarquía de procesos.
Elaboración con base en: (Carretero, 2001: 79) De acuerdo a lo que plantea
Durán, un proceso nuevo se puede ejecutar de la siguiente forma:
2. El proceso padre espera hasta que alguno o todos sus procesos hijo hayan
concluido.
Hay dos posibilidades más en términos del espacio de direcciones del nuevo
proceso:
1. El proceso hijo es una copia del proceso padre.
Los bloques de control de proceso se almacenan en colas y hay una por cada
estado posible de los procesos, éstos se dividen como se muestra a continuación:
Estado de proceso.
En esta lista están todos los procesos del sistema, al crearse un proceso nuevo se
agrega a la misma el PCB; cuando el proceso termina su ejecución, es borrado.
Existen dos tipos de colas:
Esta cola se compondrá de los procesos que estén en estado listo; la estructura
de la cola dependerá de la estrategia de planificación utilizada.
Cola de espera de dispositivos (device queue) Los procesos que esperan por un
dispositivo de E/S en particular son agrupados en una lista específica al
dispositivo. Cada dispositivo de E/S tendrá su cola de espera.
Transición de estados
De acuerdo con Carretero (2001: 97), la activación del sistema operativo se realiza
mediante las “interrupciones”. Cuando se produce una interrupción se llevan a
cabo las siguientes operaciones:
Por ejemplo, si un proceso A está bloqueado y espera a que termine una lectura
de disco y llega una interrupción del mismo, entonces se produce un cambio y
entra en acción el sistema operativo para manejar la interrupción. Si se indica que
la interrupción terminó por lo que esperaba A, el sistema operativo cambiará el
estado de este proceso a listo o a ejecución si así lo decide el módulo de
planificación de procesos.
La ejecución del sistema operativo, modifica los contenidos de los registros del
equipo y destruye sus valores anteriores. Los siguientes son algunos tipos de
transiciones, como lo propone Juan Pérez Campanero:
a) Comienzo de la ejecución. Cuando el usuario da la orden para la ejecución del
programa, el sistema operativo crea un proceso.
d) Paso a estado preparado. Que puede estar por cuatro causas: - “Ejecución por
el usuario de un programa. (…) Producción del evento, por el que estaba
bloqueado el proceso.
Si el proceso estaba bloqueado pasará de la cola de procesos bloqueados a la de
preparados. De esta manera, vuelve a competir por el uso del procesador. Si no
existiera ninguno en el procesador, el proceso desbloqueado pasará
automáticamente a ejecución.”. “
- Ejecución por el usuario. El usuario ejecuta una orden al sistema operativo para
suspender la ejecución de un programa.
Este paso se da porque el usuario dé una orden al sistema operativo para que
suspenda la ejecución del programa y se diera por casualidad de que el proceso
correspondiente a dicho programa estaba en estado bloqueado.
El proceso permanecerá en este estado hasta que se reanude por una orden del
usuario o del sistema operativo, o bien se produzca el evento por el que está
bloqueado, pasando en este caso a Suspendido Preparado
Comunicación entre procesos
Los procesos concurrentes que se ejecutan en el sistema operativo pueden ser de
dos tipos: independientes y cooperativos.
Los primeros no pueden afectar ni verse afectados por otros procesos que se
estén ejecutando, los segundos sí pueden afectar o verse afectados por otros que
se estén ejecutando en el sistema; sin embargo, existen procesos que comparten
datos con otros y se denominan procesos cooperativos.
Para lograr la comunicación entre los procesos, se requieren referencias entre sí,
por lo cual se utiliza una comunicación directa o indirecta.
Comunicación directa
Interrupciones
Una interrupción es una señal que indica que se suspende la ejecución de
un programa y activa un programa especial conocido como “manejador de
interrupción”.
Excepciones de programa: son eventos que ocurren cuando se ejecuta un
programa, y que requiere la ejecución de un fragmento de código que se
encuentra fuera del flujo normal de ejecución.
Son generadas por software.
Las excepciones incluyen la ejecución de instrucciones ilegales, o la
división por cero, las excepciones de software incluyen aquellas que son
detectadas y notificadas por los procesos o por el sistema operativo.
Prioridad.
Una prioridad está asociada a cada proceso, y el CPU se asigna al proceso
que tenga la prioridad más alta. Cuando los procesos tienen la misma
prioridad se planifica de acuerdo a FCFS. 4. Roud-robin. Este algoritmo se
denomina por turnos (round-robin) fue diseñado para sistemas de tiempo
compartido.
Es similar a FCFS sólo que agrega apropiación para conmutar entre
procesos; es decir, define una unidad de tiempo conocido como quantum;
es decir, una unidad de tiempo de 10 a 100 milisegundos. La cola de
procesos listos es manejada como una cola de tipo circular.
El planificador del CPU da vueltas sobre la cola de procesos listos y asigna
el uso de CPU a cada proceso durante un intervalo de hasta 1 quantum.
Administración de memoria
Administración de la memoria
La administración de la memoria se refiere a los métodos y operaciones
para obtener la máxima utilidad de ésta a través de la organización de
procesos y programas que se ejecutan en una computadora.
Terminación de E/S
Una división entre cero Algún suceso inválido a la memoria ó la solicitud de algún
servicio del sistema operativo.
Cuando se interrumpe a la cpu, ésta detiene lo que está haciendo y de inmediato
transfiere la ejecución a una localidad fija. La localidad fija comúnmente contiene
la dirección inicial de la rutina de servicio para la interrupción
Las interrupciones son una parte importante den la arquitectura de una
computadora. El diseño de cada computadora incluye su propio mecanismo de
interrupción, pero existen varias funciones comunes. La interrupción debe
transferir el control a la rutina de servicio apropiada. Los sistemas operativos
modernos son activados por interrupciones. Si no existen procesos por ejecutar, ni
dispositivos E/S que requiera servicio, ni usuarios a quienes responder, un sistema
operativo en guardia, esperando a que algo ocurra.
Una trampa ( o una excepción) es una interrupción generada por el software,
debida a un error.
Estructura de E/S
Interrupciones de E/S
Para uncirá una operación de E/S, la CPU carga los registros apropiados dentro
del manejador de dispositivos.
A su Ves, el controlador examina los contenidos de estos registros par determinar
qué acción tomar., si encuentra una solicitud de lectura, el controlador iniciará la
transferencia de datos desde el dispositivo hasta su buffer local, una vez que se
completa la transferencia de datos le informa al cpu que ha terminado su
operación. Esta comunicación la logra activando una interrupción.
Una vez que se inicia la operación E/S ha dos caminos a seguir: se inicia la
operación E/S luego, al terminarla, el control se regresa al proceso del usuario.
Este caso es conocido como E/S síncrona.
La otra posibilidad E/S asíncrona, regresa el control al programa del usuario sin
esperar que se complete la operación E/S, esta operación puede continuar
mientras ocurren otras operaciones al sistema.
También es necesario que se pueda llevar un registro de varias solicitudes de E/S
al mismo tiempo. Para este propósito de E/S: la tabla de estado de los dispositivos
indicando el tipo de dispositivo, su dirección y estado. En caso que este ocupado,
el sistema operativo también mantendrá una cola de esperas. Por cada dispositivo
E/S.
Estructura DMA
Por sus siglas como acceso directo a memoria par dispositivos E/S de alta
velocidad. Después de preparar los buffers, apuntadores y contadores para el
dispositivo de E/S, el controlador del dispositivo transfiere un bloque completo de
datos directamente desde su propio buffer a la memoria, o viceversa, sin la
intervención de la cpu, de esta manera, solo se genera una interrupción por
bloque, en vez de una interrupción por byte
Estructura de almacenamiento.
Jerarquía de almacenamiento
1. REGISTROS
2. CACHE
3. MEMORIA PRINCIPAL
4. DISCO ELECTRONICO
5. DISCO MAGNETICO
6. DISCO OPTICO
7. CINTAS MAGNETICAS
Además de tener diferentes velocidades y costros, los sistemas de
almacenamiento puede ser volátiles o no. El almacenamiento volátil pierde su
contenido cuando se interrumpe la energía del dispositivo.
Almacenamiento en cache
II. PROCESOS
Un proceso es cualquier actividad que realiza un procesador. Dado que un
ordenador puede llevar a cabo distintos procesos simultáneamente, el procesador
debe contemplar la posibilidad de ser compartido, lo que se consigue aplicando un
algoritmo de planificación.
Informalmente un proceso es un programa en ejecución. Un proceso es mías que
el código del programa, el cual también es conocido como la sección del texto.,
también incluye la actividad actual, representada por el valor del contador de
programa y el contenido de los registros del procesador. Un proceso por lo general
también incluye la pila del proceso, que contiene datos temporales ( parámetros
de método, direcciones de retorno y variables locales) y una sección de
datos. Que contiene variables globales.
Un programa por sí mismo no es un proceso; un programa es una entidad pasiva,
tal como el contenido de un archivo almacenado en disco, en tanto que un proceso
es una entidad activa, con un contador de programa que especifica la siguiente
instrucción a ejecutarse y un conjunto de recursos asociados.
Aunque dos procesos pueden estar asociados al mismo programa, se les
considera como dos secuencias de ejecución distintas.
Se pueden considerar cinco características definitorias de los procesos
Concurrencia:
Que es la progresión de dos o más procesos que trabajan en paralelo, pero de
forma dependiente.
Esta es la situación más típica en los sistemas actuales. Por ejemplo, mientras se
realizan las operaciones necesarias para la selección e inserción de los campos
para preparar las etiquetas que servirán para enviar las facturas de una sucursal
bancaria, pueden irse leyendo los datos relativos a vencimiento de talones o
preparar listados de riesgo por clientes (. Si la relación es de paralelismo pero
independiente, se denomina una relación de convivencia.
Competencia:
Situación que se plantea cuando dos o más procesos deben utilizar los mismos
recursos físicos o lógicos. Esto ocurre por que no es posible que dos procesos
actúen usando el mismo recurso
Cooperación:
Lo que ocurre cuando dos procesos que se están ejecutando son
interdependientes, es decir, para que lleguen a un resultado, se necesitan
mutuamente
Jerarquía:
Es la relación que se establece entre procesos que son interdependientes en
mayor o menor grado, estableciéndose familias de procesos. Cuando un proceso
necesita crear otros, al previo se le denomina proceso padre y al nuevo se le llama
proceso hijo. Las normas de estado de los procesos en su creación o suspensión
las dicta el sistema operativo
Estado:
Es el grado de uso de la CPU. Existen tres niveles:
Nuevo: el proceso se está creando
En ejecución: se están ejecutando instrucciones
En espera: el proceso está esperando que ocurra algún evento.
Listo: el proceso está en espera de ser asignado a un procesador.
Terminado: el proceso ha terminado su ejecución
Características:
Un proceso consta de código, datos y pila.
Los procesos existen en una jerarquía de árbol (varios Hijos, un sólo padre).
El sistema asigna un identificador de proceso (PID) único al iniciar el proceso.
El planificador de tareas asigna un tiempo compartido para el proceso según su
prioridad (sólo root puede cambiar prioridades).
Área de usuario: está en el kernel y consiste de la tabla de descriptores de
archivos, información sobre el consumo de CPU, manejadores de señales, entre
otros.
Tabla de páginas
Tipos de procesos
Son diferentes según las características y/o atributos que poseen. Siguiendo el
criterio de la utilización de la memoria, los procesos pueden ser:
- Proceso residente: Se trata de aquel proceso que durante su estado de activado
tiene que estar cargado en la memoria
- Proceso intercambiable: Como aquel proceso que está en estado de espera y del
cual se toma su proceso tratado por la CPU y se incluye en un fichero del sistema,
con lo que se deja liberada la porción de memoria correspondiente Si se sigue el
criterio de atender a las características de su código, los procesos serán:
- Procesos reutilizables: O programas que pueden usar varios usuarios ya que
están codificados con variables genéricas y los usuarios sólo tienen que introducir
los valores correspondientes a la posición de las variables en el código. Tiene la
ventaja de que se carga en memoria una sola vez y se usa varias veces
inicializando adecuadamente las variables
- Procesos reentrantes: Procesos cuyas instrucciones son invariantes, con lo que
pueden usarse de nuevo sin tener que cargarse otra vez. Están estructurados
separando lógicamente los segmentos de datos y de código, con lo que dos
instancias del mismo proceso pueden compartir el mismo código
- Proceso de excepciones: Circunstancias que se pueden presentar en un proceso
ocasionadas por un suceso que se ha presentado pero que no debería haber
tenido lugar, con lo que el sistema tratará de eludirlo. Es lo que se denomina
comúnmente un error
Colas de Planificación
A medida que los procesos van entrando al sistema, se les coloca en una cola de
trabajos en están todos los procesos en el sistema. Los procesos que residen en
la memoria principal listos y en espera de ejecutarse se mantienen en una lista
denominada la cola de procesos listos.
Esta cola se almacena por lo general como una lista enlazada. El encabezado de
cola de procesos listos contiene apuntadores al primero y al último PCB en la lista.
Cada PCB se extiende para incluir un campo apuntador que señala al siguiente
PCB en la cola de procesos listos.
Existen otras colas en el sistema. Cuando a un proceso se le asigna la CPU, se
ejecuta durante cierto tiempo; después abandona, es interrumpido, o debe esperar
la ocurrencia de algún evento particular, como sería la terminación de una solicitud
E/S. En el caso de una solicitud de E/S, tal petición puede ser una unidad de cinta
dedicada, o a un dispositivo compartido, como un disco.
Debido a que hay muchos procesos en el sistema, el disco puede estar ocupado
con la solicitud de e/s de otro proceso. Por lo tanto, el proceso tiene que esperar
por el disco. La lista de procesos que están esperando por un dispositivo de E/S
particular se conoce como cola del dispositivo.
Cada dispositivo tiene su propia cola.
La representación común para estudiar la planificación de procesos es un
diagrama de colas. Cada rectángulo representa una cola; se muestran los tipos de
colas: la cola de procesos listos y un conjunto de colas de dispositivos. Los
círculos representan los recursos que dan servicio a las colas y las flechas indican
el flujo de procesos en el sistema. Un nuevo proceso nuevo inicialmente se coloca
en la cola de procesos listos, donde espera hasta que es seleccionado para su
ejecución o es despachado. Una vez que se asigna la cpu al proceso y se está
ejecutando, puede ocurrir uno de varios elementos:
El proceso emite una solicitud de E/S, y entonces es colocado en la cola de E/S.
El proceso crea un nuevo subproceso y espera su terminación.
El proceso es removido forzosamente de la CPU, como resultado de una
interrupción, y es colocado de nuevo en la cola de procesos listos.
Administración de archivos
Operación en red
Uno de los programas del sistema más importante para un sistema operativo es
que el intérprete de comandos, que es la interfaz entre el usuario y el sistema
operativo, muchos comando se transmiten al sistema operativo mediante
sentencias de control. Cuando se inicia un trabajo nuevo en un sistema por lotes,
o cuando un usuario se conecta a un sistema de tiempo compartido, se ejecutan
automáticamente un programa que lee e interpreta estas sentencias de control.
Este programa también se conoce como intérprete de tarjetas de control o
intérprete de línea de comandos, y con frecuencia se denomina shell, Su función
es simple: obtener la siguiente sentencia de comandos y ejecutarla.
Ejecución de programas
Operaciones de E/S
Manipulación del sistema de archivo.
Comunicaciones
Detección de errores
Asignación de recursos
Contabilidad
Protección
Llamadas al sistema
Administración de dispositivos.
Comunicación
Microkernels
Máquinas virtuales
Máquina virtual
Planificadores
Conmutación de contexto
Procesos cooperativos.
Un proceso cooperativo puede verse afectado por los otros procesos que están
ejecutando en el sistema; cualquier proceso que comparte datos con otros
procesos es un proceso cooperativo.
Hilos
Hilos de usuario
Los hilos de usuario tienen soporte por encima del kernel y son implementados por
una biblioteca de hilos a nivel usuario. La biblioteca proporciona apoyo para la
creación, programación y administración de hilos sin soporte del kernel.
Hilos de kernel
Los hilos de kernel tienen soporte directo del sistema operativo, la creación,
programación y administración de hilos los realiza el kernel en su propio estado.
Modelos de multihilos
Modelo de varios a uno: Mapea múltiples hilos a nivel de usuario en un hilo de
kernel Modelo de uno a uno: Mapea cada hilo de usuario e un hilo de kernel.
Modelo de varios a varios: Combina muchos hilos a nivel de usuario con un
número menor o igual de hilos de kernel
Planificación de la CPU
Sección critica
Exclusión mutua.
Sincronización
Existen relaciones entre los procesos de forma que hasta que uno de ellos no ha
acabado, otro no puede comenzar. Para que un conjunto de procesos funcione
adecuadamente muchas veces será necesario sincronizar sus actividades para
garantizar que ciertos procesos terminan antes de que comiencen otros.
Para poder hacer esto, el sistema recurre al envío de señales. Un proceso
permanece en espera de recibir ciertas señales, por lo que está suspendido.
Cuando las señales llegan, se pone en estado de ejecución. Es corriente que entre
los procesos implicados se produzca una relación de cooperación para la
ejecución de tareas comunes y una relación de competencia por el uso de
recursos compartidos. Por ejemplo, si se ejecutan los siguientes procesos:
Proceso Pi Proceso Pj
Y1 = X
Y1 = X + 1
X=Y
Y2 = X
Y2 = Y2 + 1
X = Y2
Ejecución (X = 0)
Y1 = X
Y1 = X + 1
X = Y1
Y2 = X
Y2 = X + 1
X = Y2
Conclusión: X = 1, valor incorrecto para Pj
Con lo que el sistema operativo utilizará una variable especial intermedia para que
la información común a ambos procesos sea bloqueada en Pi mientras la utiliza el
primer proceso -si es que éste es el que tiene la prioridad- mientras el proceso Pj
espera. Más tarde éste recibe el valor de X y se ejecuta proporcionando el
verdadero valor de X para ese proceso, que será igual a 2.
Exclusión mutua
Métodos de software
Se trata de inventar una variable que sirva para todos los procesos relacionados y
que recoge un valor en función de la posibilidad de que un proceso entre en
ejecución de su sección crítica.
Cuando el proceso se ha ejecutado, devuelve a esa variable un valor que permitirá
a la CPU dejar paso libre para que otro proceso entre en ejecución.
Esto tiene la desventaja de que se realiza el paso de unos procesos a otros sin
tener en cuenta ni las prioridades ni la conveniencia de trabajo eficiente del
sistema. Además, si el primer proceso sufriera una interrupción, el resto de los
procesos no podrían disponer de las variables compartidas
o no podrían actuar conforma a la variable que gobierna todo el proceso.
Para evitar este problema se inventaron una serie de variables, tantas como
procesos concurrentes, que se adjudican a los procesos, una a uno, que servirá
para que cada proceso señale, en esa variable, a la CPU que se encuentra
ejecutando su sección crítica. Así, cada proceso consulta las variables de los
demás procesos para “estimar” la conveniencia de entrar en ejecución de la
sección crítica o no.
Sin embargo, las prioridades de este método no están claras y pueden producirse
cuellos de botella o infrautilizaciones de la CPU.
Algoritmo de Dekker Se trata de la primera solución conocida de tipo software
para resolver la concurrencia de procesos. Matemáticamente está basado en
interpolaciones lineales sucesivas y búsquedas binarias capaces de encontrar el
cero de una función que cambia de signo en un intervalo dado.
Es un algoritmo de espera activa, es decir, cuando las instrucciones de un proceso
van preguntando cada vez a la CPU si el proceso que se está ejecutando en
paralelo y que tiene una región crítica a terminado ya o tiene que seguir
esperando. Como ejemplo de un algoritmo de Dekker, sería el siguiente,
considerando los subíndices i y j como diferentes procesos:
<RUTINA>
INICIALIZA ACTIVO (i) = V
MIENTRAS ACTIVO (j) = V <NADA>
SI TURNO = j ACTIVO (i) = F
MIENTRAS TURNO = j <NADA>
ACTIVO (i) = V
END
TURNO = j
ACTIVO (i) = F
Si bien existe la posibilidad de que se entre en un bucle sin fin, porque podría
pasar que:
ACTIVO (i) = V
ACTIVO (j) = V
Algoritmo de Petterson
<RUTINA>
INICIALIZA ACTIVO (i) = V
TURNO = j
MIENTRAS ACTIVO (j) = V y TURNO = j <NADA>
END
ACTIVO (i) = F
Para el proceso j el algoritmo de exclusión sería idéntico.
Algoritmo de Dijkstra o del semáforo
Se trata de un método diseñado por E. W. Dijkstra en 1959 para tratamiento
gráfico y que tenía como objetivo encontrar el camino más corto entre un vértice y
los restantes, dentro de los llamados gráficos ponderados, o gráficos que llevan
asociada a cada arista -línea que une dos vértices- una cantidad representativa de
un concepto. Por ejemplo, un gráfico de rutas de viaje, donde cada arista une dos
puntos geográficos y lleva asociado un costo de viaje.
Consta de dos operaciones que trabajan coordinadamente: señal y espera. Estas
señales actúan sobre una variable que por la función que realiza se llama
semáforo. Esta variable, que es compartida, toma valores enteros no negativos. Si
se da el caso de que toma sólo los valores 0 y 1 entonces a la variable se la llama
semáforo binario. Los valores que toma la variable es el número de procesos que
pueden entrar a la vez en su sección crítica. El pseudocódigo para este algoritmo
sería el siguiente:
<SEMÁFORO-ENTRAR>
INICIALIZA SEMAFORO = VALOR
SI SEMAFORO > 0 SEMAFORO = SEMAFORO - 1
SECCIÓN CRÍTICA
SI NO <ESPERA>
<SEMÁFORO-SALIR>
SI SEMAFORO <= 0 SEMAFORO = SEMAFORO + 1
DESBLOQUEAR SIGUIENTE PROCESO
SI NO SEMAFORO = SEMAFORO + 1
FIN
(si SEMAFORO fuese igual a 0, entonces no admitiría más procesos en sección
crítica)
Si se añade una entidad denominada cola de espera, se evitará que algún proceso
entre en una dinámica de espera indefinida.
Algoritmo de Camport o de la tienda Se trata, como ocurre en algunas tiendas,
de proporcionar a cada proceso un número de “cliente”, dando entrada en la
sección crítica a aquél que tenga el número más bajo, y así sucesivamente.
Sin embargo, además de presentarse problemas de infrautilización de la CPU,
puede darse el caso de que dos procesos tengan acceso al mismo número, con lo
que se crearía el mismo conflicto que se quiere evitar.
Mecanismos de hardware
Para evitar el caso de que los métodos de software fallen, lo que podría ocurrir
cuando se presenta un fallo de programación -lo cual no es infrecuente si se tiene
en cuenta que el lenguaje de algunos de estos algoritmos será el ensamblador-,
se diseñaron mecanismos de hardware, normalmente codificados en lenguaje de
bajo nivel y decodificados directamente por la CPU.
Comparar y asignar
Variable de control
Es una situación que se plantea cuando dos procesos activos compiten por
recursos del sistema y uno de los procesos no consigue los suficientes y entra en
estado de espera. Cuando este estado de espera es indefinido se denomina
situación de interbloqueo -deadlock-. El proceso P requiere los recursos X e Y y
los necesita en ese orden y, simultáneamente, el proceso Q necesita los recursos
Y y X y los necesita en ese orden. P adquiere X y, a la vez, Q toma Y. Llegado un
momento ninguno de los procesos puede progresar dado que va a requerir
recursos que posee el otro proceso. Su solución sólo puede venir del exterior y es
una situación típica de sistemas multiprogramados.
Se entiende aquí por recursos tantos dispositivos hardware -caso de cintas, algún
periférico- como software -información en módulos de memoria, contenido de un
array-. Para que se dé el interbloqueo deben darse simultáneamente cuatro
condiciones:
- Exclusión mutua: cuando algún proceso necesita control exclusivo sobre un
recurso, forma no compartible, y lo acapara, impidiendo que otro proceso lo pueda
utilizar.
- Espera y retención: situación que se da cuando un proceso que retiene un
recurso lo mantiene hasta que pueda utilizar otro.
- No apropiación: un recurso permanece en propiedad de un proceso y no se le
puede quitar hasta que lo haya utilizado; es decir, las prioridades tienen una
escasa validez.
- Espera circular: existe un conjunto de procesos en el que se da la circunstancia
de que un proceso retiene uno o más recursos que necesita el siguiente proceso
Soluciones al interbloqueo
Lo más eficaz en este caso es evitar que alguna de las condiciones que da lugar al
interbloqueo no ocurra. Para ello las vemos una por una:
- Exclusión mutua: Resulta complicado ya que existen recursos que no se pueden
compartir, como es el caso de los dispositivos de entrada y de salida -las cintas y
las impresoras, por ejemplo-, con lo que se tiene que recurrir a una compartición
virtual con el uso del denominado spooler.
- Espera y retención: Se evita si el sistema operativo hace que cada proceso,
antes de entrar en ejecución, muestre los recursos que va a utilizar declarándolos
en el Lenguaje de Control de Tareas -JCL, de Job Control Language-. El JCL es
un lenguaje que se utiliza para elaborar “macros” que contienen la secuencia de
comandos que se van a ejecutar cuando un programa entra en estado operativo.
Si el sistema operativo comprueba que todos los recursos declarados están
disponibles, le permitirá la ejecución. Si no, le pondrá en estado de preparado
hasta que se liberen esos recursos.
Una desventaja es que los recursos tienen una baja utilización dado que algunos
de los recursos que se usarán al final de la ejecución de un proceso no se
utilizarán hasta entonces permaneciendo libres. Además se pueden discriminar
procesos postergando algunos en el tiempo más de lo debido.
- No apropiación: El sistema operativo estudia si un proceso solicita un recurso
que no está disponible y, en ese caso, lo mantendrá en estado preparado
liberando los recursos que previamente tenía asignados. Este método puede
postergar indefinidamente algunos procesos y puede desechar trabajo que ya ha
sido realizado.
- Espera circular: El programador deberá especificar en cada proceso el orden en
el que va a solicitar los recursos, estableciendo así una prioridad de los mismas
para cada proceso.
De tal manera que si un proceso está utilizando el recurso situado en el orden 3 –
por ejemplo, un fichero- y quiere usar un recurso situado en primer lugar -por
ejemplo, una cinta-, el proceso liberará los restantes recursos y se colocará en el
primer lugar del orden de uso. Para ir pasando de un lugar al inferior deben irse
liberando los recursos superiores.
Como se ha visto en los puntos anteriores, pude ocurrir que la aplicación de
medidas para prevenir el interbloqueo dé lugar a una baja utilización de los
recursos. Para evitar esta circunstancia es conveniente que el sistema y el usuario
dispongan de información sobre cómo se van a solicitar más recursos y en qué
orden.
ADMINISTRACIÓN DE LA MEMORIA
Tiempo de carga.
Si no se conoce al momento de la compilación en dónde residirá el proceso en la
memoria, entonces el compilador debe generar un código relocalizable. En este
caso, la vi nculación final se demora hasta el momento de la carga. So cambia la
dirección de inicio, sólo se necesita recargar el código de usuario para incorporar
este valor modificado.
Tiempo de ejecución
Si el proceso puede moverse durante su ejecución de un segmento de memoria a
otro, entonces la vinculación debe ser demorada hasta el momento de la
ejecución. Para que funcione este esquema, debe contarse con hardware especia.
La mayoría de los sistemas operativo de propósito general utilizan este método
Carga dinámica.
Todo programa y los datos de un proceso deben estar en la memoria física para la
ejecución de éste. El tamaño de un proceso está limitado por el tamaño de la
memoria física. Para conseguir una mejor utilización del espacio de memoria,
podemos emplear la carga dinámica. Con la carga dinámica, una rutina no se
carga sino hasta que es llamada. Todas las rutinas se mantienen en el disco en un
formato de carga relocalizable. El programa principal se carga en la memoria y se
ejecuta. Cuando una rutina necesita llamar a otra rutina, la rutina que hace el
llamado verifica primeramente si la otra ha sido cargada. Si no ha sido cargada, el
cargador de enlace relocalizables es llamado para colocar en memoria la rutina
deseada y actualizar las tablas de direcciones del programa para reflejar este
cambio.
Superposiciones (overlays)
Para que un proceso pueda ser mayor que la cantidad de memoria asignada a él,
podemos usar superposiciones. La idea de las superposiciones consiste en
mantener en memora solo aquellas instrucciones y datos que se necesitan en un
momento dado.
Como el caso de la carga dinámica, las superposiciones no requieren de algún
soporte especial del sistema operativo. Pueden ser implementadas
completamente por el usuario con estructuras de archivos sencillas, leyendo de los
archivos a la memoria y luego saltando a dicha memoria y ejecutando las
instrucciones recientemente leídas.
Intercambio (swapping)
Paginación
Método básico.
Cada sistema operativo tiene sus propios métodos para almacenar tablas de
páginas. La mayoría asigna una tabla de páginas por cada proceso. Un apuntador
a la tabla de páginas se almacena con los demás valores de registros (como el
contador de instrucciones) en el bloque de control del proceso. Cuando se le dice
al despachador que inicie un proceso, debe recargar los registros del usuario y
definir los valores correctos de la tabla de páginas de hardware a partir de la tabla
de páginas del usuario que está almacenada.
Soporte de hardware.
Protección
Cada proceso tiene generalmente una tabla de páginas asociadas con él. La tabla
de páginas tiene una entrada por cada página que el proceso está utilizando ( o
una ranura por cada dirección virtual, independientemente de la validez de esta
última) . Esta es una representación natural de la tabla ya que los procesos hacen
referencia las páginas mediante las direcciones virtuales de las mismas. El
sistema operativo debe traducir después esta referencia a una dirección física de
memoria. Debido a que la tabla está ordenada por dirección virtual, el sistema
operativo puede calcular en qué lugar de la tabla está la entrada de la dirección
física asociada, y usar dicho valor directamente. Una de las desventajas de este
método es que cada tabla de páginas puede constar de millones de entradas.
Estas tablas consumen grandes cantidades de memoria física únicamente para
llevar un registro de cómo se está utilizando la otra memoria física.
Para resolver este problema se puede usar una tabla de páginas invertida. Una
tabla de páginas invertida tiene una entrada por cada página (marco) real de
memoria. Cada entrada consiste en la dirección virtual de la página almacenada
en dicha ubicación de memora real, con información acerca del proceso que
posee dicha página. Así, sólo hay una tabla de páginas en el sistema, y sólo tiene
una entrada por cada página de la memoria física..
Cada entrada de la tabla de páginas invertida es un par < id-proceso, número- de-
página>, cuando ocurre una referencia a la memoria, parte de la dirección virtual,
que consta de <id-proceso, número – de- página>, se presenta al subsistema de la
memoria. Luego, en la tabla de páginas invertida se busca una correspondencia.
Si se encuentra alguna- por ejemplo, en la entrada entonces se genera la
dirección física <i-desplazamiento>. Si no se encuentra una correspondencia, es
que se ha intentado un acceso ilegal a una dirección.
Aunque este esquema disminuye la cantidad de memoria necesaria para
almacenar cada tabla de páginas, incrementa la cantidad de tiempo necesario
para buscar en la tabla cuando ocurre una referencia a una página. Como la tabla
de páginas invertida está ordenada por dirección física, pero las búsquedas
ocurren en direcciones virtuales, podría ser necesario buscar aliviar este
problema, se usa una tabla hash para limitar la búsqueda a una entrada – o a lo
sumo unas cuantas entradas- de la tabla de páginas. Por supuesto, cada acceso a
la tabla hash agrega al procedimiento una referencia a memoria, por lo que una
referencia a la memoria virtual requiere de por lo menos dos lecturas a la memoria
real: una para la entrada en la tabla hash y una para la tabla de páginas. Para
mejorar el rendimiento, utilizamos registros asociativos de memoria para retener
las entradas localizadas recientemente. Primero se busca en estos registros, antes
de consultar la tabla hash
Páginas compartidas.