miércoles, 14 de mayo de 2014

Unidad 5








5.2.3 Estructura de directorios
La jerarquía del sistema de ficheros es fundamental para obtener una compresión completa del sistema. 

El concepto más importante a entender es el del directorio raíz, «/». Este directorio es el primero en ser montado en el arranque y contiene el sistema básico necesario para preparar el sistema operativo para su funcionamiento en modo multi-usuario. 

El directorio raíz también contiene puntos de montaje para cualquier otro sistema de ficheros que se pretenda montar.Un punto de montaje es un directorio del que se pueden colgar sistemas de ficheros adicionales en un sistema padre (que suele ser el directorio raíz).

5.2.4 Archivos Compartidos 
Un archivo compartido es una propiedad de un archivo  informático que tiene la característica de poder ser accedido o manipulado por múltiples personas, computadoras, sesiones o programas.

Un grupo de archivos puede compartirse:

• Entre distintas computadoras de una red, con diferentes permisos para cada una de ellas.

• Entre distintas computadoras por internet con programas especiales como los de P2P.

• Entre distintas sesiones de usuarios de un sistema operativo.

• Entre distintos programas que utilizan iguales archivos. Por ejemplo, muchos archivos DLL son compartidos por múltiples aplicaciones.

5.2.5 Rendimiento del Sistema de archivos 
  • Si tienes múltiples particiones, necesitas controlar el porcentaje de espacio utilizado en cada partición montada. 

  • Si, por ejemplo, se agota el espacio de un sistema de ficheros /var independiente, los programas que necesitan poner datos en cola (como por ejemplo, correo y utilidades de impresión), escribir en /var/tmp, pueden fallar. 

  • Si tienes disponible mucho espacio en el sistema de ficheros de root u otra partición, pero la partición asignada con la que estes trabajando se queda sin espacio, no lo sacará de otras particiones.


5.3 SEGURIDAD
Dado que los sistemas de computo se han venido haciendo cada vez más sofisticados en sus aplicaciones, la necesidad de proteger su integridad, también ha crecido. Los aspectos principales de protección en un Sistema Operativo son:

1. Protección de los procesos del sistema contra los procesos de usuario.
2. Protección de los procesos de usuario contra los de otros procesos de usuario.
3. Protección de Memoria.
4. Protección de los dispositivos.


Al hablar de seguridad debemos verificar el correcto funcionamiento de los diferentes niveles de seguridad que constituyen al sistema operativo, como lo muestra la siguiente figura:

5.3.1 Fallas de Seguridad 


5.3.2 Principios de diseño para seguridad
1. Privilegios mínimos. Se les debe conceder únicamente la prioridad necesaria para llevar a cabo su tarea. Este principio permite limitar los daños en casos de ataques maliciosos.

2. Mecanismos económicos. Los mecanismos de protección deberían de ser sencillos, regulares y pequeños. Un sistema así se puede analizar, verificar, probar y diseñar fácilmente.

3. Intermediación completa. Cada intento de acceso al sistema debe ser comprobado, tanto los directos como los indirectos. Si se relaja este principio de diseño de forma que no se comprueben todos los accesos a un objeto, es necesario comprobar los permisos de los usuarios de forma periódica y no sólo cuando se accede al recurso por primera vez.

4. Fácil de usar y aceptable. El esquema de protección debe ser aceptado por los usuarios y fácil de usar. Si un mecanismo es sencillo, y no es desagradable, existen menos posibilidades de que los usuarios traten de evitarlo.

5. Separación de privilegios. Si se quiere diseñar un sistema seguro, los accesos a cada objeto deben depender de más de un mecanismo de protección.

5.3.3 Virus
Existen diversos tipos de virus, varían según su función o la manera en que éste se ejecuta en nuestra computadora alterando la actividad de la misma, entre los más comunes están: 

Para prevenirse contra los virus, es fundamental que mantenga el equipo actualizado y herramientas antivirus más recientes, que esté informado acerca de las últimas amenazas y que siga unas reglas básicas cuando explore la Web, descargue archivos o abra archivos adjuntos.

5.3.4 Mecanismos de Protección
Contamos con 5 niveles de protección para un sistema informático:

5.4 EJEMPLOS DE SISTEMAS DE ARCHIVOS
Un sistema de archivos es el componente del sistema operativo encargado de administrar y facilitar el uso de las memorias secundarias (discos duros) o terciarias (almacenamiento en red).

Sus principales funciones son la asignación de espacio a los archivos, la administración del espacio libre y la administración del acceso a los datos guardados.


Trabajan de manera que estructuran la información guardada en una unidad de almacenamiento (normalmente un disco duro), que luego será representada ya sea textual o gráficamente utilizando un gestor de archivos.

Aquí tenemos el ejemplo de una 'ruta' en un sistema de archivos de Windows:
C:\Users\Oscar\Music\canción.mp3

Donde:
'C:' es la unidad de almacenamiento en la que se encuentra el archivo.
'\Users\Oscar\Music\' es la ruta del archivo.
'canción' es el nombre del archivo.
'.mp3' es la extensión del archivo y sirve para identificar qué tipo de archivo es y la aplicación que está asociada con el archivo en cuestión, es decir, con qué programa se puede editar o reproducir el archivo.

5.4.1 CP/M
Su funcionalidad en cuanto a los sistemas de archivos se refiere era de la siguiente manera:
·       
            Los nombres de archivo se especificaban como una cadena de hasta ocho caracteres, seguido de un punto y seguido de una extensión de nombre de archivo de hasta tres caracteres.

En la extensión generalmente se identificaba el tipo de archivo. Por ejemplo: .COM indica un archivo de programa ejecutable binario y .TXT indica un archivo que contiene el texto ASCII.

·        Cada unidad de disco se identificaba mediante una letra de unidad, por ejemplo, la unidad A y la unidad B.
Para hacer referencia a un archivo en una unidad específica, la letra de unidad se antepone al nombre de archivo, separados por dos puntos, por ejemplo A: FILE.TXT.

El tamaño de archivo se especificaba como el número de registros que eran ocupados por el archivo dentro del disco duro.

5.4.2 Ms-DOS
Para leer un archivo, un programa de MS-DOS primero debe realizar una llamada al sistema open para obtener un manejador para el archivo. La llamada al sistema open especifica una ruta, que puede ser absoluta o relativa al directorio de trabajo actual. 

Se realiza una búsqueda de la ruta, componente por componente, hasta que se localiza el directorio final y se lee en la memoria. Después se busca el archivo que se desea abrir.

Mientras que los directorios de MS-DOS tienen tamaños variables y utilizan una entrada de directorio de tamaño fijo de 32 bytes.

