Practicas Servidores 2

download Practicas Servidores 2

of 31

Transcript of Practicas Servidores 2

  • 8/2/2019 Practicas Servidores 2

    1/31

    Prctico Introduccin

    Cuales son las dos funciones principales de un Sistema Operativo?

    GESTIN DE RECURSOS: control de discos duros, CDROM y DVD-ROM, gestin deperifricos (teclado, ratn, etc...), asignacin de cantidades de memoria, etc...

    GESTIN DE TAREAS: los SO actuales son multitarea, es decir, pueden realizar variastareas y ejecutar varios programas a la vez. As, mientras navegamospor Internet oescribimos una carta, el antivirus est vigilando por si se produce alg

    n ataque, o nuestromessenger est comprobando continuamente si alguno de nuestros contactos se ha conectado y nos ha enviado algn mensaje.

    Que es la multiprogramacin?

    Se denominamultiprogramacin a la tcnica que permite que dos oms procesos ocupen la misma unidad dememoriaprincipal y que seanejecutados al "mismo tiempo" (pseudo-paralelismo, en una nica CPU

    slo puede haber un proceso a la vez) en la unidad central de procesooCPU.

    Una de las razones por las que las Interfaces Graficas de Usuario(GUI) fueron adoptadas lentamente, fue por el costo del hardwarenecesario para soportarlas.

    Cuanta RAM de video se necesita para una terminal modo texto de80x25 (columnas, lineas)?

    4000 bytes de RAM de vdeo

    Cuanta para una pantalla grafica de 1024x768 con 24 bits deprofundidad de color?

    2MB de RAM nicamente para contener la imagen.Una pantalla conresolucin de 1600x1200 y una profundidad de color de 24 bits

    http://es.wikipedia.org/wiki/Memoria_de_ordenadorhttp://es.wikipedia.org/wiki/Memoria_de_ordenadorhttp://es.wikipedia.org/wiki/Memoria_de_ordenadorhttp://es.wikipedia.org/wiki/CPUhttp://es.wikipedia.org/wiki/CPUhttp://es.wikipedia.org/wiki/CPUhttp://es.wikipedia.org/wiki/CPUhttp://es.wikipedia.org/wiki/Memoria_de_ordenador
  • 8/2/2019 Practicas Servidores 2

    2/31

    requiere casi 6 MB de datos nicamente para la imagen esttica, sinincluir los datos que se representan la imagenEn 1980 el costo de la memoria era de u$s5/KB, Cuanto cuesta en laactualidad?

    Memoria Ram 1gb Ddr Pc2100 Pc2700 $295Memoria Udimm Ddr3 1333mhz 4gb Adata $349Memoria Ram Ddr3 8gb Pc3-10600 1333mhz $870Memoria Udimm Ddr2 667mhz 2gb Adata $399

    Cuales de las siguientes instrucciones deberian permitirse en modokernel?

    Deshabilitar todas las interrupciones

    Leer el Reloj de Tiempo Real (RTC)

    Escribir el RTC

    Cambiar el mapa de memoria

    Un microprocesador tiene un pipeline de 4 etapas. Todas las etapasdemoran 1nseg en procesar. Cuantas instrucciones por segundo(IPS, KIPS, MIPS) puede ejecutar este micro?

    Muchos 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 por

    ciclo y hay 3.000 millones de ciclos por segundo, se tienen 18.000MIPS.

    La MMU normalmente compara la direccion virtual entrante con elRegistro Limite, provocando una excepcion cuando la primera seexcede. Un diseo alternativo consiste en primero sumar la direccion

  • 8/2/2019 Practicas Servidores 2

    3/31

    virtual al Registro Base y despues comparar el resultado con ladireccion fsica del Registro Limite. Son equivalentes estos metodos?Son equivalentes en velocidad?

    No Kernel debe coordinarse con el hardware

    traduccin direccionesvirtuales a fsicas.

    Cuando un programa de usuario efectua un SysCall para leer oescribir un archivo en disco, este provee el archivo necesita, unpuntero a un buffer de datos y la cantidad de datos. Entonces, elcontrol pasa al SO, el que llama al driver apropiado. Supongamos queel driver le da la orden al disco y termina cuando llega unainterrupcion. En caso de una lectura, obviamente el programa quellamo tiene que permanecer bloqueado (pues no hay datos). Es lomismo para una escritura a disco?, es decir, Necesita bloquear elprograma que pidio la escritura hasta que se complete latransferencia?

    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 devuelveningn valor dado que el cdigo deprograma se sustituye por el del nuevo programa y se eliminan todaslas variables del programa.

    fork()= fork causa la creacin de un nuevo proceso copia (casi exacta)

    del proceso padre. RETORNO si lallamada tiene xito retorna: al proceso hijo pid del hijo al procesopadre si fracasa devuelve -1

    unlink()= Borra una entrada en la tabla de un directorio. pathnamerepresenta un fichero ya existente cuya entrada se quiere borrar. Si se

  • 8/2/2019 Practicas Servidores 2

    4/31

    elimina la ltima entrada existente en algn directorio que hacereferencia a un i-nodo concreto el sistema elimina el fichero de ese i-nodo. RETORNORetorna 0 si no hay error y -1 si hay

    algn error.

    Puede la siguente llamada a sistema retornar en count un valormenor que nbytes? Explicar.count = write(fd, buffer, nbytes)

    La llamada write escribe un nmero de bytes dado por count en elfichero cuyo file descriptor viene dado porfd. Los bytes a escribir deben encontrarse a partir de la posicin de

    memoria indicada en buf.

    Indique la diferencia escencial entre un dispositivo de caracteres y unode bloques.

    Un dispositivo decaracteres, eninformticaes un componentedelordenadorque secomunica con launidad central de proceso por mediodebytesindividuales.

    Ejemplos de dispositivos de caracteres sonimpresoras y teclados, quepermiten el manejo de un solo byte a la vez.

    Un dispositivo de bloques, en informtica, es un componentedel ordenadoren el que la comunicacin con la unidad central deproceso losdatosse transmiten en conjuntos indivisibles.

    Un ejemplo tpico de dispositivo de bloque es undisco duro, que estordenado internamente en sectores que tpicamente son de 512bytes,y al escribir o al leer del disco es necesario transferir esa cantidad deinformacin como conjunto.

    Laboratorio 2 :)

    Tome un *nix personal (Linux, OpenBSD, MINIX, Darwin, etc.) quepueda romper sin problemas. Escriba un shell script que intente crear

    http://es.wikipedia.org/wiki/Car%C3%A1cter_(tipo_de_dato)http://es.wikipedia.org/wiki/Car%C3%A1cter_(tipo_de_dato)http://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Transmisi%C3%B3n_de_datoshttp://es.wikipedia.org/wiki/Transmisi%C3%B3n_de_datoshttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Bytehttp://es.wikipedia.org/wiki/Bytehttp://es.wikipedia.org/wiki/Impresorahttp://es.wikipedia.org/wiki/Teclado_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Comunicaci%C3%B3nhttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Datohttp://es.wikipedia.org/wiki/Disco_durohttp://es.wikipedia.org/wiki/Bytehttp://es.wikipedia.org/wiki/Bytehttp://es.wikipedia.org/wiki/Disco_durohttp://es.wikipedia.org/wiki/Datohttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Comunicaci%C3%B3nhttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Teclado_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Impresorahttp://es.wikipedia.org/wiki/Bytehttp://es.wikipedia.org/wiki/Unidad_central_de_procesohttp://es.wikipedia.org/wiki/Transmisi%C3%B3n_de_datoshttp://es.wikipedia.org/wiki/Ordenadorhttp://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Car%C3%A1cter_(tipo_de_dato)
  • 8/2/2019 Practicas Servidores 2

    5/31

    un numero ilimitado de procesos hijos y observe lo que sucede. Nota:no intente esto en un laboratorio de acceso publico.

    No realizado

    El comando strace da un registro (traza) de todas las SysCalls quellama el comando que le sigue. Obtenga las trazas de los siguientescomandos, tratando de identificar todos los SysCalls que producen (elcomando man puede ayudar).

    strace cat /etc/hosts

    sakuragi@uzumaki-Satellite:~$ strace cat /etc/hosts

    execve("/bin/cat", ["cat", "/etc/hosts"], [/* 40 vars */]) = 0

    brk(0) = 0x9a77000

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

    mmap2(NULL, 8192, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773d000

    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file ordirectory)

    open("/etc/ld.so.cache", O_RDONLY) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=75735, ...}) = 0

  • 8/2/2019 Practicas Servidores 2

    6/31

    mmap2(NULL, 75735, PROT_READ, MAP_PRIVATE, 3, 0) =0xb772a000

    close(3) = 0

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

    open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3

    read(3,"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"...,512) = 512

    fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0

    mmap2(NULL, 1563160, PROT_READ|PROT_EXEC,

    MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x173000

    mmap2(0x2eb000, 12288, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178) =0x2eb000

    mmap2(0x2ee000, 10776, PROT_READ|PROT_WRITE,

    MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ee000

    close(3) = 0

  • 8/2/2019 Practicas Servidores 2

    7/31

    mmap2(NULL, 4096, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7729000

    set_thread_area({entry_number:-1 -> 6, base_addr:0xb77298d0,limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,limit_in_pages:1, seg_not_present:0, useable:1}) = 0

    mprotect(0x2eb000, 8192, PROT_READ) = 0

    mprotect(0x8051000, 4096, PROT_READ) = 0

    mprotect(0x637000, 4096, PROT_READ) = 0

    munmap(0xb772a000, 75735) = 0

    brk(0) = 0x9a77000

    brk(0x9a98000) = 0x9a98000

    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=7245280, ...}) = 0

    mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) =0xb7529000

    mmap2(NULL, 1249280, PROT_READ, MAP_PRIVATE, 3, 0x2c8) =0xb73f8000

  • 8/2/2019 Practicas Servidores 2

    8/31

    mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x533) =0xb73f7000

    close(3) = 0

    fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) =0

    open("/etc/hosts", O_RDONLY|O_LARGEFILE) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=232, ...}) = 0

    read(3, "127.0.0.1\tlocalhost\n127.0.1.1\tuz"..., 32768) = 232

    write(1, "127.0.0.1\tlocalhost\n127.0.1.1\tuz"..., 232127.0.0.1localhost

    127.0.1.1 uzumaki-Satellite

    # The following lines are desirable for IPv6 capable hosts

    ::1 ip6-localhost ip6-loopback

    fe00::0 ip6-localnet

  • 8/2/2019 Practicas Servidores 2

    9/31

    ff00::0 ip6-mcastprefix

    ff02::1 ip6-allnodes

    ff02::2 ip6-allrouters

    ) = 232

    read(3, "", 32768) = 0

    close(3) = 0

    close(1) = 0

    close(2) = 0

    exit_group(0) = ?

    strace cat (CTRL-D puede ayudar a terminar)

    sakuragi@uzumaki-Satellite:~$ strace cat

    execve("/bin/cat", ["cat"], [/* 40 vars */]) = 0

    brk(0) = 0x8ab8000

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

  • 8/2/2019 Practicas Servidores 2

    10/31

    mmap2(NULL, 8192, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ab000

    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file ordirectory)

    open("/etc/ld.so.cache", O_RDONLY) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=75735, ...}) = 0

    mmap2(NULL, 75735, PROT_READ, MAP_PRIVATE, 3, 0) =0xb7798000

    close(3) = 0

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

    open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3

    read(3,"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"...,512) = 512

    fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0

    mmap2(NULL, 1563160, PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x425000

  • 8/2/2019 Practicas Servidores 2

    11/31

    mmap2(0x59d000, 12288, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178) =0x59d000

    mmap2(0x5a0000, 10776, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x5a0000

    close(3) = 0

    mmap2(NULL, 4096, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7797000

    set_thread_area({entry_number:-1 -> 6, base_addr:0xb77978d0,limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,limit_in_pages:1, seg_not_present:0, useable:1}) = 0

    mprotect(0x59d000, 8192, PROT_READ) = 0

    mprotect(0x8051000, 4096, PROT_READ) = 0

    mprotect(0xf7a000, 4096, PROT_READ) = 0

    munmap(0xb7798000, 75735) = 0

    brk(0) = 0x8ab8000

    brk(0x8ad9000) = 0x8ad9000

  • 8/2/2019 Practicas Servidores 2

    12/31

    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=7245280, ...}) = 0

    mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) =0xb7597000

    mmap2(NULL, 1249280, PROT_READ, MAP_PRIVATE, 3, 0x2c8) =0xb7466000

    mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x533) =0xb7465000

    close(3) = 0

    fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) =0

    fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) =0

    read(0, "", 32768) = 0

    close(0) = 0

    close(1) = 0

    close(2) = 0

  • 8/2/2019 Practicas Servidores 2

    13/31

    exit_group(0) = ?

    strace echo 1

    sakuragi@uzumaki-Satellite:~$ strace echo 1

    execve("/bin/echo", ["echo", "1"], [/* 40 vars */]) = 0

    brk(0) = 0x84bb000

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

    mmap2(NULL, 8192, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7734000

    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file ordirectory)

    open("/etc/ld.so.cache", O_RDONLY) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=75735, ...}) = 0

    mmap2(NULL, 75735, PROT_READ, MAP_PRIVATE, 3, 0) =

    0xb7721000

    close(3) = 0

  • 8/2/2019 Practicas Servidores 2

    14/31

    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file ordirectory)

    open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3

    read(3,"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"...,512) = 512

    fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0

    mmap2(NULL, 1563160, PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x976000

    mmap2(0xaee000, 12288, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178) =0xaee000

    mmap2(0xaf1000, 10776, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xaf1000

    close(3) = 0

    mmap2(NULL, 4096, PROT_READ|PROT_WRITE,

    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7720000

    set_thread_area({entry_number:-1 -> 6, base_addr:0xb77208d0,limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,limit_in_pages:1, seg_not_present:0, useable:1}) = 0

  • 8/2/2019 Practicas Servidores 2

    15/31

    mprotect(0xaee000, 8192, PROT_READ) = 0

    mprotect(0x804d000, 4096, PROT_READ) = 0

    mprotect(0xe26000, 4096, PROT_READ) = 0

    munmap(0xb7721000, 75735) = 0

    brk(0) = 0x84bb000

    brk(0x84dc000) = 0x84dc000

    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

    fstat64(3, {st_mode=S_IFREG|0644, st_size=7245280, ...}) = 0

    mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) =0xb7520000

    mmap2(NULL, 1249280, PROT_READ, MAP_PRIVATE, 3, 0x2c8) =0xb73ef000

    mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x533) =

    0xb73ee000

    close(3) = 0

  • 8/2/2019 Practicas Servidores 2

    16/31

    fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) =0

    mmap2(NULL, 4096, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb73ed000

    write(1, "1\n", 21

    ) = 2

    close(1) = 0

    munmap(0xb73ed000, 4096) = 0

    close(2) = 0

    exit_group(0) = ?

    strace mozilla (busquese una silla comoda)

    sakuragi@uzumaki-Satellite:~$ strace mozilla

    strace: mozilla: command not found

    Intente identificar patrones comunes que correspondan a codigos deinicializacion y terminacion de procesos.

  • 8/2/2019 Practicas Servidores 2

    17/31

    Prctico Procesos

    Procesos e Hilos

    1. Por que un hilo dejaria voluntariamente la CPU con un thread_yield sisabe que despues de esto puede que se quede sin CPU para siempre?

    Otra llamada comn relacionada con los threads es thread_yield, que permite

    que un thread abandone

    voluntariamente la CPU para permitir que se ejecute algn otro thread. Tal

    llamada es importante ya que no

    existe ninguna interrupcin de reloj que d soporte al tiempo compartido como

    en el caso de los procesos. Por

    tanto para los threads es importante ser corteses y ceder voluntariamente la

    CPU de cuando en cuando para dar

    la oportunidad de que se ejecuten otros threads. Hay otras llamadas que

    permiten a un thread esperar a que otro

    thread termine algn trabajo, o a que un thread anuncie que ha terminado

    algn trabajo, etc.

    2. En un sistema con hilos, hay un solo stack por hilo o un stack porproceso 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

  • 8/2/2019 Practicas Servidores 2

    18/31

    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.int a, *ptr_b;

    a = 0;

    ptr_b = malloc(sizeof(int)); *ptr_b = 0;

    if (fork()!=0) {

    a = 2;

    *ptr_b = 4;printf("%d %d\n", a, *ptr_b);

    } else {

    a = 5;

    *ptr_b = 7;

    printf("%d %d\n", a, *ptr_b);

    }

    Se imprime a y *ptr_b

    Pensar en el mismo codigo, solo que en vez de procesos tenemos hilos.

    Condiciones de Carrera

    4. Dado el siguiente par de procesos que insertan datos en el spooler deimpresion, donde cola es un espacio de memoria compartida y libre es

    una variable local a cada proceso.

    P0:

    .

    libre := cola->fin+1;

    cola->buffer[libre] := job4;

    cola->fin := libre;

    .

    P1:

    .

    libre := cola->fin+1;

    cola->buffer[libre] := job5;

    cola->fin := libre;

    .

    1. Dar una planificacion o escenario que produce la perdida de untrabajo.

  • 8/2/2019 Practicas Servidores 2

    19/31

    Situaciones en las que dos o ms procesos leen o escriben en un rea de

    memoria compartida y el resultado

    final depende de los instantes de ejecucin de cada uno. Esto se soluciona

    impidiendo que ms de un proceso

    acceda simultneamente a las variables compartidas. Se soluciona garantizando

    la exclusin mutua.

    2. Dar una planificacion o escenario que funciona correctamente.

    Imaginemos que nuestro directorio de spool tiene un nmero muy grande de

    entradas, numeradas 0, 1, 2, ...,

    cada una de ellas capaz de contener un nombre de fichero. Imaginemos

    tambin que se tienen dos variables

    compartidas, out, que apunta al siguiente fichero a imprimir, e in, que apunta a

    la siguiente entrada libre en el

    directorio. Estas dos variables pueden caber perfectamente en un fichero de dos

    palabras disponible para todos

    los procesos. En un cierto momento, las entradas de la 0 a la 3 estn vacas (al

    haberse imprimido ya los

    ficheros correspondientes) y las entradas de la 4 a la 6 estn ocupadas (con los

    nombres de los ficheros

    encolados para su impresin). Ms o memos simultneamente, los procesos A y

    B deciden cada uno de ellos

    mandar a la cola de impresin un fichero.

  • 8/2/2019 Practicas Servidores 2

    20/31

    3. ?Cuantas planificaciones existen para estas 3+3 lineas de codigo??Cuantas son correctas y cuantas producen problemas? (determine

    el %)

    5. [Wol03] Se tienen 2 procesos P0 y P1, P0 con N acciones atomicas y P1con M acciones atomicas. Calcular cuantos escenarios posibles de

    ejecucion se pueden dar en un entorno concurrente.

    6. [Fin88, 8.1] Considere los procesos P0 y P1, con un valor inicial de x=0.?Cuales son los valores finales de x?

    { x=0 }

    P0:

    x:=x+1;

    P1:

    x:=x+1;

    7. Si ahora consideramos que x:=x+1 no es atomico a nivel de ensamblador yse compila en una secuencia de accesos a memoria y operaciones de la

    ALU, equivalentes al siguiente multiprograma. ?Cuales son los valoresfinales de x?

    { x=0 }

    P0:

    A := x;A := A+1;

    x := A;

    P1:

    A := x;A := A+1;

    x := A;

    Regiones Criticas

    8. [Wol04] Mostrar que agregando un re-testeo de lock=0 luego del busywaiting en metodo de la variable candado, no soluciona nada.

    9. [Wol04] Mostrar que en alternancia estricta el proceso P0 puede impediral P1 entrar a la CS aunque P0 este fuera de ella.

    10.[Fin88, 8.3] Deshabilitar interrupciones no funciona para regiones criticasanidadas (una dentro de la otra). Reescribir Begin/EndRegion para

    arreglar este problema.

    11.[Fin88, 8.4][Tan02, 2.51] Generalizar la alternancia estricta a 3 procesos.Generalizarla a n.12.[Fin88, 8.10] Demostrar de manera rigurosa que el algoritmo de Peterson

    no adolece del problema de progreso de la alternancia estricta.

    13.[Fin88, 8.11] {Dificil} Demostrar de manera rigurosa que el algoritmo dePeterson cumple con la propiedad de seguridad de la Region Critica

    (#proc_in_cs1).

  • 8/2/2019 Practicas Servidores 2

    21/31

    14.[Wol04] ?Sigue cumpliendo con la propiedad de seguridad el algoritmo dePeterson si intercambiamos las 2 primeras asignaciones de su

    BeginRegion? Demostrar o dar contraejemplo.

    15.[Fin88, 8.12] Implementar un spin lock con TestInc.atomic function TestInc(var lock:

    integer):integer;

    result:=lock;

    lock:=lock+1;

    return result;

    16.[Wol04][Tan02, 2.22] Implementar un spin lock con Swap.atomic procedure Swap(var v,w: integer);

    tmp:=v;

    v:=w;

    w:=tmp;

    Primitivas de sincronizacion

    17.[Wol04] Dados 3 procesos P0, P1 y P2 que realizan las acciones A0, A1 yA2, 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.

    18.[Wol04] Implementar utilizando semaforos la Region Critica N-1, es decirdentro de la region critica puede haber a lo mas N-1 procesos.

    19.[Tan02, 2.24] {Dificil} Implemente semaforos generales (el semaforoalmacena valores arbitrarios) usando semaforos binarios (solo puedenvaler 0 o 1).

    20.[Fin88, 8.22] Implementar semaforos utilizando monitores.21.[Tan02, 2.28] {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 escribirawaitnr=0nw=0 dentro del monitor

    Claramente este esquema es mas general y abstracto que los monitores

    de Hoare y Brinch-Hansen, pero no se usan. ?Por que?

    Ayuda: pensar en la implementacion.

    22.[Tan02, 2.33] {Mediano} El problema de lectores y escritores puede serformulado de varias formas respecto a cuando cada categoria de

  • 8/2/2019 Practicas Servidores 2

    22/31

    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.

    23.[Tan02, 2.50] Tenemos un Bao Unisex donde puede haber de maneraexcluyente 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.

    Planificadores

    24.[Tan02, 2.35] Los planificadores RR mantienen una lista de todos losprocesos 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?

    25.[Tan02, 2.36] ?Se podra "medir" si un proceso es IO-bound o CPU-boundanalizando el codigo fuente? (analisis estatico) ?Como se podria

    determinar en tiempo de ejecucion? (analisis dinamico)

    26.[Tan02, 2.38] Mediciones realizadas en un sistema muestran que enpromedio un proceso corre por Ttiempo antes de bloquearse en I/O. Uncambio 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. Q = infinito2. Q>T3. S

  • 8/2/2019 Practicas Servidores 2

    23/31

    28.[Wol04] Dar un conjunto de procesos con sus tiempos de arribo y sustiempos de uso de CPU, que muestren que SJF!=SRTN (shortest job first,

    shortest remaining time next).

    29.[Fin88, 3.6] Completar la tabla para las siguientes politicas deplanificacion: FCFS, SJN, SRTN, RR (Q=1), RR (Q=5).

    Proc Arribo UsoCPU

    A 0 3

    B 2 6

    C 3 10

    D 7 1

    E 8 5

    F 15 2

    G 25 7

    Lab1: Observando el Comportamiento de Linux

    Objetivos

    Iniciar los laboratorios con un proyecto sencillo, donde se muestre como atravs del sistema de archivos virtual /proc de Linux, podemos inspeccionar

    informacin interna del kernel. Se deber generar la utilidad ksampque muestra

    de diversas formas algn subconjunto de la informacin disponible en /proc.

  • 8/2/2019 Practicas Servidores 2

    24/31

    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. Dadoque 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 quemantiene la hora del sistema, la estructuratask_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 ejemploLinux Cross Reference. Tambin existen utilidades paranavegacin de cdigo local comoSource Navigator.

    Tareas

    Parte A

    Buscar informacin acerca de la estructura del directorio /proc, y averiguar los

    siguientes datos

    Tipo y modelo de CPU.

    Versin del kernel.

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

    Cuanto tiempo de CPU ha sido empleado para procesos de usuario, de

    sistema y cuando tiempo no se us.

    Cuanta memoria tiene y cuanta est disponible.

    Cuantos pedidos de lectura/escritura a disco se han realizado.

    Cuantos cambios de contexto han sucedido.

    http://lxr.linux.no/http://lxr.linux.no/http://lxr.linux.no/http://sourcenav.sourceforge.net/http://sourcenav.sourceforge.net/http://sourcenav.sourceforge.net/http://sourcenav.sourceforge.net/http://lxr.linux.no/
  • 8/2/2019 Practicas Servidores 2

    25/31

    Cuantos procesos se crearon desde que inici el sistema.

  • 8/2/2019 Practicas Servidores 2

    26/31

  • 8/2/2019 Practicas Servidores 2

    27/31

    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 lasiguiente 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.

  • 8/2/2019 Practicas Servidores 2

    28/31

    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 lasfunciones de la biblioteca "C" fopen, fgets (o fscanf) y fclose. Un ejemplo de

    uso sera el siguiente.

    #include

    #define BUFFSIZE 256

    int

    main(int argc, char *argv[]) {

    FILE *fd;

    char buffer[BUFFSIZE+1];

    fd =

    fopen("/proc/sys/kernel/hostname","r");

    fgets(buffer, BUFFSIZE+1, fd);

    printf("Hostname: %s\n",buffer);

    fclose(fd);

    http://www.linuxgazette.com/issue46/fink.htmlhttp://www.linuxgazette.com/issue46/fink.htmlhttp://www.linuxgazette.com/issue46/fink.htmlhttp://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.htmlhttp://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.htmlhttp://www.linuxgazette.com/issue46/fink.htmlhttp://www.linuxgazette.com/issue46/fink.html
  • 8/2/2019 Practicas Servidores 2

    29/31

    }

    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 elementoscomo palabras, nmeros, simbolos, espacios en blanco). Pueden usarlo en su

    proyecto tal como est, y les aconsejamos hacerlo as no pierden tiempo en esteaspecto 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 tamaoargc con cada uno de las

    cadenas de los argumentos. Notar que como el propio comando se incluye en lalista 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 laglibc 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 laGNU 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 ciertotratamiento. 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 queextraerlo 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 prettyprinting.

    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 glibcgettimeofday 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.

    http://www.cs.famaf.unc.edu.ar/so2004/Lab1/Lexer.tar.gzhttp://www.cs.famaf.unc.edu.ar/so2004/Lab1/Lexer.tar.gzhttp://www.cs.famaf.unc.edu.ar/so2004/Lab1/Lexer.tar.gzhttp://www.gnu.org/software/glibc/http://www.gnu.org/software/glibc/http://www.gnu.org/manual/glibc-2.2.5/libc.htmlhttp://www.gnu.org/manual/glibc-2.2.5/libc.htmlhttp://www.gnu.org/manual/glibc-2.2.5/libc.htmlhttp://www.gnu.org/manual/glibc-2.2.5/libc.htmlhttp://www.gnu.org/software/glibc/http://www.cs.famaf.unc.edu.ar/so2004/Lab1/Lexer.tar.gz
  • 8/2/2019 Practicas Servidores 2

    30/31

    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 comogdb o interfaces grficas para

    estos comoddd. Tambin pueden realizar compilacin condicional para hacer

    debugging de la siguente manera.

    #define STDOUT 0

    #define DEBUG

    .

    .

    #ifdef DEBUG

    fprintf(STDOUT,"DEBUG> argc:

    %d\n",argc);

    #endif

    .

    .

    Deducir la entrada disk_io requiere un poco ms de trabajo que el resto de lainformacin. 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.

    http://sources.redhat.com/gdb/http://sources.redhat.com/gdb/http://www.gnu.org/software/ddd/http://www.gnu.org/software/ddd/http://www.gnu.org/software/ddd/http://lxr.linux.no/http://lxr.linux.no/http://lxr.linux.no/http://lxr.linux.no/http://lxr.linux.no/http://www.gnu.org/software/ddd/http://sources.redhat.com/gdb/
  • 8/2/2019 Practicas Servidores 2

    31/31

    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 entremuestras.

    Utilizar getopt de POSIX.2 para parsear la lnea de comandos.

    Comparar lo realizado con utilidades establecidas que realizantareas simi lares, como por ejemploprocinfo.