Está en la página 1de 21

TECNOLÓGICO NACIONAL DE MÉXICO

INSTITUTO TECNOLÓGICO DE SALTILLO

SUBDIRECCIÓN ACADÉMICA
UNIDAD DE EDUCACIÓN A DISTANCIA
INGENIERÍA EN SISTEMAS COMPUTACIONALES

TALLER DE SISTEMAS OPERATIVOS

UNIDAD 1 Introducción a los Sistemas Operativos

Tema 1.2

Presenta:
Abril Mejia Rangel 19052155

Docente: Maria del Socorro Dávila Rios

Saltillo, Coahuila de Zaragoza; a 22 de Agosto de 2022.


Introducción
En este documento se mostrará un ensayo sobre Procesos y Multiprogramación.

Desarrollo

1. .
Un proceso es en esencia un programa en ejecución. Cada proceso tiene asociado un
espacio de direcciones, una lista de ubicaciones de memoria que va desde algún mínimo
(generalmente 0) hasta cierto valor máximo, donde el proceso puede leer y escribir
información. El espacio de direcciones contiene el programa ejecutable, los datos del
programa y su pila.

También hay asociado a cada proceso un conjunto de recursos, que comúnmente incluye
registros (el contador de programa y el apuntador de pila, entre ellos), alarmas pendientes,
listas de procesos relacionados y toda la demás para ejecutar el programa. En esencia,
un proceso es un recipiente que guarda toda la información necesaria para ejecutar un
programa.

El usuario puede haber iniciado un programa de edición de vídeo para convertir un vídeo
de una hora a un formato específico (algo que puede tardar horas) y después irse a
navegar en la Web. Mientras tanto, un proceso en segundo plano que despierta en forma
periódica para comprobar los mensajes entrantes puede haber empezado a ejecutarse.
Así tenemos (cuando menos) tres procesos activos: el editor de vídeo, el navegador Web
y el lector de correo electrónico, como se muestra en la siguiente imagen.

Cada cierto tiempo, el sistema operativo decide detener la ejecución de un proceso y


empezar a ejecutar otro, por ejemplo, debido a que el primero ha utilizado más tiempo del
que le correspondía de la CPU en el último segundo.
Cuando un proceso se suspende en forma temporal como en el ejemplo anterior, debe
reiniciarse después exactamente en el mismo estado que tenía cuando se detuvo. Esto
significa que toda la información acerca del proceso debe guardarse en forma explícita en
alguna parte durante la suspensión. Por ejemplo, el proceso puede tener varios archivos
abiertos para leerlos al mismo tiempo.

Con cada uno de estos archivos hay un apuntador asociado que proporciona la posición
actual. Cuando un proceso se suspende en forma temporal, todos estos apuntadores
deben guardarse de manera que una llamada a read que se ejecute después de reiniciar
el proceso lea los datos apropiados. En muchos sistemas operativos, toda la información
acerca de cada proceso se almacena en una tabla del sistema operativo, conocida como
la tabla de procesos, la cual es un arreglo (o lista enlazada) de estructuras, un apara
cada proceso que se encuentre actualmente en existencia.

Así, un proceso (suspendido) consiste en su espacio de direcciones, que se conoce


comúnmente como imagen de núcleo y su entrada a la tabla de procesos, que guarda el
contenido de sus registros y muchos otros elementos necesarios para reiniciar el proceso
más adelante.

Las llamadas al sistema de administración de procesos claves son las que se encargan
de la creación y la terminación de los procesos. Considere un ejemplo común. Un proceso
llamado interprete de comandos o shell lee comandos de una terminal. El usuario acaba
de escribir un comando, solicitando la compilación de un programa. El shell debe
entonces crear un proceso para ejecutar el compilador. Cuando ese proceso ha terminado
la compilación, ejecuta una llamada al sistema para terminarse a si mismo.

Si un proceso puede crear uno o mas procesos aparte y estos procesos a su vez pueden
crear procesos hijos, llegamos rápidamente la estructura de árbol de procesos de la
gráfica.

Los procesos relacionados que cooperan para realizar un cierto trabajo a menudo
necesitan comunicarse entre sí y sincronizar sus actividades. A esta comunicación se le
conoce como comunicación entre procesos.

Hay otras llamadas al sistema de procesos disponibles para solicitar más memoria,
esperar a que termine un proceso hijo y superponer su programa con uno distinto. en
algunas ocasiones se tiene la necesidad de transmitir información a un proceso en
ejecución que no esta esperando esta información.
Por ejemplo, un proceso que se comunica con otro, en una computadora distinta, envía
los mensajes al proceso remoto a través de una red de computadoras. para protegerse
contra la posibilidad de que se pierda un mensaje o su contestación, el emisor puede
solicitar que su propio sistema operativo le notifique después de cierto numero de
segundos para que pueda retransmitir el mensaje, si no se ha recibido aun la señal de
aceptación.