El formato de una entrada de directorio de MS-DOS se muestra en la siguiente figura:

5.4.3 Win 98
Al ser la versión mejorada y sucesora de Ms-DOS el funcionamiento en el sistema de archivos es muy parecido a su antecesor, solamente que se añaden 5 secciones más en donde solía estar el espacio reservado en el formato de directorios:

5.4. 4 Unix V7
Una entrada de directorio de UNIX contiene una entrada para cada archivo en ese directorio.

       Nombres de archivos hasta con 14 caracteres y pueden contener cualquier carácter ASCII excepto “/” (separador entre los componentes en una ruta) y “NUL” (se utiliza para rellenar los nombres menores de 14 caracteres). NUL tiene el valor numérico de 0.

       Una entrada de directorio sólo contiene dos campos: el nombre del archivo (14 bytes) y el número del nodo-i para ese archivo (2 bytes). 

Estos parámetros limitan el número de archivos por cada sistema de archivos a 64 K.

Unidad 4

4.1 Dispositivos de entrada y salida
 Los dispositivos de entrada y salida básicamente están contempladas en dos categorías: dispositivos de bloque y dispositivos de carácter

Dispositivo de bloque: almacena información en bloques de tamaño fijo, cada uno con su propia dirección. Los tamaños de bloque comunes varían desde 512 bytes hasta 32,768 bytes. Todas las transferencias se realizan en unidades de uno o más bloques completos (consecutivos). La propiedad esencial de un dispositivo de bloque es que es posible leer o escribir cada bloque de manera independiente de los demás. Los discos duros, CD-ROMs y memorias USBs son dispositivos de bloque comunes. Cabe recalcar que los dispositivos de bloque que no está bien definido el límite entre estos mismos













Dispositivo de carácter: Un dispositivo de carácter envía o acepta un flujo de caracteres, sin importar la estructura del bloque. No es direccionable y no tiene ninguna operación de búsqueda. Las impresoras, las interfaces de red, los ratones (para señalar)y la mayoría de los demás dispositivos que no son parecidos al disco se pueden considerar como dispo
sitivos de carácter.


4.1.1 Interrupción del CPU
En un sistema de computadora personal común, la estructura de las interrupciones es como se muestra en la siguiente figura.
4.1.2 Definición y manejo de interrupciones.
Funcionamiento de las interrupciones a nivel de hardware
Cuando un dispositivo de E/S ha terminado el trabajo que se le asignó, produce una interrupción (suponiendo que el sistema operativo haya habilitado las interrupciones). Para ello, impone una señal en una línea de bus que se le haya asignado. Esta señal es detectada por el chip controlador de interrupciones en la tarjeta principal, que después decide lo que debe hacer.
Si no hay otras interrupciones pendientes, el controlador de interrupciones procesa la interrupción de inmediato. Si hay otra en progreso, o si otro dispositivo ha realizado una petición simultánea en una línea de petición de interrupción de mayor prioridad en el bus, el dispositivo sólo se ignora por el momento. En este caso, continúa imponiendo una señal de interrupción en el bus hasta que la CPU la atiende. Para manejar la interrupción, el controlador coloca un número en las líneas de dirección que especifican cuál dispositivo desea atención e impone una señal para interrumpir a la CPU. La señal de interrupción hace que la CPU deje lo que está haciendo y empiece a hacer otra cosa.

4.1.3 E/S programada.
Es la forma más simple de E/S es cuando la CPU hace todo el trabajo. Por ejemplo. Considere un proceso de usuario que desea imprimir la cadena de ocho caracteres “ABCDEFGH” en la impresora. Primero ensambla la cadena en un búfer en espacio de usuario, como se muestra en la figura :
Después el proceso de usuario adquiere la impresora para escribir, haciendo una llamada al sistema para abrirla. Si la impresora está actualmente siendo utilizada por otro proceso, esta llamada fallará y devolverá un código de error o se bloqueará hasta que la impresora esté disponible, dependiendo del sistema operativo y los parámetros de la llamada. Una vez que obtiene la impresora, el proceso de usuario hace una llamada al sistema para indicar al sistema operativo que imprima la cadena en la impresora.
Después, el sistema operativo por lo general copia el búfer con la cadena a un arreglo, por ejemplo, p en espacio de kernel, donde se puede utilizar con más facilidad (debido a que el kernel tal vez tenga que modificar el mapa de memoria para tener acceso al espacio de usuario). Después comprueba si la impresora está disponible en ese momento. Si no lo está, espera hasta que lo esté. Tan pronto como la impresora está disponible, el sistema operativo copia el primer carácter al registro de datos de la impresora, en este ejemplo mediante el uso de E/S por asignación de memoria.Esta acción activa la impresora. Mostrando lo siguiente:

Tan pronto como copia el primer carácter a la impresora, el sistema operativo comprueba si la impresora está lista para aceptar otro. En general la impresora tiene un segundo registro, que proporciona su estado. El acto de escribir en el registro de datos hace que el estado se convierta en “no está lista”. Cuando el controlador de la impresora ha procesado el carácter actual, indica su disponibilidad estableciendo cierto bit en su registro de estado, o colocando algún valor en él.
En este punto el sistema operativo espera a que la impresora vuelva a estar lista. Cuando eso ocurre, imprime el siguiente carácter, como se muestra:
Este ciclo continúa hasta que se ha impreso toda la cadena. Después el control regresa al proceso de usuario
La E/S programada es simple, pero tiene la desventaja de ocupar la CPU tiempo completo hasta que se completen todas las operaciones de E/S. Si el tiempo para “imprimir” un carácter es muy corto (debido a que todo lo que hace la impresora es copiar el nuevo carácter a un búfer interno), entonces está bien usar ocupado en espera. Además, en un sistema incrustado o embebido, donde la CPU no tiene nada más que hacer, ocupado en espera es razonable. Sin embargo, en sistemas más complejos en donde la CPU tiene otros trabajos que realizar, ocupado en espera es ineficiente. Se necesita un mejor método de E/S.

4.1.4 E/S controlada por interrupciones

