Professional Documents
Culture Documents
Actividad 6
Actividad 6
SISTEMAS OPERATIVOS
2020
INTRODUCCION
Práctica 1
Desarrollar un programa que cree varios procesos concurrentes, que escriban periódicamente
mensajes diferentes en la pantalla Hacer lo mismo con threads periódicos. Pasar a cada thread
como parámetros el periodo y el mensaje a escribir. Los threads se crearán en estado
"independiente" Para ello se utiliza el siguiente código.
package javaapplication76;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
this.id = id;
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(2000);
h1.start();
Thread.sleep(2000);
h2.start();
Thread.sleep(2000);
h3.start();
Thread.sleep(2000);
}
El periodo es de 3 segundos por hilo.
Práctica 2 Ficheros
Escribir un programa que copie los contenidos de un fichero en otro. Se pasarán los nombres
como argumentos al programa. Modificarlo para que ponga el estado del fichero generado
según los parámetros de entrada que se le pasen los permisos del usuario (rwx) Asimismo,
deberá presentar información del estado de los ficheros (original y copia) en pantalla (fechas,
tamaño, etc.) En el desarrollo de este ejercicio se utilizó el siguiente script,
import java.io.*;
Copiar(FOrigen,FDestino);
EntraIncial=0;
if(!FOrigen.isDirectory()){
CopiarFichero(FOrigen,FDestino);
}else{
EntraIncial++;
if(EntraIncial==1){
FDestino=new File(FDestino.getAbsolutePath()+"/"+FOrigen.getName());
if(!FDestino.exists()){
FDestino.mkdir();
String []Rutas=FOrigen.list();
for(int i=0;i<Rutas.length;i++){
FnueDest.mkdir();
Copiar(FnueOri,FnueDest);
try {
if(FOrigen.exists()){
String copiar="S";
if(FDestino.exists()){
if(copiar.toUpperCase().equals("S")){
int tamaño;
Salida.write(buffer, 0, tamaño);
Salida.close();
LeeOrigen.close();
}else{
System.out.println(ex.getMessage());
Práctica 3- Threads
Escribir un programa con tres threads que se sincronicen para acceder de manera
mutuamente exclusiva a un conjunto de datos que representan las coordenadas x, y, z de un
cuerpo en el espacio Uno de los threads deberá modificar los datos de manera periódica según
las siguientes ecuaciones (una recta):
x = x + 0, 1 y = 3x + 8 z = 4x – 2y + 3
Otro thread consulta esa información y muestra x, y, z y también (y-3x), que debe ser 8
Otro thread consulta esa información y muestra x, y, z y también (z-4x+2y), que debe ser 3
El programa se ejecutará con y sin protección, y así podrá observarse la inconsistencia del
conjunto de datos cuando no hay protección Puede utilizarse el "come tiempos" que se
encuentra en los ficheros load.c y load.h disponibles en el servidor. Cópialos en tu directorio de
trabajo.
struct pthread_st {
double X1;
double X2;
double X3;
};
...
...
int main () {
pthread_st pthread_data;
...
hebra
pthread_data.X1:=1;
pthread_data.X2:=2;
pthread_data.X3:=3;
tipo estructura
&pthread_data);
...
...
...
}
double X;
double Y;
double Z;
pthread_st *pthread_dt;
“parms”, el cual
a la
“parms”
X=thread_data->X1;
Y=thread_data->X2;
Z=thread_data->X3;
...
...
...
Práctica 4 – threads II
tuberia = t;
char c;
c = alfabeto.charAt( (int)(Math.random()*26 ) );
tuberia.lanzar( c );
try {
} catch( InterruptedException e ) {
}
}
tuberia = t;
char c;
c = tuberia.recoger();
try {
} catch( InterruptedException e ) {
}
class Tuberia {
try {
} catch( InterruptedException e ) {
siguiente--;
if( siguiente == 0 )
estaVacia = true;
estaLlena = false;
notify();
return( buffer[siguiente] );
}
// Método para añadir letras al buffer
try {
} catch( InterruptedException e ) {
buffer[siguiente] = c;
siguiente++;
if( siguiente == 6 )
estaLlena = true;
estaVacia = false;
notify();
class ejercicio4 {
p.start();
c.start();
}
Práctica 5 - Señales
Probar el programa enviándole señales desde una shell (con la orden kill -num_señal pid)
Nota: Según la versión de Linux se pueden crear (incorrectamente) varios procesos si hay
manejadores de señal.
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main();
int main() {
int cuenta=0;
DIR * dir;
char directorio[255];
return -1;
dir = opendir(directorio);
if (dir == NULL) {
return -1;
entrada = readdir(dir);
while(entrada != NULL) {
cuenta++;
//free(entrada);
entrada = readdir(dir);
if (closedir(dir) == -1) {
return -1;
return 0;
Práctica 6 - Planificación
Escribir un programa que cree dos threads periódicos concurrentes. A cada thread se le pasará
como parámetro:
periodo
tiempo de ejecución
número de identificación
Para hacer threads periódicos se usará la función clock_nanosleep()
También se pondrán mensajes al inicio y final del periodo A partir de la secuencia de ejecución
dibujar un diagrama temporal de la ejecución Tratar de inferir a partir del diagrama el tipo de
planificación (expulsora o no; cíclica, FIFO,...); probar con dos combinaciones diferentes de
periodos y tiempos de ejecución Compilar y ejecutar el programa desarrollado para Linux en el
sistema operativo Marte OS sobre máquina desnuda:
. /usr/local/marte-1.9/martevars.sh
cp el_programa /net/lctrserver/mprogram_HOSTNAME
@Override
int a=i*3;
Thread hiloActual=Thread.currentThread();
String miNombre=hiloActual.getName();
System.out.println(
"Finalizado el hilo"+miNombre);
int NUM_HILOS=100;
Thread[] hilosAsociados;
hilosAsociados=new Thread[NUM_HILOS];
hilo.setName("Hilo: "+i);
hilo.start();
hilosAsociados[i]=hilo;
Thread hilo=hilosAsociados[i];
try {
hilo.join();
} catch (InterruptedException e) {
BUCLE
int numAzar=(1+generador.nextInt(5))*100;
Práctica 7- Planificación - II
Escribir un programa que cree varios threads periódicos planificados por prioridades fijas, y
que se sincronizan para utilizar un recurso compartido.
Los threads calcularán sus tiempos de respuesta de peor caso y cada vez que se produzca un
tiempo peor lo pintarán en la pantalla. Eligiendo de manera adecuada los tiempos de ejecución
y el instante de comienzo de cada tarea se podrá observar el fenómeno de la inversión de
prioridad no acotada, por el que una tarea de alta prioridad tiene que esperar a la finalización
de una tarea de baja prioridad.
Thread hilo1;
Thread hilo2;
Thread hilo3;
hilo1.start ();
hilo2.start ();
hilo3.start ();
c2++;
c3++;
Thread ct = Thread.currentThread();
corredor1();
corredor2();
Práctica 8 - Shell
Escribir un script para ser ejecutado por una Shell: que permita cambiar de nombre a todos los
ficheros de un directorio añadiéndoles a todos una extensión la extensión y el nombre del
directorio serán parámetros que se pasen al script Probarlo creando un directorio de prueba
con varios ficheros.
Escribir un segundo script que invoque al primero para todos los directorios contenidos en el
directorio de trabajo. Este segundo script tendrá un único argumento: la extensión a añadir al
nombre de cada fichero Probarlo creando un directorio de prueba con varios directorios, que a
su vez tengan varios ficheros.
Como vemos en la imagen anterior se ejecutó el código donde cambia la extensión de los
archivos y luego ejecuta el archivo para crear más archivos de texto, presionamos una tecla
para continuar y cerrar el programa.
Como vemos aquí se realizó el cambio de la extensión de los archivos de txt a jpeg y con el otro
archivo se volvieron a crear los archivos txt.
CONCLUSIONES