jueves, 22 de diciembre de 2011

ficheros




#include
#include
#include
#include
#include
#include

#define MAXLON 1000
void*cuenta(void*dato){
int pos, cont=0, leidos;
char*nombre=(char*)dato,cadena,MAXLON))!=0)
int fd;
while((leidos=read(fd,cadena,MAXLON))!=0)
for(pos=0; pos
if((cadena[pos]=='a') ||(cadena[pos]=='A'))
cont++;
printf("fichero %s:%d caracteres 'a' o 'A' encontramos" nombre,cont);
close(fd);
pthread_exit(NULL);
}
int main(int argc,char*argv[]){
pthread_t hilo;
printf("indica el nombre de un fichero.");
exit(0);
}
pthread_create(&hilo,NULL,cuenta,(void*) argv[1]);
pthread_join(hilo,NULL);
return 0;
}

jueves, 1 de diciembre de 2011

practica policia


55. Disponemos de un disco duro de 20 GB de capacidad. Hay establecida sobre él, una única partición que contiene un sistema de ficheros del tipo FAT32 en el que cada agrupamiento (cluster) consta de 16 sectores de 512 bytes cada uno. ¿Cuántos sectores del disco se necesitarán para almacenar cada copia la FAT? Razona tu respuesta.

En primer lugar se calcula lo que ocupa la FAT, que es el tama˜no del enlace

(32 bits) por el n´umero de entradas de la tabla que, a su vez, es el tama˜no del

disco dividido por el tama˜no del agrupamiento y que en este problema son

20GB/(16 512bytes) = 20 217 entradas. Luego la tabla ocupa 20 217 32bits = 20 219bytes.

Si se divide lo que ocupa la tabla por el tama˜no del agrupamiento se obtiene

el n´umero de agrupamientos que ocupa la tabla: 20 219/(16 512) = 20 26 = 1280agrupamientos, que multiplicado por 16, que es el n´umero de

sectores por agrupamiento, se obtiene el n´umero total de sectores que es

20480.

56. La policía ha arrestado al sospechoso de un delito. Al analizar el contenido de su ordenador piensan que pueden inculparle pues el contenido del mismo

es el siguiente:

En un sistema de archivos FAT, los bloques se asignan como una lista enlazada

que finaliza con la posici´on fin de lista EOF. Es posible recuperar

datos utilizando los enlaces partiendo desde esa posici´on EOF hacia atr´as.

La reconstrucci´on de la lista de bloques ser´a:

14 15 12 13 10 11 EOF

La informaci´on de esa lista de bloques ser´a:

sigan buscando yo no he sido EOF



Número De bloque de datos

Contenido

10

he

11

sido

12

yo

13

no

14

sigan

15

buscando

Como experto informático, pides consultar el contenido de la FAT, que es el siguiente:

Número de entrada en la FAT

Contenido

10

11

11

EOF

12

13

13

10

14

15

15

12

¿Apoyarías la opinión de la policía? Razona tu respuesta.

No estoy deacuerdo

Respuestas



#include

#include

#include

#include

#include

#include

#define MAX 10

#define FIN -1

int buffer[MAX];

sem t huecos, elementos;

int generar dato (void) { return random() %256;} int numero aleatorio(void) { return random() %100;}

void productor (void p) {

int pos productor= 0;

int num, dato, n;

n= numero aleatorio();

printf ("Productor con %d datos\n", n);

for(num= 0; num< n; num++) { dato= generar dato();

sem wait (&huecos);

buffer[pos productor]= dato;

pos productor= (pos productor+ 1) %MAX;

sem post (&elementos);

}sem wait (&huecos);

buffer[pos productor]= FIN;

sem post (&elementos);

pthread exit (NULL);

}

void consumidor(void p){

int pos consumidor= 0, dato;

bool continuar= true;

while (continuar) { sem wait (&elementos);

dato= buffer[pos consumidor];

sem post (&huecos);

if (dato== FIN)

continuar= false;

else { printf ("Numero aleatorio: %d\n", dato);

pos consumidor= (pos consumidor+1) %MAX;

}

}

pthread exit (NULL);

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

pthread t hiloproductor, hiloconsumidor;

sem init (&elementos, 0, 0);

sem init (&huecos, 0, MAX);

pthread create (&hiloproductor, NULL, productor, NULL);

pthread create (&hiloconsumidor, NULL, consumidor, NULL);

pthread join (hiloproductor, NULL);

pthread join (hiloconsumidor, NULL);

sem destroy (&huecos);

sem destroy (&elementos);

return 0;

}

jueves, 24 de noviembre de 2011

Practica 2



Practica 2:

//Estudia el siguiente codigo y escribe la jerarquia de procesos resultante. Despues, compila y ejecuta el codigo para comprobarlo (deberas añadir llamadas al sistema getpid, getppid y wait para conseguirlo).

#include

#include

#include

#include

#include

#include

#define L1 2

#define L2 3

int main ()

