trabajo os unix
Post on 24-Jul-2015
386 Views
Preview:
TRANSCRIPT
Republica bolivariana de Venezuela
Ministerio del Poder Popular para la Educación Universitaria
Universidad Centroccidental Lisandro Alvarado
Barquisimeto - Edo Lara
Daimerlis Escalona C.I.:20.045.544
Derlys Alvarado C.I.:20.189.960
Héctor Linares C.I.: 19.198.516
Ismarilex Perez C.I.: 19.591.262
Jesús Rea C.I.: 19.265.883
Rawin Olivera C.I.: 19.149.818
Wuilker Escalona C.I.: 19.726.462
Introducción
Los Laboratorios Bell fueron los responsables del desarrollo de Unix como un
proyecto de investigación privado dirigido por un pequeño grupo de personas que
empezó en 1969. El objetivo del grupo fue diseñar un sistema operativo que
cumpliera los siguientes requisitos:
Que fuera simple y elegante.
Que estuviera escrito en un lenguaje de alto nivel.
Que permitiera reutilizar el código.
UNIX tenía una relativamente pequeña parte de su código escrita en
ensamblador (la que se encargaba de gestionar el hardware, más conocida como
kernel) y el resto del código escrito en C principalmente por Ken Thompson,
Dennis Ritchie, Douglas McIlroy
A medida que el desarrollo avanzaba se realizaban pequeñas modificaciones al
código del kernel (dependiendo de la plataforma) y se desarrollaron muchas
utilidades en C. A través de esta evolución el kernel y el software asociado se
extendieron hasta que un sistema operativo completo se desarrolló "sobre" el
kernel.
El sistema Unix es un sistema operativo que admite múltiples usuarios, así
como también múltiples tareas, lo que significa que permite que en un único
equipo o multiprocesador se ejecuten simultáneamente varios programas a cargo
de uno o varios usuarios. Este sistema cuenta con uno o varios intérpretes de
comando (shell) así como también con un gran número de comandos y muchas
utilidades (ensambladores, compiladores para varios idiomas, procesador de
textos, correo electrónico, etc.). Además, es altamente transportable, lo que
significa que es posible implementar un sistema Unix en casi todas las
plataformas de hardware.
El sistema se basa en un Núcleo llamado Kernel, que reside permanentemente
en la memoria, y que atiende a todas las llamadas del sistema, administra el
acceso a los archivos y el inicio o la suspensión de las tareas de los usuarios. La
comunicación con el sistema UNIX se da mediante un programa de control
llamado SHELL. Este es un lenguaje de control, un intérprete, y un lenguaje de
programación, cuyas características lo hacen sumamente flexible para las tareas de
un centro de cómputo.
Actualmente, los sistemas Unix se afianzaron en entornos profesionales y
universitarios gracias a su estabilidad, su gran nivel de seguridad y el
cumplimiento de estándares, especialmente en lo que se refiere a redes.
1. Características Generales:
Es un sistema operativo de tiempo compartido, controla los recursos de una
computadora y los asigna entre los usuarios, adicionalmente permite a los usuarios
correr sus programas. Controla los dispositivos de periféricos conectados a la
máquina.
2. Características básicas:
2.1 Sistema Multiusuario.
2.2 Sistema Multitarea.
2.3 Sistema interactivo.
2.4 Estandarizado.
2.5 Potente.
2.6 Versátil.
2.7 Software y sistema operativo portable.
2.8 Permite ejecutar procesos en Background y Foreground.
2.9 Presenta niveles altos de seguridad.
2.10 Presenta una estructura jerárquica de archivos.
2.11 Posee un gran número de utilidades: Editores de línea, de pantalla,
formateadores, depuradores de programas…
2.12 Posibilidad de comunicación UNIX – UNIX (UUCP)
2.13 Fácil integración en sistemas de red.
2.14 Posibilidad de usar distintos lenguajes de programación: C,
2.15 Fortran, Cobol, Pascal,…
2.16 Gran cantidad de software disponible en el mercado.
3. A continuación se exponen las familias UNIX más significativas
3.1 AT&T: la familia que tuvo su origen en el UNIX de AT&T.
Considerada la familia UNIX "pura" y original. Sus sistemas
operativos más significativos son UNIX System III y UNIX System V.
3.2 BSD: familia originada por el licenciamiento de UNIX a Berkely.
BSD se reescribió para no incorporar propiedad intelectual originaria
de AT&T en la versión 4. La primera implementación de los
protocolos TCP/IP que dieron origen a Internet son la pila TCP/IP
BSD.
3.3 AIX: Esta familia surge por el licenciamiento de UNIX System III a
IBM.
3.4 Xenix: familia derivada de la adquisición de los derechos originales de
AT&T primero por parte de Microsoft y de esta los vendió a SCO.
3.5 GNU: En 1983, Richard Stallman anunció el Proyecto GNU, un
ambicioso esfuerzo para crear un sistema similar a Unix, que pudiese
ser distribuido libremente. El software desarrollado por este proyecto -
por ejemplo, GNU Emacs y GCC - también han sido parte
fundamental de otros sistemas UNIX.
3.6 Linux: En 1991, cuando Linus Torvalds empezó a proponer el núcleo
Linux y a reunir colaboradores, las herramientas GNU eran la elección
perfecta. Al combinarse ambos elementos, conformaron la base del
sistema operativo (basado en POSIX) que hoy se conoce como
GNU/Linux. Las distribuciones basadas en el núcleo, el software GNU
y otros agregados entre las que se pueden mencionar a Red Hat Linux
y Debian GNU/Linux se han hecho populares tanto entre los
aficionados a la computación como en el mundo empresarial.
Obsérvese que Linux tiene un origen independiente, por lo que se
considera un 'clónico' de UNIX y no un UNIX en el sentido histórico.
4. Estructura del sistema operativo UNIX (Figura1)
El sistema operativo UNIX está estructurado por 4 niveles o capas:
4.1 En el nivel más interno o primer nivel, se encuentra el hardware de la
computadora cuyos recursos se desean gestionar.
4.2 En el segundo nivel, directamente en contacto con el hardware, se
encuentra el núcleo del sistema, también llamado
únicamente núcleo (kernel). El kernel constituye el núcleo del sistema
operativo. Actúa como interfaz con el hardware del sistema, este
núcleo está escrito en lenguaje C en su mayor parte, aunque
coexistiendo con lenguaje ensamblador.. Se encarga de realizar las
funciones de más bajo nivel, como son:
4.2.1 Manejo y control de los dispositivos físicos.
4.2.2 Control de interrupciones.
4.2.3 Control de procesos y tiempos.
4.2.4 Control de archivos.
4.2.5 Control de memoria.
4.2.6 Está escrito fundamentalmente en lenguaje “C” (90%) y el
resto en lenguaje ensamblador.
4.2.7 Control de la ejecución de los procesos posibilitando su
creación, terminación o suspensión, y comunicación.
4.2.8 Planificación de los procesos para su ejecución en la CPU. En
UNIX los procesos comparten el uso de la CPU por ello el
núcleo debe velar porque la utilización de la CPU por parte de
todos los procesos se realice de una forma justa.
4.2.9 Asignación de la memoria principal. La memoria principal de
una computadora es un recurso finito y muy valioso. Si el
sistema posee en un cierto momento poca memoria principal
libre, el núcleo liberará memoria escribiendo uno o varios
procesos temporalmente en memoria secundaria (en un espacio
predefinido denominado dispositivo de intercambio). Si el
núcleo escribe un proceso entero en el dispositivo de
intercambio, se dice que el sistema de gestión de memoria
sigue una política de intercambio. Mientras que si escribe
páginas de memoria asociadas al proceso en al dispositivo de
intercambio, se dice que el sistema de gestión de memoria
sigue una política de demanda de páginas.
4.2.10 Protección del espacio de direcciones de un proceso en
ejecución. El núcleo protege el espacio de direcciones de un
proceso de intromisiones externas por parte de otros procesos.
No obstante, bajo ciertas condiciones un proceso puede
compartir porciones de su espacio de direcciones con otros
procesos.
4.2.11 Asignación de memoria secundaria para almacenamiento y
recuperación eficiente de los datos de usuario. El núcleo asigna
memoria secundaria para los ficheros de usuario, reclama el
espacio no utilizado, estructura el sistema de ficheros de una
forma entendible, y protege a los ficheros de usuario de accesos
ilegales.
4.2.12 Regulación del acceso de los procesos a los dispositivos
periféricos tales como terminales, unidades de disco,
dispositivos en red, entre otros.
4.2.13 Administración de archivos y dispositivos
4.2.14 Tratamiento de las interrupciones y excepciones
4.3 En el tercer nivel, en contacto con el núcleo, se encuentran los
programas estándar de cualquier sistema UNIX (intérpretes de
comandos, editores, etc.) y programas ejecutables generados por el
usuario. Un programa ubicado en este nivel puede interactuar con el
núcleo mediante el uso de las llamadas al sistema, las cuales dan
instrucciones al núcleo para que realice (en el nombre del programa
que las invoca) diferentes operaciones con el hardware. Además, las
llamadas al sistema permiten un intercambio de datos entre el núcleo y
el programa. En definitiva, las llamadas al sistema son el mecanismo
que los programas utilizan para solicitar el núcleo el uso de los
recursos del computador (hardware). Habitualmente las llamadas al
sistema se identifican como un conjunto perfectamente definido de
funciones.
4.4 En el cuarto nivel, se sitúan las aplicaciones que se sirven de otros
programas ya creados ubicados en el nivel inferior para llevar a cabo
su función. Estas aplicaciones no se comunican directamente con el
núcleo. Por ejemplo una aplicación situada en este cuarto nivel será el
compilador de C cc que invoca de forma secuencial a los programas
cpp, comp, as y ld. situados en el tercer nivel. La jerarquía de
programas no tiene porqué verse limitada a cuatro niveles. El usuario
puede crear tantos niveles como necesite. Además, puede haber
también programas que se apoyen en diferentes niveles y que se
comuniquen con el núcleo por un lado, y con otros programas ya
existentes, por otro. La existencia del núcleo posibilita que los
programas de los niveles superiores puedan ser escritos sin realizar
ninguna suposición sobre el hardware de la computadora. A su vez
esto facilita su portabilidad entre diferentes tipos de computadoras
(siempre que tengan instalado UNIX)
(Figura1)
De manera adicional posee un intérprete llamado Shell, actúa como la
interfaz del sistema operativo con los usuarios del mismo y como
intérprete de comandos.
� Características semejantes a un lenguaje de programación de
alto nivel.
� Shellscripts.
� Permite configurar diferentes entornos de trabajo. Es un
comando: /sbin/sh.
5. Gestión de los procesos
Se le llama proceso en Unix a un programa en ejecución y al objeto
abstracto que crea el sistema operativo para manejar el acceso de ese
programa a los recursos del sistema (memoria, CPU, dispositivos de E/S).
Pueden coexistir varias instancias de un mismo programa ejecutando en forma
simultánea. Cada una de ellas es un proceso diferente. Unix es un sistema
multiproceso por tiempo compartido. A los ojos de un usuario en un momento
dado hay múltiples programas en ejecución, cada uno de ellos avanzando en
su tarea. Sin embargo en una máquina con un solo procesador hay en cada
instante solamente un proceso ejecutando. Es el sistema operativo el que va
rotando el uso del procesador a intervalos breves (alguna decena de
milisegundos) entre los procesos definidos en el sistema de forma que se crea
la ilusión que todos avanzan simultáneamente.
El administrador del sistema dispone de herramientas para
supervisar el estado de los procesos y eventualmente tomar acciones para
suspender o detener la ejecución de un proceso o simplemente modificar su
comportamiento.
6. Tipos de procesos: Los procesos en el sistema UNIX pueden ser de tres
tipos:
6.1 Los procesos de usuario son aquellos procesos asociados a un
determinado usuario. Se ejecutan en modo usuario excepto cuando
realizan llamadas al sistema para acceder a los recursos del sistema,
que pasan a ser ejecutados en modo núcleo.
6.2 Los procesos demonio no están asociados a ningún usuario. Al igual
que los proceso de usuario, son ejecutados en modo usuario excepto
cuando realizan llamadas al sistema que pasan a ser ejecutados en
modo núcleo. Los procesos demonio realizan tareas periódicas
relacionadas con la administración del sistema, como por ejemplo: la
administración y control de redes, la ejecución de actividades
dependientes del tiempo, la administración de trabajos en las
impresoras en línea, etc.
6.3 Los procesos del núcleo no están asociados a ningún usuario. Se
ejecutan exclusivamente en modo núcleo. Son similares a los procesos
demonio en el sentido de que realizan tareas de administración del
sistema, como por ejemplo, el intercambio de procesos (proceso
intercambiador) o de páginas (proceso ladrón de páginas) a memoria
secundaria. Su principal ventaja respecto a los procesos demonio es
que poseen un mayor control sobre sus prioridades de planificación
puesto que su código es parte del núcleo. Por ello pueden acceder
directamente a los algoritmos y estructuras de datos del núcleo sin
hacer uso de las llamadas al sistema, en consecuencia son
extremadamente potentes. Sin embargo no son tan flexibles como los
procesos demonio, ya que para modificarlos se debe de recompilar el
núcleo.
7. Creación de Procesos (Figura2)
Al crearse un nuevo proceso se le asigna un identificador de
proceso único. Este número debe utilizarse por el administrador para referirse a un
proceso dado al ejecutar un comando. Los PID son asignados por el sistema a
cada nuevo proceso en orden creciente comenzando desde cero. Si antes de un
reboot del sistema se llega al nro. máximo, se vuelve a comenzar desde cero,
salteando los procesos que aún estén activos.
El mecanismo de creación de un proceso en Unix es un poco
peculiar. Un proceso se crea invocando a una función del sistema operativo
llamada fork(). La función fork () crea una copia idéntica del proceso que la
invoca con excepción de:
7.1 El nuevo proceso tiene un PID diferente
7.2 El PPID del nuevo proceso es el PID del proceso original.
7.3 Se reinicia la información de tarificación del proceso (uso de CPU)
Al retorno de fork() se siguen ejecutando las siguientes sentencias
del programa en forma concurrente. Para distinguir entre los dos procesos la
función fork() devuelve un cero al proceso hijo y el PID del nuevo proceso al
proceso padre. Normalmente el proceso hijo lanza luego un nuevo programa
ejecutando alguna variante de comando exec(). En el recuadro puede verse un
ejemplo del uso de fork.
(Figura2)
Si este es el mecanismo para crear un proceso, entonces ¿quién lanza a
correr el primer proceso? Luego del boot del sistema el kernel instala y deja
corriendo un proceso llamado init con PID=1. Una de las funciones principales de
init es lanzar mediante fork() intérpretes de comandos que a su vez lanzarán los
scripts de inicialización del sistema y los procesos de los usuarios. Además de init
el kernel lanza algunos procesos más cuyo nombre y función varía en los
diferentes sabores de Unix. A excepción de estos procesos lanzados por el kernel
al inicio, todos los demás son descendientes de init. Normalmente un proceso
termina invocando a la función exit() pasando como parámetro un código de
salida o exit code. El destinatario de ese código de salida es el proceso padre. El
proceso padre puede esperar la terminación de su proceso hijo invocando la
función wait(). Esta función manda al padre a dormir hasta que el hijo ejecute su
exit() y devuelve el exit code del proceso hijo.
Cuando el proceso hijo termina antes que el padre, el kernel debe
conservar el valor del exit code para pasarlo al padre cuando ejecute wait(). En
esta situación se dice que el proceso hijo está en el estado zombie. El kernel
devuelve todas las áreas de memoria solicitadas por el proceso pero debe
mantener alguna información sobre el proceso (al menos su PID y el exit code).
Cuando el proceso padre termina primero el kernel encarga a init la tarea de
ejecutar el wait() necesario para terminar todo en forma ordenada. A menudo init
falla en esta función y suelen quedar procesos en estado zombie hasta un nuevo
reboot. Dado que un proceso zombie no consume recursos fuera de su PID, esto
por lo general no provoca problemas.
8. Bloque de Control de Procesos (BCP)
La estructura de datos más básica asociada a los procesos es la estructura
de procesos. Dicha estructura contiene todo lo que el sistema necesita saber acerca
de un proceso cuando este se intercambia a disco, como su identificador único,
información de planificación y punteros a otros bloques de control. Existe un
arreglo de estructuras de procesos cuyas longitudes define en el momento de
enlazar el sistema. El planificador mantiene vinculadas las estructuras de procesos
de los procesos listos en una lista doblemente enlazada, y hay punteros de cada
estructura de procesos al padre del proceso, a su hijo vivo más joven y a varios
otros parientes de interés, como una lista de procesos que comparten el mismo
código de programa (texto).
El espacio de direcciones virtual de un Proceso de usuario se divide
en segmento de texto, datos y pilas. Los segmentos de datos y de pilas siempre
están en el mismo espacio de direcciones, pero podrían crecer de manera
independiente, y por lo regular en direcciones opuestas. Lo más común es que la
pila crezca hacia abajo mientras los datos crecen hacia ella, el segmento de texto
está en u espacio de direcciones diferente del de los datos y de la pila, y suele ser
solo de lectura.
Las Tablas de páginas registran información acerca de la
correspondencia acerca de la memoria virtual de los procesos y la memoria física.
La estructura de procesos contiene punteros a la tabla de página, para usarse
cuando el proceso reside en la memoria principal, ó la dirección del proceso en el
dispositivo de intercambio, cuando el proceso se intercambia. No hay una tabla de
página especial a parte para un segmento de texto compartido; todos los procesos
que comparten el segmento de texto tienen entradas para sus páginas en la tabla de
páginas del proceso. La información acerca del proceso que solo se necesita
cuando el proceso esta residente se mantiene en la estructura de usuario en lugar
de la estructura de proceso. Se establece uhna correspondencia de solo lectura
entre la esructura de usuario y el espacio de direcciones virtual del usuario, para
que los procesos de usuarios puedan leer su contenido. El nucleo puede escribir
dicha estructura
9. Estados y Transiciones de Procesos (Figura3)
9.1 Durmiendo (asleep): En general a la espera de algún recurso
compartido.
9.2 Listo para ejecutar (runnable). A la espera que le toque el turno en el
uso de la CPU.
9.3 Ejecutando (running ). Puede estar ejecutando en modo kernel o en
modo usuario.
A su vez el proceso (o partes del espacio de memoria virtual del proceso) puede
estar cargado en memoria o "swapped" a disco.
(Figura3)
Además de estos estados básicos un proceso puede estar detenido
(stopped). En este caso se le prohíbe ejecutar al proceso. Hay mecanismos para
detener y rearrancar un proceso a través de las señales STOP y CONT que
veremos más adelante.
El estado stopped es el estado en que queda un proceso lanzado a correr
desde un intérprete de comandos (shell) cuando se presiona <Control-Z> o la tecla
configurada como "suspend" en el terminal que estemos utilizando.
Finalmente el otro estado en que a menudo un administrador encuentra a un
proceso es el estado zombie o exiting. Un proceso en este estado está en proceso
de terminación. Este caso se discute más en detalle en el apartado "Ciclo de vida
de un proceso".
10. Planificación de Procesos
Las señales de Unix son un mecanismo para anunciar a un proceso que ha
sucedido cierto evento que debe ser atendido. La lista de posibles señales a
comunicar a los procesos está fija, con algunas variaciones de un sabor a otro de
Unix.
La recepción de una señal en particular por parte de un proceso provoca
que se ejecute una subrutina encargada de atenderla. A esa rutina se le llama el
"manejador" de la señal (signal handler). Un proceso puede definir un manejador
diferente para sus señales o dejar que el kernel tome las acciones predeterminadas
para cada señal.
Cuando un proceso define un manejador para cierta señal se dice que "captura"
(catch) esa señal.
11. Tratamiento de interbloqueos
Si se desea evitar que determinada señal sea recibida por un proceso se
puede solicitar que dicha señal sea ignorada o bloqueada. Una señal ignorada
simplemente se descarta sin ningún efecto posterior. Cuando alguien envía a
cierto proceso una señal que está bloqueada la solicitud se mantiene encolada
hasta que esa señal es explícitamente desbloqueada para ese proceso. Cuando la
señal es desbloqueada la rutina de manejo de la señal es invocada una sola vez
aunque la señal haya sido recibida más de una vez mientras estaba bloqueada.
Si bien un proceso tiene ciertas libertades para configurar como reacciona frente a
una señal (capturando, bloqueando o ignorando la señal), el kernel se reserva
ciertos derechos sobre algunas señales. Así, las señales llamadas KILL y STOP no
pueden ser capturadas, ni bloqueadas, ni ignoradas y la señal CONT no puede ser
bloqueada.
La señal KILL provoca la terminación de un proceso. La señal STOP
provoca la detención del proceso que queda en el estado "stopped" hasta que
alguien le envíe la señal CONT. Una señal puede enviarse desde un programa
utilizando llamadas al sistema operativo, o desde la línea de comandos de un shell
utilizando el comando kill . Al comando kill se le pasa como parámetro el número
o nombre de la señal y el PID del proceso. El uso más habitual del comando es
para enviar una señal TERM o KILL para terminar un proceso, de ahí su nombre.
Para muchas de las señales la acción predeterminada consiste en terminar el
proceso.
En algunos casos se genera además un core dump. Un core dump es un
archivo con una imagen del estado del sistema que permite al desarrollador de un
programa diagnosticar problemas con la ayuda de un debugger. Al usuario final
de un programa esta imagen rara vez le sirve de ayuda. La lista de posibles señales
puede obtenerse para cada sistema a través del man del comando kill o de la
función kill() del sistema operativo. En la tabla se listan las utilizadas más a
menudo por un administrador.
12. Sincronización de procesos
La sincronización de procesos se logra por un mecanismo evento. Los
procesos esperan a que ocurran los eventos. Las tablas de procesos están
asociadas a los eventos. Los eventos son representados como las direcciones de
las tablas correspondientes. Un proceso padre en espera de que termine uno de sus
procesos hijos, espera por un evento que es la dirección de su propia entrada de la
tabla del proceso. Un proceso que termina señala el evento representado por la
entrada del padre en la tabla del proceso. Señalar un evento por el cual no hay
ningún proceso en espera no tiene efecto.
En cualquier momento, todos los procesos, excepto uno, han llamado a
evento espera en el núcleo. El restante es el proceso ejecutante. Cuando llama a
evento espera, se despacha otro proceso cuyo evento ha sido señalado.
13. Comunicación entre procesos
Muchos recursos separados son provistos para permitir a procesos
concurrentes comunicarse con otros. Los conductores son caminos
unidireccionales sobre los cuales los procesos pueden enviar corrientes de datos a
otros procesos. Los Conductores Etiquetados (del UNIX System V) son caminos
permanentes. Los Mensajes (también de UNIX System V) transfieren elementos
de datos pequeños. SunOs incluye el mecanismo de socket a partir de BSD 4.2.
Los sokets son puntos finales de caminos de comunicación de dos vías. Ellos son
especialmente usados para implementar protocolos de red. Un proceso cliente en
una maquina en la red comienza la comunicación desde u socket; un proceso
servidor en otra máquina escucha al socket para recibir la comunicación.
SunOs provee capacidad de memoria compartida del Sistema V. Los
procesos comparten una porción de memoria; cuando un proceso completa la
escritura a esta área de memoria, otro proceso puede leer los datos. SunOs provee
también semáforos del UNIX System V para controlar el acceso a recursos
compartidos. Un semáforo se usa para bloquear una prioridad de recurso
compartido para su uso; el proceso usa el recurso y luego usa una operación de
semáforo para liberar el recurso.
14. Mecanismos de comunicación:
14.1 Tubería: Mecanismo de intercomunicación entre procesos que
permite que 2 o más procesos envíen información a cualquier otro.
14.1.1 Tubería sin nombre: Enlace de comunicación unidireccional,
capaz de almacenar su entrada (hasta 4 KB en BSD o hasta 40
KB en System V).
14.1.2 Tuberías nombradas (FIFO): Permiten una comunicación
menos restringida, ya que las colas FIFO existen en el sistema
de archivos hasta que son borradas.
14.1.2.1 Características:
14.1.2.1.1 Permite comunicar procesos no emparentados.
14.1.2.1.2 Tiene una entrada en el sistema de archivos.
14.1.2.1.3 Usa una política de colas "primero en llegar,
primero en servirse".
14.1.2.1.4 Sólo disponible en UNIX System V.
15. Gestión de Memoria
Gran parte del desarrollo inicial de UNIX se efectuó en un PDP-11.
Esta máquina solo tiene 8 segmentos en su espacio de direcciones virtuales, y
cada uno de ellos tiene cuando más 8192 bytes. Las maquinas mas grandes como
el PDP-11/70, permiten tener espacios de instrucciones y direcciones separados,
pero dicho espacio de direcciones sigue siendo relativamente pequeño. Además, el
núcleo esta todavía más restringido porque un segmento de datos se dedica a
vectores de interrupciones, otro para apuntar el segmento de datos del sistema por
procesos, y uno más para los registros UNIBUS (Bus del estrada y salida del
sistema). Por añadidura por los PDP-11 más pequeños, la memoria física total
estaba limitada a 256k. los recursos de memoria totales eran insuficientes para
justificar o apoyar algoritmos de gestión de memoria complejos. Por ello, UNIX
intercambiaba imágenes enteras de memorias de procesos.
La memoria es uno de los recursos más valiosos que gestiona el
sistema operativo. Uno de los elementos principales que caracterizan un proceso
es la memoria que utiliza. Ésta está lógicamente separada de la de cualquier otro
proceso del sistema (excepto los threads de un mismo proceso que comparten
normalmente la mayor parte de la memoria que tienen asignada). Un proceso no
puede acceder, al espacio de memoria asignado a otro proceso, lo cual es
imprescindible para la seguridad y estabilidad del sistema. El direccionamiento es
una parte importante de la gestión de memoria, puesto que influye mucho en la
visión del mismo por parte de un proceso, como en el aprovechamiento del
hardware y el rendimiento del sistema.
Puesto que UNIX se ideó para ser independiente de la máquina, su
esquema de gestión de memoria varía de un sistema a otro. Las primeras versiones
de UNIX simplemente empleaban particiones variables sin ningún esquema de
memoria virtual. Las implementaciones actuales, incluida SVR4, utilizan
memoria virtual paginada. En SVR4 existen actualmente dos esquemas de gestión
de memoria separados. El sistema de paginación ofrece una memoria virtual que
asigna marcos de página en la memoria principal a los procesos y también asigna
marcos de página a los buffers (memorias intermedias) de los bloques de disco.
Aunque esto es un esquema de gestión de memoria efectiva para procesos de
usuario y de E/S de disco, un esquema de memoria virtual paginado se adapta
peor a la gestión de asignación de memoria para el kernel, y para este último
propósito se utiliza un gestor de memoria del kernel.
16. Almacenamiento Virtual (swap)
Cuando no caben todos los programas en memoria principal
hacemos uso de intercambio (swapping)
16.1 Swap: partición de disco que almacena imágenes de procesos
16.2 Swap out: cuando no caben en memoria procesos activos, se
“expulsa” un proceso de memoria principal, copiando su imagen a
swap (área de intercambio), aunque no es necesario copiar todo el
mapa (ni código ni huecos). Existen diversos criterios de selección del
proceso a intercambiar:
16.2.1 Dependiendo de la prioridad del proceso;
16.2.2 Preferencia a los procesos bloqueados;
16.2.3 No intercambiar si está activo DMA sobre mapa del proceso.
16.3 Swap in: Cuando haya espacio en memoria principal, se
intercambia el proceso a memoria copiando imagen desde swap.
Asignación de espacio en el dispositivo de swap:
Con preasignación: se asigna espacio al crear el proceso;
Sin preasignación: se asigna espacio al intercambiarlo (cuando se
crea una región, no se hace ninguna reserva en el swap). La tendencia actual es
utilizar la segunda estrategia, dado que la primera conlleva un peor
aprovechamiento de la memoria secundaria, puesto que toda página debe tener
reservado espacia en ella.
17. Asignación del Espacio para Intercambio por parte del Kernel
17.1 Dirección map que indica qué map usar + número unidades
pedidas:
17.1.2 Éxito ⇒la dirección
17.1.3 Fracaso ⇒0
17.2 Asignar espacio para intercambio:
El kernel busca en mapa 1ª entrada con suficiente espacio para la
petición.
Si petición consume todos los recursos de la entrada del mapa:
El kernel quita la entrada del array.
Mapa ⇒ Una entrada menos.
En caso contrario
Ajusta dirección y unidades acorde a cantidad recursos asignados
Liberar espacio de intercambio:
17.3 El kernel busca posición adecuada en el mapa por la dirección. Casos
posibles:
17.3.1 Recursos liberados llenan un hueco en el mapa ⇒Combinar
todos los recursos en una entrada en el mapa.
17.3.2 Recursos liberados llenan parcialmente un hueco en el mapa y
son contiguos a alguna entrada adyacente ⇒ Elkernel ajusta la
dirección y unidades de la entrada apropiada de acuerdo a
recursos liberados.
17.3.3 Recursos liberados llenan parcialmente un hueco en el mapa y
no son contiguos a ninguna entrada ⇒ El kernel crea nueva
entrada en el mapa para los recursos liberados y la inserta en la
posición apropiada.
18. Intercambiar Procesos fuera de Memoria
El kernel intercambia procesos al swap (memoria virtual) si necesita
espacio en memoria:
18.1 Fork: Asignar espacio para el proceso hijo (crea un nuevo
proceso).
18.2 Brk: Incremento tamaño del segmento de datos de un proceso.
18.3 Crecimiento pila proceso.
18.4 Para intercambiar procesos que había intercambiado al dispositivo
de swap
Todos los casos son iguales:
Se decrementa contador de referencia de cada región del proceso;
Lleva la región al swap si el contador de referencia el igual a 0;
Salva dirección de swap de la región en la tabla de regiones.
Swap de Expansión: Proceso requiere más memoria de la que tiene asignada en
el momento (crecimiento pila o Brk) y no hay suficiente memoria disponible para
satisfacer la petición. El kernel hace un swap de expansión del proceso en el que
realiza los siguientes pasos:
Reserva suficiente espacio en swap para el proceso, incluyendo petición
actual.
Ajusta el mapa de traducción de direcciones del proceso para la nueva
configuración de la memoria virtual ⇒ no asigna memoria física porque no está
disponible.
Intercambia el proceso fuera de memoria con nueva memoria igual a cero
en el swap.
Al volver a memoria, el kernel le asignará suficiente memoria según el
nuevo mapa de traducción de direcciones.
19. Intercambiar Procesos entre Memoria Principal y swap
Proceso 0, swapper (proceso del kernel) único capaz de mover procesos
entre memoria y swap. Comportamiento:
19.1 Fin inicialización del sistema ⇒ swapper empieza un bucle infinito
19.2 Única tarea que tiene que hacer el swapper es intercambiar
procesos desde swap:
19.2.1 Examina procesos “listos para ejecutarse en área de swap” y
selecciona el que haya estado más tiempo intercambiado;
19.2.2 Si tiene suficiente memoria libre disponible asigna memoria
física, lee el proceso desde el dispositivo de swap y libera la
memoria en el mismo.
19.2.3 Si no tiene suficiente espacio en memoria principal, intenta
intercambiar procesos al dispositivo de swap
19.3 Si no hay procesos para intercambiar a memoria, o ninguno de los
procesos que hay en memoria pueden ser intercambiados al dispositivo
de swap ⇒swapper se duerme, y se despierta:
19.3.1 El reloj, lo despertará una vez cada segundo en este estado
(dormido).
19.3.2 El kernel si otro proceso va a dormir.
19.3.3 Vuelve a empezar desde el principio buscando más procesos.
20. Criterios del swapper para elegir un proceso para echarlo
(intercambiarlo) de memoria:
20.1 Examina cada uno de los procesos que estén en memoria;
20.2 No examina ni Zombies, ni procesos bloqueados en memoria;
20.3 Prefiere “Dormidos” a “listos para ejecutarse”; (4) Elegir de los
“Dormidos” los que menos f(prioridad, tiempo que proceso lleva en
memoria) tengan; (5) Elegir de los “listos para ejecutarse” los que
menos f(nice, tiempo que el proceso haya estado en memoria) tengan.
21. Paginación por Demanda
Estructuras de datos para la gestión de memoria a bajo nivel y demanda de
páginas (sistema de paginación):
21.1 Tabla de páginas (Figura4)
21.1.1 Entrada de la tabla de páginas:
21.1.1.1 Número de marco de página, es la dirección física de
la página (Marco en la memoria real)
21.1.1.2 Protección, que indican si procesos pueden leer,
escribir o ejecutar página (indica si está permitida la
operación de escritura);
21.1.1.3 Válido, que indica si la página está en la memoria
principal;
21.1.1.4 Referencia, que indica si un proceso referenció
recientemente la página (se pone a cero cuando la página se
carga por primera vez y puede ser restaurado
periódicamente por el algoritmo de reemplazo de página);
21.1.1.5 Modificado, que indica si proceso modificó
recientemente contenido de la página;
21.1.1.6 Copia en escritura, usado en fork, indica que el
kernel debe crear nueva copia de la página cuando un
proceso modifique su contenido (activo cuando más de un
proceso comparte la página).
21.1.1.7 Edad, indica cuánto hace que la página pertenece al
Working Set del proceso (indica cuánto tiempo ha estado la
página en memoria sin ser referenciada).
21.1.2 El kernel manipula: válido, copia en escritura y edad. El
hardware activa: referencia y modificado de cada entrada de la
tabla de páginas.
21.1.3 Entrada del descriptor de bloques de disco (describe copia de
disco de la página virtual):
21.1.3.1 Número de dispositivo de swap, indica el número de
dispositivo lógico del dispositivo secundario que contiene
la página correspondiente (se puede utilizar más de un
dispositivo para el intercambio);
21.1.3.2 Número de bloque del dispositivo, indica la posición
del bloque que contiene la página en el dispositivo swap;
21.1.3.3 Tipo de almacenamiento, el almacenamiento puede
ser la unidad de swap o un archivo ejecutable, en este
último caso, existe un indicador de si debe borrarse primero
la memoria virtual a asignar.
21.1.4 Los procesos que comparten una misma región ⇒ Entradas
comunes para la tabla de páginas y los descriptores de bloques
de disco.
21.2 Descriptores de bloques de disco ⇒ Asociado a cada página de un
proceso hay una entrada en la tabla que describe la copia en el disco de
la página virtual.
21.3 Tabla de marcos de página (pfdata) ⇒ Describe cada marca de la
memoria real y está indexada por el número de marco.
21.4 Tabla de uso de swap ⇒ Existe una tabla de uso de swap por cada
dispositivo de intercambio, con una entrada para cada página en dicho
dispositivo. El kernel asigna espacio para pfdata una vez durante la
vida del sistema, aunque para las otras estructuras le asigna y
desasigna espacio dinámicamente. Cada región contiene tablas de
páginas para acceder a memoria física.
(Figura4)
22. Sistema de Archivos
En Unix todo se trata como ficheros. Los ficheros son una
secuencia de bytes y los directorios son una colección de ficheros que a su vez
contienen ficheros.
Cada archivo tiene un nombre que le da el usuario para poder
utilizarlo. Un nombre de archivo puede ser casi cualquier cadena de caracteres,
donde el único carácter ASCII que no se puede usar es el slash (/), que en Unix se
usa como separador de directorios y archivos. Existen otros caracteres que se
recomienda no usarlos pues tienen significado especial para el intérprete de
comandos de Unix, como son! # & ( ) * ' " ` ; | < > @ $ ^ { } ? : \ espacio
backspace tab + - y los caracteres de control. Las mayúsculas y minúsculas son
consideradas distintas en Unix y, por ejemplo, los nombres CARTA, carta y Carta
corresponden a tres archivos distintos.
Se recomienda que los nombres de archivo no tengan más de 14
caracteres porque, salvo casos especiales, Unix considera iguales a dos archivos si
coinciden en los primeros 14 caracteres (esto no es el caso para versiones
modernas de Unix, las que pueden aceptar nombres de archivo de más de 80
caracteres). dd es un comando de la familia de los Sistemas Operativos Unix que
permite copiar y convertir datos de archivos1 a nivel bajo.
Es generalmente usado para realizar operaciones avanzadas sobre
dispositivos o archivos, como pueden ser:
22.1 Transferencias de datos específicos.
22.2 Copias de seguridad de la información en crudo (raw data).
22.3 Conversión de algunas codificaciones soportadas y/o caracteres
predefinidos
Es de mucha importancia aclarar que en sistemas operativos Unix, cualquier
dispositivo es manejado como un archivo. Por lo tanto el comando dd, puede ser
utilizado en diversos dispositivos y volúmenes (particiones), más allá de los
archivos propiamente dichos.
23. Directorios
Los directorios son la base del sistema jerárquico de archivos de Unix. Son
grupos de archivos que sirven para clasificarlos y organizarlos de acuerdo a las
necesidades de los usuarios. Un directorio puede contener otros directorios y
archivos, y así sucesivamente. En teoría, no existe limitación del número de
archivos y directorios que se puedan crear en un directorio, con excepción del
tamaño del dispositivo donde se almacena. El sistema de directorios y archivos se
puede graficar en lo que se conoce como estructura de árbol.
/
.---.---.---.---.---.---+---.---.---.---.---.---.---.
| | | | | | | | | | | | | |
| boot | etc | lib | opt | root | tmp | var
bin dev home mnt proc sbin usr |
| |
.------^--.----.-----. .----.-----|
httpd lgm memo rmg log run
spool
.------+-----. | | |
cgi-bin html logs | pubwww |
| .-----^--+------.------.
| GNUstep monos pubwww
recetas
.------.--------^-. |
disk escritos software .---^---.
| | dibujos fotos
.--^--. .--^----.
tbr sds ch-city utils
Este diagrama representa parte de un sistema de directorios y archivos
típico, donde la raíz del árbol se encuentra en la parte superior. Se le llama
directorio raíz o simplemente raíz y se denomina con el símbolo / (slash). De ella
se ramifican todos los demás directorios del sistema. Por ejemplo, dentro del
directorio home, que es un subdirectorio de la raíz, hay cuatro subdirectorios,
httpd, lgm, memo y rmg, los que a su vez contienen otros subdirectorios. El
directorio donde cada usuario se encuentra al iniciar la sesión se llama HOME o
directorio de trabajo. Cada usuario tiene un único directorio de trabajo, desde el
cual se puede mover hacia arriba y abajo en el árbol de directorios. Generalmente
el directorio de trabajo es un subdirectorio del directorio /home, y tiene como
nombre el nombre de presentación del usuario.
Nótese que puede haber varios archivos con nombres iguales en distintos
directorios, pero no dentro de un mismo directorio. Recuérdese que se considera
la diferencia entre mayúsculas y minúsculas en la distinción de nombres de
archivo.
¿Cómo se distinguen los archivos uno de otro? En Unix se pueden
especificar nombres de archivo incluyendo los directorios en que están ubicados.
Este tipo de nombre se llama nombre de camino o nombre de ruta, pues describe
el camino a seguir para llegar al archivo. Son de dos tipos:
23.1 Nombres de camino relativos: Se llama así pues se especifica el
camino en forma relativa al directorio actual. Por ejemplo, si estoy en
el directorio de trabajo de rmg y quiero ver una foto que rmg tiene
entre sus monos, se puede especificar de estas dos formas:
/home/rmg/monos/fotos/lr1.jpg
O
monos/fotos/lr1.jpg
Un punto único (.) se utiliza para referirse al directorio actual. Por
ejemplo, el nombre de camino
./prog/cuentas
Es el nombre de camino del archivo cuentas del directorio prog del
directorio actual. Los dos puntos (..) especifican el directorio padre del
directorio actual, que es el siguiente de más alto nivel en el árbol de
directorios. Si estamos en el directorio
/home/lgm/software/ch-city/
El directorio padre sería software, quien tiene como padre a lgm,
quien a su vez tiene como padre a home, el que es hijo del directorio raíz
([/]). Este último es el único directorio sin padre, y [/../] es un sinónimo de
[/]. El doble punto se utiliza para especificar cosas más abajo en el sistema
de directorios. Por ejemplo, si estamos en /home/lgm/disk/, el nombre de
camino relativo .../.../rmg/recetas/curanto.txt apunta al archivo cuya ruta
completa (o nombre de camino completo) es
/home/rmg/recetas/curanto.txt.
23.2 Nombres de caminos completos o absolutos: Los nombres de
camino completos son los que van desde la raíz hasta un archivo. Por
ejemplo:
/
/bin/sh
/home/lgm/software/ch-city/COPYING
/home/rmg/GNUstep/Library/WindowMaker/Backgrounds/termopila
s.png
/etc/httpd/conf/httpd.conf
/usr/local/bin/0verkill
/var/log/messages
Los nombres de archivos y directorios se separan con slashes. En los
nombres de camino completos, el primer / corresponde al directorio raíz.
Especificar un nombre de camino completo elimina toda ambigüedad, ya
que no pueden existir dos archivos con el mismo nombre de camino completo,
pero puede ser molesto para el usuario. En la mayoría de los sistemas, es común
mantener cinco, diez, más incluso, niveles de directorio y, especificar un nombre
de camino como este:
/mnt/cdrom/19971125/webs/xingzangwushuxuexiao.cn/html/zhongwen/xingz
hang/lishi.html
24. Búsqueda de archivos (Figura5)
El Shell es un programa interpretador de comandos que lee cada comando
que ingresa el usuario y dispone lo necesario para que se ejecuten. En este
capítulo daré a conocer ciertos aspectos del Shell estándar del sistema, como el
inicio, las órdenes de entrada, los canales de entrada y salida, etc. La búsqueda se
realiza mediante un árbol de directorios
(Figura5)
El comando find de Unix, nos permite buscar archivos dentro del árbol de
directorios de nuestro sistema. Este comando acepta una gran cantidad de
opciones. Vamos a ver algunas de ellas, pero para más información, siempre
podremos acudir al comando man, para saber más sobre find, o sobre cualquier
otro comando.
25. Sub-sistema de entradas y salidas
El sistema de entrada/salida permite al CPU relacionarse con el
mundo exterior, teclados, pantalla, impresoras, discos, etc. La comunicación de
los CPU con un elemento externo es similar a la comunicación con la memoria, se
leen y escriben datos. El comportamiento es distinto, los datos no siempre están
disponibles y el dispositivo puede no estar preparado para recibirlo se divide en
dos sistemas complementarios: el estructurado por bloques y el estructurado por
caracteres. El primero se usa para manejar cintas y discos magnéticos, y emplea
bloques de tamaño fijo (512 o 1024 bytes) para leer o escribir. El segundo se
utiliza para atender a las terminales, líneas de comunicación e impresoras, y
funciona byte por byte.
En general, el sistema Unix emplea programas especiales (escritos
en C) conocidos como manejadores (drivers) para atender a cada familia de
dispositivos de E/S. Los procesos se comunican con los dispositivos mediante
llamadas a su manejador. Además, desde el punto de vista de los procesos, los
manejadores aparecen como si fueran archivos en los que se lee o escribe; con
esto se logra gran homogeneidad y elegancia en el diseño.
Cada dispositivo se estructura internamente mediante descriptores
llamados número mayor, número menor y clase (de bloque o de caracteres). Para
cada clase hay un conjunto de entradas, en una tabla, que aporta a los manejadores
de los dispositivos. El número mayor se usa para asignar manejador,
correspondiente a una familia de dispositivos; el menor pasa al manejador como
un argumento, y éste lo emplea para tener acceso a uno de varios dispositivos
físicos semejantes.
Las rutinas que el sistema emplea para ejecutar operaciones de E/S
están diseñadas para eliminar las diferencias entre los dispositivos y los tipos de
acceso. No existe distinción entre acceso aleatorio y secuencial, ni hay un tamaño
de registro lógico impuesto por el sistema. El tamaño de un archivo ordinario está
determinado por el número de bytes escritos en él; no es necesario predeterminar
el tamaño de un archivo.
El sistema mantiene una lista de áreas de almacenamiento temporal
(buffers), asignadas a los dispositivos de bloques. El Kernel usa estos buffers con
el objeto de reducir el tráfico de E/S. Cuando un programa solicita una
transferencia, se busca primero en los buffers internos para ver si el bloque que se
requiere ya se encuentra en la memoria principal (como resultado de una
operación de lectura anterior). Si es así, entonces no será necesario realizar la
operación física de entrada o salida.
Existe todo un mecanismo de manipulación interna de buffers (y
otro de manejo de listas de bytes), necesario para controlar el flujo de datos entre
los dispositivos de bloques (y de caracteres) y los programas que los requieren.
26. Manejo de los Dispositivos
En teoría los dispositivos de entrada y salida se comunicarían con
la CPU por los buses del sistema. Dado que son muy heterogéneos sería muy
costoso que la CPU los manejase directamente.
En UNIX los dispositivos aparecen como un fichero (típicamente
en el directorio /dev). En algunos sistemas (p.e. solaris) este fichero es un enlace
simbólico a donde está realmente el fichero del dispositivo.
Tienen asignado un i-nodo, en donde además de indicar si es un
dispositivo de bloque o de carácter, figuran dos números (major number y minor
number) que indican que manejador de dispositivo se utiliza para acceder a él y
que unidad dentro de las manejadas por dicho manejador
# ls -li /dev/sda /dev/sda1 /dev/sda2 /dev/audio
4232 crw-rw---T+ 1 root audio 14, 4 Jan 7 18:51 /dev/audio
3106 brw-rw---T 1 root disk 8, 0 Jan 7 18:51 /dev/sda
3110 brw-rw---T 1 root disk 8, 1 Jan 7 18:51 /dev/sda1
3111 brw-rw---T 1 root disk 8, 2 Jan 7 18:51 /dev/sda2
Para acceder a los dispositivos se pueden utilizar las mismas
llamadas que para el acceso a los ficheros (open, read, write) siempre que el
proceso que lo haga tenga los privilegios adecuados.
También se puede acceder a las características (y demás
funcionalidades) de los dispositivos mediante la llamada ioctl
IOCTL(2) Linux Programmer’s Manual IOCTL(2)
NAME
ioctl - control device
SYNOPSIS
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
DESCRIPTION
The ioctl() function manipulates the underlying device parameters of
special files. In particular, many operating characteristics of char
acter special files (e.g., terminals) may be controlled with ioctl()
Por último, y debido a que los manejadores de los dispositivos son
programas escritos en lenguaje C, es relativamente fácil reconfigurar el sistema
para ampliar o eliminar dispositivos de E/S en la computadora, así como para
incluir tipos nuevos.
Referencias Electrónicas
• http://wikis.uca.es/wikiunix/index.php/Clasificaci%C3%B3n
• http://www.levenez.com/unix/
• Dennis M. Ritchie (September 1979) The Evolution of the Unix Time-
sharing System Bell Labs. 1996. Lucent Technologies Inc
• Bell Labs. It still remains a phenomenon The Creation of the UNIX*
Operating System.
• http://www.monografias.com/trabajos/unix/unix.shtml
• http://www.monografias.com/trabajos75/sistema-operativo-unix/sistema-
operativo-unix.shtml
• http://iie.fing.edu.uy/ense/asign/admunix/procesos.htm
• http://www.ual.es/~acorral/DSO/Tema_3.pdf
top related