Estructura del Almacenamiento Masivo

El almacenamiento constituye una de las partes principales dentro de los sistemas computacionales, ya que es en dispositivos de gran capacidad donde la información es guardada para luego ser accedida o recuperada. Uno de los mayores dispositivos que se utiliza para este propósito son los conocidos díscos duros (discos rígidos) a continuación detallaré algunos de sus aspectos más importantes como su distribución y la manera en que se accede a los datos.

La estructura física de un disco rígido esta compuesta por:

  • Cabezas lectoras que recorren la superficie del disco
  • Platos que son pequeños discos que se encuentra uno sobre otro y compuestos por caras.
  • Las pistas que son circuferencias ubicadas en una cara.
  • Y cilindros definidos como la unión de pistas alineadas verticalmente.

Esta es la distribución física de un disco, ahora analizare brevemente las distintas planificaciones que se utilizan para acceder a los datos de un disco.

Una correcta planificación trae con sigo un aumento en la velocidad de acceso a datos, es decir hace que la cabeza de lectura efectúa un trabajo eficiente en menor tiempo, entre las planificiones se pueden encontrar:

Planificación FCFS
Conocido como first-come-fist-served es un algoritmo que atiende las peticiones en orden de llegada sin importar si se encuentran en ragos muy dispersos. No es muy eficiente pues el cabezal de lectura recorre la superficie de una manera irregular.

Planificación SSTF
Basada en el principio de short-seek-time-first estable las peticiones de dirección de tal manera que será atendida aquella que se encuentre más cerca de la cabeza de lectura. Este algoritmo reduce considerablemente el tiempo, pero como desventaja puede provocar que inanición por la presencia de solicitudes siempre menores.

Planificación SCAN
También conocido como algoritmo del elevador, pues recorre toda la longitud de los platos de un lado a otro buscando en su camino las solicitudes que se encuentren pendientes. Uno de sus inconvenientes es el que las solicitudes de acceso no tienen un tiempo de espera uniforme, es decir, las de un extremo serán atendidas luego de un tiempo mayor.

Planificación C-SCAN
Esta planificación es una variación del anterior que resuelve la espera de tiempo para cada solicitud, haciendo un recorrido uniforme en cuanto ha atender pedidos lo que hace que la cabeza lectora recorra el plato de inicio a fin y retorne.

Planificación LOOK
En la práctica los dos algoritmos anteriores, que recorren todo el plato no son implementados, si no que se usa más la forma de detectar la última petición y regresar nuevamente al principio, es decir no hay razón de seguir recorriendo si ya no existen solicitudes.

Algunos de estos algoritmos son similares a los que usa el sistema operativo para planificar sus procesos, y la elección o implementación de cada uno debería ser tomada de acuerdo al flujo de información que transitará por ese medio.

Otro aspecto importante en el almacenamiento masivo:

Espacio de Intercambio
Este es un concepto importante pues su implementación es conocida como memoría virtual. Y que es lo que hace? pues permite aumentar la cantidad de memoría de tal manera que el SO moverá al disco todo o parte de un proceso sin mucha actividad, permitiendo liberar recursos.
Para ubicar el espacion de intercambio existen dos formas, la primera como un fichero de intercambio que puede reducir o ampliar su tamaño pero que puede ser afectado por la paginación y la segunda una Partición de intercambio, que es basicamente especificar una partición del disco para utilizar, y en diferencia a la anterior no puede ser modificado su tamaño.

Luego de revisar todos estos aspectos, puedo decir que el almacenamiento masivo es uno de los aspectos que el sistema operativo toma en cuenta pues la información y su localización inmediata es muy importante, además, existen algunos otros medios que permiten almacenar información de alguna u otra manera como los discos removibles, los magnéticos, las memorias flash y otros muchos que aún estan en desarrollo.

Saludos,

Sistemas de Entrada y/o Salida (E/S)

Si bien es cierto que un ordenador o computador proporcia y permite realizar procesos que al mas veloz de los mortales le tomaría un tiempo muy grande(si lo logra terminar ;-)) para que pueda trabajar con ellos o procesarlos en necesario primero darselos(entrada) y para poder utilizarlos talvez sea necesario tener una constancia de lo que se hizo(salida).

