Está en la página 1de 18

SISTEMAS OPERATIVOS INTRODUCCIN

2004

PRCTICOS

1.-Cules son las dos funciones principales de un Sistema Operativo? ADMINISTRACION DE TRABAJOS Cuando existen varios programas en espera de ser procesados, el sistema operativo debe decidir el orden de procesamiento de ellos, as como asignar los recursos necesarios para su proceso. ADMINISTRACION DE RECURSOS Mediante est funcin el sistema operativo esta en capacidad de distribuir en forma adecuada y en el momento oportuno los diferentes recursos (memoria, dispositivos, etc.,...) entre los diversos programas que se encuentran en proceso, para esto, lleva un registro que le permite conocer que recursos estn disponibles y cuales estn siendo utilizados, por cuanto tiempo y por quien, etc. CONTROL DE OPERACIONES DE ENTRADA Y SALIDA Mediante esta actividad el sistema operativo decide que proceso har uso del recurso, durante cunto tiempo y en que momento. ADMINISTRACION DE LA MEMORIA Supervisa que reas de memoria estn en uso y cual estn libre, determina cuanta memoria asignar a un proceso y en que momento, adems libera la memoria cuando ya no es requerida para el proceso. 2.-Qu es la multiprogramacin? Ejecucin de mltiples tareas compartiendo los recursos de una misma computadora. Se trata de una evolucin del procesamiento por lotes. Dentro de la multiprogramacin se encuentra el concepto de tiempo compartido, en donde cada usuario tiene acceso a una nica computadora a travs de terminales. La computadora central se simula ejecutar en simultneo las tareas de cada usuario 3.-Cuanta RAM de video se necesita para una terminal modo texto de 80x25 (columnas, lineas)? 4000 bytes de RAM de vdeo 4.-Cuanta para una pantalla grafica de 1024x768 con 24 bits de profundidad de color? 2MB de RAM nicamente para contener la imagen. 5.-En 1980 el costo de la memoria era de u$s5/KB, ?Cuanto cuesta en la actualidad? Memoria Ram 1gb Ddr Pc2100 Pc2700 $295 Memoria Udimm Ddr3 1333mhz 4gb Adata $349 Memoria Ram Ddr3 8gb Pc3-10600 1333mhz $870 Memoria Udimm Ddr2 667mhz 2gb Adata $399 6.-Cules de las siguientes instrucciones deberan permitirse en modo kernel? 1. Deshabilitar todas las interrupciones 2. Leer el Reloj de Tiempo Real (RTC) 3. Escribir el RTC 4. Cambiar el mapa de memoria