Después de asignar este temporizador, el programa puede continuar realizando otro


trabajo. Cuando ha transcurrido el número especificado de segundos, el sistema operativo
envía una señal de alarma al proceso. la señal provoca que el proceso suspenda en forma
temporal lo que esté haciendo, almacene sus registros en la pila y empiece a ejecutar un
procedimiento manejador de señales especiales, por ejemplo, para retransmitir un
mensaje que se considera perdido.

Cuando termina el manejador de señales, el procesos en ejecución se reinicia en el estado


en el que se encontraba justo antes de la seña. las señales son la analogía en software
de las interrupciones de hardware y se pueden generar mediante una variedad de causas.

Muchas traps detectadas por el hardware, como la ejecución de una instrucción ilegal o
el uso de una dirección inválida, también se convierten en señales que se envían al
proceso culpable. Cada persona autorizada para utilizar un sistema recibe na UID que
administrador del sistema le asigna. Cada procesos iniciado tiene el UID de la persona
que lo inicio. Un proceso hijo tiene el mismo UID que su padre. Los usuarios pueden ser
miembros de grupos, cada uno de los cuales tiene una GID (Identificación de grupo).

En resumen, la información de control relacionada con los procesos se almacena en la


tabla de procesos la cual es administrada por el sistema operativo y posee un arreglo de
estructuras, una por cada proceso existente en ese momento.

Un proceso suspendido consta de un espacio de dirección y los datos pertinentes de la


tabla de procesos.

Un proceso puede crear procesos hijo y estos nuevos procesos hijo, conformando un árbol
de procesos.

2. .
El modelo de procesos posee las siguientes características:

• Todo el software ejecutable, inclusive el Sistema Operativo, se organiza en varios


procesos secuenciales o procesos.
• Un proceso incluye al programa en ejecución y a los valores activos del contador,
registros y variables del mismo.
• Conceptualmente cada proceso tiene su propia CPU virtual.
• Si la CPU alterna entre los procesos, la velocidad a la que ejecuta un proceso no
será uniforme, por lo que es necesario aclarar lo siguiente:
o Los procesos no deben programarse con hipótesis implícitas acerca del
tiempo.
o Normalmente la mayoría de los procesos no son afectados por la
multiprogramación subyacente de la CPU o las velocidades relativas de
procesos distintos.
• Un proceso es una actividad de un cierto tipo, que tiene un programa, entrada,
salida y estado.
• Un solo procesador puede ser compartido entre varios procesos con
cierto algoritmo de planificación, el cal determina cuando detener el trabajo en
un proceso y dar servicio a otro distinto.

En cuanto a las jerarquías de procesos es necesario señalar que los SO deben disponer
de una forma de crear y destruir procesos cuando se requiera durante la operación,
teniendo además presente que los procesos pueden generar procesos hijos mediante
llamadas al SO, pudiendo darse ejecución en paralelo.

Respecto a los estados del proceso deben efectuarse las siguientes consideraciones:

• Cada proceso es una entidad independiente pero frecuentemente


debe interactuar con otros procesos.
• Los procesos pueden bloquearse en su ejecución
• Los estados pueden tener un proceso en ejecución, listo o
bloqueado
• Son posibles cuatro transiciones entre estos estados

3. .
Los sistemas operativos necesitan cierta manera de crear procesos. en sistemas muy
simples o sistemas diseñados para ejecutar sólo una aplicación, es posible tener
presentes todos los procesos que se vayan a requerir cuando el sistema inicie. No
obstante, en los sistemas de propósito general se necesita cierta forma de crear y terminar
procesos según sea necesario durante la operación.

Hay cuatro eventos principales que provocan la creación de procesos:

• El arranque del sistema.


• La ejecución, desde un proceso, de una llamada al sistema para
creación de procesos.
• Una petición de usuario para crear un proceso.
• El inicio de un trabajo por lotes.

Generalmente, cuando se arranca un sistema operativo se crean varios procesos. Algunos de


ellos son procesos en primer plano, es decir, procesos que interactúan con los usuarios y
realizan trabajo para ellos.
Otros son procesos en segundo plano, que no están asociados con usuarios específicos sino
con una función específica. Los procesos que permanecen en segundo plano para manejar
ciertas actividades como correo electrónico, páginas web, noticias, impresiones, etcétera, se
conocen como demonios (daemons).

Además de los procesos que se crean al arranque, posteriormente se pueden crear otros. A
menudo, un proceso en ejecución emitirá llamadas al sistema para crear uno o más procesos
nuevos, para que le ayuden a realizar su trabajo. En especial, es útil crear procesos cuando
el trabajo a realizar se puede formular fácilmente en términos de varios procesos interactivos
relacionados entre sí, pero independientes en los demás aspectos.