Ahora vamos a considerar el caso de imprimir en una impresora que no coloca los caracteres en un
búfer, sino que imprime cada uno a medida que va llegando. Si la impresora puede imprimir (por
ejemplo,) 100 caracteres/seg, cada carácter requiere 10 mseg para imprimirse. Esto significa que
después de escribir cada carácter en el registro de datos de la impresora, la CPU estará en un ciclo
de inactividad durante 10 mseg, esperando a que se le permita imprimir el siguiente carácter. Este
tiempo es más que suficiente para realizar un cambio de contexto y ejecutar algún otro proceso durante
los 10 mseg que, de otra manera, se desperdiciarían.
La forma de permitir que la CPU haga algo más mientras espera a que la impresora esté lista es
utilizar interrupciones. Cuando se realiza la llamada al sistema para imprimir la cadena, el búfer se
copia en espacio de kernel (como vimos antes) y el primer carácter se copia a la impresora, tan pronto
como esté dispuesta para aceptar un carácter. En ese momento, la CPU llama al planificador y se
ejecuta algún otro proceso. El proceso que pidió imprimir la cadena se bloquea hasta que se haya impreso
toda la cadena.
Cuando la impresora ha impreso el carácter, y está preparada para aceptar el siguiente, genera
una interrupción. Esta interrupción detiene el proceso actual y guarda su estado. Después se ejecuta
el procedimiento de servicio de interrupciones de la impresora.Si no hay más caracteres por imprimir, el manejador de interrupciones realiza cierta acción para desbloquear al usuario. En caso contrario, imprime el siguiente carácter, reconoce la interrupción y regresa al proceso que se estaba ejecutando justo antes de la interrupción, que
continúa desde donde se quedó.

4.1.5 Clasificacion
Interrupciones precisas e imprecisas

Interrupciones precisa:
Una interrupción que deja al equipo en un estado bien definido se conoce como interrupción
precisa (Walker y Cragon, 1995). Dicha interrupción tiene cuatro propiedades:
1. El contador del programa (PC) se guarda en un lugar conocido.
2. Todas las instrucciones antes de la instrucción a la que apunta el PC se han ejecutado por
completo.
3. Ninguna instrucción más allá de la instrucción a la que apunta el PC se ha ejecutado.
4. Se conoce el estado de ejecución de la instrucción a la que apunta el PC.

Interrupciones  imprecisa
Una interrupción que no cumple con los requerimientos anteriores se conoce como interrupción imprecisa


4.1.6 Manejador de interrupciones.
Deben ocultarse en la profundidad de las entrañas del sistema operativo, de manera que éste sepa lo menos posible de ellas.
La mejor manera de ocultarlas es hacer que el controlador que inicia una operación de E/S se bloquee
hasta que se haya completado la E/S y ocurra la interrupción.
a continuación tal vez no sean necesarios en una máquina específica, y tal vez se requieran otros
que no estén listados. Además, los pasos que se llevan a cabo pueden estar en distinto orden en algunas
máquinas.
1. Guardar los registros (incluyendo el PSW) que no han sido guardados por el hardware de
la interrupción.
2. Establecer un contexto para el procedimiento de servicio de interrupciones. Para ello tal
vez sea necesario establecer el TLB, la MMU y una tabla de páginas.
3. Establecer una pila para el procedimiento de servicio de interrupciones.
4. Reconocer el controlador de interrupciones. Si no hay un controlador de interrupciones
centralizado, rehabilitar las interrupciones.
5. Copiar los registros desde donde se guardaron (posiblemente en alguna pila) a la tabla de
procesos.
6. Ejecutar el procedimiento de servicio de interrupciones. Éste extraerá información de los
registros del controlador de dispositivos que provocó la interrupción.
7. Elegir cuál proceso ejecutar a continuación. Si la interrupción ha ocasionado que cierto
proceso de alta prioridad que estaba bloqueado cambie al estado listo, puede elegirse para
ejecutarlo en ese momento.
8. Establecer el contexto de la MMU para el proceso que se va a ejecutar a continuación.
También puede ser necesario establecer un TLB.
9. Cargar los registros del nuevo proceso, incluyendo su PSW.
10. Empezar a ejecutar el nuevo proceso.

Como se puede ver, el procesamiento de interrupciones no carece de importancia. También ocupa
un considerable número de instrucciones de la CPU, en especial en máquinas en las que hay memoria
virtual y es necesario establecer tablas de páginas, o se tiene que guardar el estado de la
MMU (por ejemplo, los bits R y M). En algunas máquinas, el TLB y la caché de la CPU tal vez
también tengan que manejarse al cambiar entre los modos de usuario y de kernel, lo cual requiere
ciclos de máquina adicionales.

4.1.7 Vector de interrupciones
El vector de interrupciones es un vector que contiene el valor que apunta a la dirección en memoria del gestor de una interrupción. En muchas arquitecturas de computación típicas, los vectores de interrupción se almacenan en una tabla en una zona de memoria, la llamada tabla de vectores de interrupción, de modo que cuando se atiende una petición de interrupción de número n, el sistema, tras realizar eventualmente algunas tareas previas (tales como salvar el valor de ciertos registros) transfiere el control a la dirección indicada por el elemento n-ésimo de dicha tabla.
Usualmente, en las arquitecturas más típicas, la transferencia de control se efectuará de modo análogo a una llamada a función a nivel de máquina, almacenándose en una pila el estado actual del registro contador de programa, que será recuperado por una instrucción máquina de retorno de interrupción, que restaurará el estado correspondiente a la ejecución normal de programa forzando la ejecución de la siguiente instrucción.

4.2  Canales de E/S

Los dispositivos de E/S son cada vez más sofisticados
• Ej: tarjetas gráficas 3D.
• Evolución:
1. La CPU controla directamente los periféricos.
2. Se agrega un módulo de E/S o controlador.
3. Idem 2 más llamado de interrupción.
4. El módulo de E/S provee el acceso directo a memoria (DMA).
5. El módulo de E/S tiene su propio procesador con su pequeño
conjunto de instrucciones.
6. El módulo además tiene su memoria local o sea se convierte
en una computadora en sí mismo.


4.2.1 Tipos de canales de E/S
Selector
• Controla varios dispositivos de alta velocidad y uno
por vez, por lo tanto el canal se dedica para la
transferencia de datos de ese dispositivo.
• El canal selecciona un dispositivo y efectúa la
transferencia.
• Los dispositivos son manejados por un controlador o
módulo de E/S
• Por lo tanto el canal de E/S ocupa el lugar de la CPU
en el control de esos controladores.


Multiplexor
• Puede manejar E/S con varios dispositivos a la vez.
• Multiplexor de bytes:
• Acepta y transmite caracteres.
• Multiplexor de bloques:
• Intercala bloques de datos desde distintos dispositivos.