7.-Un microprocesador tiene un pipeline de 4 etapas. Todas las etapas demoran 1nseg en procesar. Cuntas instrucciones por segundo (IPS, KIPS, MIPS) puede ejecutar este micro? Los microprocesadores de 8 y 16 bits han sido medidos con KIPS(kiloinstrucciones por segundo), que equivale a 0'001 MIPS. El primermicroprocesador de propsito general, el Intel 8080 ejecutaba 640KIPS. El Intel 8086 (16 bits), el primer microprocesador usado en PC,800 KIPS. El Pentium 4 llega aproximadamente a 1'700 MIPS.Los PC actuales realizan un mximo de 18.000 millones deoperaciones lgicas por segundo. Si se ejecutan 6 instrucciones porciclo y hay 3.000 millones de ciclos por segundo, se tienen 18.000MIPS 8.-La MMU normalmente compara la direccion virtual entrante con el Registro Limite, provocando una excepcion cuando la primera se excede. Un dise#o alternativo consiste en primero sumar la direccion virtual al Registro Base y despues comparar el resultado con la direccion fisica del Registro Limite. ?Son equivalentes estos metodos? ?Son equivalentes en velocidad? No, Kernel debe coordinarse con el hardware traduccin direcciones virtuales a fsicas. 9.-Cuando un programa de usuario efectua un SysCall para leer o escribir un archivo en disco, este provee el archivo necesita, un puntero a un buffer de datos y la cantidad de datos. Entonces, el control pasa al SO, el que llama al driver apropiado. Supongamos que el driver le da la orden al disco y termina cuando llega una interrupcion. En caso de una lectura, obviamente el programa que llamo tiene que permanecer bloqueado (pues no hay datos). ?Es lo mismo para una escritura a disco?, es decir, ?Necesita bloquear el programa que pidio la escritura hasta que se complete la transferencia? De condiciones de falla para cada uno de los SysCall que siguen: fork(), exec() y unlink(). Exec()= Retornan -1 si hay error. Si se ejecuta con xito no devuelve ningn valor dado que el cdigo de programa se sustituye por el del nuevo programa y se eliminan todas las variables del programa. fork()= fork causa la creacin de un nuevo proceso copia (casi exacta) del proceso padre. RETORNO si la llamada tiene xito retorna: al proceso hijo pid del hijo al proceso padre si fracasa devuelve -1 unlink()= Borra una entrada en la tabla de un directorio. pathname representa un fichero ya existente cuya entrada se quiere borrar. Si se elimina la ltima entrada existente en algn directorio que hace referencia a un i-nodo concreto el sistema elimina el fichero de ese i-nodo. RETORNO Retorna 0 si no hay error y -1 si hay algn error. 10.-Puede la siguiente llamada a sistema retornar en count un valor menor que nbytes? Explicar. count=write(fd, buffer, nbytes) 11.-Indique la diferencia esencial entre un dispositivo de caracteres y uno de bloques. Cada tipo de dispositivo en el sistema Linux se comunica con la aplicacin en una de las formas siguientes: carcter por carcter o como un conjunto de datos en un bloque de tamao predefinido. Las terminales, impresoras y mdems asncronos son dispositivos modo carcter. Cuando se usa el modo caracter se enva uno a la vez y hace eco en la otra terminal. Los manejadores (device drivers) de disco duro y la mayora de manejadores, usan el modo bloque, porque este es el camino ms rpido para enviar o recibir grandes cantidades de informacin. 12.- Tome un *nix personal (Linux, OpenBSD, MINIX, Darwin, etc.) que pueda romper sin problemas. Escriba un shell script que intente crear un nmero ilimitado de procesos hijos y observe lo que sucede. Nota: no intente esto en un laboratorio de acceso pblico.

13.- El comando strace da un registro (traza) de todas las SysCalls que llama el comando que le sigue. Obtenga las trazas de los siguientes comandos, tratando de identificar todos los SysCalls que producen (el comando man puede ayudar). 1. strace cat /etc/hosts 2. strace cat (CTRL-D puede ayudar a terminar) 3. strace echo 1 4. strace mozilla (busquese una silla comoda) Intente identificar patrones comunes que correspondan a cdigos de inicializacin y terminacin de procesos.

SISTEMAS OPERATIVOS 2004 - PRCTICOS PROCESOS


Procesos e Hilos 1.-Por qu un hilo dejara voluntariamente la CPU puede que se quede sin CPU para siempre? 2.-En un sistema con hilos, ?hay un solo stack por hilo o un stack por proceso cuando se usan hilos en espacio de usuario? Y si se usan hilos a nivel de kernel? el ncleo mantiene una tabla de threads que sigue la pista de todos los threads en el sistema. Cuando un thread desea crear un nuevo thread o destruir uno que ya existe, hace una llamada al ncleo, que es el que se encarga efectivamente de su creacin o destruccin actualizando la tabla de threads del sistema. 3.- Para el siguiente programa decidir que valores se pueden imprimir.

Pensar en el mismo codigo, solo que en vez de procesos tenemos hilos. Se pueden imprimir a, *ptr_b Condiciones de Carrera 4.- Dado el siguiente par de procesos que insertan datos en el spooler de impresion, donde cola es un espacio de memoria compartida y libre es una variable local a cada proceso.

Dar una planificacion o escenario que produce la perdida de un trabajo. Dar una planificacion o escenario que funciona correctamente. Cuantas planificaciones existen para estas 3+3 lineas de codigo? ?Cuantas son correctas y cuantas producen problemas? (determine el %) 5.- Se tienen 2 procesos P0 y P1, P0 con N acciones atmicas y P1 con M acciones atmicas. Calcular cuntos escenarios posibles de ejecucin se pueden dar en un entorno concurrente. 6.- Considere los procesos P0 y P1, con un valor inicial de x=0. Cules son los valores finales de x?