En los sistemas interactivos, los usuarios pueden iniciar un programa escribiendo un comando
o haciendo doble clic en un icono. Cualquiera de las dos acciones inicia un proceso y ejecuta
el programa seleccionado. En los sistemas UNIX basados en comandos que ejecutan X, el
nuevo proceso se hace cargo de la ventana en la que se inició. En Windows, cuando se inicia
un proceso no tiene una ventana, pero puede crear una y la mayoría lo hace. En ambos
sistemas, los usuarios pueden tener varias ventanas abiertas a la vez, cada una ejecutando
algún proceso. mediante el ratón, el usuario puede seleccionar una ventana e interactuar con
el proceso para proveer datos cuando sea necesario.

La última situación en la que se crear los procesos se aplica sólo a los sistemas de
procesamiento por lotes que se encuentran en las mainframes grandes. Aquí los usuarios
pueden enviar trabajos de procesamiento por lotes al sistema. Cuando el sistema operativo
decide que tiene los recursos para ejecutar otro trabajo, crea un proceso y ejecuta el siguiente
trabajo de la cola de entrada. Técnicamente, para crear un proceso hay que hacer que un
proceso existente ejecute una llamada al sistema de creación de proceso. Ese proceso puede
ser un proceso de usuario en ejecución, un proceso del sistema invocado mediante el teclado
o ratón, o un proceso del administrador de procesamiento por lotes.

Tanto en UNIX como en Windows, una vez que se crea un proceso, el padre y el hijo tienen
sus propios espacios de direcciones distintos. En UNIX, el espacio de direcciones inicial del
hijo es una copia del padre, pero en definitiva hay dos espacios de direcciones distintos
involucrados, no se comparte memoria en la que se pueda escribir. En Windows los espacios
de direcciones del hijo y del padre son distintos desde el principio.
4. .
Una vez que se crea un proceso, empieza a ejecutarse y realiza el trabajo al que está
destinado. Sin embargo, nada dura para siempre, ni siquiera los procesos. Tarde o
temprano el nuevo proceso terminará, por lo general debido a una de las siguientes
condiciones:

• Salida normal (voluntaria)


• Salida por error (voluntaria).
• Error fatal (involuntaria).
• Eliminado por otro proceso (involuntaria).

La mayoría de los procesos terminan debido a que han concluido su trabajo. Cuando un
compilador ha compilado el programa que recibe, ejecuta una llamada al sistema para indica
al sistema operativo que ha terminado. Esta llamada es exit en UNIX y ExitPocess en
Widnows.

Los programas orientados a pantalla también admiten la terminación voluntaria. Los


procesadores de palabras, navegadores de Internet y programas similares siempre tienen un
icono o elemento de menú en el que el usuario puede hacer clic para indicar al proceso que
elimine todos los archivos temporales que tenga abiertos y después termine.

La segunda razón de terminación es que el proceso descubra un error, los procesos


interactivos orientados a pantalla por lo general no terminan cuando reciben parámetros
incorrectos. En vez de ellos, aparece un cuadro de diálogo y se le pide al usuario que intente
de nuevo.

La tercera razón de terminación es un error fatal producido por el proceso, a menudo debido
a un error en el programa. Algunos ejemplos incluyen el ejecutar una instrucción ilegal, hacer
referencia a una parte de memoria no existente o ala división entre cero. En algunos sistemas
(como UNIX) un proceso puede indicar al sistema operativo que desea manejar ciertos errores
por sí mismo, en cuyo caso el proceso recibe una señal en vez de terminar.

La cuarta razón por la que un proceso podría terminar es que ejecute una llamada al sistema
que indique al sistema operativo que elimine otros procesos. En UNIX esta llamada es kill. la
función correspondiente en Win32 es TerminateProcess. en ambos casos, el proceso eliminador
debe tener la autorización necesaria para realizar la eliminación. En algunos sistemas, cuando
un proceso termina, todos los procesos que creó se eliminan de inmediato también. Sin
embargo ni Windows ni UNIX trabajan de esta forma.

5. .
Con frecuencia, los procesos necesitan comunicarse con otros procesos. Por ejemplo, en
una canalización de shell, la salida del primer proceso se debe pasar al segundo proceso
y así sucesivamente. Por ende, existe una necesidad de comunicación entre procesos,
de preferencia en una forma bien estructurada sin utilizar interrupciones, debido a tres
cuestiones:

• Un proceso puede pasar información a otro.


