Biblioteca de sistema

Documentos relacionados
Práctica 1: Intérprete de mandatos. Sistemas Operativos Área de Arquitectura y Tecnología de Computadores

Ejercicios sobre tuberías

Funciones POSIX (I): Introducción

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

Tema 4: Gestión de Procesos

Introducción a Sistemas Operativos: Ficheros

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Sistemas Operativos. Grado Ingeniería Informática. TGR Procesos.

Examen Final de SO Grau

Sistemas Operativos Práctica 3

Concurrencia en UNIX / LINUX. Introducción: Procesos e Hilos POSIX

Sistemas Operativos I Manual de prácticas

Aplicación Multiproceso sobre HTTP Ejemplo -

Taller de Sistemas Operativos Introducción

Programación I Funciones

Llamadas al sistema básicas de control de procesos

Sistemas Operativos Practica 1: procesos y concurrencia.

Examen Final de Teoría. Grupo de teoría:

Llamadas a Sistema para procesos

Usando el Sistema Operativo

Esquema de un programa en C: bloques básicos

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

Examen final de teoría QT

Introducción a Sistemas Operativos: Concurrencia

PARTE II PROGRAMACION CON THREADS EN C

TEMA 3. CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO. Definición y objetivos de un S.O

Si el fichero hashes existe, el script debe notificar el error y salir como corresponde. A continuación se muestra un ejemplo:

Threads. Hilos - Lightweight process - Procesos ligeros

Sistemas Operativos. Pedro Cabalar TEMA III. PROCESOS. Depto. de Computación Universidade da Coruña

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Ejercicios de la sesión 4 de C resueltos

Primer control de teoría

05 Funciones en lenguaje C. Diego Andrés Alvarez Marín Profesor Asociado Universidad Nacional de Colombia Sede Manizales

Fundamentos de los Sistemas Operativos. Tema 2. Procesos José Miguel Santos Alexis Quesada Francisco Santana

Prácticas de Sistemas operativos

Un ejemplo: UNIX PROCESOS UNIX

Sistemas Operativos. Procesos

SOLUCION EXAMEN junio 2006

Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): Se pide:

1. Procesos vs Hilos 2. Cuando se ejecutan los procesos 3. Fork 4. Clone 5. Cómo se ejucuta el fork? 6. do_fork() 7. copy_process 8.

SISTEMAS OPERATIVOS: PROCESOS. Introducción a la gestión de Procesos

SISTEMAS OPERATIVOS INTRODUCCIÓN. Pedro de Miguel Anasagast

!! Identificar las señales que llegan a la consola.

1 Primitivas básicas de OpenMP

Introducción a Sistemas Operativos: Comunicación entre Procesos

/* Compilador del Lenguaje Micro (Fischer) */ #include <stdio.h> #include <string.h> #include <ctype.h>

Bloque I: Principios de sistemas operativos

LLAMADAS AL SISTEMA SISTEMAS OPERATIVOS

Teoría. Procesos. Escuela Politécnica Superior Universidad Autónoma de Madrid 1

Funciones POSIX III Funciones POSIX III. No Nombrados Nombrados. sem_open sem_open. sem_close sem_close. sem_unlink sem_unlink

Lección 3 Sentencias de control

Paradigma de paso de mensajes

SISTEMAS OPERATIVOS: COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS. Desarrollo de servidores concurrentes

SISTEMAS OPERATIVOS: PROCESOS. Hilos y Procesos

Taller de Sistemas Operativos. Procesos 2012

1. Interfaz de llamadas a la librería de fluxes

/**********************Prototipos de ciones************************/ TOKEN scanner(); int columna(int c);

Gestión de procesos en UNIX

Examen de Fundamentos de la Programación (Modelo 1)

El lenguaje de Programación C. Fernando J. Pereda

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Ejercicio Sockets Suma Resta. Descripción

El tiempo de búsqueda es de 3 + 0,04 x ms, siendo x el número de cilindros a recorrer.

Tema 4: Padre e hijo

SISTEMAS OPERATIVOS: PROCESOS. Señales

5. Sentencias selectivas o condicionales

Primer control de teoría

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011

PROBLEMAS DE SISTEMAS OPERATIVOS DE 2º

Prácticas de Sistemas operativos

Examen Teórico (1/3 de la nota final)

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Sistemas Complejos en Máquinas Paralelas

Arquitecturas cliente/servidor

Introducción a los Sistemas Operativos S.O.

SISTEMAS OPERATIVOS:

Fundamentos de la programación

PROGRAMACION MODULAR FUNCIONES

Tema 2. Administración de procesos

Capítulo 2 Introducción a los sistemas operativos

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)

