Beruflich Dokumente
Kultur Dokumente
Licenciatura en Sistemas
Corrientes - Argentina
2009
A mi Familia, Amigos y Compañeros
Prefacio
Una de las muchas y muy variadas posibles aplicaciones de la P.O.O. (programación
orientada a objetos) está en el desarrollo de algoritmos que implementen estrategias de
administración de recursos por parte del Sistema Operativo.
Como parte de las estrategias antes mencionadas, podemos considerar las de adminis-
tración o asignación del procesador, es decir aquéllas según las cuales los S. O. seleccionan
a cuál de los procesos listos para ser ejecutados en ejecución concurrente, le asignarán el
procesador en un momento dado, es decir, a qué proceso darán la posibilidad de utilizar
la CPU para ejecutar sus propias instrucciones; a esta decisión también se la conoce como
despacho del proceso.
El concepto central de cualquier Sistema Operativo es el de proceso: una abstracción
de un programa en ejecución también llamada tarea.
En sistemas de multiprogramación la CPU alterna de programa en programa, en
un esquema de seudoparalelismo, es decir que la cpu ejecuta en cierto instante un solo
programa, intercambiando muy rápidamente entre uno y otro.
El paralelismo real de hardware se da en las siguientes situaciones:
En cuanto a las jerarquías de procesos es necesario señalar que los Sistemas Opera-
tivos deben disponer de una forma de crear y destruir procesos cuando se requiera durante
la operación, teniendo además presente que los procesos pueden generar procesos hijos
mediante llamadas al Sistema Operativo, pudiendo darse ejecución en paralelo.
Respecto de los estados del proceso deben efectuarse las siguientes consideraciones:
vi
— Desde el punto de vista lógico no puede continuar porque espera datos que aún
no están disponibles.
— El Sistema Operativo asignó la CPU a otro proceso.
Un proceso puede crear un nuevo proceso, en cuyo caso el proceso creador se denomina
proceso padre y el proceso creado proceso hijo y se obtiene una estructura jerárquica de
procesos.
La destrucción de un proceso implica:
vii
• Obtiene el control.
• Analiza la interrupción.
Una interrupción puede ser iniciada por un proceso en estado de ejecución o por un
evento que puede o no estar relacionado con un proceso en ejecución.
Generalmente las interrupciones se pueden clasificar en los siguientes tipos:
• SVC (llamada al supervisor): es una petición generada por el usuario para un servicio
particular del sistema.
• Externas: son causadas por distintos eventos, por ejemplo, expiración de un cuanto
en un reloj de interrupción o recepción de una señal de otro procesador en un sistema
multiprocesador.
Etapas de desarrollo
Se ha efectuado una amplia recopilación bibliográfica específica a los temas pertinentes
a la tarea planificada y a los productos de software que se emplearon para la concreción
del trabajo final.
Se ha desarrollado el aplicativo con la utilización del lenguaje Java, versión jdk1.5.0-15.
En el marco de la herramienta Dreamweaver CS3 se desarrollaron la página web del
aplicativo utilizadando páginas HTML.
En el marco de la herramienta Netbeans IDE 6.7.1 se desarrollaron los Applets utili-
zadandos en la página web del aplicativo.
Generacion del ejecutable del Sistema desarrollado por el Profesor Orientador Mgter.
David Luis la Red Martinez, Concurrencia e Hilos en java
Una vez finalizada la etapa de desarrollo se realizaron las siguientes actividades:
• Aplicación desarrollada.
1 Introducción 1
1.1 Qué es un Sistema Operativo . . . . . . . . . . . . . . . . . . . . . 1
1.2 Historia de los Sistemas Operativos - Generaciones . . . . . . . . . . . . . . 3
1.3 Conceptos de los Sistemas Operativos . . . . . . . . . . . . . . . 6
1.4 Estructura de los Sistemas Operativos . . . . . . . . . . . . . . . 8
1.5 Tendencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6 Definiciones Sobre Procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.7 Estados de Procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.8 El Núcleo del Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . 18
1.9 Planificación de Procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.10 Niveles de Planificación del Procesador . . . . . . . . . . . . . . . . . . . . . 20
1.11 Objetivos de la Planificación . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.12 Conceptos Básicos de Almacenamiento Virtual . . . . . . . . . . . . . . . . 23
1.13 Organización del Almacenamiento de Niveles Múltiples . . . . . . . . . . . . 24
1.14 Sistemas de Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.15 Funciones del Sistema de Archivos . . . . . . . . . . . . . . . . . . . . . . . 27
1.16 El Sistema de Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.17 Entrada / Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.18 Algoritmos de Programación del Brazo del Disco . . . . . . . . . . . . . . . 29
2 Fundamentos Teóricos 33
2.1 Procesos y Administración del Procesador . . . . . . . . . . . . . . . . . . . 33
2.1.1 Criterios de Planificación . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2 Planificación Apropiativa Versus No Apropiativa . . . . . . . . . . . . . . . 34
2.3 Temporizador de Intervalos o Reloj de Interrupción . . . . . . . . . . . . . . 35
2.4 Prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.5 Tipos de Planificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.5.1 Planificación a Plazo Fijo . . . . . . . . . . . . . . . . . . . . . . . . 36
2.5.2 Planificación Garantizada . . . . . . . . . . . . . . . . . . . . . . . . 37
2.5.3 Planificación del Primero en Entrar Primero en Salir (FIFO) . . . . 37
2.5.4 Planificación de Asignación en Rueda (RR: Round Robin) . . . . . . 37
2.5.5 Tamaño del Cuanto o Quantum . . . . . . . . . . . . . . . . . . . . . 38
2.5.6 Planificación del Trabajo Más Corto Primero (SJF) . . . . . . . . . 38
2.5.7 Planificación del Tiempo Restante Más Corto (SRT) . . . . . . . . . 39
2.5.8 Tiene mayor sobrecarga que la planificación SJF. . . . . . . . . . . . 39
xi
xii ÍNDICE GENERAL
3 JAVA 73
3.1 Introducción al Lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.1 Bibliotecas de Clases Estándares de Java . . . . . . . . . . . . . . . 74
3.1.2 Java es Multiplataforma . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.1.3 Características del Lenguaje Java . . . . . . . . . . . . . . . . . . . . 75
3.2 Estructura General de un Programa Java . . . . . . . . . . . . . . . . . . . 76
3.3 Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.3.1 Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.3.2 Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.3.3 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.3.4 Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.3.5 La Jerarquía de Clases de Java (API) . . . . . . . . . . . . . . . . . 79
3.4 Variables Dentro del Lenguaje Java . . . . . . . . . . . . . . . . . . . . . . . 79
3.4.1 Visibilidad y Vida de las Variables . . . . . . . . . . . . . . . . . . . 81
3.5 Operadores en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.1 Operadores Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.2 Operadores de Asignación . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.3 Operadores Unarios . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.4 Operadores Incrementales . . . . . . . . . . . . . . . . . . . . . . . . 83
3.5.5 Operadores Relacionales . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.5.6 Operador de Concatenación de Cadenas de Caracteres (+) . . . . . 84
3.5.7 Precedencia de Operadores . . . . . . . . . . . . . . . . . . . . . . . 84
3.6 Estructuras de Programación . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.6.1 Sentencias o Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.6.2 Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.6.3 Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.6.4 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.7 Clases en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.7.1 Características Importantes de las Clases . . . . . . . . . . . . . . . 90
3.7.2 Métodos o Funciones Miembros . . . . . . . . . . . . . . . . . . . . . 90
3.8 Algunas Clases de Utilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.8.1 Clase Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.8.2 Clases String y StringBuffer . . . . . . . . . . . . . . . . . . . . . . . 93
3.8.3 Clase Double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.8.4 Clase Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.9 El AWT (Abstract Windows Toolkit) . . . . . . . . . . . . . . . . . . . . . . 94
3.9.1 Qué es el AWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.9.2 Creación de una Interface Gráfica de Usuario . . . . . . . . . . . . . 94
3.9.3 Objetos “event source” y Objetos “event listener” . . . . . . . . . . 95
3.9.4 Proceso a Seguir Para Crear Una Aplicación Interactiva (Orientada
a Eventos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.10 Errores Frecuentes de Programación . . . . . . . . . . . . . . . . . . . . . . 96
3.10.1 Scheduling de Hilos de Ejecución . . . . . . . . . . . . . . . . . . . . 96
3.10.2 Errores en el Uso de las Características de Portabilidad de Java . . . 97
3.10.3 Uso de Directorios Definidos . . . . . . . . . . . . . . . . . . . . . . 98
xiv ÍNDICE GENERAL
6 Conclusión 159
Bibliografía 161
xvii
xviii ÍNDICE DE FIGURAS
xxi
Capítulo 1
Introducción
• Programas de sistema:
• Programas de aplicación:
• Programas de aplicación:
1
2 CAPÍTULO 1. INTRODUCCIÓN
• Programas de sistema:
• Hardware:
— Lenguaje de máquina.
— Microprogramación.
— Dispositivos físicos
• Busca las instrucciones de lenguaje de máquina para ejecutarlas como una serie de
pequeños pasos.
• Procesadores.
• Almacenamiento.
• Dispositivos de e / s.
• Datos.
• Operadores.
• Programadores de aplicaciones.
• Programas.
• Hardware.
• Usuarios.
— Carencia total de S. O.
— Completo acceso al lenguaje de máquina.
— Carencia de S. O.
4 CAPÍTULO 1. INTRODUCCIÓN
— Difusión de la multiprogramación:
∗ Partición de la memoria en porciones, con trabajos distintos en cada una
de ellas.
∗ Aprovechamiento del tiempo de espera consecuencia de operaciones de e /
s, para utilizar la CPU para otros procesos.
— Protección por hardware del contenido de cada partición de memoria.
— Aparición de técnicas de spooling:
∗ Simultaneous Peripheral Operation On Line: operación simultánea y en
línea de periféricos.
∗ Almacenamiento de trabajos de entrada y de salida en dispositivos tran-
sitorios rápidos (discos), para disminuir el impacto de los periféricos mas
lentos.
— Son sistemas de modos múltiples, es decir que deben soportar sistemas
de propósitos generales; son grandes y complejos pero muy poderosos.
— Interponen una capa de software entre el usuario y el hardware.
— Aparecen los lenguajes de control de trabajos, necesarios para especificar
el trabajo y los recursos requeridos.
— Soportan timesharing (tiempo compartido), variante de la multiprogra-
mación con usuarios conectados mediante terminales en línea, permitiendo la
operación en modo interactivo o conversacional.
— Aparecen los sistemas de tiempo real, que requieren tiempos de respuesta
muy exigentes, especialmente para usos industriales o militares.
6 CAPÍTULO 1. INTRODUCCIÓN
• Procesos:
1.3. CONCEPTOS DE LOS SISTEMAS OPERATIVOS 7
• Archivos:
• Llamadas al sistema:
• Sistemas monoliticos:
— El primer sistema con este esquema fue el “THE” (Holanda - Dijkstra -1968):4
∗ “THE”: Technische Hogeschool Eindhoven.
∗ Capa 0:
· Trabaja con la asignación del procesador.
· Alterna entre los procesos cuando ocurren las interrupciones o expiran
los cronómetros.
2
Ver Figura 3.1 de la página 102 [10, Tanenbaum].
3
Ver Figura 1.3 de la página 9 [10, Tanenbaum].
4
Ver Tabla 1.1 de la página 10 [10, Tanenbaum].
1.4. ESTRUCTURA DE LOS SISTEMAS OPERATIVOS 9
SIST. OPER.
4
EN MODO
PROC. DE SERVICIO N U C LE O
3
1
PROCED. PRINCIPAL
PROC. DE
SERVICIO
PROCED.
UTILITARIOS
5 - Operador
4 - Programas del Usuario
3 - Control de Entrada / Salida
2 - Comunicaciones Operador - Proceso
1 - Administración de la Memoria y del Disco
0 - Asignación del Procesador y Multiprogramación
• Máquinas virtuales:
INSTRUC. LLAMADA AL
DE E / S SISTEMA AQUI
AQUI
CMS CMS CMS
TRAMPA AQUI
VM / 370
TRAMPAS
AQUI 370 HARDWARE SIMPLE
1.5 Tendencias
Las principales tendencias en S. O. son las siguientes [4, Deitel]:
NUCLE O MODO
NUCLEO
RED
• La unidad despachable.
• Si la cpu alterna entre los procesos, la velocidad a la que ejecuta un proceso no será
uniforme, por lo que es necesario aclarar lo siguiente:
— Que los procesos no deben programarse con hipótesis implícitas acerca del tiem-
po.
— Que normalmente la mayoría de los procesos no son afectados por la multipro-
gramación subyacente de la cpu o las velocidades relativas de procesos distintos.
• Un proceso es una actividad de un cierto tipo, que tiene un programa, entrada, salida
y estado.
• Un solo procesador puede ser compartido entre varios procesos con cierto “algoritmo
de planificación” , el cual determina cuándo detener el trabajo en un proceso y dar
servicio a otro distinto8 .
En cuanto a las jerarquías de procesos es necesario señalar que los Sistemas Opera-
tivos deben disponer de una forma de crear y destruir procesos cuando se requiera durante
la operación, teniendo además presente que los procesos pueden generar procesos hijos
mediante llamadas al Sistema Operativo, pudiendo darse ejecución en paralelo.
Respecto de los estados del proceso deben efectuarse las siguientes consideraciones:
— Desde el punto de vista lógico no puede continuar porque espera datos que aún
no están disponibles.
— El Sistema Operativo asignó la cpu a otro proceso.
8
Ver Figura 1.7 de la página 16 [10, Tanenbaum].
9
Ver Figura 1.8 de la página 16 [10, Tanenbaum].
16 CAPÍTULO 1. INTRODUCCIÓN
UN CONTADOR DE PROGRAMA
ALTERNADOR DE PROCESOS
A
D
A C D B
P
R
D
O
C C
E
S B
O
A
TIEMPO
10
Ver Figura 1.9 de la página 17 [10, Tanenbaum].
1.7. ESTADOS DE PROCESOS 17
Cuando el Sistema Operativo cambia la atención de la cpu entre los procesos, utiliza
las áreas de preservación del PCB para mantener la información que necesita para reiniciar
el proceso cuando consiga de nuevo la cpu.
18 CAPÍTULO 1. INTRODUCCIÓN
Los sistemas que administran los procesos deben poder crear, destruir, suspender,
reanudar, cambiar la prioridad, bloquear, despertar y despachar un proceso.
La “creación” de un proceso significa:
Un proceso puede “crear un nuevo proceso”, en cuyo caso el proceso creador se de-
nomina “proceso padre” y el proceso creado “proceso hijo” y se obtiene una “estructura
jerárquica de procesos”.
La “destrucción” de un proceso implica:
• Manipulación de interrupciones.
1.9. PLANIFICACIÓN DE PROCESOS 19
• Despacho.
• Sincronización de procesos.
Criterio Descripción
Equidad Garantizar que cada proceso obtiene su proporción
justa de la cpu
Eficacia Mantener ocupada la cpu el ciento por ciento
del tiempo
Tiempo de respuesta Minimizar el tiempo de respuesta para los
usuarios interactivos
Tiempo de regreso Minimizar el tiempo que deben esperar los
usuarios por lotes (batch) para obtener
sus resultados
Rendimiento Maximizar el número de tareas procesadas por hora
— Determina a qué proceso listo se le asigna la cpu cuando esta queda disponible
y asigna la cpu al mismo, es decir que “despacha” la cpu al proceso.
12
Ver Figura 1.10 de la página 21 [4, Deitel].
1.11. OBJETIVOS DE LA PLANIFICACIÓN 21
TRABAJOS ESPERANDO
E NT R AD A
ENTRADA DE TRABAJOS
TRABAJOS ESPERANDO
INICIACION
PLANIFICACION DE
INICIACION DE TRABAJOS ALTO NIVEL
TRABAJOS SUSPENDIDOS
ESPERANDO ACTIVACION
ACTIVAR SUSPENDER
PLANIFICACION DE
NIVEL INTERMEDIO
PROCESOS ACTIVOS
DESPACHO PLANIFICACION DE
BAJO NIVEL
PROCESOS EN
EJECUCION
TERMINAR
TERMINADO
Los distintos Sistemas Operativos utilizan varias Políticas de Planificación, que se ins-
trumentan mediante Mecanismos de Planificación .
• Ser justa:
• Ser predecible:
• Minimizar la sobrecarga:
• Asegurar la prioridad:
— Un proceso de baja prioridad podría mantener un recurso clave, que puede ser
requerido por un proceso de más alta prioridad.
— Si el recurso es no apropiativo, el mecanismo de planificación debe otorgar al
proceso un tratamiento mejor del que le correspondería normalmente, puesto
que es necesario liberar rápidamente el recurso clave.
1.12. CONCEPTOS BÁSICOS DE ALMACENAMIENTO VIRTUAL 23
Muchas de estas metas se encuentran en conflicto entre sí, por lo que la planificación
se convierte en un problema complejo.
• “Direcciones virtuales”:
• “Direcciones reales”:
Los procesos hacen referencia a direcciones virtuales pero éstas deben ejecutarse en el
almacenamiento real:
• Las direcciones virtuales deben ser transformadas dentro de las direcciones reales,
mientras el proceso está en ejecución.
24 CAPÍTULO 1. INTRODUCCIÓN
Existen varios medios para asociar las direcciones virtuales con las reales.13
Los mecanismos de “traducción dinámica de direcciones” (dat) convierten las direccio-
nes virtuales en reales al ejecutarse el proceso.
Las direcciones contiguas dentro del espacio de direcciones virtuales de un proceso no
tienen por qué ser contiguas dentro del almacenamiento real, a esto se denomina “con-
tigüidad artificial ”.14
• Permitir que el espacio de direcciones virtuales de un usuario sea mayor que el espacio
de direcciones reales.
• Soportar multiprogramación de forma efectiva en un sistema con muchos usuarios
que compartan el almacenamiento real.
LOCALIZA-
CIONES
CONTI-
GUAS DE
ALMA-
CENA-
MIENTO
VIRTUAL
MECANISMO DE
TRANSFORMACION
DE DIRECCIONES
— En él se ejecutan los procesos y en él deben estar los datos para que un proceso
pueda referirse a ellos.
• Cada proceso puede tener un espacio de direcciones virtuales mucho mayor que el
almacenamiento real.
• Solo se mantiene al mismo tiempo una pequeña parte de los programas y datos de
cada proceso en el almacenamiento real.
ALMACENAM. SECUNDARIO,
ALMACENAM. PRINCIPAL, AUXILIAR O ADICIONAL
PRIMARIO O REAL
DISCOS
PROCESA- ALMACENAM .
OTROS
DORES REAL
DISPOSIT.
ALMACENAMIENTO AUXILIAR
ALMACENAMIENTO
VIRTUAL DEL PROC. B
ALMACENAMIENTO
VIRTUAL DEL PROC. Z
• Los archivos deben ser persistentes, decir que no deben verse afectados por la
creación o terminación de un proceso.
• Los archivos son una colección de datos con nombre.
• Pueden ser manipulados como una unidad por operaciones como: open, close, create,
destroy, copy, rename, list.
• Los elementos de datos individuales dentro del archivo pueden ser manipulados por
operaciones como: read, write, update, insert, delete.
Se debe poder estructurar los archivos de la manera más apropiada a cada aplicación.
Los usuarios deben poder ordenar la transferencia de información entre archivos.
Se deben proporcionar posibilidades de “respaldo” y “recuperación” para prevenirse
contra:
28 CAPÍTULO 1. INTRODUCCIÓN
• Debe suministrar una “visión lógica” de los datos y de las funciones que serán eje-
cutadas, en vez de una “visión física”.
• Se utiliza una “raíz ” para indicar en qué parte del disco comienza el “directorio
raíz ”.
• Un “directorio de usuario” contiene una entrada para cada uno de los archivos del
usuario.
1.17. ENTRADA / SALIDA 29
• Cada entrada de archivo apunta al lugar del disco donde está almacenado el archivo
referenciado.
Los nombres de archivos solo necesitan ser únicos dentro de un directorio de usuario
dado.
El nombre del sistema para un archivo dado debe ser único para el sistema de archivos.
En sistemas de archivo “jerárquicos” el nombre del sistema para un archivo suele estar
formado como el “nombre de la trayectoria” del directorio raíz al archivo.
• Incluye las solicitudes pendientes para cada cilindro enlazadas entre sí en una lista
ligada.
30 CAPÍTULO 1. INTRODUCCIÓN
• Cuando concluye una búsqueda, el manejador del disco tiene la opción de elegir la
siguiente solicitud a dar paso:
Ej. de SSF :
• Durante la búsqueda, llegan solicitudes para los cilindros 1, 36, 16, 34, 9 y 12, en
ese orden.
• Con un disco muy cargado, el brazo tenderá a permanecer a la mitad del disco la
mayoría del tiempo, como consecuencia de ello las solicitudes lejanas a la mitad del
disco tendrán un mal servicio.
• Se mantiene el movimiento del brazo en la misma dirección, hasta que no tiene más
solicitudes pendientes en esa dirección; entonces cambia de dirección.
Ej. del algoritmo del elevador para el caso anterior, con el valor inicial arriba del bit
de dirección:
1.18. ALGORITMOS DE PROGRAMACIÓN DEL BRAZO DEL DISCO 31
— El manejador puede enviar una solicitud para el sector que pasará debajo del
cabezal.
— Se pueden hacer solicitudes consecutivas de distintas pistas de un mismo cilin-
dro, sin generar un movimiento del brazo.
Cuando existen varias unidades, se debe tener una tabla de solicitudes pendientes para
cada unidad.
Si una unidad está inactiva, deberá buscarse el cilindro siguiente necesario, si el con-
trolador permite búsquedas traslapadas.
Cuando termina la transferencia actual se verifica si las unidades están en la posición
del cilindro correcto:
• El factor dominante será el retraso rotacional, por lo tanto, los algoritmos que op-
timizan los tiempos de búsqueda (como el algoritmo del elevador) perderán impor-
tancia frente a los algoritmos que optimicen el retraso rotacional.
• Los 38 bits conforman una palabra de 32 bits junto con 6 bits para verificación.
Este diseño se conoce como RAID; siglas en inglés de “arreglo redundante de discos
no costosos”.
Capítulo 2
Fundamentos Teóricos
• Si un proceso es por lote (batch) o interactivo: los usuarios interactivos deben recibir
inmediato servicio para garantizar buenos tiempos de respuesta.
• ¿Qué urgencia tiene una respuesta rápida?: por ejemplo, un proceso de tiempo real
de un sistema de control que supervise una re.nería de combustible requiere una
respuesta rápida, más rápida que la respuesta requerida por un proceso en lotes
(batch) que deberá entregarse al día siguiente.
— Probablemente los procesos que generan pocos fallos de página hayan acumu-
lado sus .conjuntos de trabajo. en el almacenamiento principal.
— Los procesos que experimentan gran cantidad de fallos de página aún no han
establecido sus conjuntos de trabajo.
— Un criterio indica favorecer a los procesos que han establecido sus conjuntos de
trabajo.
— Otro criterio indica favorecer a los procesos con una tasa alta de fallos de página
ya que rápidamente generarán una petición de Entrada / Salida.
33
34 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
Disciplina Descripción
Apropiativa Una vez que se le ha otorgado la cpu a un proceso,
le puede ser retirada
No Apropiativa Una vez que se le ha otorgado la cpu a un proceso,
no le puede ser retirada
• Frecuentemente un proceso ha sido apropiado por otro de más alta prioridad, lo cual
significa lo siguiente:
• debe ser favorecido un proceso que ha recibido muy poco tiempo de cpu.
• Logra hacer más predecibles los tiempos de respuesta puesto que los trabajos nuevos
de prioridad alta no pueden desplazar a los trabajos en espera.
• La libera voluntariamente.
• El reloj la interrumpe.
2.4 Prioridades
Las prioridades pueden ser de distinto tipo2 .
En el caso de prioridades asignadas arbitrariamente, un mecanismo del sistema necesita
distinguir entre procesos sin importarle cuál es el más importante.
Las principales características de las prioridades estáticas son las siguientes:
• No cambian.
2
Ver Figura 2.2 de la página 36 [4, Deitel].
36 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
Tipos de prioridades
Asignadas automáticamente por el sistema
Asignadas desde el exterior
Dinámicas
Estáticas
Asignadas racionalmente
Asignadas arbitrariamente
• Responden al cambio.
• Los mecanismos de implementación son más complicados que para prioridades es-
táticas.
• La ejecución del trabajo de plazo fijo no debe producir una grave degradación del
servicio a otros usuarios.
1. La cpu es apropiada.
(te + ts)
pr=
ts
• Deben tener prioridad para usar la cpu y efectuar la siguiente petición de Entrada /
Salida, ya que se ejecutará (la operación de Entrada / Salida) en paralelo con otro
proceso que utilice la cpu.
• Si deben esperar mucho tiempo a la cpu estarán ocupando memoria por un tiempo
innecesario.
Un proceso situado en una cola dada no podrá ser ejecutado hasta que las colas de los
niveles superiores estén vacías.
Un proceso en ejecución es apropiado por un proceso que llegue a una cola superior.
Es un mecanismo adaptable, es decir que se adapta a cargas variables.
A los efectos de una revisión gráfica de lo enunciado precedentemente, ver la figura 2.1
de la pág.42, [4, Deitel].
Los criterios que podría utilizar el planificador de nivel superior para tomar sus deci-
siones son los que se indican a continuación:
• Paginación.
• Segmentación.
• Segmentación y paginación.
— Tratan de los casos en que una página o segmento deben ser traídos del alma-
cenamiento secundario al primario.
— Las estrategias de búsqueda por demanda esperan a que se haga referencia
a una página o segmento por un proceso antes de traerlos al almacenamiento
primario.
— Los esquemas de búsqueda anticipada intentan determinar por adelantado a
qué páginas o segmentos hará referencia un proceso para traerlos al almacena-
miento primario antes de ser explícitamente referenciados.
44 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
Estrategias de colocación:
— Tratan del lugar del almacenamiento primario donde se colocará una nueva
página o segmento.
— Los sistemas toman las decisiones de colocación de una forma trivial ya que
una nueva página puede ser colocada dentro de cualquier marco de página
disponible.
Estrategias de reposición:
• El principio de optimización.
• No usada recientemente.
• Conjuntos de trabajo.
• Belady, Nelson y Shedler descubrieron que con la reposición FIFO, ciertos patrones
de referencias de páginas causan más fallos de páginas cuando se aumenta el número
de marcos (celdas) de páginas asignados a un proceso: en esto consiste la anomalía
FIFO.
• No se implementa frecuentemente.
La página seleccionada para reemplazo podría ser la próxima en ser requerida, por lo
que habría que paginarla de nuevo al almacenamiento principal casi de inmediato.
• Ej.: La página de uso menos frecuente puede ser la página de entrada más reciente
al almacenamiento principal, y por lo tanto existe una alta probabilidad de que sea
usada de inmediato.
• Bit referenciado:
La selección de la página que será reemplazada comienza buscando una página que no
ha sido referenciada, pero si no la encuentra habrá que reemplazar una página que ha sido
referenciada.
Si una página ha sido referenciada se comprueba si ha sido modificada o no:
• Si no se encuentra una página que no ha sido modi.cada será reemplazada una página
modificada.
Con el transcurso del tiempo la mayoría de los bits referenciados serán activados:
• Se pierde la capacidad para distinguir las páginas más deseables para ser reempla-
zadas.
2.6.8 Localidad
El concepto de localidad expresa [4, Deitel]:
Los procesos tienden a hacer referencia al almacenamiento en patrones no uniformes y
muy localizados.
La .localidad. se mani.esta en el tiempo y en el espacio:
• Ej.: Los procesos tienden a favorecer ciertos subconjuntos de páginas, las que tienden
a ser adyacentes entre sí en el espacio de direcciones virtuales del proceso.
• Está relacionada con la forma en que se escriben los programas y se organizan los
datos.
— Recorrido de arreglos.
— Ejecución secuencial de código.
— Tendencia de los programadores a colocar de.niciones de variables relacionadas,
próximas entre sí.
• Los conjuntos de trabajo son transitorios y el siguiente conjunto de trabajo del proceso
puede diferir substancialmente de su conjunto de trabajo anterior.
5
Ver Figura 2.5 de la página 50 [4, Deitel].
6
Ver Figura 2.4 de la página 50 [4, Deitel].
50 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
Figura 2.5: Tamaño del conjunto de trabajo como una función del tamaño de la ventana.
2.7. PAGINACIÓN POR DEMANDA Y PAGINACIÓN ANTICIPADA 51
El principal inconveniente está en los procesos que requieren acumular sus páginas una
por una:
• Con páginas grandes, grandes cantidades de información que nunca llegaría a ser
referenciada, se paginarán hacia el almacenamiento primario:
• Los procedimientos y datos rara vez comprenden un número entero de páginas, por
lo que los sistemas de paginación experimentan una .fragmentación interna.:
Los tamaños de pagina mas utilizados son: 512 b, 1 kb, 2 kb, 4 kb.
2.8. PORQUÉ ES NECESARIA LA PLANIFICACIÓN DE DISCOS 53
• Un proceso tiende a hacer referencia a una parte significativa de sus páginas inme-
diatamente después de iniciar su ejecución.
• El proceso puede concluir sin haber referenciado a algunas de sus páginas, corres-
pondientes a rutinas que atienden errores que no se produjeron.
• Cuanto más marcos de página tenga un proceso, mayor será el tiempo entre los fallos
de páginas.
• Asignar marcos de página adicionales más allá del punto de inflexión no produce
efectos significativos sobre el tiempo interfallos.
Respecto del porcentaje de instrucciones de una página que son ejecutadas antes de
transferirse el control a otra página, los valores experimentales obtenidos indican un máxi-
mo de 200 instrucciones por página de 1 kb 8 .
• La generación de peticiones puede ser mucho más rápida que la atención de las
mismas:
• Optimización de la búsqueda.
• Capacidad de ejecución.
La planificación suele mejorar la imagen total al tiempo que reduce los niveles de
servicio de ciertas peticiones:
56 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
• La varianza es un término estadístico que indica hasta qué punto tienden a desviarse
del promedio de todos los elementos los elementos individuales.
• Se desea una política de planificación que minimice la varianza, es decir que maximice
la predecibilidad.
• 2 Incluye las solicitudes pendientes para cada cilindro enlazadas entre sí en una lista
ligada.
• 2 Cuando concluye una búsqueda, el manejador del disco tiene la opción de elegir la
siguiente solicitud a dar paso:
Ej. de SSF:
• Durante la búsqueda, llegan solicitudes para los cilindros 1, 36, 16, 34, 9 y 12, en
ese orden.
• Con un disco muy cargado, el brazo tenderá a permanecer a la mitad del disco la
mayoría del tiempo, como consecuencia de ello las solicitudes lejanas a la mitad del
disco tendrán un mal servicio.
La solución a este problema la brinda el algoritmo del elevador (por su analogía con el
ascensor o elevador):
• Se mantiene el movimiento del brazo en la misma dirección, hasta que no tiene más
solicitudes pendientes en esa dirección; entonces cambia de dirección.
Ej. del algoritmo del elevador para el caso anterior, con el valor inicial arriba del bit
de dirección:
— El manejador puede enviar una solicitud para el sector que pasará debajo del
cabezal.
— Se pueden hacer solicitudes consecutivas de distintas pistas de un mismo cilin-
dro, sin generar un movimiento del brazo.
Cuando existen varias unidades, se debe tener una tabla de solicitudes pendientes para
cada unidad.
Si una unidad está inactiva, deberá buscarse el cilindro siguiente necesario, si el con-
trolador permite búsquedas traslapadas.
Cuando termina la transferencia actual se veri.ca si las unidades están en la posición
del cilindro correcto:
• El factor dominante será el retraso rotacional, por lo tanto, los algoritmos que optimi-
zan los tiempos de búsqueda (como el algoritmo del elevador) perderán importancia
• Los 38 bits conforman una palabra de 32 bits junto con 6 bits para verificación.
Este diseño se conoce como RAID; siglas en inglés de .arreglo redundante de discos
no costosos.
• FCFS.
• SSTF.
• SCAN.
• SCAN de N - Pasos.
• C - SCAN.
• Esquema Eschenbach.
• Las peticiones se reordenan para ser servidas dentro de un cilindro para tomar ven-
taja de la posición rotacional.
2.10.7 Conclusiones
Mediante trabajos de simulación y de laboratorio se demostró lo siguiente:
• Medir la actividad.
Para eliminar ciertos embotellamientos puede ser necesaria una recon.guración del
hardware:
Para ayudar a reducir la congestión del canal, muchos sistemas han incorporado la
técnica de examen (sensado) de posición rotacional (RPS):
• RPS permite al canal quedar libre justo hasta antes de que el registro se encuentre
debajo de la cabeza de lectura - grabación apropiada.
• RPS permite varias peticiones activas al mismo tiempo en un solo canal, incremen-
tando la performance.
• 2 Son muy convenientes desde el punto de vista de las aplicaciones y del usuario.
• Error de programación:
• Error de búsqueda:
El manejador del disco debe controlar los errores de la mejor manera posible.
La mayoría de los controladores:
• Si persisten, el bloque debe ser marcado como un bloque defectuoso, para que el
software lo evite.
• Una tabla asocia las pistas defectuosas con las pistas de repuesto:
• Son adecuados para el almacenamiento de programas o datos con accesos muy fre-
cuentes.
Los bloques de almacenamiento tienen el mismo tamaño que en los discos reales.
Cuando el manejador debe leer de o escribir en un bloque de un disco en RAM, calcula
el lugar de la memoria donde se encuentra el bloque solicitado y lee o escribe en el mismo.
2.15 Relojes
Los relojes o cronómetros son esenciales para la operación de sistemas de tiempo compar-
tido [10, Tanenbaum].
Registran la hora del día.
Evitan que un proceso monopolice la cpu.
El software para reloj toma generalmente la forma de un manejador de dispositivo,
aunque no es un dispositivo de bloque ni de caracter.
Los relojes más sencillo trabajan con la línea de corriente eléctrica de 110 o 220 voltios
y provocan una interrupción por cada ciclo de voltaje, a 50 o 60 hz.
Otro tipo de relojes consta de tres componentes:
— Genera una señal periódica de muy alta precisión, generalmente entre 5 y 100
mhz.
— La señal se alimenta en el contador para que cuente en forma descendente hasta
cero.
2.16. TERMINALES 65
La ventaja del reloj programable es que su frecuencia de interrupción puede ser con-
trolada por el software.
Las principales funciones del software manejador del reloj son:
• Evitar que los procesos se ejecuten durante más tiempo del permitido.
• Controlar llamadas al sistema tipo .alarm. por parte de los procesos del usuario.
El software manejador del reloj puede tener que simular varios relojes virtuales con un
único reloj físico.
2.16 Terminales
Las terminales tienen gran número de formas distintas [10, Tanenbaum] :
• Interfaz RS-232:
— Orientada a caracteres.
— Orientada a bits.
• Poseen una interfaz mediante una memoria especial llamada video RAM:
• Cada bit en el video RAM controla en forma directa un solo pixel de la pantalla.
2.17. PROCESOS Y PROCESADORES EN SISTEMAS DISTRIBUIDOS 67
• Permite una completa .exibilidad en los tipos y tamaños de caracteres, varias ven-
tanas y grá.cos arbitrarios.
Las terminales pueden operar con una estructura central de buffers o con buffers ex-
clusivos para cada terminal.
Frecuentemente los manejadores de terminales soportan operaciones tales como:
• Si tiene varios hilos de control podría ejecutar un segundo hilo mientras el primero
espera:
• Cada hilo:
• Los hilos comparten la cpu de la misma forma que lo hacen los procesos:
• Mientras un hilo está bloqueado se puede ejecutar otro hilo del mismo proceso.
El hilo trabajador verifica si puede satisfacer la solicitud por medio del bloque caché
compartido, al que tienen acceso todos los hilos.
• Se llama:
— Al planificador y se inicializa otro hilo, que tal vez sea el servidor, para pedir
más trabajo; o.
— A otro trabajador listo para realizar un trabajo.
Los hilos ganan un desempeño considerable pero cada uno de ellos se programa en
forma secuencial.
Otro modelo es el de equipo:
2.18. INTRODUCCIÓN A LOS HILOS (THREADS) 69
• Todos los hilos son iguales y cada uno obtiene y procesa sus propias solicitudes.
• No hay servidor.
• Se utiliza una cola de trabajo que contiene todos los trabajos pendientes, que son
trabajos que los hilos no han podido manejar.
• Un hilo debe veri.car primero la cola de trabajo antes de buscar en el buzón del
sistema.
• 2 Los datos pasan de hilo en hilo y en cada etapa se lleva a cabo cierto procesamiento.
• 2 En un verdadero multiprocesador.
En un diseño dinámico:
• Un proceso:
70 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
• Del usuario.
• Del núcleo.
• Cuando un hilo ejecuta una llamada al sistema o cualquier acción que pueda provocar
su suspensión:
• Todas las llamadas que pueden bloquear un hilo se implantan como llamadas al
sistema:
Otro problema de los paquetes de hilos a nivel usuario es que si un hilo comienza su
ejecución no puede ejecutarse ningún otro hilo de ese proceso, salvo que el hilo entregue
voluntariamente la cpu.
Un problema adicional para los hilos a nivel usuario es que generalmente los progra-
madores desean los hilos en aplicaciones donde los hilos se bloquean a menudo:
• Ej.: servidor de archivos con varios hilos.
72 CAPÍTULO 2. FUNDAMENTOS TEÓRICOS
Una de las estructuras es una pila de argumentos compartida por C y S, que se asocia
de manera lectura / escritura en ambos espacios de direcciones.
Para llamar al servidor, C :
El núcleo:
• Modifica el mapa de memoria del cliente para colocar éste en el espacio de direcciones
del servidor.
JAVA
• Objetos.
• Clases.
• Métodos.
• Subclases.
• Herencia simple.
• Enlace dinámico.
• Encapsulamiento.
73
74 CAPÍTULO 3. JAVA
clases cumple el mismo objetivo de una biblioteca de procedimientos en una lenguaje como
C. Sin embargo:
Una biblioteca de clases es mucho más fácil de usar que una biblioteca de procedimien-
tos, incluso para programadores sin experiencia en orientación a objetos. Esto se debe a
que las clases ofrecen mecanismos de abstracción más eficaces que los procedimientos.
Se puede distinguir entre varios tipos de programadores en Java:
• Manejo de archivos.
• Comunicación de datos.
• Interfaces gráficas.
Windows/95 y /NT.
Power/Mac.
Unix (Solaris, Silicon Graphics, ...).
La compatibilidad es total:
A nivel de fuentes: El lenguaje es exactamente el mismo en todas las plataformas.
A nivel de bibliotecas: En todas las plataformas están presentes las mismas biblio-
tecas estándares.
A nivel del código compilado: el código intermedio que genera el compilador es el
mismo para todas las plataformas. Lo que cambia es el intérprete del código intermedio.
• Flexibilidad
import java.awt.event.WindowEvent;
import java.util.*;
import java.awt.TextField;
public class Simu extends Frame implements ActionListener,ItemListener{
MenuBar barra;
m1 =new Menu(“Archivo”);
barra.add(m1);
m2 =new Menu(“Ver”);
barra.add(m2);
....
public static void main(String argv [ ]){
Simu menus = new Simu();
menus.setTitle(“Simulación de Redes”);
menus.setVisible(true);
}
}
Aparece una clase que contiene el programa principal Simu (aquel que contiene la
función main()) y algunas clases de usuario (las específicas de la aplicación que se está
desarrollando) que son utilizadas por el programa principal. La aplicación se ejecuta por
medio del nombre de la clase que contiene la función main(). Las clases de Java se agrupan
en packages, que son librerías de clases. Si las clases no se definen como pertenecientes a
un package, se utiliza un package por defecto (default) que es el directorio activo.
para crear objetos. Cada objeto tiene sus propias copias de las variables miembro, con sus
propios valores, en general distintos de los demás objetos de la clase. Las clases pueden
tener variables static, que son propias de la clase y no de cada objeto [?, Bosz].
Ejemplo:
public FuncionActivacion () {
3.3.2 Herencia
La herencia permite que se puedan definir nuevas clases basadas en clases existentes, lo cual
facilita reutilizar código previamente desarrollado. Si una clase deriva de otra (extends)
hereda todas sus variables y métodos. La clase derivada puede añadir nuevas variables y
métodos y/o redefinir las variables y métodos heredados.
En Java, a diferencia de otros lenguajes orientados a objetos, una clase sólo puede
derivar de una única clase, con lo cual no es posible realizar herencia múltiple en base a
clases. Sin embargo es posible “simular” la herencia múltiple en base a las interfaces.
3.3.3 Interface
Una interface es un conjunto de declaraciones de funciones. Si una clase implementa
(implements) una interface, debe definir todas las funciones especificadas por la interface.
Una clase puede implementar más de una interface, representando una forma alternativa
de la herencia múltiple.
Una interface puede derivar de otra o incluso de varias interfaces, en cuyo caso incor-
pora todos los métodos de las interfaces de las que deriva.
Ejemplo: La clase TangenteHiperbolica se extiende de la clase FuncionActivacion que
implementa la interface Serializable.
3.3.4 Package
Un package es una agrupación de clases. Existen una serie de packages incluidos en el
lenguaje.
Además el programador puede crear sus propios packages. Todas las clases que formen
parte de un package deben estar en el mismo directorio.
Los packages se utilizan con las siguientes finalidades:
1. Para agrupar clases relacionadas.
2. Para evitar conflictos de nombres. En caso de conflicto de nombres entre clases
importadas, el compilador obliga a cualificar en el código los nombres de dichas
clases con el nombre del package.
3. Para ayudar en el control de la accesibilidad de clases y miembros.
Por las razones citadas, durante la etapa de Diseño del Software desarrollado, se ha
decido crear dos paquetes, calculos e interfase, utilizando la sentencia package.
package myprojects.simu;
import myprojects.calculos.*;
import myprojects.interfase.*;
Desde el punto de vista de su papel dentro del programa, las variables pueden ser:
En la Tabla 3.2 de la pág. 81 se muestran las dos grandes categorías de tipos para las
variables en Java:
En la Tabla 3.3de la pág. 81 se indica para cada tipo primitivo el número de bits que se
emplea en su representación y el rango de valores que se puede almacenar en las variables
de estos tipos.
Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de
B. Esto quiere decir que las variables de tipo B siempre se pueden asignar a variables de
tipo A (eventualmente con pérdida de significancia).
Por ejemplo int es de mayor rango que short, que a su vez es de mayor rango que byte.
Float y double son de mayor rango que int. Double es de mayor rango que float.
3.4. VARIABLES DENTRO DEL LENGUAJE JAVA 81
variable miembro, pero no con el nombre de otra variable local. La variable declarada
dentro del bloque oculta a la variable miembro en ese bloque. Para acceder a la variable
miembro oculta será preciso utilizar el operador this.
Uno de los aspectos más importantes en la programación orientada a objetos (OOP) es
la forma en la cual son creados y eliminados los objetos. La forma de crear nuevos objetos
es utilizar el operador new. Cuando se utiliza el operador new, la variable de tipo referencia
guarda la posición de memoria donde está almacenado este nuevo objeto. Para cada objeto
se lleva cuenta de por cuántas variables de tipo referencia es apuntado. La eliminación
de los objetos la realiza el denominado garbage collector, quien automáticamente libera o
borra la memoria ocupada por un objeto cuando no existe ninguna referencia apuntando a
ese objeto. Lo anterior significa que aunque una variable de tipo referencia deje de existir,
el objeto al cual apunta no es eliminado si hay otras referencias apuntando a ese mismo
objeto.
Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++. Estos
operadores se describen brevemente a continuación.
variable = expression;
2. Siguiendo a la variable (por ejemplo: i++). En este caso primero se utiliza la variable
en la expresión (con el valor anterior) y luego se incrementa.
En muchas ocasiones estos operadores se utilizan para incrementar una variable fuera
de una expresión. En este caso ambos operadores son equivalente. Si se utilizan en
una expresión más complicada, el resultado de utilizar estos operadores en una u otra
de sus formas será diferente. La actualización de contadores en bucles for es una de las
aplicaciones más frecuentes de estos operadores.
{entradaEntrenamiento[i][j] = paresEntrenamiento[i][j];
{salidaEntrenamiento[i][j] = paresEntrenamiento[i][j+numeroNeuronasEntrada];
Nombre Sintáxis
Postfijos [ ] .(params) expr++ expr-
Unarios ++expr —expr +expr -expr !
De creación (type) expr
Multiplicativo */%
Adición +-
Shift << >> >>>
Relacional <> <= >= instanceof
Igualdad == ! =
AND &
Or Excluyente ^
Or Incluyente |
Logico AND &&
Logico OR ||
Condicional ?:
Asignación = += -= *= /= %= &= ^= |= <<= >>= >>>=
En Java, todos los operadores binarios, excepto los operadores de asignación, se evalúan
de izquierda a derecha. Los operadores de asignación se evalúan de derecha a izquierda,
lo que significa que el valor de la izquierda se copia sobre la variable de la derecha.
Una expresión es un conjunto variables unidos por operadores. Son órdenes que se le dan
al computador para que realice una tarea determinada.
Una sentencia es una expresión que acaba en punto y coma (;). Se permite incluir varias
sentencias en una línea, aunque lo habitual es utilizar una línea para cada sentencia. A
continuación se muestra un ejemplo de una línea compuesta de tres sentencias:
i = 0; j = 5; x = i + j;
86 CAPÍTULO 3. JAVA
3.6.2 Comentarios
Existen dos formas diferentes de introducir comentarios entre el código de Java (en realidad
son tres, como pronto se verá). Son similares a la forma de realizar comentarios en el
lenguaje C/C++. Los comentarios son tremendamente útiles para poder entender el
código utilizado, facilitando de ese modo futuras revisiones y correcciones. Además permite
que cualquier persona distinta al programador original pueda comprender el código escrito
de una forma más rápida. Se recomienda acostumbrarse a comentar el código desarrollado.
De esta forma se simplifica también la tarea de estudio y revisión posteriores.
Java interpreta que todo lo que aparece a la derecha de dos barras “// ” en una
línea cualquiera del código es un comentario del programador y no lo tiene en cuenta. El
comentario puede empezar al comienzo de la línea o a continuación de una instrucción que
debe ser ejecutada. La segunda forma de incluir comentarios consiste en escribir el texto
entre los símbolos “ /* */ ”. Este segundo método es válido para comentar más de una
línea de código. Por ejemplo:
En Java existe además una forma especial de introducir los comentarios (utilizando
/***/ más algunos caracteres especiales) que permite generar automáticamente la docu-
mentación sobre las clases y packages desarrollados por el programador. Una vez intro-
ducidos los comentarios, el programa javadoc.exe (incluido en el JDK) genera de forma
automática la información de forma similar a la presentada en la propia documentación
del JDK. La sintaxis de estos comentarios y la forma de utilizar el programa javadoc.exe
se puede encontrar en la información que viene con el JDK.
3.6.3 Bifurcaciones
Las bifurcaciones permiten ejecutar una de entre varias acciones en función del valor de
una expresión lógica o relacional. Se tratan de estructuras muy importantes ya que son las
encargadas de controlar el flujo de ejecución de un programa. Se exponen dos variantes
del de tipo if.
Bifurcación if
Esta estructura permite ejecutar un conjunto de sentencias en función del valor que tenga
la expresión de comparación. Ejemplo: se ejecuta si la expresión de comparación (error
< errorMinimo) tiene valor true:
Las llaves {} sirven para agrupar en un bloque las sentencias que se han de ejecutar,
y no son necesarias si sólo hay una sentencia dentro del if.
Bifurcación if else
Análoga a la anterior, de la cual es una ampliación. Las sentencias incluidas en el else se
ejecutan en el caso de no cumplirse la expresión de comparación (false),
Ejemplo:
3.6.4 Bucles
Un bucle se utiliza para realizar un proceso repetidas veces. Se denomina también lazo
o loop. El código incluido entre las llaves {} (opcionales si el proceso repetitivo consta
de una sola línea), se ejecutará mientras se cumpla unas determinadas condiciones. Hay
que prestar especial atención a los bucles infinitos, hecho que ocurre cuando la condición
de finalizar el bucle (booleanExpression) no se llega a cumplir nunca. Se trata de un fallo
muy típico, habitual sobre todo entre programadores poco experimentados.
Bucle while
En el siguiente ejemplo se muestra que se ejecutará la sentencia fin++ mientras la expresión
(capas.charAt(fin)!=‘,’ && capas.charAt(fin)!=-1) sea verdadera.
{fin++;
}
}
}
Bucle for
A continuación se podrá apreciar la utilización del bucle for:
Bucle do while
Es similar al bucle while pero con la particularidad de que el control está al final del
bucle (lo que hace que el bucle se ejecute al menos una vez, independientemente de que
la condición se cumpla o no). Una vez ejecutados las sentencias, se evalúa la condición: si
resulta true se vuelven a ejecutar las sentencias incluidas en el bucle, mientras que si la
condición se evalúa a false finaliza el bucle.
do{
problema.fijoVector(vectorDis);
step++;
problema.fijoVector(vectorDis);
3.7. CLASES EN JAVA 89
Sentencia return
Una forma de salir de un bucle es utilizar la sentencia return. Esta sentencia sale también
de un método o de una función. En el caso de que la función devuelva alguna variable,
este valor se deberá poner a continuación del return.
1. Encapsulación: Las clases pueden ser declaradas como públicas (public) y como
package (accesibles sólo para otras clases del package). Las variables miembro y los
métodos pueden ser public, private, protected y package. De esta forma se puede
controlar el acceso y evitar un uso inadecuado.
2. Herencia: Una clase puede derivar de otra (extends), y en ese caso hereda todas sus
variables y métodos. Una clase derivada puede añadir nuevas variables y métodos
y/o redefinir las variables y métodos heredados.
3. Polimorfismo: Los objetos de distintas clases pertenecientes a una misma jerarquía
o que implementan una misma interface pueden tratarse de una forma general e
individualizada, al mismo tiempo. Esto facilita la programación y el mantenimiento
del código.
1. Todas las variables y funciones de Java deben pertenecer a una clase. No hay
variables y funciones globales.
2. Si una clase deriva de otra (extends), hereda todas sus variables y métodos.
3. Java tiene una jerarquía de clases estándar de la que pueden derivar las clases que
crean los usuarios.
4. Una clase sólo puede heredar de una única clase (en Java no hay herencia múltiple).
Si al definir una clase no se especifica de qué clase deriva, por defecto la clase deriva
de Object. La clase Object es la base de toda la jerarquía de clases de Java.
5. En un fichero se pueden definir varias clases, pero en un fichero no puede haber más
que una clase public. Este fichero se debe llamar como la clase public que contiene
con extensión *.java. Con algunas excepciones, lo habitual es escribir una sola clase
por fichero.
6. Si una clase contenida en un fichero no es public, no es necesario que el fichero se
llame como la clase.
7. Los métodos de una clase pueden referirse de modo global al objeto de esa clase al
que se aplican por medio de la referencia this.
8. Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del
fichero (package packageName;). Esta agrupación en packages está relacionada con
la jerarquía de directorios y ficheros en la que se guardan las clases.
objeto es su argumento implícito. Los métodos pueden además tener otros argumentos
explícitos que van entre paréntesis, a continuación del nombre del método.
La primera línea de la definición de un método se llama declaración o header; el código
comprendido entre las llaves {} es el cuerpo o body del método. Considérese el siguiente
ejemplo:
imprimoError=algor.devuelveErrorMinimo();
public double devuelveErrorMinimo()
{return errorMinimo;
}
La Clase Object
1. Los arrays se crean con el operador new seguido del tipo y número de elementos.
2. Se puede acceder al número de elementos de un array con la variable miembro im-
plícita length (por ejemplo, vect.length).
3. Se accede a los elementos de un array con los corchetes [ ] y un índice que varía de
0 a length-1.
4. Se pueden crear arrays de objetos de cualquier tipo. En principio un array de objetos
es un array de referencias que hay que completar llamando al operador new.
5. Los elementos de un array se inicializan al valor por defecto del tipo correspondiente
(cero para valores numéricos, la cadena vacía para Strings, false para boolean, null
para referencias).
6. Como todos los objetos, los arrays se pasan como argumentos a los métodos por
referencia.
7. Se pueden crear arrays anónimos (por ejemplo, crear un nuevo array como argumento
actual en la llamada a un método).
Inicialización de Arrays
Los arrays se pueden inicializar con valores entre llaves {...} separados por comas. También
los arrays de objetos se pueden inicializar con varias llamadas a new dentro de unas llaves
{...}.
Si se igualan dos referencias a un array no se copia el array, sino que se tiene un array
con dos nombres, apuntando al mismo y único objeto.
Ejemplo de creación de una referencia a un array:
/*vector de pesos */
public double[ ] pesos;
3. Crear una clase Ventana, sub-clase de Frame, que responda al evento WindowClo-
sing().
4. La función main() deberá crear un objeto de la clase Ventana (en el que se van a
introducir las componentes seleccionadas) y mostrarla por pantalla con el tamaño y
posición adecuados.
5. Añadir al objeto Ventana todos los componentes y menúes que deba contener.
6. Definir los objetos Listener (objetos que se ocuparán de responder a los eventos, cu-
yas clases implementan las distintas interfaces Listener) para cada uno de los eventos
que deban estar soportados. En aplicaciones pequeñas, el propio objeto Ventana se
96 CAPÍTULO 3. JAVA
valor += 1;
}
public static void main( String args[] )
{
3.10. ERRORES FRECUENTES DE PROGRAMACIÓN 97
try
{
Thread hilo1 = new Thread( new Contador() );
hilo1.setPriority( 1 );
Thread hilo2 = new Thread( new Contador() );
hilo2.setPriority( 2 );
hilo1.start();
hilo2.start();
hilo1.join();
hilo2.join();
Systtem.out.println( valor );
} catch( Exception e ) {
e.printStackTrace();
}
}
Este programa puede no imprimir “2” en todas las plataformas, porque los dos hilos de
ejecución no están sincronizados y, desgraciadamente, este es un problema muy profundo
y no hay forma de detectar su presencia ni adivinar el momento en que va a ocurrir.
Una solución simple, y drástica, es hacer todos los métodos sincronizados. Pero esto
también tiene problemas porque puede presentar como puntos sin retorno obvios, lo que
en realidad es una corrupción de datos.
El scheduling de los hilos de ejecución es uno de los aspectos más problemáticos de
la programación Java, porque la naturaleza del problema se vuelve global, al intervenir
varios hilos de ejecución. No se puede buscar el problema en una parte del programa, es
imprescindible entender y tratar el programa en su globalidad.
Además, hay ejemplos de contención de hilos que no serán detectados. Por ejemplo,
en la clase Contador anterior no se detectará el problema ya que la contención está en el
acceso al campo, en lugar de en el acceso al método.
import java.io.File;
import java.util.StringTokenizer;
}
100 CAPÍTULO 3. JAVA
• Un driver que incluya código nativo fallará al cargarlo sobre cualquier plataforma
diferente de la que fue diseñado; por lo que el programa deberá recoger la excepción
ClassNotFoundException.
• Un driver con código nativo no debe registrarse con DriverManager hasta que no
se sepa que la carga ha tenido éxito.
• Un driver con código nativo no está protegido por la caja negra de Java, así que
puede presentar potenciales problemas de seguridad.
3.11 APPLETS
2. Las applets no tienen ventana propia: se ejecutan en la ventana del browser (en un
panel).
3. Por la propia naturaleza abierta de Internet, las applets tienen importantes res-
tricciones de seguridad, que se comprueban al llegar al browser: sólo pueden leer y
escribir ficheros en el servidor del que han venido, sólo pueden acceder a una limitada
información sobre el ordenador
102 CAPÍTULO 3. JAVA
en el que se están ejecutando, etc. Con ciertas condiciones, las applets de confianza
(trusted applets) pueden pasar por encima de estas restricciones.
Aunque su entorno de ejecución es un browser, las applets se pueden probar sin nece-
sidad de browser con la aplicación appletviewer del JDK de Sun.
• Se heredan otros muchos métodos de las super-clases de Applet que tienen que ver
con la generación de interfaces gráficas de usuario (AWT). Así, los métodos gráficos
se heredan de Component, mientras que la capacidad de añadir componentes de
interface de
• Las applets también suelen redefinir ciertos métodos gráficos: los más importan-
tes son paint() y update(), heredados de Component y de Container; y repaint()
heredado de Component.
3.12. QUÉ ES UN APPLET 103
Método init()
Método start()
Método stop()
El método stop() se llama de forma automática al ocultar el applet (por haber haber
dejado de estar activa la página del browser, por hacer reload o resize, etc.).
Con objeto de no consumir recursos inútilmente, en este método se suelen parar las
threads que estén corriendo en el applet, por ejemplo para mostrar animaciones.
Método destroy()
Se llama a este método cuando el applet va a ser descargada para liberar los recursos que
tenga reservados (excepto la memoria). De ordinario no es necesario redefinir este método,
pues el que se hereda cumple bien con esta misión.
104 CAPÍTULO 3. JAVA
(a) ALIGN, VSPACE, HSPACE. Tienen el mismo significado que el tag IMG de
HTML.
Los archivos JAR están basados en los archivos ZIP y pueden crearse con el programa
jar que viene con el JDK. Por ejemplo:
jar cvf myFile.jar *.class *.gif
crea un fichero llamado myFile.jar que contiene todos los ficheros *.class y *.gif del
directorio actual. Si las clases pertenecieran a un package llamado es.ceit.infor2 se utilizaría
el comando:
jar cvf myFile.jar es\ceit\infor2\*.class *.gif
unApplet.init();
unApplet.start();
unFrame.setVisible(true);
}
} // fin de la clase MiApplet
Capítulo 4
Herramientas utilizadas
4.1 Netbeans
La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un
conjunto de componentes de software llamados módulos. Un módulo es un archivo Java
que contiene clases de java escritas para interactuar con las APIs de NetBeans y un archivo
especial (manifest file) que lo identifica como módulo. Las aplicaciones construidas a partir
de módulos pueden ser extendidas agregándole nuevos módulos. Debido a que los módulos
pueden ser desarrollados independientemente, las aplicaciones basadas en la plataforma
NetBeans pueden ser extendidas fácilmente por otros desarrolladores de software.
NetBeans es un proyecto de código abierto de gran éxito con una gran base de usuarios,
una comunidad en constante crecimiento, y con cerca de 100 socios en todo el mundo. Sun
MicroSystems fundó el proyecto de código abierto NetBeans en junio 2000 y continúa
siendo el patrocinador principal de los proyectos.
• Administración de ventanas.
109
110 CAPÍTULO 4. HERRAMIENTAS UTILIZADAS
vamos a hacer clic sobre el botón Browser para indicar que queremos que nuestro
proyecto se aloje por debajo de los directorios C:\Tesis\hilos seguidamente hacemos clic
sobre el botón Finish; ver Figura 4.3 en la pág. 112.
4.3. CREACIÓN DE PROYECTO 111
• los paquetes no están ligados a un entorno de desarrollo, sino que es una parte
integral y esencial del lenguaje Java
En este caso, se creara un paquete llamado PackHilo siguiendo los siguientes pasos,
situese en la ventana Projects ,con el botón derecho del mouse seleccionara la carpeta
Source Packages correspondiente al proyecto Hilos que se acaba de crear, se elegira New-
Java Package ( ver figura 4.4 de la pág. 113 ).
y en el cuadro de diálogo New Java Package se introduce el nombre del paquete Pac-
kHilo y se hace clic sobre el botón Finish; ver figura 4.5 de la pág. 114.
3. El editor automaticamente genera un código que hay que rellenar con el código que
se necesite, (ver figura 4.8 de la pág. 117).
Una vez creado el applets se debe crear la página web que va a contener a este. Se
debe crear un archivo HTML dentro del paquete que contiene el applet.
3. Para ejecutar una aplicación desde una consola del sistema, se tecleara en la consola:
java - jar ruta\nombreProyecto.jar, antes se debe crear el archivo jar ,donde
ruta\nombreProyecto.jar es la ruta y nombre del archivo .jar. Para este ejemplo
ruta \nombreProyecto .jar es: C: \Tesis \Hilos \dist \Hilos.jar.
Para generar un jar de una aplicación sencilla solo debe hacer clickcon el bóton derecho
del mouse sobre el proyecto -> Clean and Build ver figura 4.16 de la pág.123.
Une vez que se ejecuto Clean and Build en la pantalla de salida Output mostrara lo
siguiente,ver figura 4.17 de la pág.123.
En el panel de Archivos(Files) se podra visualizar el archivo JAR dentro de la carpeta
dist, ver figura 4.18 de la pág. 124.
Ahora cada vez que se desee ejecutar el proyecto sin abrir el netbeans solo bastará con
hacer doble clic en el archivo JAR y listo.
• Adobe CSS Advisor es un sitio web accesible desde Dreamweaver que contiene in-
formación útil para resolver los problemas de compatibilidad entre navegadores.
bola Adobe Device Central, incluido en la Adobe Creative Suite, facilita la publicación
en dispositivos móviles, PDAs, etc.
Barra de titulo
126 CAPÍTULO 4. HERRAMIENTAS UTILIZADAS
La barra de herramientas estándar contiene iconos para ejecutar de forma inmediata al-
gunas de las operaciones más habituales, como Abrir , Guardar , etc.
La vista Código y Diseño permite dividir la ventana en dos zonas. La zona superior
muestra el código fuente, y la inferior el editor visual. Cuando se realiza un cambio en
alguna de las zonas, este cambio se aplica directamente sobre la otra.
4.10. ENTORNO DE TRABAJO 131
2. Se debe hacer click en Create y listo, (ver figura 4.30 de la pág. 133).
También se podrá crear un nuevo documento HTML con la ventana de Bienvenida ver
figura4.31,al hacerse clic sobre la opción HTML ,automaticamente genera un HTML sin
titulo(Untitled-1) ,según la vista de código se visualizara lo siguiente, ver figura4.32
Se debe guardar este documento nuevo para que esté localizado físicamente en alguna
carpeta del sistema (en concreto, en la carpeta del sitio Web en el que se este por trabajar).
Para guardar una página nueva los pasos a seguir serán:
(a) Seleccionar File > Save o hacer clic sobre el botón de la barra de
herramientas Estándar.
(b) En el cuadro de diálogo Save AS, accedemos a la carpeta raíz del sitio (en
nuestro ejemplo, la carpeta Sitio ).
Aparecerá por defecto la carpeta raíz del sitio que tengamos abierto en el Panel Ar-
chivos; ver figura 4.33 de la pág. 136.
2. Realiza una de estas dos operaciones para mostrar el cuadro de dialogo Hipervínculo:
• Pulsamos sobre el botón Hipervínculo del panel Insertar > Common, el cual
desplegara la siguiente ventana4.41.
Para realizar un enlace simple basta con rellenar estos campos de texto:
• Vinculo : la dirección URL del vínculo o haga clic en el icono de carpeta para
localizar y seleccionar un archivo dentro del sitio web.
Para poder visualizar nuestras páginas web, existe la opción de la Vista previa(File -
>Preview in Browser). En esta lista de navegadores podrás seleccionar el navegador con
el que se desee realizar la vista previa. También podrás Editar esta lista en la opción Edit
Browser List.
138 CAPÍTULO 4. HERRAMIENTAS UTILIZADAS
http://guarani.dch.unne.edu.ar/classes
143
144 CAPÍTULO 5. ALGORITMOS DE PLANIFICACIÓN DEL PROCESADOR
Una vez realizado esto podrá visualizar los resultado, ver figura 5.8 de la pág.147 .
Para poder acceder a la teoría da Hilos de Java,deberá presionar el botón ,ver figura5.9
de la pág.148 .
luego visualizara la siguiente página, ver figura 5.10 de la pág.148.
Para poder ejecutar la aplicación realizada en Java, deberá hacer clic en el enlace
2. Se debe especificar el Host (en este caso guarani.dch.unne.edu.ar); ver figura 5.22 de
la pág. 155.
3. Ingresar el Username y password, luego hacer clic en el botón Login, luego se visua-
lizara el siguiente cuadro de dialogo, se debe hacer clic en el botón Accept and Save;
ver figura 5.23 de la pág. 156.
4. Podrá visualizar tanto los archivos locales como los archivos remotos(servidor). ver
figura 5.24 de la pág. 156.
5. Seleccione la carpeta que contiene los archivos de la página web, y arrastrelo dentro
de la carpeta /var/www/classes del archivo del servidor web y listo; ver figura 5.25
de la pág. 157.
Figura 5.11: Abriendo ejecutable de Hilos en Java
Figura 5.25: Ventana Local File y Remote File pasando los archivos.
158 CAPÍTULO 5. ALGORITMOS DE PLANIFICACIÓN DEL PROCESADOR
Capítulo 6
Conclusión
— Round Robin
— S.R.T
— F.I.F.O
— S.J.F.
159
Bibliografía
161
Índice de Materias
163
164 ÍNDICE DE MATERIAS
al sistema, 6 apropiativa, 20
del procesador, 20
máquina virtual, 1, 6 mecanismos de, 21
máquinas virtuales, 10, 14 no apropiativa, 20
métodos, 90 objetivos de la, 21
de la clase object, 91 políticas de, 21
de objeto, 90 planificación apropiativa, 34
microprograma planificación no apropiativa, 34
microcódigo, 2 Prioridad, 35
modelo cliente - servidor, 11 procesador, 15
modo interactivo niveles de planificación del, 20
conversacional, 5 planificación del, 19
modo núcleo procesadores
modo supervisor, 8 asignación de los, 14
modo usuario, 8, 12 proceso, 14, 15
Multics, 10 bloque de control de, 14, 17
multiprocesamiento, 5, 12 creación de un, 18
multiprogramación destrucción de un, 18
sistemas de, 14 estados del, 15
multiprogramación, 5, 24 hijo, 18
padre, 18
Netbeans, 109
reanudar un, 18
objetos del software, 6 suspendido, 18
OOP, 76, 89 proceso cliente, 11
operadores, 82 proceso servidor, 11
aritméticos, 82 procesos, 6
de asignación, 82 algoritmo de planificación de, 19
de concatenación de cadenas de ca- comportamiento deseable de, 23
racteres, 84 envejecimiento de, 22
incrementales, 83 estados de, 17
precedencia de, 84 estructura jerárquica de, 18
racionales, 83 jerarquías de, 15
unarios, 82 lista de bloqueados, 17
organización lista de listos, 17
interna, 8 planificación de, 19
planificador de, 19
package, 79 prioridad de los, 22
packages, 77 tabla de, 18
Paginación, 53 transiciones entre estados, 16
Paginación anticipada, 51 procesos hijo, 7
Paginación por demanda, 51 programas de aplicación, 1
Paquetes de Hilos, 70 programas de sistema, 1
paralelismo, 14
PC Quantum, 38
computadoras personales, 6
planificación RAID, 59
166 ÍNDICE DE MATERIAS