Вы находитесь на странице: 1из 44

Sistemas Operativos

Introduccin

Es un programa de control que se ocupa de:


Administrar los recursos de la computadora. Administrar la ejecucin de los diferentes programas, incluso de diferentes usuarios. Facilitar la tarea del programador permitindole acceso a los recursos de manera independiente del hardware. Proveer servicios a los programas de aplicacin a travs de un conjunto de llamadas standard.

Estas acciones se resuelven a travs de una implementacin que puede representarse en capas

Modelo de capas

Clasificacin: Sistemas de Tiempo Real

Se utilizan para sistemas de control industrial, centrales telefnicas, instrumentacin cientfica. Por lo general tienen una interfaz con el usuario limitada o no tienen utilitarios. Su fortaleza consiste en administrar los recursos de la computadora, de modo de ejecutar una operacin en particular en la misma cantidad de tiempo cada vez que ocurre el evento que la dispara. Concepto event-driven. En el tipo de aplicaciones que resuelven estos sistemas operativos, si una parte se mueve mas rpido solo porque los recursos estn disponibles puede generar resultados tan catastrficos como si no se mueve porque el recurso est ocupado. Ejemplos: QNX, RT-Linux.

Clasificacin: Monotarea - Monousuario

Estn preparados para ejecutar slo una tarea a la vez. No puede ejecutar mas de una tarea en forma concurrente Interfaz para un slo usuario, (una sola sesin de trabajo) Transfiere el control de la mquina a la aplicacin que va ejecutarse, y slo interviene a demanda de esta mediante alguna llamada a los servicios de su kernel, o cuando la aplicacin finaliza y devuelve el control. Ejemplo: MS-DOS, CPM/86, algunas versiones de Palm OS

Clasificacin de Multitarea - Monousuario

Interfaz para un usuario, pero pueden mantener en memoria mltiples aplicaciones en forma estable y dentro de un entorno de proteccin. Es habitual descargar correo electrnico de Internet o bajar un archivo extenso durante minutos mientras se trabaja en la redaccin de un documento, o en la escritura de un programa de aplicacin, y hasta se chequea el estado de una unidad de disco, y se realizar un backup de informacin ... todo a la vez. Ejemplos: Windows XP, Windows NT WorkStation, Windows 2000, Cualquier UNIX corriendo en monousuario.

Clasificacin: Multiusuario

Esta es la forma mas avanzada de los Sistemas Operativos, y que prim en los Sistemas pioneros. La falta de capacidad del hardware de por entonces (1969) hizo que se implementasen versiones mas simplificadas para usuarios individuales. Aqu la interfaz de usuario soporta mltiples sesiones. Esto por extensin implica que tiene capacidades de Sistema Multitarea. Estos Sistemas son los mas poderosos y normalmente los mas eficientes: MVS, UNIX. Microsoft tiene versiones similares, Windows 2003 Server entre otras.

Funciones de un Sistema Operativo

Gestin del procesador

Gestin del tiempo de procesamiento para cada tarea (scheduling de procesos) Asignacin de memoria RAM para las aplicaciones aplicando criterios basados en la MMU del procesador Gestin de la Memoria Virtual Gestin de la Memoria Cache

Gestin de la Memoria

Funciones de un Sistema Operativo (2)

Gestin de los dispositivos de E/S

Acceso al hardware de manera transparente para las aplicaciones. Manejo de la concurrencia de acceso en sistemas multiusuario/multitarea especialmente. File Systems en los medios masivos de almacenamiento: discos rgidos, CD-ROM's. DVD's.

Gestin del storage

Funciones de un Sistema Operativo (3)

Interfaz para las aplicaciones


System Call's En los multitarea se manejan mediante este subsistema, los diferentes niveles de privilegio que posea el Sistema Operativo (y que dependen del procesador utilizado en el sistema) Menejo de interfaces sencillas para usuarios no expertos: GUI, Texto, Combinacin de ambas.

Interfaz para los usuarios

Seguridad

Scheduler Preemtivo o Cooperativo

Scheduler Preemptivo

Esto significa que una tarea puede ser interrumpida por otra de mayor prioridad, en cualquier momento y luego continuar su ejecucin. Cuando una tarea tiene la ejecucin otra tarea de mayor prioridad slo puede tomar el control del CPU en determinados momentos.