Modularización en lenguaje C. Funciones

Problemas de Redes de Computadores. Conjunto de problemas 1

Message Passing Interface (MPI)

Prof. Dr. Paul Bustamante

Microprocesadores. Introducción al Lenguaje C - Parte IV. Prof. Luis Araujo. Universidad de Los Andes

Examen Fundamentos de Programación 15 de enero de 2016 Curso 2015/16

Segundo control de teoría

Nombre Apellidos. DNI Titulación Grupo.

Procesos e Hilos en C

Estructuración del programa en partes más pequeñas y sencillas

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 9 Departamento de Arquitectura y Tecnología de Computadores Universidad de Sevilla

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

Sistemas Operativos Primer Recuperatorio Parcial 1

Prof. Dr. Paul Bustamante

; hcomment.rc aa.es ;

Taller de Sistemas Operativos. System Calls 2012

Escuela Politécnica Superior de Elche

Fundamentos de los Sistemas Operativos

Transcripción:

* Para la realización del presente examen se aconseja un tiempo de 2 horas. Teoría 1. Explique en detalle cómo se pasa una llamada al sistema operativo. El sistema operativo se activa cuando debe responder a una petición de servicio de un proceso, es decir una llamada al sistema. Esta petición se realiza mediante la llamada a una biblioteca que incluye funciones de interfaz de programación (API). Cada una de ellas se corresponde con algún servicio del sistema operativo. La función es un envoltorio para el código que invoca el servicio del sistema operativo y la proporciona normalmente el fabricante del sistema operativo. Puesto que esta función incluye la ejecución de una instrucción de trap que transfiere el control al sistema operativo mediante la generación de una interrupción y eleva el nivel de ejecución de la CPU para pasar a modo privilegiado. A continuación se incluye un esquema con el proceso de una llamada a sistema: Biblioteca de sistema read asm ( lw $a0, fd lw $a1, b lw $a2, lo li $v0, 14 syscall sw $v0, r ); return r; 1 2 Programa de usuario Código de usuario read(fd,b,lo ) 4 3 Como se puede ver, el usuario ejecuta la rutina de API de llamada ala sistema read, que llama a la biblioteca del sistema (1). Esta prepara los argumentos, carga el código de llamada al sistema (read_syscall, 14) y ejecuta un trap mediante la instrucción syscall (2). Este trap invoca al sistema operativo que ejecuta read_sycall al ver el código 14 y devuelve Sistemas Operativos 1

el resultado en V0 (3). La rutina de biblioteca retorna a la de usuario (4) y devuelve el resultado de la llamada al sistema. Teoría 2. Explique las diferencias, desde el punto de vista de imagen de memoria, de un proceso sin threads y con threads. Un proceso sin threads incluye un único hilo de ejecución, por tanto su imagen de memoria incluye un número de regiones variables, entre las cuáles necesita, como mínimo, una región de texto, una de datos dinámicos y una pila. Un proceso con threads tiene varios flujos de ejecución que comparten casi toda la imagen de memoria. Pero la imagen de memoria debe tener una parte específica de cada thread para dar soporte a dicha ejecución y esa parte no se comparte. La información de memoria específica de cada thread comprende: Identificador de thread (tid) Contador de programa (PC) Conjunto de registros (registers) Pila (Stack) La información de memoria compartida por todos los threads de un proceso es: Mapa de memoria (sección de código, sección de datos, shmem) Ficheros abiertos Señales, semáforos y temporizadores. La figura siguiente muestra ambos casos: Sistemas Operativos 2

Ejercicio 1. Dado el programa que se muestra a continuación, responda a las cuestiones: #include <stdio.h> #include <stdlib.h> main() { int pid,i, m=10; int tiempoinicial, tiempoactual; tiempoinicial = time(null);//time devuelve el tiempo actual en segundos printf("%d:inicio del programa \n",tiempoactual ); for(i=0; i<3; i++) { pid=fork(); sleep(1); switch(pid) { case -1: perror("error en la creación de procesos"); case 0: m++; printf("%d:hijo %d m=%d\n",tiempoactual, i, m); sleep(2); exit(0); default: printf("%d:creado el proceso %d\n", tiempoactual, i); if( i%2 == 0 ) { wait(null); //wait espera que finalice un hijo cualquiera Sistemas Operativos 3