4.2.2 Interfaces.
La interfaz externa
• Provista para un periférico desde un módulo de E/S.
• ¿Serial ó paralelo?
• Paralela: tape, disco (dispositivo de alta velocidad).
• Serial: terminales, mouse.
• Existe un módulo que dialoga con el dispositivo. Los
pasos son:
• El módulo envía señal de control pidiendo permiso para enviar
datos al dispositivo.
• Este confirma el pedido.
• El módulo transfiere los datos.
• El periférico confirma la recepción de los mismos.
• Uso de buffers internos en el módulo para compensación
de velocidades.

Tipos de interfaces
• La conexión entre un módulo de E/S y los
dispositivos externos puede ser:
• Punto a punto: línea dedicada.
• Ej: teclado, impresora, modem ...etc.
• Multipunto: idem a un bus externo.
• Ej: dispositivos de almacenamiento en masa externos (discos
SCSI).
4.2.3 Controladores
Por lo general, las unidades de E/S consisten en un componente mecánico y un componente elec-
trónico. A menudo es posible separar las dos porciones para proveer un diseño más modular y ge-
neral. El componente electrónico se llama
controlador de dispositivo
o adaptador. En las computadoras personales, comúnmente tiene la forma de un chip en la tarjeta principal o una tarje-
ta de circuito integrado que se puede insertar en una ranura de expansión (PCI). El componente me-
cánico es el dispositivo en sí.
La tarjeta controladora por lo general contiene un conector, en el que se puede conectar
un cable que conduce al dispositivo en sí. Muchos controladores pueden manejar dos, cuatro o
inclusive ocho dispositivos idénticos. Si la interfaz entre el controlador y el dispositivo es están-
dar, ya sea un estándar oficial ANSI, IEEE o ISO, o un estándar de facto
a interfaz entre el controlador y el dispositivo es a menudo de muy bajo nivel. Por ejemplo,
se podría dar formato a un disco con 10,000 sectores de 512 bytes por pista. Sin embargo, lo que
en realidad sale del disco es un flujo serial de bits, empezando con un
preámbulo , después los 4096 bits en un sector y por último una suma de comprobación, también conocida como
Código de Corrección de Errores (ECC). El preámbulo se escribe cuando se da formato al disco y contiene el cilindro y número de sector, el tamaño del sector y datos similares, así como información de sin-
cronización.
El trabajo del controlador es convertir el flujo de bits serial en un bloque de bytes y realizar
cualquier corrección de errores necesaria. Por lo general, primero se ensambla el bloque de by-
tes, bit por bit, en un búfer dentro del controlador. Después de haber verificado su suma de com-
probación y de que el bloque se haya declarado libre de errores, puede copiarse a la memoria
principal.
El controlador para un monitor también funciona como un dispositivo de bits en serie a un ni-
vel igual de bajo. Lee los bytes que contienen los caracteres a mostrar de la memoria y genera las
señales utilizadas para modular el haz del CRT para hacer que escriba en la pantalla. El controlador
también genera las señales para que el haz del CRT realice un retrazado horizontal después de ha-
ber terminado una línea de exploración, así como las señales para hacer que realice un retrazado
vertical después de haber explorado toda la pantalla. Si no fuera por el controlador del CRT, el pro-
gramador del sistema operativo tendría que programar de manera explícita la exploración análoga
del tubo. Con el controlador, el sistema operativo inicializa el controlador con unos cuantos pará-
metros, como el número de caracteres o píxeles por línea y el número de líneas por pantalla, y de-
ja que el controlador se encargue de manejar el haz. Las pantallas TFT planas funcionan de manera
diferente, pero son igualmente complicadas


4.3 MEMORIAS TRASITORIAS (BUFFERS)

Los buffers son áreas de almacenamiento temporal que residen en la memoria principal, en los canales y en las unidades de control. Sirven para almacenar datos leídos de un dispositivo de entrada antes que los necesite el procesador y para almacenar datos que se escribirán en un dispositivo de salida.

4.3.1 TIPOS DE MEMORIAS TRANSITORIAS

Buffers de una única fila

Un buffer de una única fila no es en realidad un cursor, aunque aquí se apliquen las mismas reglas de pertenencia que se aplican a un cursor de conjunto de claves de sólo avance. Con un buffer de una única fila sólo es posible examinar los datos de la fila del conjunto de resultados. Las filas anteriores no están disponibles y la fila actual no estará accesible después de pasar a la siguiente fila del conjunto de resultados.

Buffers de n filas

Un buffer de n filas amplía el ámbito y la capacidad de desplazamiento del buffer de una única fila. En este caso, a la estación de trabajo se le expone un número determinado de filas del conjunto de resultados y a la aplicación se le permite que se desplace libremente por esas filas.

4.3.2 MANEJO DE MEMORIAS TRANSITORIAS

El uso de búferes también es un problema, tanto para los dispositivos de caracteres como para los de bloques. Para entender mejor el problema, consideremos un proceso que quiere leer datos de un módem, una posible estrategia para manejar los caracteres que llegan es hacer que el proceso de usuario emita una llamada al sistema read y se bloquee en espera de un carácter. La llegada de cada carácter causa una interrupción, el procedimiento de servicio de interrupciones entrega el carácter al proceso de usuario y lo desbloquea; después de colocar el carácter en algún lado, el proceso lee otro carácter y vuelve a bloquearse. Esta posible solución no es recomendable debido a que un proceso se ejecutara muchas veces durante lapsos de tiempo muy cortos.
Los búferes son muy importantes en las operaciones de salida. Por ejemplo, considere la forma en que se envían salidas al módem siguiendo el modelo descrito anteriormente, el proceso de usuario ejecuta una llamada write al sistema para enviar a la salida n caracteres.

4.3.3 IMPLEMENTACION

La implementación mas adecuada para el uso de memorias transitorias es que el kernel copie los datos en un búfer kernel y desbloqueando de inmediato el invocador. Ahora no importa cuando termine la E/S real; el usuario podrá volver a utilizar el búfer en el instante en que se le desbloquee.
El uso de búferes es una técnica ampliamente utilizada, pero tiene sus desventajas, si los datos se colocan en demasiados búferes sucesivos, hay una merma en el desempeño.

4.3.4 TERMINALES DE RED

Se denominan dispositivos de comunicación y son aquellos que permiten conectar a la computadora con otras a través de una red, los dos tipos de dispositivos mas importantes son: Tarjeta red y el módem.
El administrador de red proporciona una forma conveniente para los usuarios de compartir recursos y al mismo tiempo controlar sus acceso a los mismos, mediante la implementación de protocolos y comunicaciones de red; estos recursos incluyen hardware como la CPU, áreas de memoria, impresoras, unidades de almacenamiento secundario, módem; y recursos de software como compiladores, programas de aplicación y archivos de datos.

4.3.5 INTERFACES GRAFICAS DE USUARIO