Scheduler Cooperativo

Modelo derivado de las funciones

Modelo derivado de las funciones


Hardware Kernel Capa de interfaz para acceso a los servicios del S.O. Aplicaciones

Caso prctico: Linux


Sistema Operativo UNIX-like Basado en POSIX (Portable OS based on UNIX) Kernel monoltico (programa nico + mdulos) Diseado bajo el concepto Lightweight Processes (LWP) Preemptive Kernel

La versin 2.6 (al igual que Solaris 2.x y MAC 3.0) son full preemptive

Caso prctico: Linux (2)


Soporta SMP (Symetric MultiProcessing). Soporta varios File Systems (EXT2, EXT3, IBM AIX, SGI Irix, FAT 32, NTFS, Raiser, entre otros). Puede ser muy pequeo. Se puede ajusta a un floppy 31/2. Puede ejecutarse un web server o un proxy server basado en Linux en una PC basada en 80386. Es libre. Se puede instalar y modificar su cdigo son otra limitacin que el hardware. Versiones. Son tres nmeros separados por puntos.

El Kenel

Es el principal programa del S.O. Actualmente soportado por las siguientes arquitecturas:

ARM (ARM based Computers) Alpha (Compaq) IA32 e IA64-Itanium (Intel) Familia 68000 (Motorola) S390 (IBM) Power PC, Power PC 64 (IBM) Sparc (Sun)

El Kernel (2)

Aprovecha las capacidades del hardware

Maneja el acceso a los recursos de hardware especficos. A travs de Device Drivers. Provee servicios de acceso al hardware a los programas de usuarios.

Es reentrante: Mltiples procesos acceden al kernel de manera simultnea. Maneja niveles de proteccin

Ejecucin en modo kernel Ejecucin en modo User Maneja Stacks separados.

El Kernel (3)

GDT en Linux

Hay una GDT por procesador. Hay un arreglo denominado cpu_gdt_table que contiene a estas GDT's. 18 Descriptores en uso:

__KERNEL_CS, __KERNEL_DS __USER_CS, USER_DS 1 TSS, 1 LDT 3 Thread-Local Storage 3 Advanced Power Management 5 Plug and Play BIOS 1 TSS especial (Double Fault)

GDT en Linux (2)

Segmentacin basada en el modelo flat.

Descriptores de TSS

Una TSS por cada procesador No usa Task Switch a travs del procesador TSS para:

El stack de PL=0 cuando sube el nivel de privilegio de una tarea (ya sea por llamada al kernel, o por entrada de una interrupcin). Un programa que corre en modo user, ejecuta IN o OUT, se consulta el par de flags IOPL en EFLAGS y el IO Map del TSS.

Descriptor LDT

Una genrica compartida por todos los procesos. El Kernel de linux no usa LDT.

Contiene un descriptor NULL Direccin base: Se almacena en la variables default_ldt. Lmite 7. Los procesos pueden crear su propia LDT mediante una funcin especial del kernel: modify_ldt().

Descriptores APM y PnP

Segmentos para Advanced Power Management (APM): El Cdigo del BIOS usa estos segmentos, de modo que cuando el driver APM de Linux invoca funciones del BIOS para obtener el estado o configurar un dispositivo APM, usar estos segmentos de cdigo y datos. Segmentos para servicios Plug and Play (PnP) del BIOS. Como en el caso previo, el cdigo del BIOS utiliza estos segmentos, de modo que cuando un driver PnP de Linux invoque funciones del BIOS para detectar recursos utilizados por dispositivos PnP, usar estos segmentos de cdigo y datos.

Descriptores TLS

Segmentos Thread-Local Storage (TLS): Mecanismo que permite a las aplicaciones que hagan multithreading usar hasta tres segmentos conteniendo datos locales para cada thread. Las system call's set_thread_area() y get_thread_area(), crean y liberan respectivamente un segmento TLS para el proceso en ejecucin.

Proceso

Instancia de un programa en ejecucin, o un contexto de ejecucin.