printf("%d:finalizó un proceso, valor de m=%d\n", tiempoactual,m); //fin if //fin switch //fin for wait(null); printf("%d:finalizó un proceso, valor de m=%d",tiempoactual, m); //fin main a) Escribir los mensajes que se escriben por pantalla y en qué instante, suponiendo que el mensaje de Inicio del programa aparece en el instante 0. b) Cuántas variables m se crean en memoria? SOLUCION a) 0:Inicio del programa 1:Hijo 0 m=11 1:Creado el proceso 0 3:Finalizó un proceso, valor de m=10 4:Hijo 1 m=11 4:Creado el proceso 1 5:Hijo 2 m=11 5:Creado el proceso 2 6:Finalizó un proceso, valor de m=10 7:Finalizó un proceso, valor de m=10 b) La variable m es creada por el padre. Los hijos a heredan y según el mecanismo copy-on-write solo crean una copia cuando la modifican. Pero como cada hijo hace m++ todos la modifican. Por tanto, cada hijo crea una copia en su espacio de memoria. Ejercicio 2. a) Escribir en código C una función llamada mi_cat que lea el contenido de un fichero (cuyo nombre se recibe por el primer parámetro) y lo escriba en un descriptor recibido por el segundo parámetro. Ayudarse del siguiente código: void mi_cat(char *nombre_fichero, int fd_salida){ int fd_entrada = open(nombre_fichero, O_RDONLY); if( fd_entrada < 0 ) { perror( Error al abrir el fichero ); Sistemas Operativos 4

/* RELLENAR POR EL ALUMNO */ // LEER DE fd_entrada Y ESCRIBIR EN fd_salida /* FIN RELLENAR POR EL ALUMNO */ if( close(fd_entrada) < 0 ) { perror( Error al cerrar el fichero ); b) Escribir un programa en código C que ejecute: mi_cat fichero_alumnos.txt grep manuel El proceso que ejecute mi_cat debe enviar el contenido del archivo fichero_alumnos.txt por la tubería, y el proceso que ejecute grep coge los datos de la tubería y filtra sólo las líneas en las que aparece la palabra manuel. - - Se deben utilizar procesos pesados comunicándolos mediante tuberías o pipes. El comando mi_cat debe ejecutarse haciendo uso de la función del apartado a), en lugar de utilizar execvp para ejecutarlo. En argv[1][0] se encuentra el nombre del fichero fichero_alumnos.xt. - Para el comando grep suponer que en argv[2] se encuentra el comando con sus parámetros. De tal forma que para ejecutar este mandato grep, se debe utilizar la llamada al sistema execvp, de la forma: execvp(argv[2][0], argv[2]); int main(int argc, char **argv[]){ /* RELLENAR POR EL ALUMNO */ Sistemas Operativos 5

SOLUCIÓN Ejercicio 2: a) void mi_cat(char *nombre_fichero, int fd_salida){ int fd_entrada = open(nombre_fichero, O_RDONLY); if( fd_entrada < 0 ) { perror( Error al abrir el fichero ); /* RELLENAR POR EL ALUMNO */ int n; char buffer[512]; memset(buffer, 0, 512); while( (n = read(fd_entrada, buffer, 512)) > 0){ if( write(fd_salida, buffer, n) < 0) { perror( Error al escribir en el descriptor de salida ); memset(buffer, 0, 512); //limpio la memoria para la lectura /* FIN RELLENAR POR EL ALUMNO */ if( close(fd_entrada) < 0 ) { perror( Error al cerrar el fichero ); Sistemas Operativos 6

b) Solución suponiendo que el hijo ejecuta mi_cat y que el padre ejecuta grep. int main(int argc, char **argv[]){ int pid; int tuberia[2]; if( pipe(tuberia) < 0) { perror( Error al crear la tuberia ); pid=fork(); //se crea el proceso hijo switch(pid) { case -1: perror( Error en la creación de procesos ); case 0: mi_cat(argv[1][0], tuberia[1]); exit(0); default: wait(null); //espero a que termine el hijo close(0); dup(tuberia[0]); close(tuberia[0]); close(tuberia[1]); //el padre no lo utiliza if( execvp(argv[2][0], argv[2]) < 0) break; //fin switch Solución suponiendo que el padre ejecuta mi_cat y que el hijo ejecuta grep. int main(int argc, char **argv[]){ int pid; int tuberia[2]; if( pipe(tuberia) < 0) { perror( Error al crear la tuberia ); pid=fork(); //se crea el proceso hijo switch(pid) { case -1: perror( Error en la creación de procesos ); case 0: close(0); dup(tuberia[0]); close(tuberia[0]); close(tuberia[1]); //el hijo no lo utiliza if( execvp(argv[2][0], argv[2]) < 0) default: mi_cat(argv[1][0], tuberia[1]); close(tuberia[1]); //el padre ya no lo necesita close(tuberia[0]); //el padre no lo utiliza wait(null); break; //fin switch Sistemas Operativos 7