lunes, 15 de abril de 2013

Administración básica de memoria



Monoprogramación sin intercambio ni paginación.


Se utiliza cuando solo se tiene un proceso que ocupe la memoria a la vez, el esquema de la administración de la memoria es el más sencillo que hay. Sin embargo, éste método ya no tiene aplicación en la actualidad, ya que era visto en las computadoras con sistemas operativos de un solo usuario y una sola tarea. El usuario introducía su disco a la computadora (por lo general, la máquina no contaba con disco duro) y ejecutaba su aplicación, la cual acaparaba toda la memoria de la máquina.


Multiprogramación con particiones fijas.



Se realiza mediante el uso de particiones fijas o variables en la memoria. En las particiones fijas, la memoria se puede organizar dividiéndose en partes, las cuales pueden variar en tamaño. Esta partición la puede hacer el usuario en forma manual, al iniciar sesión en la máquina.


Hay dos maneras de asignar los procesos a ella:



1) Mediante el uso de una cola única que asigna los procesos a los espacios disponibles de la memoria conforme se vayan desocupando. El tamaño del hueco de memoria disponible es usado para localizar en la cola el primer proceso que quepa en él.



2) Buscar en la cola el proceso de tamaño mayor que se ajuste al hueco, sin embargo hay que tomar en cuenta que tal método discrimina a los procesos más pequeños. Dicho problema podría tener solución si se asigna una partición pequeña en la memoria al momento de hacer la partición inicial, el cual sería exclusivo para procesos pequeños.


Administración de la memoria con mapas de bits


Este tipo de administración divide la memoria en unidades de asignación, las cuales pueden ser tan pequeñas como unas cuantas palabras o tan grandes como varios kilobytes. A cada unidad de asignación le corresponde un bit en el mapa de bits, el cual toma el valor de 0 si la unidad está libre y 1 si está ocupada (o viceversa).


Administración de la memoria con listas enlazadas


Otra forma de mantener un registro de la memoria es mediante una lista ligada de los segmentos de memoria asignados o libres, en donde un segmento puede ser un proceso o un hueco entre dos procesos. La memoria de la figura está mostrada como una lista ligada de segmentos en la figura 7. Cada entrada de la lista especifica un hueco (H) o un proceso (P), la dirección donde comienza, su longitud y un apuntador a la siguiente entrada.


Concurrencia


La computación concurrente es la simultaneidad en la ejecución de múltiples tareas interactivas. Estas tareas pueden ser un conjunto de procesos o hilos de ejecución creados por un único programa. Las tareas se pueden ejecutar en una sola unidad central de proceso (multiprogramación), en varios procesadores o en una red de computadores distribuidos. La programación concurrente está relacionada con la programación paralela, pero enfatiza más la interacción entre tareas. Así, la correcta secuencia de interacciones o comunicaciones entre los procesos y el acceso coordinado de recursos que se comparten por todos los procesos o tareas son las claves de esta disciplina.

Algoritmos de Planificación de Procesos



Primero en llegar primero en ser servido

Conocido como FCFS (First Come First Served). Este algoritmo emplea una cola de procesos, asignando un lugar a cada proceso por el orden de llegada. Cuando el proceso llega es puesto en su lugar en la cola después del que llegó antes que él y se pone en estado de listo. Cuando un proceso comienza a ejecutarse no se interrumpe su ejecución hasta que termina de hacerlo.

Prioridad al más corto

Su nombre es SJF (Shortest Job First). El proceso que se encuentra en ejecución cambiará de estado voluntariamente, o sea, no tendrá un tiempo de ejecución determinado para el proceso. A cada proceso se le asigna el tiempo que usará cuando vuelva a estar en ejecución, y se irá ejecutando el que tenga un menor tiempo asignado. Si se da el caso de que dos procesos tengan igual valor en ese aspecto emplea el algoritmo FCFS.

Round Robin

A cada proceso se le asigna un tiempo determinado para su ejecución, el mismo tiempo para todos. En caso de que un proceso no pueda ser ejecutado completamente en ese tiempo se continuará su ejecución después de que todos los procesos restantes sean ejecutados durante el tiempo establecido. Este es un algoritmo basado en FCFS que trata la cola de procesos que se encuentran en estado de listos como una cola circular.

Planificación por prioridad

En este tipo de planificación a cada proceso se le asigna una prioridad siguiendo un criterio determinado, y de acuerdo con esa prioridad será el orden en que se atienda cada proceso.

Planificación garantizada

Para realizar esta planificación el sistema tiene en cuenta el número de usuarios que deben ser atendidos. Para un número "n" de usuarios se asignará a cada uno un tiempo de ejecución igual a 1/n.

Planificación de Colas Múltiples

El nombre se deriva de MQS (Multilevel Queue Schedulling). En este algoritmo la cola de procesos que se encuentran en estado de listos es dividida en un número determinado de colas más pequeñas. Los procesos son clasificados mediante un criterio para determinar en qué cola será colocado cada uno cuando quede en estado de listo. Cada cola puede manejar un algoritmo de planificación diferente a las demás.

