 |
www.es-minix.org Foros de discusión en español, sobre el sistema operativo Minix
|
| View previous topic :: View next topic |
| Author |
Message |
Griselle Banegas Usuario
Joined: 11 Jan 2007 Posts: 11 Location: Honduras
|
Posted: Wed Mar 21, 2007 10:08 pm Post subject: Nanoproye--Griselle Banegas ---10511155 |
|
|
Detalle de instalación de jBACI, cómo lo instaló, qué ejemplos corrió y los resultados que obtuvo.
R=/ --La instalacion de JBACI es muy sencilla , solo basta con descomprimir el archivo en zip, y copiar esta carpeta en una nueva carpeta localizada en el disco C, asi;
C:\JBACI
co esto es sufieciente para que esta implementacion funcione, ya que si no es asi es muy probable que hasta al momento de querer compilar codigo no sea posible.
Y de algunos ejemplos interesantes que corri fueron
add.cm: que opera con variables las cuales suma.
addsem.cm: esta opera tal como la anterior solo que esta ocupa procesos para lograr sumar las variables
sugar.cm: la impresion fue: Kid 2 is getting a cube
Total cubes is: 1
Demostración de cálculos para determinar los problemas que se le asignan
R=/
1 + 0 + 5 + 1 + 1 + 1 + 5 + 5
49 + 48 + 53 +49 +49 +49 + 53 +53
=403/7
=57.57 mod 12
=2.57 = 2
Descripción narrativa de la solución a su primer problema
R=/ Mi problema ya por deduccion de la formula anterior es el numero 2 , que trata de la implementacion de un codigo que le permita a un maestro universitario la forma de contestar preguntas de sus alumnos de modo que estos sean contestadas todas y queel maestro si no recibe mas preguntas este se ponga a dormir.
Y para este problema decidi basarme en el metodo del Barbero Dormilon, ya que es basicamente el mismo concepto , puesto que sus clientess son hilos y utiliza Semaforos, dichos anteriormente basocos para este problema.
Esta algoritmo me desempeñe y realice ademas 4 funciones 2 para los estudiantes llamadas QuestionStart() y QuestionDone(), una para cuando empiese a preguntar y otra para cuando termine.
En el proceso Profesor() utilice procedimientos llamados AnswerStart() y AnswerDone(), ya que estos imprimian cuando el profeso Profesor empezaba a contestar y cuando este terminaba.
Lo mismo y muy importante fue para mi los procedimientos QuestionStart(), ya que al hacer este llamado en el proceso Estudiante tuve que poner un semaforo paraindicar el momento en que el alumno iniciaba la pregunta y el momento en que este terminaba de hacerla para que el proceso profesor supiera que el alumno ya habia terminado de preguntar para empezar a contestar.
Entre otros semaforos mas fueron implementados en este problema ya que unos fueron primero para pruebas iniciales y otros indispensables como el semaforo Terminado, que me permite saber cuando un proceso termina y manda signal al otro para saber que este ya termino.
Y en el main() implemente hilos que son el profesor y los alumnos.
Código fuente del primer problema
| Code: | /* programa profesor ---alumnos*/
semaphore sali = 1;
semaphore sofa = 1;
semaphore listo_profe = 1;
semaphore coord = 2;
semaphore terminado = 0;
int num=3;
semaphore pregunto=0;
semaphore contesto=0;
void QuestionStart(){
int tipopre;
cout<<"alumno #"<< "1"<<" preguntando"<<endl;
tipopre=random(5);
if(tipopre==0){
cout<<"¿En que nos facilita los thread para manejar procesos?"<<endl;
}else
if(tipopre==1){
cout<<"¿Porque no todos los lenguajes incluyen semaforos y monitores?"<<endl;
}else
if(tipopre==2){
cout<<"¿Cual es el mejor metodo para implementar semaforos?"<<endl;
}else
if(tipopre==3){
cout<<"¿Porque JBACI nos facilita semaforos?"<<endl;
}else
if(tipopre==4){
cout<<"¿En que año surge el problema de los semaforos?"<<endl;
}
}
void QuestionDone(){
cout<<"Termine de Preguntar..."<<endl;
}
void estudiante()
{
while(1){
cout<<"alumno esta listo para preguntar"<<endl;
wait(sali);
wait(sofa);
wait(listo_profe);
signal(sofa);
QuestionStart();
wait(terminado);
QuestionDone();
signal(pregunto);
num=num-1;
signal(sali);
}
}
void AnswerStart(){
cout<<"Iniciando Respuesta...."<<endl;
}
void AnswerDone(){
cout<<"Catedratico ya respondio"<<endl<<endl;
}
void profesor()
{
while (1) {
wait(coord);
signal(terminado);
if(num!=0){
wait(pregunto);
AnswerStart();
AnswerDone();
}
signal(coord);
signal(listo_profe);
}
}
void main()
{
cobegin{
//3 estudiantes
//estudiante();
//estudiante();
estudiante();
profesor();
}
} |
Corrida
Dificultades encontradas y cómo se resolvieron
R=/ Una de las dificultades al inicio fue saber la forma correcta en que se pueden implementar los semaforos.
Tambien tuve la dificultad que en ningun momento el proceso de estudiantes empezaba, pero esto surge por los mismos semaforos.
Otro problema aun no resuelto es el fin de linea (endl) ya que en ocasiones suele salir las impresiones en forma desordenada y sin sentido alguno.
Conclusiones
R=/ Realmente solo al ponerme a programar supe el verdadero funcionamiento y modos en que operan los semaforos y los hilos ya que no es lo mismo ver o leer un codigo a hacerlo ya que se nos presentan dificultades que al mismo tiempo nos enseñan como es el verdadero uso de estos metodos, solo asi supe que tan importante s proteger una seccion critica. |
|
| Back to top |
|
 |