Si ahora consideramos que x:=x+1 no es atmico a nivel de ensamblador y se compila en una secuencia de accesos a memoria y operaciones de la ALU, equivalentes al siguiente multiprograma. Cules son los valores finales de x?

Regiones Crticas 7.-Mostrar que agregando un re-testeo de lock=0 luego del busy waiting en metodo de la variable candado, no soluciona nada. 8.- Mostrar que en alternancia estricta el proceso P0 puede impedir al P1 entrar a la CS aunque P0 este fuera de ella. 9.- Deshabilitar interrupciones no funciona para regiones criticas anidadas (una dentro de la otra). Reescribir Begin/EndRegion para arreglar este problema. 10.- Generalizar la alternancia estricta a 3 procesos. Generalizarla a n. 11.- Demostrar de manera rigurosa que el algoritmo de Peterson no adolece del problema de progreso de la alternancia estricta. 12.- {Dificil} Demostrar de manera rigurosa que el algoritmo de Peterson cumple con la propiedad de seguridad de la Region Critica (#proc_in_cs1).

13.- Sigue cumpliendo con la propiedad de seguridad el algoritmo de Peterson si intercambiamos las 2 primeras asignaciones de su BeginRegion? Demostrar o dar contraejemplo. 14.- Implementar un spin lock con TestInc.

15.- Implementar un spin lock con Swap.

Primitivas de sincronizacion 16.- Dados 3 procesos P0, P1 y P2 que realizan las acciones A0, A1 y A2, poner P's y V's de semaforos antes y despues de las acciones para sincrinizarlos de manera tal que se ejecuten en secuencia A0,A1,A2. Especificar el/los valor/es inicial/es de el/los semaforo/s. 17.- Implementar utilizando semaforos la Region Critica N-1, es decir dentro de la region critica puede haber a lo mas N-1 procesos. 18.- {Dificil} Implemente semaforos generales (el semaforo almacena valores arbitrarios) usando semaforos binarios (solo pueden valer 0 o 1). 19.- Implementar semaforos utilizando monitores. 20.- {Dificil} La sincronizacion en monitores usa variables de condicion y dos operaciones especiales, wait y signal. Una forma mas general de sincronizacion son las esperas por condiciones con auto-sealizacion, donde escribimos await CondicionBooleana para bloquear el proceso hasta que la condicion se cumpla. Por ejemplo el BeginWrite del problema de lectores y escritores se resume a escribir await nr=0nw=0 dentro del monitor Claramente este esquema es mas general y abstracto que los monitores de Hoare y BrinchHansen, pero no se usan. ?Por que? Ayuda: pensar en la implementacion. 21.- {Mediano} El problema de lectores y escritores puede ser formulado de varias formas respecto a cuando cada categoria de procesos puede empezar. De manera cuidadosa describa 3 variaciones distintas del problema, cada una favoreciendo (o desfavoreciendo) alguna categoria de procesos. Para cada variacion, especifique que sucede cuando un lector o escritor esta listo para acceder a la base de datos y que sucede cuando un proceso ha terminado de usar la base de datos. 22.- Tenemos un Bao Unisex donde puede haber de manera excluyente varones y mujeres. Mediante semaforos sincronice la entrada y la salida del bao por parte de varones y mujeres (EntraVaron, SaleVaron, EntraMujer, SaleMujer) de manera que se cumpla con el invariante nv=0 nm=0, es decir que no se mezclen. Este problema clasico de sincronizacion tambien se conoce con el nombre de problema del Puente de Una Via, y modela el acceso a un recurso que puede ser compartido por muchos procesos de un tipo o (excluyente) de otro.

23.- Los planificadores RR mantienen una lista de todos los procesos listos para correr, donde cada proceso aparece exactamente una vez. ?Que pasaria si hubiera 2 o mas apariciones de un proceso en la lista de procesos para correr? ?Para que serviria? 24.- ?Se podra "medir" si un proceso es IO-bound o CPU-bound analizando el codigo fuente? (analisis estatico) ?Como se podria determinar en tiempo de ejecucion? (analisis dinamico) 25.- Mediciones realizadas en un sistema muestran que en promedio un proceso corre por T tiempo antes de bloquearse en I/O. Un cambio de proceso requiere de un tiempo S, denominado overhead (sobrecarga). Para un planificador RR con un quanto Q, dar una formula que mida la eficiencia de la CPU (tiempo usado en CPU/tiempo total) para los siguientes casos. 1. 2. 3. 4. 5. Q = infinito Q>T S<Q<T Q=S Q casi 0

26.- El planificador SPN (shortest process next) necesita de una medida de estimacion del tiempo de computo. Con un "factor de memoria" =1/2, donde los ultimos tiempos de corrida fueron: 40, 20, 40 y 15 msec. ?Cual es la estimacion del tiempo siguiente? 27.- Dar un conjunto de procesos con sus tiempos de arribo y sus tiempos de uso de CPU, que muestren que SJF!=SRTN (shortest job first, shortest remaining time next). 28.- Completar la tabla para las siguientes politicas de planificacion: FCFS, SJN, SRTN, RR (Q=1), RR (Q=5).

LAB1: OBSERVANDO EL COMPORTAMIENTO DE LINUX


Objetivos
Iniciar los laboratorios con un proyecto sencillo, donde se muestre como a travs del sistema de archivos virtual /proc de Linux, podemos inspeccionar informacin interna del kernel. Se deber generar la utilidad ksamp que muestra de diversas formas algn subconjunto de la informacin disponible en /proc.

Introduccin
Podemos pensar el kernel de Linux como una coleccin de funciones y estructuras de datos. Estas estructuras de datos (o variables de kernel) contienen la visin del kernel respecto al estado del sistema, donde cada interrupcin, cada llamada al sistema, cada fallo de proteccin hacen que este estado cambie. Inspeccionando las variables del kernel podemos obtener informacin relevante a los procesos, interrupciones, dispositivos, sistemas de archivos, capacidades del hardware, etc. Muchas variables conforman el estado del kernel y estas pueden estar alojadas de manera esttica o dinmica en un stack frame de la memoria del kernel. Dado que el kernel de Linux es un programa "C" de cdigo abierto, es posible inspeccionar el cdigo fuente y encontrar algunos ejemplos relevantes de estas variables como por ejemplo xtime definido en include/linux/sched.h que mantiene la hora del sistema, la estructura task_struct definida en include/linux/sched.h que contiene la descripcin completa de un proceso, o los valores nr_threads y nr_running definidos en kernel/fork.c los cuales indican cuantos procesos existen y cuantos de estos estn corriendo. El cdigo fuente de Linux lo podemos encontrar en el directorio /usr/src/linux de la mayora de las distribuciones, pero tambin existen pginas donde podemos navegar el cdigo de varias versiones de kernel, como por ejemplo Linux Cross Reference. Tambin existen utilidades para navegacin de cdigo local como Source Navigator.

Tareas
Parte A Buscar informacin acerca de la estructura del directorio /proc, y averiguar los siguientes datos

Cuantos procesos se crearon desde que inici el sistema. Tipo y modelo de CPU.

Versin del kernel.

Tiempo en das, horas, minutos y segundos que han transurrido desde que se inici el sistema operativo.

Cuanta memoria tiene y cuanta est disponible.

Cuantos cambios de contexto han sucedido.

Parte B Escriba una versin inicial del programa que inspeccione las variables del kernel a travs del /proc e informe por stdout:

Tipo y modelo de CPU. Versin de Kernel.

Cantidad de tiempo transcurrido desde que se inici el sistema operativo, con el formato ddD hh:mm:ss.

Tambin se pide incluir una cabecera donde se indique el nombre de la mquina y la fecha y hora actuales. Parte C Escriba una segunda versin del programa que imprima la misma informacin que la versin por defecto, pero en caso de invocarse con la opcin -s, agrega la siguiente informacin:

Cantidad de tiempo de CPU utilizado para usuarios, sistema y proceso idle. Cantidad de cambios de contexto. Fecha y hora cuando el sistema fue iniciado. Nmero de procesos creados desde el inicio del sistema.

Parte D La tercera parte involucra imprimir todo lo de las versiones anteriores, pero cuando se invoca con la opcin -l interval duration imprime adems:

Nmero de peticiones a disco realizadas. Cantidad de memoria configurada en el hardware. Cantidad de memoria disponible. Lista de los promedios de carga de 1 minuto.

Asi por ejemplo ksamp -l 2 100 mostrar el promedio de carga de 1 minuto por 100 segundos tomando muestras en intervalos de 2 segundos.

Cmo atacar los problemas


La pgina del manual de Linux man 5 proc contiene suficiente informacin al respecto, tambin se pueden ver artculos de la revista Linux Magazine " An Overview of the Proc Filesystem" o The Official Red Hat Linux Reference Guide en su captulo "The /proc Filesystem". En general basta con realizar una bsqueda de "/proc filesystem" en cualquier buscador de la Web para encontrar informacin en cualquier idioma. Una vez encontrados los archivos de /proc donde est la informacin, es necesario abrirlos, leer la informacin y cerrarlos. Esto se puede lograr con las funciones de la biblioteca "C" fopen, fgets (o fscanf) y fclose. Un ejemplo de uso sera el siguiente.

Para facilitar el proceso de lectura y anlisis de los archivos, les facilitamos un TAD para hacer lexing (separacin de la entrada en tokens, es decir elementos como palabras, nmeros, simbolos, espacios en blanco). Pueden usarlo en su proyecto tal como est, y les aconsejamos hacerlo as no pierden tiempo en este aspecto del proyecto. El fuente del TAD lo pusimos en un paquete Lexer.tar.gz. Para leer los argumentos de entrada e interpretarlos (proceso de parsing) hay que hacer uso de las variables int argc y char *argv[]. La primera indica cuantos argumentos se pasaron y argv es el arreglo de tamao argc con cada uno de las cadenas de los argumentos. Notar que como el propio comando se incluye en la lista de argumentos una llamada ksamp -l 10 100 implica que al inicio del main se cumple {argc=4 & argv[]={"ksamp", "-l", "10", "100"}}. Pueden utilizar la funcin getopt de la glibc para no volver a inventar la rueda. Pueden encontrar informacin en man 3 getopt o bien en las Infopages invocando pinfo libc y buscado este tema. Este ltimo comando muestra la GNU C Library reference manual. El ejemplo anterior resulta sencillo en cuanto a que no tenemos que "interpretar" la secuencia de caracteres, slo la tomamos y la imprimimos. Sin embargo, muchos de los parmetros que se necesitan imprimir requieren de cierto tratamiento. Este proceso de transformar una secuencia de caracteres en alguna representacin ms adecuada para su tratamiento se denomina parsing. Por ejemplo el tiempo transcurrido desde que el sistema inici se expresa en segundos, y se encuentra en cierta parte del archivo. Entonces tenemos que extraerlo y convertirlo a un entero sin signo. Cuando ya tenemos un entero sin signo, resulta sencillo operar matemticamente y generar una secuencia de caracteres (imprimir) con el formato adecuado. Esto ltimo se denomina pretty printing. Funciones como atoi y sus relacionadas pueden ser tiles. Tambin resulta til sscanf. Para obtener la fecha y hora que va en el encabezado del informe que brinda el programa, se pueden utilizar la funciones de la glibc gettimeofday y ctime, o bien leer el tiempo de inicio del sistema y sumarlo al transcurrido para luego convertirlo a fecha.

Cuando se necesite realizar las muestra del promedio de carga de 1 minuto, puede ser til la funcin sleep que duerme un proceso por un intervalo determinado de tiempo.

Qu se debe Entregar

Cdigo (funcionando bajo las especificaciones dadas y bajo cualquier caso de test de parametros de entrada) o Dividir en mdulos de manera juiciosa. o Estilo de cdigo. o Usar TADs, por ejemplo no estara mal un TAD que contenga toda la informacin que se quiere con mtodos para leer del kernel e imprimir en un filedescriptor los datos, o uno que contenga las opciones de la lnea de comandos y que acepte un mtodo para leerlas a partir de argc y argv. o Utilizar Makefile. Informe del desarrollo del proyecto

Tips
No intenten hacer todo de golpe, vayan de a partes, y sobre todo discutan, analicen y trabajen en ideas de forma grupal. Una hora pensando en papel libremente suele ahorrar muchos problemas en el momento de codificar. Utilicen debuggers de lnea de comandos como gdb o interfaces grficas para estos como ddd. Tambin pueden realizar compilacin condicional para hacer debugging de la siguente manera.

Deducir la entrada disk_io requiere un poco ms de trabajo que el resto de la informacin. Encuentren el manejo de /proc en kernels 2.4.x, analicen el cdigo fuente y deduzcan el significado de cada elemento. Pueden utilizar Linux Cross Reference.

Tareas Adicionales
Si les sobra tiempo pueden hacer las siguientes mejoras:

Algunos de las datos que se muestran involucran cantidades de memoria, y el valor que se puede leer en /proc est siempre expesado en bytes. Como leer cantidades como 64MB en bytes suele ser dificultoso, muchos programas incluyen la opcin -h

que significa "legible para humanos", que transforma las cantidades a una unidad correspondiente de manera que la cadena se mantenga acotada en tamao. Este programa puede ser muy til para monitorear la actividad de un servidor, pero resulta ms practico si se le agrega una opcin -d que bajo la opcin -l muestra el diferencial de los valores leidos para, por ejemplo, poder medir cuantos cambios de contexto se estn realizando por segundo. Este es un muy buen lugar para utilizar un TAD con los valores de muestra que acepte mtodos que calculen el diferencial entre muestras. Utilizar getopt de POSIX.2 para parsear la lnea de comandos. Comparar lo realizado con utilidades establecidas que realizan tareas similares, como por ejemplo procinfo.

LAB2: UN BAASH
Objetivos
1. Utilizar los mecanismos de concurrencia y comunicacin de gruesa granularidad que brinda UNIX. 2. Comprender como los interpretes de lnea de comando reflejan la arquitectura y estructura interna de stas primitivas de comunicacin y concurrencia. 3. Implementar de manera sencilla un intrprete de lnea de comandos (shell) al estilo de Bourne shell.

Introduccin
La interfaz ms tradicional de un sistema operativo UNIX-like (*NIX) es el intrprete de lnea de comandos. Este programa, que ejecuta en modo usuario, funciona en cualquier *NIX que soporte interface de caracteres y su funcin es aceptar comandos ingresados por entrada estandar (teclado), parsearlos, ejecutar la rden y mostrar el resultado en salida estandar (pantalla), para luego volver a repetir el proceso. Por defecto UNIX ejecuta un proceso shell cada vez que un usuario interactivo ingresa al sistema. Aunque esto puede ser configurado de otra manera (ver el ltimo campo de cada lnea del archivo /etc/passwd), en la mayora de los casos luego de ingresar nuestro nombre de usuario y contrasea, el proceso que maneja el ingreso de usuarios genera un proceso hijo que ejecuta un shell, con el uid/gid (identificador de usuario y grupo) correspondiente al usuario. En este momento la pantalla se suele presentar de la siguiente manera:

[juan@hal juan]$

Despus de este texto inicial llamado prompt, que contiene informacin de entorno como por ejemplo el nombre del usuario, el nombre del host y el ltimo tramo del directorio corriente, el shell espera datos a travs de la stdin que normalmente se asocia al dispositivo teclado. Podemos escribir el comando que deseamos que el shell ejecute, e iniciar la ejecucin ingresando el caracter NEWLINE '\n' generalmente asociado con la tecla Enter o Return.

[juan@hal 10

juan]$

sleep

Har que el shell ejecute un proceso con el programa binario que se encuentra en /bin/sleep, pasndole el argumento "10".

Operacin Bsica
La sintxis bsica del intrprete de comandos ms usual de *NIX, conocido como Bourne shell (Bourne again shell - bash, en Linux) es la siguiente,
comando argumento1 argumento2 ...

donde el comando y los argumentos son secuencias de caracteres separados por uno o ms espacios. La semntica dice que al presionar Enter el shell buscar el comando dentro de los comandos internos y si no lo encuentra tratar de buscar un archivo ejecutable con ese nombre, siguiendo las reglas de camino de *NIX o componiendo el comando a la secuencia de la variable de entorno PATH, para luego crear un proceso hijo que cargar y ejecutar el contenido de ese archivo con los argumentos correspondientes. Los comandos internos son manejados directamente por el shell, sin requerir de ningn archivo externo. Un ejemplo es el comando de cambio de directorio cd, el cual no se encuentra como archivo ejecutable en ningn lugar del rbol de directorio (el comando find /bin /sbin /usr/bin /usr/sbin -perm +400 -type f -name cd no devuelve nada). Con man builtin obtenemos una lista de todos los comandos internos implementados en bash. Si el comando no es un builtin, el shell deber buscar un archivo dentro de su sistema de archivos, cargarlo y ejecutarlo pasndole los argumentos. El problema principal es dnde buscar este archivo. Existen tres formas:

Camino absoluto Camino relativo Bsqueda en secuencia PATH

Cuando el comando comienza con /, este se toma como un camino absoluto dentro del rbol del filesystem, el shell cargar en memoria y ejecutar el comando. En cambio si el comando comienza con el nombre de un directorio, . o .., se debe seguir las reglas usuales de camino relativo de *NIX, cargar y ejecutar el archivo comando, relativo al camino actual (ver comando pwd). Otro mecanismo entra en juego cuando el comando no comienza con un delimitador de camino absoluto o relativo. La variable de entorno PATH, que puede ser leida con el comando env o con echo $PATH, sirve de secuencia de caminos absolutos o relativos, separados por ':' que sern prefijados a commando hasta encontrar un archivo que pueda ser ledo y ejecutado. Usemos el archivo ejecutable /bin/date que nos proporciona la fecha y hora del sistema para ejemplificar los mecanismos de camino absoluto, relativo y secuencia PATH.

[juan@hal juan]$ /bin/date Sun Aug 31 15:33:22 ART 2003 [juan@hal juan]$ cd /usr [juan@hal /usr]$ ../bin/date Sun Aug 31 15:33:57 ART 2003 [juan@hal /usr]$ cd / [juan@hal /]$ bin/date Sun Aug 31 15:34:24 ART 2003 [juan@hal /]$ cd ~ [juan@hal juan]$ date Sun Aug 31 15:35:02 ART 2003

Todos los comandos ejecutados por bash son el mismo /bin/date. Ejercicios 1. Cmo ejecutamos un archivo que se llama exactamente como un builtin? 2. Por qu las recomendaciones de seguridad indican que es peligroso tener ./ en PATH al ms puro estilo DOS? 3. Supongamos que existen 2 comandos posibles dentro de la secuencia que contien PATH, donde el primero en la secuencia no est marcado como ejecutable y el segundo si. Qu hace el intrprete bash, ejecuta el segundo o informa que el primero no tiene permiso de ejecucin? (incorporte esta semntica a baash) 4. Indique qu sucede cuando se tiene un directorio en el pwd actual con el mismo nombre que un archivo ejecutable en el PATH. Dice que no puede ejecutar un directorio o ejecuta el comando que encontr? (siga esta forma en baash)

5. Obtenga la lgica ms sencilla que unifique los tres tipos de bsqueda. 6. Podemos poner directorios relativos en PATH? (haga lo propio con baash)

Ejercicios
1. Investigue cuales son los comandos internos para manejo de procesos en background de bash cd, chdir, alias, set o export 2. En el ejemplo de arriba el operador '&' funciona como operador de composicin paralela. Cul es el operador de composicin secuencial en Bourne shell? 3. Investigue como bash forma el rbol de procesos cuando ejecutamos cmd1 & cmd2 & cmd3 & ... & cmdN. Piense la respuesta y luego utilice pstree para corroborarla. Aplique los resultados de su observacin a baash. 4. Indique cuantas letras 'a' debera imprimir el siguiente programa. Generalice.
fork(); fork(); fork(); printf("a");

LAB3: TADS SINCRONIZADOS


Objetivos

Comprender y utilizar los mecanismos de sincronizacin de granularidad fina que provee POSIX (PThreads). Solucionar problemas tpicos de concurrencia: condiciones de carrera, abrazos mortales, inhanicin, etc. Implementar TAD sincronizados.

Introduccin
En el Laboratorio anterior utilizamos las facilidades de concurrencia de gruesa granularidad de UNIX. Creamos y esperamos la finalizacin de procesos que se ejecutaban en espacios de memoria disjuntos, y donde slo se compartan los descriptores de archivos.

Esta concurrencia haca uso del concepto de proceso como unidad bsica de ejecucin, el cual brindaba la posibilidad de ejecutar una componente de un multiprograma en un espacio de memoria disjunto y a la vez protegido. Al no compartir memoria, los procesos efectuan su comunicacin utilizando alguna de las estructuras que s se comparten, como por ejemplo el sistema de archivos, y vimos cmo a travs de pipes podamos comunicar y sincronizar procesos. Un hilo o proceso liviano (ligthweight process - LWP) es otro de los posibles modelos de ejecucin de un multiprograma que proveen los sistemas operativos en general y *NIX en particular, y brinda otra posibilidad para realizar multiprogramacin. Esta segunda opcin existe para que el programador tenga la posibilidad de elegir una solucin de compromiso entre dos cualidades deseables: proteccin y eficiencia. Normalmente estos los hilos tienen vida dentro de los procesos, y podemos pensar en los procesos simples que utilizamos en el Lab2 como procesos que slo contienen un hilo de ejecucin interno. El problema reside en que un proceso maneja un estado relativamente grande, que involucra los registros del microprocesador, la pila de ejecucin, el mapa de memoria, los descriptores de archivos y tabla de manejadores de seal, con lo cual el nacimiento, la vida (cambios de contexto) y la muerte de los procesos, son operaciones que consumen muchos recursos de tiempo (cpu) y espacio (memoria). Los hilos en cambio, lo nico que no comparten son los registros del microprocesador y el espacio de la pila, por lo que las opearciones de creacin, cambio de contexto y muerte, resultan mucho ms econmicas. La comunicacin entre las componentes del multiprograma es otro factor que diferencia los procesos de los hilos. Mientras en los hilos es posible transferir informacin entre componentes simplemente leyendo y escribiendo en el espacio de memoria compartida, los procesos tienen que efectuar un secuencia de llamadas al ncleo, para poder completar la transferencia de informacin: espacio_de_usuario1, kernel, espacio_de_usuario_2, incurriendo no slo en sobrecarga por copia, sino tambin por cambios de niveles de proteccin. El sistema operativo Linux, incorpora procesos livianos en un modelo conocido uno-a-uno utilizando clone, la generalizacin del syscall fork. A cada hilo se le asocia un proceso, donde se comparte la memoria y los descriptores de archivos. Lamentablemente esta implementacin de procesos livianos, pierde algunas de las caractersticas esperables (LinuxThreads Frequently Asked Questions, Programacin utilizando C threads, FAQ de comp.programming.threads). Es muy interesante la discusin que se propone en "The Art of Unix Programming" en el captulo 7 "Multiprogramming", sobre todo en la subseccin "Threads Threat or Menace?", atacando abiertamente el uso de hilos en la multiprogramacin.

Ejercicios

Por qu no es posible compartir entre los hilos una variable declarada dentro del main()? Comprobarlo! Hay dos posibles causas para que el planificador no interrumpa x:=x+1, una puede ser simplemente que este hecho resulte altamente improbable y la segunda es que la compilacin genere una instruccin atmica a nivel del microprocesador. Investigue sobre este hecho en diversas arquitecturas. (Ayuda: con gcc -S generamos el cdigo ensamblador intermedio donde podemos corroborar este ltimo hecho, quienes estn interesados, se pueden perparar ms ejercicios). Modificar programTopology.c para que los incrementos no sean atmicos y comprobar que la asercin puede no cumplirse para ciertos interleavings. Por qu al activar las opciones de optimizacin de cdigo -O, el programa anterior podra dejar de producir los interleavings requeridos para que no valga el invariante, o para peor imprime constantemente 0. Intente reproducir estos resultados.