Y es aquí donde los dispositivos de entrada y salida forma una de las partes más esenciales, esto son capaces de enviar información entre diversas unidades(i/o)

Entre los dispositivos que pueden realizar estas operaciones su gama es muy variada van desde periféricos como impresoras, monitores y otros, hasta los más pequeños como el canal de transmisión entre la cpu y la memoria del computador(buses).

Pero bueno, la pregunta es como interactúan entre sí dos o más componentes para realizar estos procesos????
Si bien cada dispositivo(hardware) es capaz de funcionar y realizar operaciones de una manera diferente y a intervalos de tiempo variados y propios de cada uno, el kernel del SO debe conocerlos o tener una referencia de como funcionan y la manera en que se planifica su uso.

A esto se conoce como el Sistema de E/S el mismo que proporciona la interfaz de acceso, los controladres de cada dispositivo también conocidos como «drivers» y un control básico para la correcion de errores frecuentes, toda esta información es almacenada y utilizada por el kernel dependiendo de cada dispositivo.

Bien, pero como se transmite la información? Pues cada dispostivo dependiendo de su naturaleza podrá comunicarse, transferir o recibir las señales electrónicas de diversas formas, algunos de ellos(lo más común) utilizan cables, otros circuitos integrados(placas impresas) y los más avanzados tecnología inalambrica.

Cada uno de estos enviará y recibira las señales en lugares conocidos como «puertos» que el SO deberá registrar y manejar dependiendo del dispositivo y la solicitud enviada.

Además, la información(señales) podrá variar en la forma que llega/sale, es decir se diferencian basicamente dos tipos:

Por Bloques: Donde cada ‘bloque’ contiene un tamaño fijo y es etiquetado con una dirección única, para ser administrado, esta transmisión es utilizada mayoritariamente en los dispostivos de almacenamiento como discos y cd.

Por Caracter: La información se recibe o se envia mediante flujos secuenciales de longitud no fija(muy pequeños) es decir, es necesario seguir su orden de llegada/salida para su correcto funcionamiento, uno de los dispositivos más conocidos es el teclado o el mouse.

Además, este sistema de E/S utiliza mecanismos(tanto hardware como software) que permiten que los dispositivos puedan interactuar. Algunos de ellos son:

Interrupciones:
Permiten que el dispositivo emita su estado al S.O ya sea que este listo para recibir/transmitir datos o realizando una operación.

Buffer: Secciones de memoria que permiten almacenar datos mientras son transferidos

Cache: Son secciones de memoria que contienen copias de datos lo que permite mayor velocidad en su acceso.

Todo esto con la ayuda de algoritmos de planificación para el uso de los dispositivos hacen que los sistemas de E/S sean un factor importante, ya que una mala utilización podría provocar perdida no solo de tiempo de procesamiento sino de información que no puediera llegar desde o a los dispositivos.

Saludos,

La Sincronización de Procesos.

Dentro de los Sistemas Operativos los procesos que se ejecutan son muy variados, algunos utilizan la cpu para realizar de lectura de memoria, u otros campos que competen a la aplicación. Y también los mismos pudieran modificar los datos que leen. Pero que sucede si dos o mas procesos tienen que hacer estas operaciones? Es decir por ejemplo el modificar los datos que un proceso esta leyendo.

Pues es aquí en donde el caos podría entrar, pues la información podría ser modificada sin previo aviso o suceder acciones que no estaban planteadas. Para esto se plantea la Sincronización de Procesos.

Esto consiste en utilizar estructuras algorítmicas que permitan implementar el control de los procesos o hilos que se van a ejecutar de acuerdo a condiciones dadas, para que no se produzca situaciones como Bloqueos, Bloqueos mutuos(inanición) o accesos a secciones críticas del programa que no pueden ser accedidas en ese momento.

Para este control los algoritmos emplean sentencias(o pedazos de código) conocidos como semáforos o monitores.

Semáforos.- Se los considera como variables enteras que poseen solo dos métodos a través de los cuales se puede acceder a ellos. Lo que condiciona la entrada a zonas críticas o uso de recursos.

Monitores.- En cambio son estructuras más avanzadas de alto nivel que permiten mayor control que si son empleados correctamente permiten detectar error de temporización conocidos como timing.

