BUAP FACULTAD DE CIENCIAS DE LA COMPUTACIÓN SISTEMAS OPERATIVOS 2 REPORTE APPLET PROGRAMA DE PARTICIONES INTEGRANTES: JOSE ANTONIO MÉNDEZ BARRIOS JAIME MORALES FLORES PRIMAVERA 2015 201118720 200917708 Introducción Un archivo mapeado a memoria (en inglés Memory-mapped file) es un esquema que permite la asociación o una correlación byte a byte entre un archivo y una porción de la Memoria Virtual, básicamente permiten acceder a archivos de disco a través de punteros de memoria. Esta asociación permite a una aplicación o a algunos procesos ejecutar acciones de lectura y escritura (sobre el archivo) directamente, como si se encontrara en la memoria principal. Desarrollo de la práctica Programa 1. a) Planteamiento En esta práctica realizamos la simulación de memoria paginada, esta se hizo en java usando un applet. b) Especificar interrupciones y librerías. java.awt.event.* Si queremos que este applet maneje eventos, debemos importar este paquete y utilizar la interface ActionListener para implementar la accion que responda al evento en el método actionPerformed(). java.util.Random Nos permite crear un objeto de la clase Random, llamar a una de las funciones miembro que generan un número aleatorio. java.awt.* Contiene todas las herramientas necesarias para desarrollar interfaces gráficos. java.applet.* Contiene todas las herramientas necesarias para desarrollar los applets. c) Código en JAVA Particle.java import java.util.Random; import java.awt.*; import java.lang.*; class Particle extends Thread { protected int x; protected int y; protected String nombre ; protected int volumen; protected int volumen2; protected int valor; protected int rest; protected int tiempo; protected boolean estado; protected final Random rng = new Random(); public Particle(String name,int initialx, int initialy,int vol,int ll,boolean e,int value,int time) { nombre=name; x=initialx; y=initialy; volumen=vol; volumen2=ll; estado=e; rest=0; valor=value; tiempo=time; } public synchronized void move() { synchronized(this) { estado=false; int rest1=volumen; int x=((int)(Math.random()*10)); int y=((int)(Math.random()*51)); if(x==0) { if(volumen==0) { valor=1; volumen=0; } volumen-=3; } else { estado=false; if(volumen<0) { valor=1; volumen=0; } else volumen-=3; } } System.out.println("particle valor= "+valor+"de: "+nombre); } public void draw(Graphics g) { int lx,ly,v,ti; boolean es; String nam; synchronized(this) { lx=x; ly=y; ti=tiempo; v=volumen; nam=nombre; es=estado; System.out.println("volumen"+volumen); } g.setColor(Color.cyan); g.fillRect(150,7,400,30); g.setColor(Color.red); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 30)); g.drawString("GESTOR DE MEMORIA", 230,30); //MEMORIA g.setColor(Color.blue); g.drawRect(350,80,94,90); g.setColor(Color.blue); g.drawRect(350,170,94,65); g.setColor(Color.blue); g.drawRect(350,240,94,65); g.setColor(Color.blue); g.drawRect(350,310,94,65); g.setColor(Color.blue); g.drawRect(350,380,94,65); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 20)); g.drawString("S.O",380 ,110); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 15)); g.drawString("0",450 ,90); g.drawString("300",450 ,180); g.drawString("500",450 ,250); g.drawString("800",450 ,310); g.drawString("1100",450 ,380); g.drawString("1400",450 ,450); //MEMORIA FIN g.setColor(Color.red); g.fillRect(lx+340,ly+66,94, v+50); if(valor>100) { g.setColor(Color.green); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 15)); g.drawString("el tiempo promedio de espera fue de: "+(valor-100), lx+100,ly+270); System.out.println("resultado"+valor); } g.setColor(Color.green); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 15)); g.drawString(nam, lx+22,ly+140); g.setColor(Color.red); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 10)); g.drawString(" ",lx+107,ly+95); g.drawString(" ",lx+107,ly+105); if(es==false) { if(v>0) { g.drawString("Tiempo:"+v,lx+22,ly+100); g.drawString("Tamaño:"+ti,lx+22,ly+125); } if(v==14) g.drawString("",lx+107,ly+95); if(v<1) { g.drawString("TERMINO TAREA",lx+480,ly+100); g.drawString(nam,lx+480,ly+130); } if(v==0) g.drawString("",lx+22,ly+195); } if(es==true) { g.setColor(Color.green); g.setFont(new Font("BOOK ANTIQUA", Font.CENTER_BASELINE, 15)); g.drawString("", lx+22,ly+100); g.setColor(Color.magenta); } } } ParticleApplet.java import import import import import import import java.awt.*; javax.swing.*; java.util.*; java.awt.event.*; java.awt.*; java.applet.*; java.util.Random; public class ParticleApplet extends Applet { protected Thread[] threads=null; protected final ParticleCanvas canvas = new ParticleCanvas(300); public int cont=0; public int segmentos[]; public int resp_segmentos[]=new int[20]; public int valor_total=64; public int valor_resta=0; public void init() { add(canvas); } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0,0,800,800); } protected Thread makeThread(final Particle p){ Runnable runloop=new Runnable(){ public void run(){ System.out.println("runloop valor= "+p.valor+"de: "+p.nombre); try{ System.out.println("runloop volumen= "+p.volumen); for(;;){ if(p.valor==0){ System.out.println("runloop volumen= "+p.volumen); p.move(); canvas.repaint(); Thread.sleep(1300); } } }catch(InterruptedException e){return;} } }; return new Thread(runloop); } public synchronized void start() { int n=15; int v=15; int x1=15; int y2=101; Integer e0 = 0; int p=0; String respc1; Particle[] particles= new Particle[n]; int e; if(threads==null) { JOptionPane.showMessageDialog(null, "PROGRAMA DE ADMINISTRACÌÓN DE MEMORIA","MEMORIA",JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(null, "EL MAXIMO DE MEMORIA ES DE 64 MB\n POR FAVOR PIENSE BIEN EL TAMAÑO DEL PROCESO","MEMORIA",JOptionPane.INFORMATION_MESSAGE); respc1 = JOptionPane.showInputDialog("1)DIVIDIR CADA PARTICIONES POR USUARIO\n2)DAR NUMERO DE PARTICIONES"); e0 = Integer.parseInt(respc1); do { if(e0==1) { respc1 = JOptionPane.showInputDialog("1)CUANTO MIDE LA PARTICION?"); e0 = Integer.parseInt(respc1); resp_segmentos[p]=e0; p+=1; valor_total=valor_total-e0; valor_resta+=valor_total; System.out.println("valor_resta= "+valor_resta); System.out.println("valor_total= "+valor_total); System.out.println("p= "+p); } }while(valor_total!=0);} else if(e0==2) { respc1 = JOptionPane.showInputDialog("1)CUANTAS PARTICIONES QUIERE?"); e0 = Integer.parseInt(respc1); int div=64/e0; resp_segmentos[p]=e0; p+=1; } do { System.out.println("Programa MEMORIA"); String respc; respc = JOptionPane.showInputDialog("1)Nuevo PROCESO \n2) VER PROCESOS"); e = Integer.parseInt(respc); if(e==1) { respc = JOptionPane.showInputDialog(" ¿ Cantidad de TAMAÑO ? "); int c = Integer.parseInt(respc); if(c<301) { cont+=1; if((cont%5)==0) { y2+=200; x1=5; } if(cont==1) particles[cont-1]=new Particle("PROCESO "+cont,x1,y2,16,16,false,0,c); else particles[cont-1]=new Particle("PROCESO "+cont,x1,y2,16,16,false,v,c); v-=1; y2+=73; } else JOptionPane.showMessageDialog(null, "EL MAXIMO DE TIEMPO ES 300","MEMORIA",JOptionPane.INFORMATION_MESSAGE); } }while(e!=2&&cont!=5); canvas.setParticles(particles); threads=new Thread[cont]; for(int i=0;i<cont;++i) { System.out.println("numero de hilos "+threads.length); threads[i]=makeThread(particles[i]); threads[i].setPriority(i+1); threads[i].start(); } } public synchronized void stop(){ if(threads != null){ for(int i=0;i<threads.length;++i) threads[i].interrupt(); threads=null; } } } ParticleCanvas.java import java.awt.*; import java.applet.*; import java.lang.*; class ParticleCanvas extends Canvas { public int aux=0; private Particle[] particles=new Particle[0]; ParticleCanvas(int size) { setSize(new Dimension(800,600)); } protected synchronized void setParticles(Particle[] ps) { if(ps==null) throw new IllegalArgumentException("No puede ser nulllo"); particles=ps; } protected synchronized Particle[] getParticles() { return particles; } public void paint(Graphics g) { Particle[] ps=getParticles(); for(int i=0;i<ps.length;i++) { System.out.println("\nENTRA la i vale:"+i); System.out.println("si paint "+i+" valor= "+ps[i].valor+"volumen= "+(ps[i].volumen)); System.out.println("volumen= "+(ps[i+1].volumen)+" de= "+(i+1)+"valor= "+(ps[i+1].valor)); if(ps[i].volumen==1) { ps[i+1].valor=0; System.out.println("si se cumplio la cond= "+ps[i+1].valor); System.out.println("para proceso= "+ps[i+1].nombre); } else if(ps[i].valor==0||ps[i+1].valor==0) { ps[i].draw(g); ps[i+1].draw(g); } System.out.println("\nSALE la i vale:"+i); System.out.println("\ny el arreglo:"+ps[i].volumen2); } } public int Suma() { Particle[] ps=getParticles(); int aux2=0; for(int j=0;j<3;j++) { if(j==0) aux2+=ps[j].volumen2; else { aux+=ps[j].volumen2; System.out.println("\nj vale: "+j); System.out.println("\n:aux "+aux); aux+=(ps[j].volumen2+aux2); System.out.println("\naux: "+aux); } } aux2=((aux)/4); return aux2; } } Myrunnable.java public interface Myrunnable extends java.lang.Runnable { } e) Pantallas de la corrida Estas son las ventanas que se abren al momento de empezar a ejecutar el applet. Aquí nos dice que el máximo de memoria va a ser de 64mb. Luego nos abrirá esta ventana y escogeremos la primera opción. Después tenemos que poner el tamaño de la partición. Después seleccionaremos la opción de Nuevo proceso y le asignaremos un tamaño. Después de esto ya tendremos asignado el primer proceso, si queremos podemos ir insertando más procesos pero el número máximo de procesos que podremos insertar será de 4. Al terminar de insertar los procesos los podremos ver de manera gráfica seleccionando la opción VER PROCESOS. Conclusión - Reflexión de lo aprendido Aprendimos el funcionamiento de la gestión de memoria mediante la paginación (la paginación de memoria dividen los programas en pequeñas partes). La cantidad de memoria desperdiciada por un proceso es el final de su última página, esta minimiza la fragmentación interna. También aprendimos la manera en cómo se crea un applet y como es su funcionamiento en una aplicación y también el modo de ejecutarlos ya que para compilarlo se le tienen que dar permisos de seguridad en java. Bibliografía http://www.deciencias.net/simulaciones/paginas/appletjava.htm http://proton.ucting.udg.mx/tutorial/java/Cap2/compilapp.html