• Dos o más procesos no se interpongan entre sí.
• Obtener la secuencia apropiada cuando hay dependencias presentes.
Condiciones de carrera
En algunos sistemas operativos, los procesos que trabajan en conjunto pueden compartir
cierto espacio de almacenamiento en el que pueden leer y escribir datos. El
almacenamiento compartido puede estar en la memoria principal o puede ser un archivo
compartido. Para ver cómo funciona la comunicación entre procesos en la práctica,
consideraremos un ejemplo simple pero común: un spooler de impresión.

Cuando un proceso desea imprimir un archivo, introduce el nombre del archivo en un


directorio de spooler especial. Otro proceso, el demonio de impresión, comprueba en
forma periódica si hay archivos que deban imprimirse y si los hay, los imprime y luego
elimina sus nombres del directorio.

Regiones Criticas
La clave para evitar problemas aquí y en muchas otras situaciones en las que se
involucran la memoria compartida, los archivos compartidos y todo lo demás compartidos
es buscar alguna manera de prohibir que más de un proceso lea y escriba los datos
compartidos al mismo tiempo.

Dicho en otras palabras, lo que necesitamos es exclusión mutua, cierta forma de asegurar
que, si un proceso está utilizando una variable o archivo compartido, los demás procesos
se excluirán de hacer lo mismo.

La dificultad antes mencionada ocurrió debido a que el proceso B empezó a utilizar una
de las variables compartidas antes de que el proceso A terminara con ella. La elección de
operaciones primitivas apropiadas para lograr la exclusión mutua es una cuestión de
diseño importante en cualquier sistema operativo y un tema que analizaremos con mayor
detalle en las siguientes secciones.

Esa parte del programa en la que se accede a la memoria compartida se conoce como
región critica o sección critica. Si pudiéramos ordenar las cosas de manera que dos
procesos nunca estuvieran en sus regiones críticas al mismo tiempo, podríamos evitar las
carreras.
Para tener una buena solución a dichas carreras, necesitamos cumplir con cuatro
condiciones:

• No puede haber dos procesos de manera simultánea dentro de sus regiones


críticas.
• No pueden hacerse suposiciones acerca de las velocidades o el número de CPUs.
• Ningún proceso que se ejecute fuera de su región crítica puede bloquear otros
procesos.
• Ningún proceso tiene que esperar para siempre para entrar a su región crítica.

Regiones Criticas
Para lograr la exclusión mutua, de manera que mientras un proceso esté ocupado
actualizando la memoria compartida en su región critica, ningún otro proceso puede entrar
a su región crítica y ocasionar problemas.

Deshabilitando interrupciones: En un sistema con un solo procesador, la solución más simple es


hacer que cada proceso deshabilite todas las interrupciones justo después de entrar a su
región crítica y las rehabilite justo después de salir. Con las interrupciones deshabilitadas,
no pueden ocurrir interrupciones de reloj. Después de todo, la CPU sólo se conmuta de
un proceso a otro como resultado de una interrupción del reloj o de otro tipo, y con las
interrupciones desactivadas la CPU no se conmutará a otro proceso. Por ende, una vez
que un proceso ha deshabilitado las interrupciones, puede examinar y actualizar la
memoria compartida sin temor de que algún otro proceso intervenga. A menudo
deshabilitar interrupciones es una técnica útil dentro del mismo sistema operativo, pero
es apropiada como mecanismo de exclusión mutua general para los procesos de usuario.

Variables de candado: Como segundo intento, busquemos una solución de software. Cuando
un procesos desea entrar a su región crítica primero evalúa el candado. Si este cando es
0, el proceso lo fija en 1 y entra a la región critica. Si el candado ya es 1 sólo espera hasta
que el candado se haga 0. Por ende, un 0 significa que ningún proceso esta en su región
crítica y un 1 significa que algún proceso está en su región crítica. por desgracia, esta
idea contiene exactamente el mismo error fatal que vimos en el directorio de spooler.
Suponga que un proceso lee el candado y ve que es 0, ante de que pueda fijar el candado
en 1, otro proceso se planifica para ejecutarse y fija el candado a 1. Cuando el primer
proceso se ejecuta de nuevo, también fija el candado a 1 y por lo tanto dos procesos se
encontrarán en sus regiones críticas al mismo tiempo.

Alternancia estricta: Esta solución requiere que los dos procesos se alternen de manera
estricta al entrar en sus regiones críticas. Ninguno podría poner dos archivos en la cola al
mismo tiempo. Aunque este algoritmo evita todas las condiciones de carrera, en realidad
no es un candidato serio como solución.

Solución de Peterson: Al combinar la idea de tomar turnos con la idea de las variables de
candado y las variables de advertencia, un matemático holandés fue el primero en idear
una solución de software para el problema de la exclusión mutua que no requiere de una
alternancia estricta. Peterson descubrió una manera mucho más simple de lograr la
exclusión mutua, con lo cual la solución de Dekker se hizo obsoleta.