Sección crítica y exclusión mutua


El método más sencillo de comunicación entre los procesos de un programa concurrente es el uso común de unas variables de datos. El problema de este sistema es que la acción de un proceso interfiere en las acciones de otro de una forma no adecuada. Para evitar este tipo de errores se pueden identificar aquellas regiones de los procesos que acceden a variables compartidas y dotarlas de la posibilidad de ejecución como si fueran una única instrucción. Se denomina sección crítica a aquellas partes de los procesos concurrentes que no pueden ejecutarse de forma concurrente o, que desde otro proceso se ven como si fueran una única instrucción. Esto quiere decir que si un proceso entra a ejecutar una sección crítica en la que accede a unas variables compartidas, entonces otro proceso no puede entrar a ejecutar una región crítica en la que se modifique las variables compartidas con el anterior. Las secciones críticas se pueden agrupar en clases, siendo mutuamente exclusivas las secciones críticas de cada una. Para conseguir dicha exclusión se deben implementar protocolos software que impidan o bloqueen el acceso a una sección crítica mientras está siendo utilizada por un proceso.
.
Los algoritmos de exclusión mutua (comúnmente abreviada como mutex por mutual exclusion) se usan en programación concurrente para evitar que fragmentos de código conocidos como secciones críticas accedan al mismo tiempo a recursos que no deben ser compartidos.

La mayor parte de estos recursos son las señales, contadores, colas y otros datos que se emplean en la comunicación entre el código que se ejecuta cuando se da servicio a una interrupción y el código que se ejecuta el resto del tiempo. Se trata de un problema de vital importancia porque, si no se toman las precauciones debidas, una interrupción puede ocurrir entre dos instrucciones cualesquiera del código normal y esto puede provocar graves fallos.

La técnica que se emplea por lo común para conseguir la exclusión mutua es inhabilitar las interrupciones durante el conjunto de instrucciones más pequeño que impedirá la corrupción de la estructura compartida (la sección crítica). Esto impide que el código de la interrupción se ejecute en mitad de la sección crítica.

En un sistema multiprocesador de memoria compartida, se usa la operación indivisible test-and-set sobre una bandera, para esperar hasta que el otro procesador la despeje. La operación test-and-set realiza ambas operaciones sin liberar el bus de memoria a otro procesador. Así, cuando el código deja la sección crítica, se despeja la bandera. Esto se conoce como espera activa.

Algunos sistemas tienen instrucciones multioperación indivisibles similares a las anteriormente descritas para manipular las listas enlazadas que se utilizan para las colas de eventos y otras estructuras de datos que los sistemas operativos usan comúnmente.

La mayoría de los métodos de exclusión mutua clásicos intentan reducir la latencia y espera activa mediante las colas y cambios de contexto. Algunos investigadores afirman que las pruebas indican que estos algoritmos especiales pierden más tiempo del que ahorran.
.
A pesar de todo lo dicho, muchas técnicas de exclusión mutua tienen efectos colaterales. Por ejemplo, los semáforos permiten interbloqueos (deadlocks) en los que un proceso obtiene un semáforo, otro proceso obtiene el semáforo y ambos se quedan a la espera de que el otro proceso libere el semáforo. Otros efectos comunes incluyen la inanición, en el cual un proceso esencial no se ejecuta durante el tiempo deseado, y la inversión de prioridades, en el que una tarea de prioridad elevada espera por otra tarea de menor prioridad, así como la latencia alta en la que la respuesta a las interrupciones no es inmediata.
.
La mayor parte de la investigación actual en este campo, pretende eliminar los efectos anteriormente descritos. Si bien no hay un esquema perfecto conocido, hay un interesante esquema no clásico de envío de mensajes entre fragmentos de código que, aunque permite inversiones de prioridad y produce una mayor latencia, impide los interbloqueos.
.
Algunos ejemplos de algoritmos clásicos de exclusión mutua son:
El algoritmo de Dekker.
El algoritmo de Peterson.

Procesos ligeros o hilos


Los procesos ligeros son programas en ejecución son básicamente procesos pero a diferencia de éstos últimos que solo tienen un hilo de ejecución los primeros tienen el hilo principal más hilos secundarios o hijos, en éste caso todos los procesos hijos comparten la información del hilo principal pero además puede cada hilo tener su información privada.


Dentro de la información propia tenemos:

  • Contador de programa
  • Pila
  • Registros.
  • Estado del proceso ligero.
  • Dentro de la información compartida tenemos:
  • Variables globales.
  • Archivos abiertos
  • Señales
  • Semáforos.
  • Contabilidad.

Procesos y planificación




Procesos

Un proceso es un programa en ejecución. Un proceso simple tiene un hilo de ejecución, por el momento dejemos esta última definición como un concepto, luego se verá en más detalle el concepto de hilo. Una vez definido que es un proceso nos podríamos preguntar cuál es la diferencia entre un programa y un proceso, y básicamente la diferencia es que un proceso es una actividad de cierto tipo que contiene un programa, entradas salidas y estados.
Los procesos pueden ser cooperantes o independientes, en el primer caso se entiende que los procesos interactúan entre sí y pertenecen a una misma aplicación. En el caso de procesos independientes en general se debe a que no interactúan y un proceso no requiere información de otros o bien porque son procesos que pertenecen a distintos usuarios.