{

int cont1, cont2;

pid_t pid;

system("clear");

for (cont2 = 0; cont2

{

for (cont1 = 0; cont1 < L1; cont1++)

{

pid = fork();

if (pid== 0)

break;

}

if (pid!= 0)

break;

}

printf("Soy el proceso %d y mi padre es % d\n",getpid(),getppid());

return 0;

}

En esta primera corrida y compilacion del programa, se obtienen un padre para muchos hijos en este caso 15.

Y en este caso si se le agrega la funcion sleep(); los procesos se anidan y se forman como en zigzag.

miércoles, 23 de noviembre de 2011





Ejercicio 1

Dibuja la jerarquía de procesos que resulta de la ejecución del siguiente código. Introduce las llamadas al sistema wait para que una vez generado el árbol de procesos los hijos sean esperados por sus respectivos padres. Ademas, haz que se informe de los tiempos de ejecución de las aplicaciones xload y kcalc que se generen así como del tiempo total de ejecución. Para calcular el tiempo transcurrido, puedes utilizar la función´ time() de la librería estándar time.h. La llamada time(NULL) devuelve los segundos transcurridos desde las 00:00:00 del 1/1/1970 hasta el instante de la llamada.Código:

#include
#include
#include
#include
#include
#include
int main (int argc, char *argv[]) {
int i, j;
pid_t pid, nuevo, nuevo1;
time_t ini, fin;
ini = rand()%25+1;
for (i= 0; i< 2; i++)
{ pid= getpid();
for (j= 0; j< i+2; j++)
{ nuevo= fork();
if(nuevo== 0){ break;
nuevo1= fork();
if(nuevo1== 0)
execlp ("xload", "xload", NULL);
}
}
if (pid!= getpid())
execlp ("kcalc", "kcalc", NULL);
}
for (i= 0; i< 2; i++)
for (j= 0; j< i+2; j++){ wait(NULL);
printf ("Tiempo en ejecucion de kcalc: %ld\n", (rand()%50+1)-ini);
}

jueves, 27 de octubre de 2011

Practicas matando proceso







Practica 1 Matando un proceso en modo grafico







Practica 2 Matando un proceso por línea de comandos





Practica 3 Matando un proceso por medio de scripts























Practica 4 Ver los procesos de usuario desde línea de comandos







Practica 5 Mostrando los porcentajes de uso de memoria de los procesos




Practica 6 Ejecución de procesos de manera concurrente




Prac7 Uso del comando jobs (viendo estado de procesos)




Practica 8 Pausar tareas y 9 Muestra de reinicio de procesos




Practica 10 Crear una lista FIFO


Practica 11 Agregando un proceso a una lista FIFO




Practica 12 Creado listas con mknod


PRACTICA 13 Observar listas de procesos creadas hasta ahora


PRACTICA 14 Eliminando una lista






Practica15





















Practica 15 Ver árbol de procesos

jueves, 20 de octubre de 2011

practica semaforos

lock_lp (tipo_flag flag)
{
BOOL entrar= 0;
while (!entrar) {
lock(cerrojo_flags);
if (flag) {
unlock(cerrojo_flags);
dormir(flag);
}
else {
entrar= 1;
flag= 1;
unlock(cerrojo_flags);
}
}
}
unlock_lp (tipo_flag flag)
{
lock(cerrojo_flags);
flag= 0;
despertar(flag);
unlock(cerrojo_flags);
}

a) Analizar la estructura de las secciones criticas que contiene.
El código es de acceso exclusivo y se protege con una sección crítica de corto plazo mediante un cerrojo de exclusión mutua único común, que llamamos (de mutual exclusión). Pero un proceso no puede quedarse dormido dentro de la sección crítica de corto plazo en lock_lp, ya que no permitiría la ejecución de despertar por otro proceso.
b) Siguiendo esta misma idea, dados los algoritmos de bajar y subir sobre semáforos.
Subir () puede encargarse de liberar los cerrojos de los procesos, y bajar() de restaurarlos. En otras palabras, los procesos en estado bloqueado se consideran fuera de toda sección crítica. Un problema del esquema subir/bajar es que bajar desbloquea a todos los procesos subidos en el flag y sólo uno de ellos accederá a la sección crítica. Esto es especialmente preocupante en multiprocesadores, ya que producirían contención en el acceso al cerrojo. Sin embargo, la limitación fundamental del manejo de eventos con este mecanismo deriva de que la primitiva de bajar no almacena el evento; lo que introduce la posibilidad de condiciones de carrera en una secuencia de subir y bajar sobre un flag (importa el orden en que se ejecutan).

jueves, 13 de octubre de 2011

FIFO Y LIFO

FIFO: Guarda analogía con las personas que esperan en una cola y van siendo atendidas en el orden en que llegaron, es decir, que la primera persona que entra es la primera persona que sale.

También se lo llama first come first served o FCFS (en español "primero en llegar, primero en ser atendido").



En hardware, un FIFO se usa para propósitos de sincronización. Comportándose como una cola circular y, por lo tanto, contiene dos punteros:

1.Puntero de Lectura / Registro de Dirección de Lectura
2.Puntero de Escritura / Registro de Dirección de Escritura
Las direcciones de lectura y escritura están ambas inicialmente en la primera ubicación de la memoria y la cola FIFO está Vacía.

FIFO Vacía
Cuando el registro de dirección de lectura alcanza al registro de dirección de escritura, la cola FIFO dispara la señal o bandera Vacío.
FIFO Llena
Cuando el registro de dirección de escritura alcanza al registro de dirección de lectura, la cola FIFO dispara la señal o bandera

LIFO

El término LIFO es el acrónimo inglés de Last In First Out (último en entrar, primero en salir). elementos almacenados en forma de algunos tipos de estructuras de datos se procesan. Por definición, en una lista estructurada LIFO lineales, los elementos pueden ser añadidos o retirados de un solo extremo, llamado el "top". [1] Una estructura LIFO se puede ilustrar con el ejemplo de una pila de bandejas. La última bandeja para ser colocado en la parte superior es también el primero en tomar la parte superior.