aega1988 Usuario
Joined: 11 Jan 2007 Posts: 9
|
Posted: Wed Mar 21, 2007 10:38 pm Post subject: Documentacion proyecto 10611086 Adrian García |
|
|
Para instalar el compilador de jbaci, descomprimi el archivo proporcionado en el CD de Sistemas Operativos en el directorio 'C:/jbaci'. Y luego ya pude correr el ejecutable.
Corri todos los ejemplos utilizados en codigo c. Hay ejemplos muy interesantes que me ayudaron a trabajar en el proyecto, ya que nos demuestra que es lo que sucede cuando no hay regiones críticas protegidas por semaforos, además podemos apreciar la concurrencia de procesos. Incluso hubo en ejemplo que es muy entretenido 'graph.cm' ya que graficamente nos muestra la concurrencia entre 2 procesos.
10611086: en codigo ascii es 49 48 54 49 49 48 56 54
al sumarlos obtengo el resultado de 407.
se divide dentro de 7 y me da 58.14, que se aproxima a 58, luego el residuo modulo 5 de esto es 3.
Por lo tanto me toco el problema de las ballenas.
Basicamente lo que hice fue crear una funcion ballena() que inicialmente hace el ciclo pedido de 'hacer cualquier cosa' que es un ciclo for que contiene la funcion random(). Luego con la misma funcion random(3), significa que el resultado estara entre 0 y2, se elige por medio de una decision anidada que funcion se utilizara (male(), female(), matchmaker() ) para asignar el tipo de ballena que sera.
Las funciones male(), female() y matchmaker() funcionan en concurrencia, y para que se puedan retornar tienen que estar los tres juntas. Esto se logra utilizando semaforos, utilizo dos contadores que sirven para crear una cola de 'machos' y 'hembras' y dos semaforos binarios para que la 'casamentera' sepa que ya esta listo un 'macho' y una 'hembra'
La dificultad que se encontro fue que casi siempre algunas de las funciones quedaban esperando (en un wait() ) a que se les dejara seguir, pero debido a que no habia como formar parejas entonces no podían seguir adelante, este problema se dio debido a los semaforos y no se pudo resolver.
| Code: | binarysem pareja1 = 0;
binarysem pareja2 = 0;
semaphore macho= 0;
semaphore hembra= 0;
int no_uniones=0;
void male(){
cout<<"Soy Macho\n";
signal( macho);
wait(pareja1);
}
void female(){
cout<<"Soy Hembra\n";
signal( hembra);
wait(pareja2);
}
void matchmaker(){
cout<<"Soy Casamentera\n";
wait(hembra);
wait(macho);
cout<<"Hice una union\n";
no_uniones++;
signal(pareja1);
signal(pareja2);
}
void ballena(){
int i,x,tipo;
cout<<"Estoy generando numeros aleatorios\n";
for(i=0;i<2;i++){
x=random(10);
}
tipo=random(3);
if(tipo==1){
male();
}else
if(tipo==2){
female();
}else{
matchmaker();
}
}
int main(){
cobegin{
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
ballena();
}
} |
En conclusion, con este proyecto se pudo lograr trabajar y entender mejor la concurrencia de procesos, sincronizacion de procesos, regiones críticas y semaforos. Conocer sus aplicaciones es de gran importancia ya que como vimos con los problemas clasicos son base para muchos otro problemas mas existentes. |
|
| Back to top |
|
 |