Dentro de este ámbito de la Sincronización se han planteado numerosos casos como el de los filósofos comensales, el barbero dormilón y otros muchos más.

A continuación pueden encontrar una solución a un problema conocido como “El problema de los fumadores de cigarrillos” en donde existen 3 fumadores y un agente. Cada fumador continuamente enrolla un cigarro y luego lo fuma. Pero para enrollar y fumar un cigarrillo, el fumador necesita tres ingredientes: tabaco, papel y cerillos. Donde cada fumador tiene un solo elemento. El agente tiene un suministro infinito de los tres materiales. El agente coloca dos de los ingredientes en la mesa. El fumador que tiene el ingrediente restante hace entonces un cigarrillo y lo fuma, indicando al agente que terminó para que nuevamente coloque 2 nuevos elementos y el ciclo se repite.

El enlace para su descarga esta aquí, la aplicación fue desarrolla en Java bajo NetBeans 6.0. A continuación coloco algunas capturas de pantalla de la corrida del programa.

Saludos,

Simulación del Algoritmo SJF

A continuación pongo en consideración una pequeña simulación del algoritmo “primero el trabajo más corto” (shortest – job – first).

La aplicación esta desarrollada en Java bajo el IDE NetBeans 6.0 y permite crear procesos(en realidad son solo objetos no hilos) que ocuparán cada uno un tiempo de ejecución o uso de CPU determinado por el usuario.

Esto funciona de la siguiente manera al establecer cuantos procesos se realizarán el usuario deberá especificar que tiempo tardará cada uno en terminar, para luego la aplicación planifique su ejecución empezando por el más pequeño.

Una vez encontrado el orden exacto cada proceso ocupará el thread(hilo) central de la aplicación haciéndola detener para que nadie pueda ocuparlo mientras él se ejecuta, además cabe recalcar que por ser una demostración se estima el tiempo en segundos(el hacerlo unidades menores no daría mucha idea de lo que sucede). Luego abandonará el control del hilo y pasará al siguiente. Al terminar todos los procesos la aplicación también terminará.

Puedo decir que este algoritmo presenta varias ventajas pues al realizar los procesos con menor tiempo primero el tiempo de espera disminuye considerablemente aunque en una situación real la única dificultad es el cálculo de la ráfaga de CPU que como mencioné en un post anterior es aproximada.

Pueden descargar la aplicación desde  aquí 

Saludos,

Actualización: Si el link de descarga presenta problemas accede desde aquí o desde el widget que se encuentra en la parte izquierda del blog.

ALGORITMOS DE PLANIFICACIÓN EN LA CPU

Planificación FCFS

El algoritmo FCFS(first come – first-served), conocido como primero en llegar, primero en  ser atendido.

Dentro de este campo de planificación es el más sencillo, pues es similar a una cola de estructura (FIFO)

Este algoritmo trabaja de la siguiente manera, al entrar un proceso al estado de “listo”,  el bloque de control de proceso se ubica en el final de la cola, entonces el cpu al estar libre retirará de esta cola el primer elemento(cabeza).

Es decir, en este algoritmo el tiempo de espera par que un proceso se ejecute es incierto y no mínimo. Pudiendo así ejecutarse dentro de la cpu un proceso que consuma demasiado tiempo, atrasando a otros procesos y dejando la cpu sin trabajo por lapsos de tiempo.

En definitiva este algoritmo hace que los procesos pequeños esperen a que un grande abandone la cpu. Una gran desventaja.

Planificación en SJF

El algoritmo “primero el trabajo más corto” (shortest – job – first). Establece para la planificación una relación entre proceso y ráfaga de la CPU. Es decir, al liberarse la cpu ingresará el proceso con la menor ráfaga de tiempo, el más pequeño primero, y si existiera más de un proceso con igual valor, pues se aplicaría dentro de este el algoritmo anterior(FCFS)

Este algoritmo presenta una gran ventaja, pues el tiempo de espera será mucho menor, pues mientras los procesos de tiempo inferior terminan y ocupan tiempo en operaciones de E/S, el cpu se ocupa de resolver el proceso con mayor tiempo, un algoritmo muy óptimo.