Estados de los procesos

Un proceso puede estar en cualquiera de los siguientes tres estados: Listo, En ejecución y Bloqueado.
Los procesos en el estado listo son los que pueden pasar a estado de ejecución si el planificador los selecciona. Los procesos en el estado ejecución son los que se están ejecutando en el procesador en ese momento dado. Los procesos que se encuentran en estado bloqueado están esperando la respuesta de algún otro proceso para poder continuar con su ejecución. Por ejemplo operación de E/S.

Implantación de los procesos

La implementación del modelo de procesos se logra debido a que el sistema operativo almacena en una tabla denominada tabla de control de procesos información relativa a cada proceso que se esta ejecutando en el procesador. Cada línea de esta tabla representa a un proceso.
La información que se almacena es la siguiente:
1) Identificación del proceso.
2) Identificación del proceso padre.
3) Información sobre el usuario y grupo.
4) Estado del procesador.
5) Información de control de proceso
5.1) Información del planificador.
5.2) Segmentos de memoria asignados.
5.3) Recursos asignados.


Planificación de procesos

La planificación es el proceso por el cual el sistema operativo selecciona que proceso ejecutar. La selección del proceso se basa en alguno de los algoritmos de planificación que se describen más abajo.



Evolución de los Sistemas Operativos


Evolución de los Sistemas Operativos 






1969: Tres programadores de los laboratorios Bell (Ken Thompson, Dennis Ritchie y Douglas MCIlroy) crean el sistema operativo UNIX, aún en tiempos de terminal y sin entornos graficos existentes. 


 




1973: Xerox crea lo que podemos llamar la “primera computadora personal mas o menos decente”, la Xerox Alto con su sistema operativo propio. 





1974: Empieza la creación de BSD 1.0, que es rápidamente sucedida por BSD 2.0 en 1978. 





1979: Tim Paterson crea su sistema operativo 86-DOS, que posteriormente pasó a llamarse QDOS (Quick and Dirty Operative System). Dos años después Bill Gates compra QDOS por una suma entre 25 y 50 mil dólares y rebautiza dos veces, en primer lugar como PC-DOS, el cual vende como sistema operativo a IBM para que estos lo usen en sus PCs (IBM-PC), y en segundo lugar (un año más tarde) como MS-DOS, el cual, siendo una copia casi identica a PC-DOS, vende como sistema propio (el sistema operativo sólo, en disketes). 


 




1981: Nace Xerox Star, el sucesor de Xerox Alto. 





1983: Apple muestra su primera gran obra, la Apple Lisa System 1. 





1983: VisiCorp crea Visi On. 





1984: Mac OS System de la mano de Apple. 






1985: Microsoft Windows 1.0 ve la luz, aunque tras un grave fracaso debido a los errores que tenía, se ve rápidamente sucedido por Windows 1.01. 







1987: Andrew S. Tanenbaum crea MINIX, un sistema operativo basado en Unix y escrito en lenguaje C, cuyo principal objetivo era el aprendizaje informático (aprender como funciona un sistema operativo por dentro). Este sistema inspiró a Linus Torvalds para la creación del Núcleo Linux. Imágen de MINIX3. 





1987: Windows 2.0 aparece. 





1989: NeXTSTEP / OPENSTEP 





1990: BeOS de la mano de Be Incorporated. Imágen moderna. 





1990: Windows 3.0. Cuya famosa actualización gratuita a 3.11 (para Windows 3.1) salió 2 años después. 





1990: Richard Stallman crea el sistema GNU de software libre y el Núcleo Hurd, el cual no parece ser tan bueno para el sistema GNU como lo que Linus Torvalds crearía un año después, el Núcleo Linux. En 1992, el sistema GNU y el Núcleo Linux se unen formalmente para crear GNU/Linux, un sistema con docenas de distribuciones (“versiones” que son creadas en paralelo por diversos grupos independientes de programadores) 





1995: Windows 95. 





1996: IBM saca la nueva versión de su sistema operativo: OS/2 Warp 4. 





1997: Mac OS System 8 





1998: Windows 98. 





1998: GNU/Linux sigue avanzando y una de sus más famosas distribuciones, Mandrake Linux, saca su primera versión (5.1). 





2001: Mac OS X. 





2001: Windows XP. 




2006: Ubuntu, la más famosa distribución de GNU/Linux de la actualidad, nace (en varios idiomas). 





2006: Empiezan a aparecer los sistemas operativos en la Nube (Internet), como es el caso de EyeOS. 





2007: Windows Vista. 





2007: Mac OS X Leopard 





2009: Windows 7 aparece 





2011: Ubuntu saca su versión 11.04, cambiando de interfáz Gnome a Unity.