Una interfaz gráfica de usuario, definida por sus siglas en inglés GUI, es la interfaz de usuario que le permite activar los comandos de sistema operativo con un clic sobre un icono de escritorio mediante un dispositivo apuntador como un ratón o una pantalla táctil. El GUI evolucionó a partir de las interfaces de usuario impulsadas por comandos.
Muchas interfaces gráficas de usuario comparten muchas similitudes, tanto en apariencia como en operación. Ejemplo de ello, se puede mencionar a sistemas operativos populares como Windows (todas sus versiones hasta las actuales), UNIX, Macintosh (diferentes versiones) y Linux.

4.4 SERVICIOS DE E/S: GENERICOS PARA POSIX Y WIN32

Debido al tratamiento diferenciado que se da el reloj, se presentan separadamente los servicios relacionados con el mismo de los correspondientes a los dispositivos de entrada/salida convencionales.
En cuanto a los servicios del reloj, se van a especificar de acuerdo a las tres categorías: fecha y hora, temporizaciones y contabilidad.

SERVICIO DE FECHA Y HORA: El servicio para obtener fecha y hora es time, y su prototipo es:
time_t time(time_t *t);

SERVICIO DE TEMPORIZACION: El servicio esta definido por alarm, y su prototipo es:
unsigned int alarm (unsigned int segundos);

SERVICIO DE CONTABILIDAD: Existen diversas funciones que se pueden englobar en esta categoria, por ejemplo la mas usada times, que devuelve información sobre el tiempo de ejecución de un proceso y sus hijos.
clock_t times (struct tms *info);



Tercer exposicion



Segunda exposicion



Primer exposicion

viernes, 7 de febrero de 2014

EXPO INOVACION TECNOLOGICA EN MEXICO



REFLEXION DE COMO INFLUYEN Y SU IMPORTANCIA DE LOS SISTEMAS OPERATIVOS EN LA ACTUALIDAD 

Desde hace unos años hasta la presente fecha, se ha dado una evolución en los sistemas operativos de las computadoras personales, sin embargo la mecánica de su funcionalidad no ha cambiado demasiado, esto se debe a que las empresas de cada sistema operativo se han encargado de hacer mejorías sobre sí mismos para satisfacer las demandas de los usuarios. Sin embargo, se pueden notar ciertos aspectos que han marcado cierta diferencia con los avances de tecnologías, porque las computadoras personales de estos tiempos realizan más tareas y funciones que hace 10 años Su importancia es para establecer o estructurar un conjunto de mensajes que activan entradas y salidas claves del centro de mando del ROM. Por dar un ejemplo sencillo, es como decirle un código para que el CPU nos diga la cantidad de memoria que está vacía. Entonces nos enviará una gráfica de pastes ilustrando % de memoria llena y % de memoria vacía. Así el programador estará haciendo un diagnóstico rápido y podrá hacer las correcciones y modificaciones necesarias para calibrar y actualizar la unidad completa.

CONFERENCIA


More PowerPoint presentations from Manuel

jueves, 6 de febrero de 2014

JUSTIFICACIÓN S.O. DE PROYECTO

EVOLUCIÓN DE UN SISTEMA OPERATIVO


HISTORIA DE LOS SISTEMAS OPERATIVOS
Los sistemas operativos han estado evolucionando durante muchos años. En las siguientes secciones examinaremos brevemente este desarrollo. Dado que, históricamente, los sistemas operativos han estado de manera muy estrecha vinculados con la arquitectura de las computadoras en las que se ejecutan, estudiaremos las sucesivas generaciones de computadoras para ver qué clase de sistemas operativos usaban. Esta correspondencia entre las generaciones de sistemas operativos y de computadoras es algo burda, pero establece un poco de estructura que de otra forma sería inexistente. La primera computadora digital verdadera fue diseñada por el matemático inglés Charles Babbage (1792- 1871). Aunque Babbage invirtió la mayor parte de su vida y su fortuna tratando de construir su “máquina analítica”, nunca logró que funcionara correctamente porque era totalmente mecánica, y la tecnología de su época no podía producir las ruedas, engranes y levas con la elevada precisión que él requería. Huelga decir que la máquina analítica no contaba con un sistema operativo. Como acotación histórica interesante, diremos que Babbage se dio cuenta de que necesitaría software para su máquina analítica, así que contrató a una joven mujer, Ada Lovelace, hija del famoso poeta británico, Lord Byron, como la primera programadora de la historia. El lenguaje de programación Ada® recibió sunombre en honor a ella.
La primera generación (1945-55): Tubos de vacío y tableros de conmutación
Después del fracaso de los trabajos de Babbage, fueron pocos los avances que se lograron en la construcción de computadoras digitales hasta la Segunda Guerra Mundial. A mediados de la década de 1940, Howard Aiken en Harvard, John von Neumann en el Institute for Advanced Study en Princeton, J. Presper Eckert y William Mauchley en la University of Pennsylvania y Konrad Zuse en Alemania, entre otros, lograron construir máquinas calculadoras usando tubos de vacío. Estas máquinas eran enormes, y ocupaban cuartos enteros con decenas de miles de tubos de vacío, pero eran mucho más lentas que incluso las computadoras personales más baratas de la actualidad. En esos primeros días, un solo grupo de personas diseñaba, construía, programaba, operaba y mantenía a cada máquina. Toda la programación se realizaba en lenguaje de máquina absoluto, a menudo alambrando tableros de conmutación para controlar las funciones básicas de la máquina. No existían los lenguajes de programación (ni siquiera los de ensamblador). Nadie había oído hablar de los sistemas operativos. La forma de operación usual consistía en que el programador se anotaba para recibir un bloque de tiempo en la hoja de reservaciones colgada en la pared, luego bajaba al cuarto de la máquina, insertaba su tablero de conmutación en la computadora, y pasaba las siguientes horas con la esperanza de que ninguno de los cerca de 20000 tubos de vacío se quemara durante la sesión. Prácticamente todos los problemas eran cálculos numéricos directos, como la producción de tablas de senos y cosenos.
A principios de la década de 1950, la rutina había mejorado un poco con la introducción de las tarjetas perforadas. Ahora era posible escribir programas en tarjetas e introducirlas para ser leídas, en lugar de usar tableros de conmutación; por lo demás, el procedimiento era el mismo.
 La segunda generación (1955-65): Transistores y sistemas por lote