Ahora considere el caso en el que ambos procesos llaman a entrar_region casi en forma
simultánea. Ambos almacenarán su número de proceso en turno. Cualquier
almacenamiento que se haya realizado al último es el que cuenta, el primero se
sobrescribe y se pierde. Suponga que el proceso 1 almacena al último, por lo que turno
es 1. Cuando ambos procesos llegan a la instrucción while, el proceso 0 la ejecuta 0 veces
y entra a su región crítica. El proceso 1 itera y no entra a su región crítica sino hasta que
el proceso 0 sale de su región crítica.

Semáforos
Un semáforo es una variable especial que constituye el método clásico para restringir o
permitir el acceso a recursos compartidos en un entorno de multiprocesamiento. Los
semáforos se utilizaron por primera vez en el sistema operativo THEOS.

Los semáforos se emplean para permitir el acceso a diferentes partes de programas o


secciones criticas donde se manipulan variables o recursos que deber ser accedidos de
forma especial. Según el valor con que son inicializados se permiten a más o menos
procesos utilizar el recurso de forma simultánea.
Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse
un semáforo inicializado en 0. El proceso que debe ejecutar primero en la secuencia
realiza la operación V sobre el semáforo antes del código que debe ser ejecutado después
del otro proceso. Éste ejecuta la operación P.

Si el segundo proceso en la secuencia es programado para ejecutar antes que el otro, al


hacer P dormirá hasta que el primer proceso de la secuencia pase por su operación V.
Este modo de uso se denomina señalación (signaling), y se usa para que un proceso o
hilo de ejecución le haga saber a otro que algo ha sucedido.

El otro uso de los semáforos es para la sincronización. Los semáforos vacíos y llenos se
necesitan para garantizar que ciertas secuencias de eventos ocurran o no. En este caso,
aseguran que el productor deje de ejecutarse cuando el búfer esté lleno y que el
consumidor deje de ejecutarse cuando el búfer esté vacío. Este uso es distinto de la
exclusión mutua.

Mutex
Cuando no se necesita la habilidad del semáforo de contar, algunas veces se utiliza una
versión simplificada, llamada mutex. Los mutexes son buenos sólo para administrar la
exclusión mutua para cierto recurso compartido o pieza de código.

Se implementan con facilidad y eficiencia, lo cual hace que sean especialmente útiles en
paquetes de hilos que se implementan en su totalidad en espacio de usuario. Un mutex
es una variable que puede estar en uno de dos estados: abierto (desbloqueado) o cerrado
(bloqueado).

En consecuencia, se requiere sólo 1 bit para representarla, pero en la práctica se utiliza


con frecuencia un entero, en donde 0 indica que está abierto y todos los demás valores
indican que está cerrado. Se utilizan dos procedimientos con los mutexes.

Cuando un hilo (o proceso) necesita acceso a una región crítica, llama a mutex_lock. Si
el mutex está actualmente abierto (lo que significa que la región crítica está disponible),
la llamada tiene éxito y entonces el hilo llamador puede entrar a la región crítica. Por otro
lado, si el mutex ya se encuentra cerrado, el hilo que hizo la llamada se bloquea hasta
que el hilo que está en la región crítica termine y llame a mutex_unlock.

Si se bloquean varios hilos por el mutex, se selecciona uno de ellos al azar y se permite
que adquiera el mutex. Como los mutexes son tan simples, se pueden implementar con
facilidad en espacio de usuario, siempre y cuando haya una instrucción TSL o XCHG
disponible.

Monitores
Los monitores tienen una importante propiedad que los hace útiles para lograr la exclusión
mutua: sólo puede haber un proceso activo en un monitor en cualquier instante. Los
monitores son una construcción del lenguaje de programación, por lo que el compilador
sabe que son especiales y puede manejar las llamadas a los procedimientos del monitor
en forma distinta a las llamadas a otros procedimientos.

Por lo general, cuando un proceso llama a un procedimiento de monitor, las primeras


instrucciones del procedimiento comprobarán si hay algún otro proceso activo en un
momento dado dentro del monitor.
De ser así, el proceso invocador se suspenderá hasta que el otro proceso haya dejado el
monitor. Si no hay otro proceso utilizando el monitor, el proceso invocador puede entrar.

Es responsabilidad del compilador implementar la exclusión mutua en las entradas del


monitor, pero una forma común es utilizar un mutex o semáforo binario. Como el
compilador (y no el programador) está haciendo los arreglos para la exclusión mutua, es
mucho menos probable que al o salga mal.