Tiene un espacio de direccionamiento determinado (direcciones de memoria que tienen permitidas para acceder). Normalmente trabajan en modo usuario. Cuando requieren servicios del kernel, cambia a modo kernel. Una vez resuelto el requerimiento regresan a modo usuario.

El kernel hace que cada proceso vea una CPU dedicada. Es un administrador de procesos.

Proceso (2)

Existe un grupo de programas privilegiados llamados kernel threads.

Corren en modo Kernel en el espacio de direccionamiento del Kernel. No interactan con el usuario. No tienen terminal asociada. Se crean durante el arranque del sistema y finalizan con su cierre.

Proceso (3): ps -ef | more


guri:~#psef|more UIDPIDPPIDCSTIMETTYTIMECMD root100Aug26?00:00:00init[2] root200Aug26?00:00:00[kthreadd] root320Aug26?00:00:00[migration/0] root420Aug26?00:00:00[ksoftirqd/0] root520Aug26?00:00:00[watchdog/0] root920Aug26?00:00:00[events/0] root1120Aug26?00:00:00[khelper] root4420Aug26?00:00:00[kblockd/0] root4720Aug26?00:00:00[kacpid] root4820Aug26?00:00:00[kacpi_notify] root13020Aug26?00:00:00[kseriod] root17120Aug26?00:00:00[pdflush] root17220Aug26?00:00:00[pdflush]

Proceso (4)

El Kernel debe saber para cada proceso:


La prioridad. El estado. El espacio de direcciones asignado. Los archivos abiertos y en acceso. El Kernel define un tipo de dato struc task_struc: task_t. El kernel define un array de estas estructuras denominado task_array.

Descriptores de Proceso, estructura task_struc:


Proceso (5)

Parentesco entre procesos

Los procesos pueden crear copias de si mismos -> child's. Los child's comparten el espacio de memoria de los padres. Pero conservan independencia en los datos. Si un proceso modifica un dato el resto conserva su propia copia y no ve la modificacin. A esto se lo denomina copy on write

Proceso (6): ps -ejH | more


guri:~#psejH|more PIDPGIDSIDTTYTIMECMD 200?00:00:00kthreadd 300?00:00:00migration/0 400?00:00:00ksoftirqd/0 377400?00:00:00events/1 111?00:00:00init 930930930?00:00:00udevd 189718971897?00:00:00portmap 272527252725?00:00:00inetd 288428842884?00:00:00kdm 288728872887tty700:03:16Xorg 289528842884?00:00:00kdm 295329532953?00:00:00startkde 299129912991?00:00:00sshagent 303929532953?00:00:00kwrapper 289928992899tty100:00:00getty 302730273027?00:00:00kdeinit 303230273027?00:00:00klauncher 306230273027?00:00:04konsole 306530653065pts/000:00:00bash 362836283065pts/000:00:00su 363036303065pts/000:00:00bash

Threads

El enfoque parent-childs, permite crear flujos paralelos de ejecucin. Fue el inicio de computacin paralela en los sistemas operativos antiguos. Los sistemas operativos modernos, introducen el concepto de Multithreaded Applications.

Hilos de procesamiento en paralelo que compartan no lo el cdigo sino las reas de datos. Son procesos mas livianos, denominados Threads (hilos). POSIX Threads, los estandariza. pthread es la librera que contiene su implementacin para generar aplicaciones Multithreading.

Threads (2)

Hasta el kernel 2.4 inclusive la implementacin no era 100% POSIX compatible. A partir de la implementacin 2.6, se lleva el modelo al standard.

Se manejan desde el scheduler como procesos independientes. Se conserva su agrupacin como un nico proceso a efectos de las system call's globales, como por ejemplo getpid(), exit(), kill(), entre otras. Pero si un thread queda bloqueado como consecuencia de llamar a una funcin bloqueante, el resto sigue trabajando normalmente. El kernel 2.6 maneja threads, como las versiones de Windows: NT, 2000, 2003 Server, XP o Vista.

Descriptor de procesos

Tiene por objeto darle al Sistema Operativo la visin clara de que est haciendo el proceso. Definido en la declaracin de task_struct. Dada la complejidad de esta estructura algunos campos son referencias a otras estructuras como la tabla de file descriptor's del proceso.

vi /usr/src/linux-[versin]/includes/linux/sched.h