Pero, el mayor problema radica en como saber el tiempo de ráfaga para cada proceso???? Pues no existe manera de saber cual será la siguiente. Pero podemos aproximarnos, diciendo que será similar a las anteriores, que mediante una fórmula matemática podríamos decir que:

Tn +1  = a Tn + (1 – a)Tn

De donde Tn es la ráfaga anterior y a es el peso relativo de la historia reciente. Lo que garantiza una aproximación mas considerable.

 

Planificación por Prioridad

Esta clase de algoritmo utiliza como relación entre proceso, tiempo de la cpu y prioridad. De donde el proceso con mayor ráfaga tendrá la menor prioridad y viceversa.

Y donde la cpu podrá ser utilizada por el proceso con mayor prioridad.

Dentro de este algoritmo la prioridad es asignada ya sea interna o externamente. Pero, uno de los problemas que puede presentar esta planificación es la de un bloqueo indefinido. Es decir, pudiera darse el caso que existan procesos de prioridad alta que harían que los procesos de prioridad baja queden bloqueados hasta que logren colocarse en la cpu o perderse cuando nuestro sistema se caiga, es decir una espera indefinida.

Es aquí donde se puede aplicar una técnica conocida como envejecimiento, que ira incrementando la prioridad de los procesos en espera cada determinado tiempo hasta que estos se ejecuten. Y a mi parecer este es una de las mejores soluciones.

 

Planificación con RR

La planificación por turnos o Round Robin, se basa en una estructura FIFO de forma circular, en donde se asigna a los procesos un intervalo de tiempo para la cpu, conocido como quantum. En donde se establece la regla de que un proceso no podrá estar dos veces seguidas en la cpu a menos que sea el único en el estado de listo.

Este algoritmo trabaja de la siguiente manera, al ingresar el proceso a utilizar la cpu, este estará dentro del tiempo(quantum), si al terminar este tiempo el proceso no ha terminado es colocado al final y se ingresará otro proceso. Pero si el proceso pasa ha estado terminado antes de terminar su quantum, también será extraído de la cpu.

En cambio este algoritmo presenta complicaciones pues el tiempo de entrega de un proceso dependerá mucho más del tiempo(quantum) que de la magnitud del proceso.

 

Saludos,

La CPU y los algoritmos de Planificación

La planificación de uso de la CPU, es la base de todo sistema operativo, ya que una planificación correcta permitirá un uso máximo, lo que causaría un rendimiento «optimo».
Pero, como hace un Sistema Operativo para planificar sus procesos???

Partamos pues de que un proceso necesita una cantidad de tiempo para ser realizado(cambiar de estado a terminado), pero como un mismo proceso no puede ocupar la cpu hasta que termine se permitirá a cada proceso un tiempo de uso de cpu, también conocido como «ráfaga de la cpu», y para esto se almacenara toda la información del proceso, (como su estado, tiempo de espera, entre otros) dentro de un «bloque de control del proceso» (PCB) que determinará todo el estado de un proceso.

Pero, como «sabe»(literalmente) el Sistema Operativo que proceso es el correcto  o más necesario para que utilice la cpu???

Pues a decir verdad cada sistema operativo implementa criterios de planificación, basados en algoritmos que intentan que la cpu no este ociosa(en tiempo de espera Ej. E/S)

Entre los criterios que se emplean para la planificación puedo mencionar:

  • Utilización de la CPU.- Tenerla tan ocupada como sea posible. Esto es un 40% en Sistemas ligeros y 90% en sistemas pesados.
  • Rendimiento.- Calculado mediante el número de procesos que es capaz de terminar en una unidad de tiempo.
  • Tiempo de Entrega.- Se considera como el tiempo desde que un proceso inicia hasta que termina.
  • Tiempo de espera.- Lo considero como la suma de periodos de tiempo en la cola de listos.
  • Tiempo de Respuesta.- Es el tiempo que se requiere para que un proceso empiece a responder y no el tiempo para dicha respuesta.

Siguiendo estos criterios, se deduce que lo más deseable es que aumenten los dos primeros puntos(Utilización – rendimiento) y disminuyan todos los demás.

Para conseguir este fin se utilizan algoritmos que distribuyen o planifican procesos, por ahora solo los enunciaré para en un próximo post detallarlos:

  • FCFS
  • SJF
  • Procesos por Prioridad
  • RR

Saludos,