En cualquier caso, la persona que escribe el monitor no tiene que saber acerca de cómo
el compilador hace los arreglos para la exclusión mutua. Basta con saber que, al convertir
todas las regiones críticas en procedimientos de monitor, nunca habrá dos procesos que
ejecuten sus regiones críticas al mismo tiempo.

Un problema con los monitores (y también con los semáforos) es que están diseñados
para resolver el problema de exclusión mutua en una o más CPUs que tengan acceso a
una memoria común. Al colocar los semáforos en la memoria compartida y protegerlos
con instrucciones TSL o XCHG, podemos evitar las condiciones de carrera.

Si utilizamos un sistema distribuido que consista en varias CPUs, cada una con su propia
memoria privada, conectadas por una red de área local, estas primitivas no se pueden
aplicar. La conclusión es que los semáforos son de un nivel demasiado bajo y los
monitores no pueden usarse, excepto en algunos lenguajes de programación. Además,
ninguna de las primitivas permite el intercambio de información entre las máquinas. Se
necesita algo más (el pasaje de mensajes).

Pasaje de Mensajes
Este método de comunicación entre procesos utiliza dos primitivas (send y receive) que,
al igual que los semáforos y a diferencia de los monitores, son llamadas al sistema en vez
de construcciones del lenguaje. Como tales, se pueden colocar con facilidad en
procedimientos de biblioteca.

La primera llamada envía un mensaje a un destino especificado y la segunda recibe un


mensaje de un origen especificado (o de cualquiera, si al receptor no le importa). Si no
hay un mensaje disponible, el receptor se puede bloquear hasta que llegue uno. De
manera alternativa, puede regresar de inmediato con un código de error.

Barreras
Nuestro último mecanismo de sincronización está destinado a los grupos de procesos, en
vez de las situaciones de tipo productor consumidor de dos procesos. Algunas
aplicaciones se dividen en fases y tienen la regla de que ningún proceso puede continuar
a la siguiente fase sino hasta que todos los procesos estén listos para hacerlo.

Para lograr este comportamiento, se coloca una barrera al final de cada fase. Cuando un
proceso llega a la barrera, se bloquea hasta que todos los procesos han llegado a ella.

6. .

El concepto de multiprogramación se refiere a la idea general de poder cargar múltiples


programas dentro de un mismo computador para que sean ejecutados en un determinado
momento.
Para lograr manejar múltiples programas, es necesario primero definir que compone a un
programa.

En general, se puede decir que un programa está compuesto por dos partes: su
representación en memoria que incluye el código, datos y stack del programa, y su estado
de ejecución que incluye los valores almacenados en los registros de la CPU (PC,
registros acumuladores, SP, Status register, etc.) que indican el estado actual del
programa en la máquina. Para lograr trabajar con múltiples programas, entonces, es
necesario permitir el manejo de múltiples representaciones en memoria y de múltiples
estados de ejecución.

Se denomina multiprogramación a la técnica que permite que dos o más procesos ocupen
la misma unidad de memoria principal y que sean ejecutados al "mismo tiempo" (pseudo-
paralelismo, en una única CPU sólo puede haber un proceso a la vez) en la unidad central
de proceso o CPU.

La multiprogramación una técnica que intenta incrementar la utilización del CPU tratando
de tener siempre algo para que el CPU lo ejecute. Esta idea funciona de la siguiente
manera: El sistema operativo selecciona uno de los trabajos y empieza su ejecución.
Eventualmente, el trabajo tiene que esperar por algo, tal como una lectura a disco, un
comando que debe ser tecleado, etc. En un sistema no multiprogramado el CPU debe
esperar si hacer nada. En un sistema con multiprogramación, el sistema operativo
simplemente seleccionará otro trabajo y lo ejecutará.

Cuando ese trabajo necesite esperar, el CPU será asignado a otro trabajo y de esta forma
continuará. Eventualmente el primer trabajo habrá terminado su espera y obtendrá el CPU
nuevamente. De esta manera, sí siempre existe algún trabajo para ejecutar, el CPU nunca
estará ocioso.

En resumen, la CPU alterna de programa en programa, en un esquema de seudoparalelismo,


es decir que la CPU ejecuta en cierto instante un solo programa, intercambiando muy
rápidamente entre uno y otro.

El paralelismo real de hardware se da en las siguientes situaciones:

• En ejecución de instrucciones de programa con más de un procesador de


instrucciones en uso simultáneamente.
• Con la superposición de ejecución de instrucciones de programa con la ejecución
de una o más operaciones de entrada/salida.

El objetivo es aumentar el paralelismo en la ejecución..