javi-isc Usuario
Joined: 20 Jul 2006 Posts: 10
|
Posted: Wed Mar 21, 2007 11:44 pm Post subject: Nano-Proyecto #1 |
|
|
Instalación de jBACI,
Se creó una carpeta llamada “jbaci” en la raíz principal del disco duro “c:\”.
Se copiaron todos los archivos (previamente descomprimidos del archivo jbaci1-4-5.zip) a la carpeta “jbaci”.
Se ejecutó el archivo “java -jar jbaci.jar”.
Finalmente se ejecuta el archivo run.bat, apareciendo el simulador de jBACI.
Obs. Para el funcionamiento de este simulador se debe tener previamente instalado la máquina virtual de Java.
Al iniciar la ejecución de jBACI se emplearon varios ejemplos para ver el funcionamiento de estos, comenzando desde el más sencillo “Hello.pm”, hasta el más largo “Linda.pm”.
Los ejemplos que más ayudaron fueron el de los filósofos ya que utiliza semáforos, así como también el ejemplo Sem2.pm, que también utiliza semáforos.
Cta # 9 9 1 1 0 1
Código ASCII : 57 + 57 + 49 + 49 + 48 + 49 = 309
Cálculo del módulo 5 (309 mod 5) = 4
Al comenzar la solución del problema de sincronización de las cajas de seguridad, comencé creando los tres procedimientos principales.
Estos procedimientos tienen algo en común, se ejecutan dentro de un ciclo finito, y manejan una bandera individual, para el control de secuencia.
CostumerArrives(): Que es el procedimiento que le corresponde al cliente del banco, su función principal es iniciar al cliente mostrando un mensaje: “Cliente hace el Depósito”, previamente esta instrucción junto con otras están en región crítica, por eso es que se utiliza un semáforo “c”, y luego utilizando otro semáforo “o” para la utilización del procedimiento OpenDepositBox.
OpenDepositBox(): Este Procedimiento se ejecuta hasta que el procedimiento CostumerArrives() le de chance para su ejecución, mostrando el mensaje: “OpenDepositBox es Llamado por el Cliente” esta instrucción es la que entra a la región crítica, y es donde se utiliza el semáforo “o” modificando las respectivas banderas.
BankManagerArrives(): Este procedimiento es el último que se debería ejecutar ya que según el problema el Gerente del banco debe de despertarse y dejar de hacer algo y cerrar la Bóveda del Banco, este procedimiento muestra el mensaje : “Gerente del Banco Cierra la Bóveda”, y así se debería de terminar el ciclo.
Código Fuente
program Caja_Seg2;
{ Javier Ordóñez Cta # 991101 }
{ Problema de Sincronización de las cajas de seguridad. }
const M = 100;
var c: semaphore := 1;
var b: semaphore := 1;
var o: semaphore := 1;
var c1: integer := 1;
var b1: integer := 0;
var o1: integer := 0;
procedure CustomerArrives(k: integer);
var I: Integer;
begin
for I := 1 to M do
begin
if c1 = 1 then
begin
o1 := 0;
b1 := 0;
wait(c);
writeln('Cliente hace el Depósito');
b1 := 0;
o1 := 1;
wait(o);
signal(o);
signal(c);
{ end
else
begin}
c1 := 0;
o1 := 1;
end;
end;
end;
procedure OpenDepositBox(k: integer);
var I: Integer;
begin
for I := 1 to M do
begin
if o1 = 1 then
begin
b1 := 0;
c1 := 0;
wait(o);
writeln('OpenDepositBox es Llamado por el Cliente');
b1 := 1;
signal(o);
wait(b);
signal(b);
end;
end;
end;
procedure BankManagerArrives(k: integer);
var I: Integer;
begin
for I := 1 to M do
begin
if b1 = 1 then
begin
o1 := 0;
c1 := 1;
b1 := 0;
{ wait(o);}
wait(b);
writeln('Gerente del Banco Cierra la Bóveda');
o1 := 0;
c1 := 1;
b1 := 0;
signal(b);
{ signal(o);}
end;
end;
end;
begin
cobegin
CustomerArrives(1);
OpenDepositBox(2);
BankManagerArrives(3);
coend;
end.
Dificultades encontradas
Una de las grandes dificultades que encontré al principio es entender realmente lo que pedía el problema.
Psd. En estos momentos acabo de tener la revisión y me di cuenta que no lo comprendí bien ya que el gerente tenía que abrir la bóveda y sólo lo implementé para que la cerrara.
Otra dificultad encontrada fue la comprensión de cómo funcionan realmente los Semáforos, ya que es la primera vez que los utilizo.
Funciones no implementadas
No se implementó la función de creación de números aleatorios e indicar un mensaje en pantalla “Estoy generando números aleatorios”.
No se implementó la solución de que se necesitan insertar las dos llaves simultáneamente.
Conclusiones
Se comprendió la importancia de conocer el manejo de la sincronización de procesos
La concurrencia en el sistema operativo es vital ya que ayuda a mejorar el rendimiento de los recursos de la computadora
Existen muchos algoritmos para que los procesos entren a la región crítica, y es importante conocer y manejar a la perfección los mas importantes. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|