Identificacin de un proceso

Cada proceso tiene un Descriptor que lo define unvocamente. Los punteros a los descriptores de proceso sirven para identificarlos. Son nmeros de 32 bits. Los UNIX identifican a los procesos son un Process ID (PID). Los PID van desde 0 a 32767. El Process ID corresponde al campo PID en el descriptor de proceso (task_struct)

Estados de un proceso

Corresponden al campo state de task_struct. Valores posibles (flags) Para setear el estado de un proceso el kernel usa las macros set_task_state o set_current_state. Los estados posibles son:

TASK_RUNNING: El valor del campo state es 0, el proceso est en ejecucin en alguna CPU o esperando para ser ejecutado. TASK_INTERRUPTIBLE: El valor del campo state es 1, el proceso est suspendido hasta que se produzca una determinada condicin que los vuelva a TASK_RUNNING; como por ejemplo una Interrupcin, liberacin de un recurso o una seal.

Estado de un proceso (2)

Los estados posibles son (continuacin):

TASK_UNINTERRUPTIBLE: El valor del campo state es 2, es similar al anterior con la diferencia que la llegada de una seal no lo pone en TASK_RUNNING. TASK_STOPPED: El valor del campo state es 4, el proceso ha sido detenido como consecuencia de la recepcin de seales como SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOUT. TASK_TRACED: El valor del campo state es 8, el proceso ha sido detenido por un debugger. El debugger lanz el proceso utilizando ptrace().

Estado de un proceso (3)

Los estados posibles son (continuacin):

EXIT_ZOMBIE: El valor del campo state es 16, el proceso termin su ejecucin pero el proceso padre no ejecut la System Call wait4() o waitpid(), para recuperar informacin del proceso finalizado. El sistema no puede descartar el proceso, ni libera sus recursos hasta que se ejecuten alguna de las System Call citadas. EXIT_DEAD: El valor del campo state es 32, es el estado final de un proceso y est siendo liberado por el sistema, como consecuencia que el proceso padre ejecut la system call wait4() o waitpid().

Lista de Procesos

Task array: Lista doblemente enlazada de punteros a estructuras de tipo task_struct. La cantidad de elementos se guarda en la variable N_TASKS. El campo PID es el ndice de este arreglo. Los campos prev_task y next_task de los descriptores de procesos (task_struct), vinculan los elementos. El primer elemento es el puntero a task_struct del proceso cero llamado swapper.

Lista doblemente enlazadas

Linux utiliza numerosas listas doblemente enlazadas. Buscando un estilo de programacin homogneo se define la siguiente estructura genrica:

Struct list_head {

Struct list_head *next, *prev;

};

La misma se encuentra en el archivo /usr/src/linux[versin]/includes/linux/list.h

Lista de procesos en ejecucin

Por una cuestin de eficiencia, el kernel mantiene una lista separa de los procesos que estn en estado TASK_RUNNING. La variable nr_running mantiene la cantidad de procesos en este estado. Hasta la versin 2.4 el kernel manejaba una lista llamada runqueue.

Lista de procesos en ejecucin (2)

El campo run_list de task_struct es una estructura de tipo list_head para implementar esta lista. La lista est encabezada por init_task (descriptor de proceso del proceso cero o swapper). Funciones:

add_to_runqueue(): Inserta un proceso a la lista del_from_runqueue(): Remueve un proceso de la lista move_first_runqueue(): Mueve un proceso al principio de la lista. move_last_runqueue(): Mueve un proceso al final de la lista.

Lista de procesos en ejecucin (3)

A partir del kernel 2.6, se implementa con algunas diferencias. No hay mas una nica lista, sino una lista por cada valor de prioridad. (runqueue ahora es una lista de listas) Existen 140 valores de prioridad almacenables en una variable k (de 0 a 139). => hasta 140 listas de procesos. El campo run_list de task_struct apunta a una estructura de tipo list_head que ahora corresponde a la lista de procesos con prioridad k.

Parentesco entre procesos

En el descriptor de procesos se dispone de los siguientes campos para reflejar parentesco


p_opptr (original parent) p_pptr (parent) p_cptr (child) p_ysptr (younger sibling) p_osptr (older sibling)

Вам также может понравиться