Los Sistemas Operativos son altamente sofisticados ya que necesitan tener varios
trabajos listos para ser ejecutados, los cuales deben de estar simultáneamente en
memoria principal. Con la multiprogramación, la ejecución de los procesos (o hilos) se va
solapando en el tiempo a tal velocidad, que causa la impresión de realizarse en paralelo
(simultáneamente).

Se trata de un paralelismo simulado, dado que la CPU sólo puede trabajar con un proceso
cada vez (el proceso activo). De ahí que, en rigor, se diga que la CPU ejecuta
«concurrentemente» (no simultáneamente) varios procesos; en un lapso de tiempo
determinado, se ejecutarán alternativamente partes de múltiples procesos cargados en la
memoria principal.
7.
.

• Mejora productividad del sistema y utilización de recursos.


• Multiplexa recursos entre varios programas.
• Generalmente soportan múltiples usuarios (multiusuarios).
• Proporcionan facilidades para mantener el entorno de usuarios individuales.
• Requieren validación de usuario para seguridad y protección.
• Proporcionan contabilidad del uso de los recursos por parte de los usuarios.
• Multitarea sin soporte multiusuario se encuentra en algunos computadores
personales o en sistemas de tiempo real.
• Sistemas multiprocesadores son sistemas multitareas por definición ya que
soportan la ejecución simultánea de múltiples tareas sobre diferentes
procesadores.
• En general, los sistemas de multiprogramación se caracterizan por tener múltiples
programas activos compitiendo por los recursos del sistema: procesador,
memoria, dispositivos periféricos.

8. .

• Varios procesos en ejecución


• Permite el servicio interactivo simultáneo a varios usuarios de manera eficiente
• Aprovecha los tiempos que los procesos pasan esperando a que se completen sus
operaciones de E/S y por ende aumenta la eficiencia en el uso del CPU.

Las direcciones de los procesos son relativas, el programador no se preocupa por saber
en dónde estará el proceso dado que el sistema operativo es el que se encarga de
convertir la dirección lógica en física.

9. .
Un método para la multiprogramación es el Foreground/Background (o ejecución
jerarquizada) (usado en sistemas por tandas, nunca en interactivos), en él hay un proceso
prioritario (el foreground (FG)) que se ejecuta con preferencia de todos los demás, cuando
este proceso solicita una operación L/E(Lectura/Escritura), mientras el SO la realiza, el
proceso FG estará bloqueado por esta operación y le cede el control al proceso
background 1 (BG), y si éste realiza una operación L/E, al BG2.

Cuando uno de los procesos bloqueados se desbloquea, recibe el control del procesador.
Para que este método funcione de forma óptima la mejor forma es colocar los procesos
ordenados de mayor a menor cantidad de operaciones L/E. La multiprogramación es una
técnica de multiplexación que permite la ejecución simultánea de múltiples procesos en
un único procesador.

En realidad, esta técnica produce una ilusión de paralelismo, de manera que parece que
todos los procesos se están ejecutando a la vez. Sin embargo, hay un único proceso
ejecutándose en el procesador a la vez.
Como se puede observar en el ejemplo anterior, los procesos alternan periodos en los
que progresan en su actividad, cuando están asignados al procesador, con periodos de
inactividad, en los que no progresan en absoluto. Si los periodos de inactividad son los
suficientemente pequeños como para que el usuario del sistema operativo no los note,
que en práctica se traduce a periodos de inactividad de menos de 100ms, el efecto
causado es una ilusión de paralelismo.

En caso contrario dará una sensación de que se producen "saltos". El planificador de


procesos es la parte del sistema operativo que se encarga de decidir qué proceso emplea
el procesador en cada instante, por tanto, es el encargado de implementar la
multiprogramación.

10.
.

Sistemas de tiempo compartido

El tiempo compartido es bastante popular


en sistemas multiprogramados y
multiusuarios. Estos sistemas de
multiacceso dedican la mayor parte del
tiempo de ejecución de un programa único
de una gran aplicación.

Son elementos dedicados que poseen un


buen tiempo de respuesta del terminal y
tratan con frecuencia de proporcionar un
reparto equitativo de los recursos comunes
para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo,
cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos
de proceso pedido.
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos
sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que
se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema
operativo interrumpe un programa y lo pone al final de la cola de programas en espera,
cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los
programas de la monopolización del procesador.

El gestor de memoria del sistema proporciona el aislamiento y protección de los


programas en ejecución. Sin embargo, se puede emplear un espacio de memoria
compartido controlado por el sistema operativo.

Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la
cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los
terminales humanos y la reacción o respuesta humana, el procesamiento de las
interrupciones del terminal no necesita ser críticas para el tiempo.

El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso,
dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.

Sistemas de tiempo real

Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos
muertos un gran número de sucesos, en su mayoría externos al sistema de computadora.
Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.

Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan


al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se
consigue el multiproceso planificando los procesos independientes unos de otros. Se
asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia
relativa de los sucesos que sirve.

El procesador está normalmente asignado al proceso con más alta prioridad entre los que
están listos para ejecutarse. Esta forma de planificación se llama planificación basada en
la prioridad preferente.

A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado


para tener un menor tiempo de respuesta debido a que los programas generalmente
residen permanentemente en la memoria ya que usualmente son sistemas estáticos no
diseñados para permitir la implementación de programas externos.
El tiempo crítico del gestor de dispositivo es una de las características principales de los
sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión
de interrupciones y almacenamiento intermedio, estos sistemas proporcionan
frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse
directamente a vectores de interrupción y sucesos de servicio. De esta forma, los
programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento
de una interrupción.

Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento


secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es
requerido se necesita la implementación de un gestor de archivos que como en otros tipos
de sistemas operativos debe manejar protección y control de acceso.

Sistemas de operativos combinados

Lamentablemente el uso de sistemas operativos de tiempo es demasiado específicos y


por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen
las necesidades de los usuarios en computadoras personales y emergentes dispositivos
portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos
combinados que emplean las ventajas de los sistemas operativos de multiprogramación
juntamente con los sistemas operativos por lotes.

Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con
una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del
procesador al eliminar los tiempos muertos o de espera.

11. .
Los sistemas de un solo usuario desperdician gran cantidad de recursos computacionales
debido a que:

• Cuando ocurre una petición de entrada/Salida la CPU normalmente no puede


continuar el proceso hasta que concluya la operación de entrada / salida
requerida.
• Los periféricos de e/s frenan la ejecución de los procesos ya que
comparativamente la CPU es varias ordenes de magnitud más rápida que los
dispositivos de e/s.
Los sistemas de multiprogramación permiten que varios procesos usuarios compitan al
mismo tiempo por los recursos del sistema:

• Un trabajo en espera de e/s cederá la CPU a otro trabajo que esté listo para
efectuar cómputos.
• Existe paralelismo entre el procesamiento y la e/s
• Se incrementa la utilización de la CPU y la capacidad global de ejecución del
sistema.
• Es necesario que varios trabajos residan a la vez en la memoria principal.

Multiprogramación de Partición Fija: Traducción Carga Absolutas


Las particiones del almacenamiento principal son de tamaño fijo, aloja un proceso cada
una y la CPU se cambia rápidamente entre los procesos creando la ilusión de
simultaneidad.

Los trabajos se traducían con ensambladores y compiladores absolutos para ser


ejecutados solo dentro de una partición especifica. EL Sistema Operativo resulta de
implementación relativamente sencilla pero no se optimiza la utilización de la memoria.
Multiprogramación de Partición Fija: Traducción y Carga Relocalizables

Los compiladores, ensambladores y cargadores de relocalización:

• Se usan para producir programas relocalizables que puedan ser ejecutados en


cualquier partición disponible de tamaño suficiente para aceptarlos.
• Son más complejos que los absolutos.
• Mejoran la utilización del almacenamiento.
• Confieren más flexibilidad en el armado de la carga de procesos.

12. .
• Los procesos ocupan tanto espacio como necesitan, pero obviamente no deben
superar el espacio disponible de memoria.
• No hay limites fijos de memoria, es decir que la partición de un trabajo es su
propio tamaño.
• Se consideran esquemas de asignación contigua dado que un programa debe
ocupar posiciones adyacentes de almacenamiento.
• Los procesos que terminan dejan disponibles espacios de memoria principal
llamados agujeros:
o Pueden ser usados por otros trabajos que cuando finalizan dejan otros
agujeros menores.
o En sucesivos pasos los agujeros son cada vez mas numerosos pero más
pequeños, por lo que se genera un desperdicio de memoria principal.

Compresión o compactación de almacenamiento


Puede ocurrir que los agujeros separados distribuidos por todo el almacenamiento
principal constituyan una cantidad importante de memoria:
• Podría ser suficiente para alojar a procesos encolados en espera de memoria
• Podría no ser suficiente ningún área libre individual.

La técnica de compresión de memoria implica pasar todas las áreas ocupadas del
almacenamiento a uno de los extremos de la memoria principal:

• Dejando un solo agujero grande de memoria libre contigua


• Esta técnica se denomina recogida de residuos.

Algunas de las principales desventajas de la compresión es que consume recursos del


sistema.
El sistema debe detener todo mientras efectúa la compresión, lo que puede afectar los
tiempos de respuesta. Implica la relocalización de los procesos que se encuentran en la
memoria y la información de relocalización debe ser de accesibilidad inmediata.

Una alta carga de trabajo significa mayor frecuencia de compresión que incrementa el
uso de recursos.

También podría gustarte