16 GUIA DE APRENDIZAJE - Arquitectura de Sistemas Operativos
16 GUIA DE APRENDIZAJE - Arquitectura de Sistemas Operativos
CÓDIGO DE MATERIA: 16
2
GUÍA DE REVISIÓN CONCEPTUAL
Unidad 0 – Generalidades Del Funcionamiento De La Computadora
1. Enumere y describa las partes mínimas que componen a una computadora.
2. Explique cómo está compuesta conceptualmente la memoria, y como se puede
utilizar para representar datos de más de un byte.
3. Enumere y detalle cuales son los registros visibles para el usuario, y aquellos de
control y estado.
4. Describa el proceso de Fetch (búsqueda) y Execution (ejecución) de Instrucciones
5. Explique qué es una Interrupción.
6. Describa los 4 tipos generales de interrupciones.
7. Enumere los mínimos pasos de software y hardware que deben darse para poder
manejar interrupciones.
8. Explique el concepto de Jerarquía de Memoria.
9. ¿Qué características diferencian a los distintos niveles de memoria?
10. ¿En qué consiste el concepto de Caché? ¿Qué beneficios y problemas conlleva?
11. ¿Cómo funciona el acceso a E/S mediante programa?
12. ¿Cómo funciona el acceso a E/S mediante Interrupciones?
13. ¿Cómo funciona el acceso a E/S mediante DMA?
14. Dado un hipotético microprocesador de 32 bits, que cuenta con instrucciones de 32
bits compuestas por dos campos. El primer byte contiene el código de operación y
el resto contiene el operando, o la dirección al operando
a. ¿Cuántas instrucciones distintas se pueden tener?
b. ¿Cuál es el valor máximo de un operando local?
c. ¿Cuál es la capacidad máxima de memoria direccionable?
4
38. ¿Qué estados y transiciones tiene un motor de procesos de 2 estados? ¿Qué
problemas tiene?
39. ¿Qué estados y transiciones tiene un motor de procesos de 5 estados? ¿Qué
problemas tiene?
40. Explique el funcionamiento básico que debe tener el sistema operativo para poder
manejar procesos de 5 estados.
41. ¿Cuál es la diferencia entre el estado “Bloqueado” y el estado “Suspendido”?
42. ¿Qué componentes tiene la imagen de proceso?
43. ¿Qué modos de ejecución existen? ¿Qué los diferencia?
44. ¿Qué mecanismos existen para interrumpir la ejecución de un proceso?
Ejemplifique
45. Enumere y describa los pasos necesarios para hacer un cambio del proceso en
ejecución (Process Switch)
46. ¿Es el sistema operativo un conjunto de procesos? ¿En qué escenario?
47. Diagrame los 9 estados y las transiciones del motor de procesos de Unix
48. ¿Cómo es la imagen de proceso de Unix?
49. ¿Cómo es la creación de procesos en Unix?
50. Explique la diferencia entre Paralelismo y Concurrencia.
51. Defina Multithreading
52. Explique que tipos de sistemas pueden implementarse combinando la cantidad de
procesadores, y la cantidad de threads (hilos) por proceso.
53. ¿Cuáles son los beneficios de tener threads (hilos)?
54. ¿Cuáles son los estados básicos de un thread?
55. ¿Qué tipos de thread se pueden encontrar? ¿Qué los diferencia?
56. ¿Qué beneficios tienen los threads (hilos) a nivel de usuario?
57. ¿Qué beneficios tienen los threads (hilos) a nivel de kernel (núcleo)?
58. ¿Qué es el multiprocesamiento simétrico (SMP)? ¿Qué posibles ventajas conlleva?
59. Enumere y describa las categorías de sistemas propuestas por Flynn
60. ¿Qué problemas deben tenerse en cuenta a la hora de diseñar un sistema operativo
que funcione sobre un multiprocesador?
5
61. ¿Qué es un Microkernel?
62. ¿Qué llevó a la creación de los sistemas de tipo Microkernel?
63. ¿Cuáles son los beneficios de los sistemas de tipo Microkernel?
64. ¿Cuáles son las desventajas de los sistemas de tipo Microkernel?
65. ¿Qué características tienen los Procesos e threads (hilos) de Windows?
66. ¿Qué estados y transiciones tienen los threads (hilos) de Windows?
67. ¿Qué estados y transiciones tienen los threads (hilos) de Linux?
68. Enumere similitudes y diferencias entre Windows y Linux.
6
84. ¿cómo asigna procesos tradicionalmente Unix?
85. Describa los diferentes tipos de multiprocesador que se pueden encontrar
86. ¿Qué es la granularidad?
87. Describa los distintos niveles de granularidad
88. ¿Qué implica una granularidad fina?
89. ¿Qué implica una granularidad gruesa?
90. ¿En que escenario pueden coexistir distintas granularidades? Ejemplifique.
91. ¿Qué problemas deben tenerse en cuenta para asignar procesos en un
multiprocesador?
92. Explique el problema de asignación de un proceso a un procesador. ¿Qué variantes
existen?
93. ¿Qué problema surge con utilizar un programa concurrente en un solo procesador?
94. Enumere y defina los algoritmos de asignación de Threads (hilos) en
multiprocesadores
95. Explique el método de Load Sharing. ¿Qué beneficios tiene?
96. Explique el método de Gang Scheduling. ¿Qué beneficios tiene?
97. Explique el método de Dedicated Processor Assignment. ¿Qué beneficios tiene?
98. Explique el método de Dynamic Scheduling. ¿Qué beneficios tiene?
99. ¿Qué es un sistema operativo de tiempo real?
100. ¿Qué caracteriza a los sistemas de tiempo real?
101. ¿cómo funciona el agendamiento en un sistema operativo de tiempo real?
102. Explique el algoritmo de aproximación estática orientado a tabla para asignación
en tiempo real
103. Explique el algoritmo de aproximación estática orientado a prioridad preventiva
para asignación en tiempo real
104. Explique el algoritmo de aproximación dinámica orientado a planes para
asignación en tiempo real
105. Explique el algoritmo de aproximación dinámica del mejor esfuerzo para
asignación en tiempo real
106. Explique el algoritmo de agendamiento de Deadline (fecha limite)
7
107. Explique el algoritmo de agendamiento de tasa monotónica
108. Explique el problema de inversión de prioridad. ¿En qué caso puede ocurrir?
109. ¿Qué tipos de agendamiento en tiempo real maneja Linux?
110. Compare a Windows con Linux en cuanto a agendamiento de procesos
8
132. Detalle el escenario de la Cena de los Filósofos. ¿Cómo se podría solucionar?
133. Explique el concepto de las Barreras como instrucción del procesador ¿En qué
caso son necesarias?
134. Explique el concepto de Pipes (cañerías) como mecanismo de concurrencia de
Unix
135. Explique el concepto de Mensajes como mecanismo de concurrencia de Unix
136. Explique el concepto de Memoria compartida como mecanismo de concurrencia
de Unix
137. Explique el concepto de Semáforos como mecanismo de concurrencia de Unix
138. Explique el concepto de Señales como mecanismo de concurrencia de Unix
139. Compare Windows con Linux en cuanto a su manejo de Concurrencia
140. ¿Cuáles son as funciones que debe proveer el manejo de memoria?
141. Defina Relocation (reubicación) en el contexto de manejo de memoria
142. Defina Protección en el contexto de manejo de memoria
143. Defina compartir en el contexto de manejo de memoria. ¿Cómo interactua con la
necesidad de seguridad?
144. Explique que son la organización Física y Lógica de la memoria
145. Explique la técnica de Particionamiento fijo de la memoria. ¿Qué ventajas y
desventajas tiene?
146. ¿Qué impacto tiene el tamaño de las particiones en el particionamiento fijo de
memoria?
147. ¿Cómo es el algoritmo de asignación para el particionamiento fijo de memoria?
148. Explique la técnica de Particionamiento dinámico de la memoria. ¿Qué ventajas y
desventajas tiene?
149. ¿Cómo es el algoritmo de asignación para el particionamiento dinámico de
memoria?
150. ¿Qué complejidad extra tiene la asignación de partes dinámicas por sobre las fijas?
¿Cómo se resuelve?
151. Explique la técnica de paginación simple de la memoria. ¿Qué ventajas y
desventajas tiene?
152. ¿Qué mejoras provee la paginación por sobre la partición? ¿Por qué?
9
153. Explique la técnica de Segmentación simple de la memoria. ¿Qué ventajas y
desventajas tiene?
154. Explique la técnica de Memoria virtual paginada. ¿Qué ventajas y desventajas
tiene?
155. Explique la técnica de Memoria virtual segmentada. ¿Qué ventajas y desventajas
tiene?
156. ¿Qué beneficios tiene combinar la paginación y la segmentación?
157. ¿Qué es la memoria virtual?
158. ¿Qué costos tiene el utilizar la memoria virtual?
159. ¿Qué beneficios tiene utilizar la memoria virtual?
160. ¿Cómo es la mínima estructura de control necesaria para manejar memoria
paginada?
161. ¿Cómo es la mínima estructura de control necesaria para manejar memoria
Segmentada?
162. ¿Cómo es la mínima estructura de control necesaria para manejar memoria
paginada y segmentada?
163. ¿Cómo es el proceso de traducción de direcciones de un sistema paginado?
164. ¿Qué consideraciones hay que tener para la protección y el compartir segmentos
de memoria?
165. ¿Qué es una falla de paginado? ¿Qué costo tiene?
166. ¿Cómo funciona el algoritmo óptimo de reemplazo de páginas?
167. ¿Cómo funciona el algoritmo de uso menos reciente (LRU) de reemplazo de
páginas?
168. ¿Cómo funciona el algoritmo primero en llegar, primero en salir (FIFO) de
reemplazo de páginas?
169. ¿Cómo funciona el algoritmo de reloj (Clock) de reemplazo de páginas?
170. ¿Qué variantes de definición de tamaño residente existen? ¿Qué ventajas poseen?
171. ¿Qué caracteriza al manejo de memoria de Unix?
172. ¿Cómo son las estructuras de datos del manejo de páginas virtuales de Unix?
173. ¿Cómo es el algoritmo de reemplazo de páginas de Unix?
10
174. ¿Qué diferencia al manejo de memoria de Linux con el de Unix?
175. ¿Qué diferencia al manejo de memoria de Windows con el de Linux?
11
195. Explique el algoritmo Last in First Out (LIFO) de Planificación de acceso a disco.
¿Presenta una mejora por sobre FIFO?
196. Explique el algoritmo Shortest Service Time First (SSTF) de Planificación de
acceso a disco. ¿En qué escenario es mejor utilizarlo?
197. Explique el algoritmo SCAN de Planificación de acceso a disco. ¿Qué ventaja
presenta contra los anteriores?
198. Explique el algoritmo C-SCAN de Planificación de acceso a disco. ¿Qué ventaja
presenta por sobre SCAN?
199. ¿Qué problema dio lugar al surgimiento de F-SCAN y N-Step-Scan? ¿Cómo lo
solucionan?
200. ¿Qué significan las siglas RAID?
201. Explique el concepto de RAID
202. ¿Qué posibles beneficios tiene la técnica de RAID?
203. Describa a la configuración RAID 0. ¿Qué beneficios trae?
204. Diagrame el estado de los discos para RAID 0
205. Describa a la configuración RAID 1. ¿Qué beneficios trae?
206. Diagrame el estado de los discos para RAID 1
207. Describa a la configuración RAID 2. ¿Qué beneficios trae?
208. Diagrame el estado de los discos para RAID 2
209. Describa a la configuración RAID 3. ¿Qué beneficios trae?
210. Diagrame el estado de los discos para RAID 3
211. Describa a la configuración RAID 4. ¿Qué beneficios trae?
212. Diagrame el estado de los discos para RAID 4
213. Describa a la configuración RAID 5. ¿Qué beneficios trae?
214. Diagrame el estado de los discos para RAID 5
215. Describa a la configuración RAID 6. ¿Qué beneficios trae?
216. Diagrame el estado de los discos para RAID 6
217. Explique el concepto de RAID por Software. ¿Qué beneficios trae?
218. ¿Qué estrategias de reemplazo se utilizan en el caché del disco?
12
219. Describa cómo Linux planifica sus accesos a disco
220. Compare el acceso a dispositivos de E/S de Linux y Windows
221. ¿Qué es un File System (sistema de archivos)?
222. ¿Qué propiedades debe tener un File System (sistema de archivos)?
223. ¿Qué operaciones se pueden realizar sobre un File System (sistema de archivos)?
224. Defina el concepto de Field (Campo)
225. Defina el concepto de Record (Registro)
226. Defina el concepto de File (Archivo)
227. Defina el concepto de Database (Base de datos)
228. ¿Qué es un File Management System (Sistema de Manejo de Archivos)?
229. ¿Qué objetivos tiene un File Management System (Sistema de Manejo de
Archivos)?
230. ¿Cómo interactúan entre sí el File Management System (Sistema de Manejo de
Archivos) con el Sistema operativo?
231. ¿Qué criterios impactan a la hora de decidir qué estructura lógica de
almacenamiento se utilizará?
232. Explique como funciona un archivo de tipo Pile (montón).
233. Explique como funciona un archivo secuencial. ¿Qué beneficios trae sobre el
anterior?
234. Explique como funciona un archivo secuencial indexado. ¿Qué beneficios trae
sobre el anterior?
235. Explique como funciona un archivo indexado. ¿Qué beneficios trae sobre el
anterior?
236. Explique como funciona un archivo del tipo Hashed (directo). ¿Qué beneficios
trae?
237. Compare las velocidades de acceso y actualización de los distintos tipos de archivo
238. ¿Qué es un Directorio?
239. ¿Qué información tiene un Directorio?
240. ¿Qué problemas surgen a la hora de reservar espacio para archivos?
241. Explique el problema de la Fragmentación. ¿En qué escenario puede darse?
13
242. ¿Cómo se resuelve el problema de la Fragmentación?
243. Explique el algoritmo de reserva de espacio de reserva contigua. ¿cómo es la tabla
de archivos?
244. Explique el algoritmo de reserva de espacio de reserva encadenada. ¿cómo es la
tabla de archivos? ¿Qué beneficios y costos conlleva?
245. Explique el algoritmo de reserva de espacio de reserva indexada. ¿cómo es la tabla
de archivos? ¿Qué beneficios y costos conlleva?
246. ¿Qué es un Volumen?
247. ¿Qué tipos de archivos maneja Unix?
248. ¿Cómo reserva el espacio Unix?
249. ¿Qué es el Virtual File System de Linux? ¿Qué beneficios tiene?
250. ¿Qué caracteriza al formato FAT?
251. ¿Qué caracteriza al formato NTFS?
252. Compare como manejan los archivos Linux y Windows
14
265. ¿Qué es la “Cloud” a la que se referencia con Cloud Computing?
266. ¿Qué beneficios trae el uso de Cloud?
267. Defina Escalabilidad (vertical)
268. Defina Elasticidad (horizontal)
269. Explique el concepto de SaaS (Software as a Service)
270. Explique el concepto de PaaS (Platform as a Service)
271. Explique el concepto de IaaS (Infrastructure as a Service)
272. ¿Qué es el balanceo de cargas? Ejemplifique
273. Explique cómo funciona un CDN (Content Distribution Network)
Unidad 6 – Compiladores
274. ¿Qué es código ejecutable?
275. ¿Qué es un Lenguaje de Programación?
276. ¿Qué es un Abstract syntaxt tree (AST)?
277. ¿Qué es un Compilador?
278. ¿Qué caracteriza a un multi-pass Compiler?
279. ¿Qué fases tiene el proceso de compilación?
280. ¿Qué actividades se realizan en la fase de compilación Front-End?
281. ¿Qué actividades se realizan en la fase de compilación Middle-End?
282. ¿Qué actividades se realizan en la fase de compilación Back-End?
283. ¿Qué es un Assembler?
284. ¿Qué beneficios tiene el uso de compiladores?
285. ¿Qué particularidad tiene un Cross Compiler?
286. ¿Qué es un Interpreter?
287. ¿Qué caracteriza a un interpreter de bytecodes?
288. ¿Qué caracteriza a un threaded interpreter?
289. ¿Qué caracteriza a un interpreter de AST?
15
290. ¿Qué es el microcode?
291. ¿Qué es un Linker?
292. ¿Cómo funciona el linking dinámico? ¿Qué beneficios trae?
293. ¿Cómo funciona el linking estático? ¿Qué beneficios trae?
294. Explique el funcionamiento básico de un Compilador
295. Explique el funcionamiento básico de un interpreter
296. Explique qué es un Just-in-time Compiler. ¿Qué beneficios trae?
16
GUÍA DE TRABAJOS PRÁCTICOS
Unidad 2 - Algoritmos De Planificación De Procesos Y De Gestión De La
Memoria
GUIA PRÁCTICA DEL TP I
El objetivo de este trabajo es brindar a los alumnos con la posibilidad de aplicar los
conceptos teóricos abordados por la asignatura.
Los alumnos, en equipos de no más de dos personas, deberán analizar la evolución de la
ejecución de un conjunto de procesos simplificados en una serie de procesadores ideales, y
detallar los resultados de estos análisis en una carpeta entregable.
Dados las siguientes cargas de trabajo compuestas, cada una, por un conjunto de procesos
definidos por:
1. Nombre (P1, P2, P3, etc.)
2. Esfuerzo (el número de ciclos de ejecución que completarán este trabajo)
3. Prioridad (Número positivo que indicará la prioridad de este proceso. A menor
valor, mayor prioridad)
4. Tiempo de arribo (Número positivo que indicará en que ciclo de ejecución el
proceso será disparado)
17
RR – 1 1 Round Robin con ventanas de ejecución de 1 1 ciclo de procesador
ciclo de procesador
RR – 2 1 Round Robin con ventanas de ejecución de 2 1 ciclo de procesador
ciclo de procesador
Priority – N Colas múltiples con prioridades, sin No hay cambio de contexto
interrupciones
Priority – P 1 Colas múltiples con prioridades, con 1 ciclo de procesador
interrupciones
Cargas de trabajo
Carga de trabajo 1
Nombre Esfuerzo Prioridad Tiempo de Arribo
P1 5 1 0
P2 5 1 4
Carga de trabajo 2
Nombre Esfuerzo Prioridad Tiempo de Arribo
P1 5 5 0
P2 5 1 4
Carga de trabajo 3
Nombre Esfuerzo Prioridad Tiempo de Arribo
P1 50 1 0
P2 20 2 10
P3 40 3 6
Carga de trabajo 4
Nombre Esfuerzo Prioridad Tiempo de Arribo
P1 50 9 0
P2 20 4 30
P3 1 3 40
P4 1 2 40
Carga de trabajo 5
Nombre Esfuerzo Prioridad Tiempo de Arribo
P1 2 9 0
P2 2 8 1
P3 2 7 2
P4 2 6 3
18
P5 2 5 4
P6 2 4 5
P7 2 3 6
El docente encargado del curso evaluará la posibilidad de la exposición por parte de los
alumnos, en clase y/o en el laboratorio de computación, de acuerdo a la disponibilidad de
recursos. De estas exposiciones el curso podrá apreciar en la práctica como distintos
algoritmos de asignación pueden resultar preferibles ante distintas cargas de trabajo, y
generará un consenso sobre el trabajo realizado.
19
d. Seguridad
i. Aspectos relevantes
e. Correo electrónico
i. Protocolos de comunicaciones
ii. Protocolo de transferencia de archivos
El docente encargado del curso evaluará la posibilidad de la exposición por parte de los
alumnos, en clase y/o en el laboratorio de computación, de acuerdo con la disponibilidad de
recursos.
GUIA PRÁCTICA DEL TP III
El objeto de este trabajo es familiarizar a los estudiantes con el uso de Cloud Computing,
basándose en su práctica previa con máquinas virtuales. Para ello los alumnos desarrollarán
un análisis sobre las ofertas y viabilidades de Cloud Computing, y montarán su propia
máquina virtual en un servidor Cloud. Este trabajo generará como entregable una carpeta y
una presentación que los alumnos realizarán para el resto del curso.
Los alumnos deberán realizar una investigación sobre Cloud Computing en el mercado, e
implementarán su propia máquina virtual en el contexto de Cloud.
Para ello se seguirán los siguientes pasos:
1. Buscar proveedores de Cloud Computing, como oferta de servidores para trabajos
de empresas como ser: procesadores, disponibilidad de espacio de almacenamiento
masivo, servicios de back up, etc.
2. Realizar un análisis comparativo de las variantes en servicio, prestaciones, y costos
para los proveedores seleccionados.
3. Obtener infraestructura de un proveedor de Cloud, o montar su propia
infraestructura utilizando software libre (como por ejemplo OpenStack, CloudStack,
OpenNebula).
4. Instalar en dicha infraestructura la máquina virtual desarrollada anteriormente y
demostrar su funcionamiento.
5. Realizar un análisis de beneficios y perjuicios de montar su sistema sobre
infraestructura en la nube.
20
La idea del siguiente trabajo es que tenga un orden didáctico y sencillo para que el alumno
pueda realizar sus propias modificaciones ó realizar un intérprete completamente radical.
Actualmente no se usan mucho las shells antes mencionados, sino otras que son evolución
de aquellas y que tienen características de las tres. Estas son bash (Bourne again), pdksh
(Public Domain Korn Shell) y tcsh (una extensión de csh). En la actualidad por defecto la
mayoría de las distribuciones usan el BASH. No obstante algunos en algunos entornos se
suele desarrollar programas específicos para tener controlado lo que el usuario puede
realizar, estos programas pueden ser scripting o compilados.
La primer línea es de suma importancia porque indica que interprete se debe usar para leer
el script, en este caso es también un shell script por simplicidad, pero tranquilamente se
21
podría haber usada un lenguaje de scripting de mayor poder como por ejemplo perl ó
phyton.
El script hace un bucle infinito que la única forma de cortarlo es vía Control+C, aunque con
la ultima línea hace que finalice y se cierre la terminal por la cual se accedió al sistema
(consola, telnet ó ssh).
En ese bucle se espera que se ingrese únicamente la palabra “listar” para así obtener un
listado de todos los archivos del sistema con el comando find.
Permisos
El ejemplo anterior le hemos puesto el nombre de “[Link]”, este archivo se forma a trabes
comandos preexistentes para realizar un script, a su ves lo hemos guardado en el directorio
/bin con permisos de ejecución como se denota debajo.
Una vez realizado esto hay que agregarlo en el archive /etc/shells para poder ser invocado y
así asignarlo a un usuario
Utilización
Para que un usuario pueda utilizarlo hay que asignárselo en el archive /etc/passwd si el
usuario ya existe en el sistema, como en este ejemplo el usuario admin.
Si se quisiera crear un usuario y usar nuestro shell se debería ejecutar el siguiente comando:
adduser “nombre_de_cuenta” -s [Link] –p “ contraseña de la cuenta”
// Declaración de funciones
void proceso_hijo(int);
23
void proceso_padre(int);
int inicia(int);
int borra_s(int);
void P(int);
void V(int);
int semcall(int, int);
//desarrollo de funciones
void proceso_padre(critica)
{ /* ejecuta uno de los 3 comandos a ingresar por un usuario: ls ó ll ó find como el ejemplo
anterior solo que espera el path para listarlo */
P(critica); //restringe el recurso
printf("ingrese comandos ej: ls, ll, find\n");
char aux[16];
scanf("%s", aux);
printf("ingrese directorio\n");
char aux2[16];
scanf("%s", aux2);
if (strcmp("ls",aux)==0)
{
strcpy(aux,"/bin/ls ");
strcat(aux,aux2);
system(aux);
}
else
24
if (strcmp("ll",aux)==0)
{
strcpy(aux,"/bin/ls -la ");
strcat(aux,aux2);
system(aux);
}
else
if (strcmp("find",aux)==0)
{
strcpy(aux,"/usr/bin/find ");
strcat(aux,aux2);
system(aux);
}
printf("aprete enter para continuar");
getchar();
getchar();
V(critica); //libera el recurso
wait(0); //espera hasta q lo liberen.
}
void proceso_hijo(critica)
{
P(critica); //utiliza el recurso
system("/usr/bin/clear"); //limpia la pantalla
system("/bin/cat /tmp/[Link]"); //muestra un banner, debajo se muestra *1.
V(critica); //libera el recurso
exit(0); //libera el proceso
}
//libera el recurso
void V(semaforo)
{
if ( semcall(semaforo, 1) == -1 )
perror("Error en operacion.");
}
*1.\ Banner
26
*2.\ Comunicación entre procesos (IPC)
En UNIX/Linux se define tres operaciones fundamentales sobre semáforos:
semget: Crea o toma el control de un semáforo
semctl: Operaciones de lectura y escritura del estado del semáforo. Destrucción del
semáforo
semop: Operaciones de incremento o decremento con bloqueo
27
GUÍA DE ABORDAJE BIBLIOGRÁFICO
Unidad 6 – Compiladores
Alfonseca, M; De la Cruz M; Ortega, A; Pulido, E. (2006). Compiladores e intérpretes:
teoría y práctica. Pearson Prentice Hall. Madrid.
28