La introducción del transistor a mediados de la década de 1950 alteró el panorama radicalmente. Las computadoras se hicieron lo bastante confiables como para poderse fabricar y vender a clientes comerciales con la expectativa de que seguirían funcionando el tiempo suficiente para realizar algo de trabajo útil. Por primera vez, había una separación clara entre diseñadores, constructores, operadores, programadores y personal de mantenimiento.
Estas máquinas se encerraban en cuartos de computadora con acondicionamiento de aire especial, con equipos de operadores profesionales para operarlas. Sólo las grandes empresas, o las principales dependencias del gobierno o universidades, podían solventar el costo de muchos millones de dólares. Para ejecutar un trabajo(es decir, un programa o serie de programas), un programador escribía primero el programa en papel (en FORTRAN o ensamblador) y luego lo perforaba en tarjetas. Después, llevaba el grupo de tarjetas al cuarto de entrada y lo entregaba a uno de los operadores. Cuando la computadora terminaba el trabajo que estaba ejecutando en ese momento, un operador acudía a la impresora, separaba la salida impresa y la llevaba al cuarto de salida donde el programador podía recogerla después. Luego, el operador tomaba uno de los grupos de tarjetas traídos del cuarto de entrada y lo introducía en el lector. Si se requería el compilador de FORTRAN, el operador tenía que traerlo de un archivero e introducirlo en el lector. Gran parte del tiempo de computadora se desperdiciaba mientras los operadores iban de un lugar a otro, en el cuarto de la máquina. Dado el alto costo del equipo, no es sorprendente que la gente pronto buscara formas de reducir el desperdicio de tiempo. La solución que se adoptó generalmente fue el  sistema por lotes. El principio de este modo de operación consistía en juntar una serie de trabajos en el cuarto de entrada, leerlos y grabarlos en una cinta magnética usando una computadora pequeña y (relativamente) económica, como una IBM 1401, que era muy buena para leer tarjetas, copiar cintas e imprimir salidas, pero no para realizar cálculos numéricos. Otras máquinas, mucho más costosas, como la IBM 7094, se usaban para la computación
propiamente dicha. Esta situación se muestra en la Fig. 1-2.


Después de cerca de una hora de reunir un lote de trabajos, la cinta se rebobinaba y se llevaba al cuarto de la máquina, donde se montaba en una unidad de cinta. El operador cargaba entonces un programa especial (el antepasado del sistema operativo actual), que leía el primer trabajo de la cinta y lo ejecutaba. La salida se escribía en una segunda cinta, en lugar de imprimirse. Cada vez que terminaba un trabajo, el sistema operativo leía automáticamente el siguiente trabajo de la cinta y comenzaba a ejecutarlo. Una vez que estaba listo todo el lote, el operador desmontaba las cintas de entrada y salida, montaba la cinta de entrada del siguiente lote, y llevaba la cinta de salida a una 1401 para la impresión  fuera de línea (o sea, no conectada a la computadora principal). La estructura de un trabajo de entrada típico se muestra en la Fig. 1-3. El trabajo comenzaba con una tarjeta $JOB, que especificaba el tiempo de ejecución máximo en minutos, el número de cuenta al que se debía cobrar el trabajo, y el nombre del programador. Luego venía una tarjeta $FORTRAN, que ordenaba al sistema operativo leer el compilador de FORTRAN de la cinta de sistema. Esta tarjeta iba seguida del programa por compilar y por una tarjeta $LOAD, que ordenaba al sistema operativo cargar el programa objeto recién compilado. (Los programas compilados a menudo se escribían en cintas temporales y tenían que cargarse explícitamente.) Luego venía la tarjeta $RUN, que ordenaba al sistema operativo ejecutar el programa con los datos que le seguían. Por último, la tarjeta $END marcaba el final del trabajo. Estas tarjetas de control primitivas eran los precursores de los lenguajes de control de trabajos e intérpretes de comandos modernos.



Las computadoras grandes de la segunda generación se usaban primordialmente para cálculos científicos y de ingeniería, como la resolución de ecuaciones diferenciales parciales. Estas máquinas generalmente se programaban en FORTRAN y lenguaje ensamblador. Los sistemas operativos típicos eran FMS (el Fortran Monitor System) e IBSYS, el sistema operativo de IBM para la 7094.
La tercera generación (1965-1980): Circuitos integrados y multiprogramación
A principios de la década de 1960, la mayoría de los fabricantes de computadoras tenían dos líneas de producto distintas y totalmente incompatibles. Por un lado estaban las computadoras científicas a gran escala, orientadas hacia las palabras, como la 7094, que se usaban para cálculos numéricos en ciencias e ingeniería. Por el otro, estaban las computadoras comerciales orientadas hacia los caracteres, como la 1401, que los bancos y las compañías de seguros utilizaban ampliamente para ordenar e imprimir desde cinta.
La creación y mantenimiento de dos líneas de producto totalmente distintas era una situación costosa para los fabricantes. Además, muchos clientes de computadoras nuevas necesitaban inicialmente una máquina pequeña que más adelante les resultaba insuficiente, de modo que querían una máquina más grande que ejecutara todos sus viejos programas, pero más rápidamente.
IBM trató de resolver simultáneamente ambos problemas introduciendo la System/360. La 360 era una serie de máquinas de software compatible que iban desde tamaños comparables a la 1401 hasta computadoras mucho más potentes que la 7094. Las máquinas diferían sólo en el precio y el rendimiento (memoria máxima, velocidad del procesador, número de dispositivos de E/S permitidos, etc.). Puesto que todas las máquinas tenían la misma arquitectura y conjunto de instrucciones, los programas escritos para una máquina podían ejecutarse en todas las demás, al menos en teoría. Además, la 360 estaba diseñada para manejar computación tanto científica como comercial. Así, una sola familia de máquinas podía satisfacer las necesidades de todos los clientes. En años subsecuentes IBM produjo sucesoras comparables a la línea 360, usando tecnología más moderna, conocidas como series 370, 4300, 3080 y 3090. La 360 fue la primera línea importante de computadoras en usar (a pequeña escala) circuitos integrados(IC), ofreciendo así una ventaja de precio/rendimiento considerable respecto a las máquinas de la segunda generación, que se armaban con transistores individuales. Esta línea fue un éxito inmediato, y la idea de una familia de computadoras compatibles pronto fue adoptada por todos los demás fabricantes importantes.
Los descendientes de estas máquinas todavía se emplean en uno que otro centro de cómputo en la actualidad, pero su uso está en rápido declive. La gran ventaja de la idea de “una familia” fue también su gran debilidad. La intención era que todo el software, incluido el sistema operativo, funcionara en todos los modelos. El software tenía que funcionar en sistemas pequeños, que en muchos casos simplemente sustituían a la 1401 para copiar tarjetas en cinta, y en sistemas muy grandes, que con frecuencia sustituían a las 7094 para realizar pronósticos del tiempo y otros trabajos de computación pesada. El software tenía que ser bueno en sistemas con pocos y con muchos periféricos; tenía que funcionar en entornos comerciales y. científicos y, sobre todo, tenía que ser eficiente para todos estos usos distintos.
Era imposible que IBM (o alguien más) pudiera escribir un programa que satisficiera todos esos requisitos opuestos. El resultado fue un sistema operativo enorme, extraordinariamente complejo, tal vez dos o tres órdenes de magnitud mayor que FMS. Este sistema consistía en millones de líneas de lenguaje ensamblador escrito por miles de programadores, y contenía miles y miles de errores, requiriéndose un flujo continuo de nuevas versiones en un intento por corregirlos. Cada versión nueva corregía algunos errores e introducía otros nuevos, de modo que es probable que el número de errores se mantuviera constante con el tiempo.
Uno de los diseñadores de OS/360, Fred Brooks, escribió después un ingenioso e incisivo libro (Brooks, 1975) describiendo sus experiencias con el OS/360. Aunque sería imposible resumir aquí ese libro, baste con decir que la portada muestra una manada de bestias prehistóricas atascadas en un foso de brea. La portada del libro de Silberschatz y Galvin (1994) es una alusión similar.
A pesar de su enorme tamaño y de sus problemas, OS/360 y los sistemas operativos de tercera generación parecidos a él producidos por otros fabricantes de computadoras lograron satisfacer a sus clientes en un grado razonable, y también popularizaron varias técnicas clave que no existían en los sistemas operativos de la segunda generación. Tal vez la más importante de ellas haya sido la  multiprogramación. En la 7094, cuando el trabajo actual hacía una pausa para esperar que se completara una operación de cinta u otra operación de E/S, la CPU simplemente permanecía ociosa hasta que la E/S terminaba. En los cálculos científicos, con gran uso de CPU, la E/S es poco frecuente, así que el tiempo desperdiciado no es significativo. En el procesamiento de datos comerciales, el tiempo de espera por E/S puede ser el 80 o 90% del tiempo total, de modo que algo debía hacerse para evitar que la CPU estuviera ociosa tanto tiempo.
La solución a la que se llegó fue dividir la memoria en varias secciones, con un trabajo distinto en cada partición, como se muestra en la Fig. 1-4. Mientras un trabajo estaba esperando que terminara su E/S, otro podía estar usando la CPU. Si se podían tener en la memoria principal suficientes trabajos a la vez, la CPU podía mantenerse ocupada casi todo el tiempo. Tener múltiples trabajos en la memoria a la vez requiere hardware especial para proteger cada trabajo contra espionaje por parte de los demás, pero la 360 y otros sistemas de tercera generación estaban equipados con este hardware.


Otra característica importante presente en los sistemas operativos de la tercera generación era la capacidad de leer trabajos de las tarjetas al disco tan pronto como se llevaban al cuarto de computadoras. Luego, cada vez que un trabajo terminaba su ejecución, el sistema operativo podía cargar uno nuevo del disco en la partición que había quedado vacía y ejecutarlo. Esta técnica se llama spooling(de “operación simultánea de periféricos en línea”) y también se usaba para la salida. Con spooling, las 1401 ya no eran necesarias, y desapareció una buena parte del transporte de cintas. Aunque los sistemas operativos de la tercera generación se adaptaban bien a cálculos científicos extensos y sesiones masivas de procesamiento de datos comerciales, seguían siendo básicamente sistemas por lotes.
Muchos programadores añoraban los días de la primera generación cuando tenían toda la máquina para ellos solos durante unas cuantas horas, lo que les permitía depurar sus programas rápidamente. Con los sistemas de la tercera generación, el tiempo entre la presentación de un trabajo y la obtención de las salidas a menudo era de varias horas, y una sola coma mal colocada podía causar el fracaso de una compilación y que el programador desperdiciara medio día.
Este deseo de respuesta rápida preparó el camino para el  tiempo compartido, una variante de la multiprogramación, en la que cada usuario tiene una terminal en línea. En un sistema de tiempo compartido, si 20 usuarios ingresan en el sistema y 17 de ellos están pensando, hablando o tomando café, la CPU puede asignarse por turno a los tres trabajos que requieren servicio. Puesto que las personas que están depurando programas usualmente emiten comandos cortos (p. ej., compilar un procedimiento de cinco páginas) en vez de largos (p. ej., ordenar un archivo de un millón de registros), la computadora puede proporcionar servicio rápido interactivo a varios usuarios y tal vez también trabajar con trabajos de lote grandes en segundo plano cuando la CPU está ociosa. Aunque el primer sistema serio de tiempo compartido (CTSS) fue creado en el M.I.T. en una 7094 especialmente modificada (Corbato et al., 1962), el tiempo compartido no se popularizó realmente hasta que se generalizó el uso del hardware de protección necesario durante la tercera generación.
Después del éxito del sistema CTSS, MIT, Bell Labs y General Electric (por ese entonces un fabricante importante de computadoras) decidieron emprender el desarrollo de un “servicio de computadora” una máquina que diera apoyo a cientos de usuarios de tiempo compartido simultáneos. Su modelo fue el sistema de distribución de electricidad: cuando usted necesita potencia eléctrica, simplemente enchufa una clavija en la pared y, dentro de límites razonables, obtendrá tanta electricidad como necesite. Los diseñadores de este sistema, llamado
MULTICS(servicio de información y computación multiplexado), contemplaban una enorme máquina que proporcionara potencia de cómputo a todos los usuarios de Boston. La idea de que máquinas mucho más potentes que su GE-645 se vendieran como computadoras personales por unos cuantos miles de dólares sólo 30 años después no era sino ciencia ficción en ese entonces.
Para resumir un poco la historia, MULTICS introdujo muchas ideas seminales en la literatura de computación, pero su construcción fue mucho más difícil de lo que nadie había imaginado. Bell Labs abandonó el proyecto, y General Electric dejó el negocio de las computadoras por completo. Finalmente, MULTICS funcionó lo bastante bien como para usarse en un entorno de producción de MIT y en docenas de otros sitios, pero el concepto de un servicio de computadora se hizo obsoleto al desplomarse los precios de las computadoras. No obstante, MULTICS tuvo una influencia enorme sobre los sistemas subsecuentes; se le describe en (Corbato et al., 1972; Corbato y Vyssotsky, 1965; Daley y Dennis, 1968; Organick, 1972; Saltzer, 1974).
Otro avance importante durante la tercera generación fue el crecimiento fenomenal de las minicomputadoras, comenzando con la DEC PDP- 1 en 1961. La PDP-1 sólo tenía 4K de palabras de 18 bits, pero a $120 000 por máquina (menos del 5% del precio de una 7094), se vendieron como pan caliente. Para ciertos tipos de trabajos no numéricos, la PDP-1 era casi tan rápida como la 7094, e hizo nacer una industria totalmente nueva. A esta máquina pronto siguió una serie de otras PDP (todas incompatibles, a diferencia de la familia IBM), culminando en la PDP-11.
Uno de los computólogos de BelI Labs que había trabajado en el proyecto MULTICS, Ken Thompson, encontró subsecuentemente una pequeña minicomputadora PDP-7 que nadie estaba usando y se propuso escribir una versión de MULTICS reducida al mínimo, para un solo usuario. Este trabajo posteriormente evolucionó para convertirse en el sistema operativo
UNIX®, que se popularizó en el mundo académico, las dependencias del gobierno y muchas compañías.
La historia de UNIX se cuenta en otras obras (p. ej., Salus, 1994). Baste con decir que, dado que casi todo mundo podía obtener el código fuente, diversas organizaciones desarrollaron sus propias versiones (incompatibles), lo que condujo al caos. Con objeto de que fuera posible escribir programas susceptibles de ejecución en cualquier sistema UNIX, el IEEE creó un estándar para UNIX, llamado  Posix, que casi todas las versiones actuales de UNIX reconocen. POSIX define una interfaz mínima de llamadas al sistema que los sistemas UNIX deben reconocer. De hecho, algunos otros sistemas de programación ya reconocen la interfaz POSIX.
La cuarta generación (1980-presente): Computadoras personales
Con la invención de los circuitos integrados a gran escala (LSI), chips que contienen miles de transistores en un cm2 de silicio, nació la era de la computadora personal. En términos de arquitectura, las computadoras personales no eran muy diferentes de las minicomputadoras de la clase PDP-11, pero en términos de precio sí que eran diferentes. Si bien la minicomputadora hacía posible que un departamento de una compañía o universidad tuviera su propia computadora, el chip microprocesador permitía que un solo individuo tuviera su propia computadora personal. Las computadoras personales más potentes empleadas por empresas, universidades e instalaciones del gobierno suelen llamarse  estaciones de trabajo, pero en realidad sólo son computadoras personales grandes. Por lo regular estas máquinas están interconectadas mediante una red.
La amplia disponibilidad de la potencia de cómputo, sobre todo la potencia de cómputo altamente interactiva casi siempre acompañada por excelentes gráficos, dio pie al crecimiento de una importante industria productora de software para computadoras personales. Una buena parte de este software era  amistoso con el usuario, lo que significa que estaba dirigido a usuarios que no sólo no sabían nada de computación, sino que además no tenían la mínima intención de aprender. Sin duda, esto representaba un cambio drástico respecto al OS/360, cuyo lenguaje de control de trabajos, JCL, era tan arcano que llegaron a escribirse libros enteros sobre él (p. ej., Cadow, 1970).
Dos sistemas operativos dominaron inicialmente el campo de las computadoras personales y las estaciones de trabajo: MS-DOS de Microsoft y
UNIX. MS-DOS se usaba ampliamente en la IBM PC y otras máquinas basadas en la CPU Intel 8088 y sus sucesoras, la 80286, 80386 y 80486 (que en adelante llamaremos la 286, 386 y 486, respectivamente) y más tarde la Pentium y Pentium Pro. Aunque la versión inicial de MS-
DOS era relativamente primitiva, versiones subsecuentes han incluido características más avanzadas, muchas de ellas tomadas de UNIX. El sucesor de Microsoft para MS-DOS, WINDOWS, originalmente se ejecutaba encima de MS-DOS (es decir, era más un shell que un verdadero sistema operativo), pero a partir de 1995 se produjo una versión autosuficiente de WINDOWS,
WINDOWS 95 ®, de modo que ya no se necesita MS-DOS para apoyarlo. Otro sistema operativo de Microsoft es
WINDOWS NT, que es compatible con WINDOWS 95 en cierto nivel, pero internamente se reescribió desde cero.
El otro competidor importante es UNIX, que domina en las estaciones de trabajo y otras computadoras del extremo alto, como los servidores de red. UNIX es popular sobre todo en máquinas basadas en chips RISC de alto rendimiento. Estas máquinas por lo regular tienen la potencia de cómputo de una minicomputadora, a pesar de estar dedicadas a un solo usuario, por lo que resulta lógico que estén equipadas con un sistema operativo diseñado originalmente para minicomputadoras, a saber, UNIX. Una tendencia interesante que apareció a mediados de la década de 1980 fue el crecimiento de redes de computadoras personales en las que se ejecutan  sistemas operativos de red o sistemas operativos distribuidos (Tanenbaum, 1995). En un sistema operativo de red los usuarios están conscientes de la existencia de múltiples computadoras y pueden ingresar en máquinas remotas y copiar archivos de una máquina a otra. Cada máquina ejecuta su propio sistema operativo local y tiene su propio usuario o usuarios locales.
Los  sistemas operativos de red no son fundamentalmente distintos de aquellos para un solo procesador.
Obviamente, estos sistemas necesitan un controlador de la interfaz con la red y software de bajo nivel para operarlo, así como programas para realizar inicios de sesión remotos y acceso a archivos remotos, pero estas adiciones no alteran la estructura esencial del sistema operativo.
Un sistema operativo distribuido, en cambio, presenta el mismo aspecto a los usuarios que un sistema tradicional de un solo procesador, aunque en realidad se compone de múltiples procesadores. Los usuarios no deben enterarse de en dónde se están ejecutando sus programas o almacenando sus archivos; de todo eso debe encargarse el sistema operativo automática y eficientemente.
Los verdaderos sistemas operativos distribuidos requieren más que la adición de un poco más de código a un sistema operativo uniprocesador, porque los sistemas distribuidos y centralizados difieren en aspectos cruciales. Los sistemas distribuidos, por ejemplo, a menudo permiten a las aplicaciones ejecutarse en varios procesadores al mismo tiempo, por lo que requieren algoritmos de planificación de más complejos a fin de optimizar el grado de paralelismo.
En muchos casos, los retardos de comunicación dentro de la red implican que éstos (y otros) algoritmos deban ejecutarse con información incompleta, caduca o incluso incorrecta. Esta situación difiere radicalmente un sistema de un solo procesador en el que el sistema operativo tiene toda la información sobré el estado del sistema.