Los paradigmas definen cómo se estructura el código. El paradigma imperativo describe pasos secuenciales que modifican estado; el funcional se apoya en funciones puras e inmutabilidad; el lógico se basa en reglas (p. ej. Prolog); y el orientado a objetos se sustenta en cuatro pilares: abstracción, encapsulamiento, herencia y polimorfismo. Domina tipado, ámbito (scope) y manejo de memoria: las variables locales y los marcos de activación de las llamadas se guardan en la pila (stack), mientras que la memoria reservada dinámicamente con malloc/new vive en el montón (heap). Al trazar código dado en texto, sigue el flujo instrucción por instrucción anotando el valor de cada variable segun su ámbito.
En sistemas operativos, memoriza estas fórmulas de planificación de CPU para calcular tiempos:
Para memoria virtual y paginación, la dirección lógica se divide en número de página (p) y desplazamiento (d); los bits de offset = log2(tamaño de página), es decir una página de 2^n bytes usa n bits. El TLB es una caché de traducciones página→marco y el tiempo de acceso efectivo es EAT = (1 − p) × ma + p × t_fallo_de_página. El algoritmo OPT/MIN reemplaza la página que no se usará por más tiempo: mínimo de fallos pero irrealizable; la anomalía de Belady afecta a FIFO (algoritmos que no son de pila), donde más marcos pueden aumentar los fallos. La fragmentación interna es desperdicio dentro del bloque asignado (asignado > solicitado) y la externa se elimina con paginación, pues los marcos no requieren ser contiguos.
En sincronización, un interbloqueo (deadlock) exige las cuatro condiciones de Coffman a la vez: exclusión mutua, retención y espera, no expropiación y espera circular; los semáforos y mutex previenen condiciones de carrera. Recuerda que compilación, ligado (linking) y ejecución son fases distintas del ciclo de un programa.
1. ¿Cuál paradigma de programación describe un programa como una secuencia de instrucciones que modifican el estado del programa mediante asignaciones a variables, ejecutadas en orden por la computadora?
El paradigma imperativo define la ejecución como una secuencia de sentencias que cambian el estado mediante asignaciones; el funcional evita el estado mutable, el orientado a objetos organiza el estado en objetos y el lógico expresa reglas declarativas (como en Prolog). (Sebesta, Concepts of Programming Languages, cap. Paradigmas de programación.)
2. ¿Cuál paradigma de programación organiza el código en unidades que combinan datos (atributos) y comportamiento (métodos), llamadas clases, a partir de las cuales se instancian objetos?
El paradigma orientado a objetos agrupa datos y comportamiento en clases que se instancian como objetos; el imperativo y el funcional no requieren esta organización en clases, y el lógico se basa en reglas y hechos. (Booch, Object-Oriented Analysis and Design.)
3. ¿Cuál paradigma de programación trata el cómputo como la evaluación de funciones matemáticas, evita las variables mutables y privilegia las funciones puras sin efectos secundarios?
El paradigma funcional modela el cómputo como evaluación de funciones matemáticas puras, sin estado mutable, lo que lo distingue del imperativo (asignaciones), del orientado a objetos (clases) y del lógico (reglas). (Sebesta, Concepts of Programming Languages, cap. Programación funcional.)
4. ¿Cuáles son los cuatro pilares fundamentales en los que se sustenta el paradigma orientado a objetos?
El paradigma orientado a objetos se sustenta en abstracción, encapsulamiento, herencia y polimorfismo; modularidad, recursión, inmutabilidad y concurrencia son relevantes en otros contextos pero no son los cuatro pilares clásicos de la POO. (Sebesta, Concepts of Programming Languages; Booch, Object-Oriented Analysis and Design.)
5. Una clase CuentaBancaria oculta la representación interna de su saldo y solo permite modificarlo a través de los métodos depositar() y retirar(), sin exponer el atributo directamente al código externo. ¿Qué pilar de la programación orientada a objetos ejemplifica principalmente esta práctica?
El encapsulamiento consiste en ocultar el estado interno de un objeto y controlar su acceso mediante métodos; la abstracción se refiere a exponer solo las características esenciales de una entidad, sin implicar necesariamente restricción de acceso. (Booch, Object-Oriented Analysis and Design.)
6. La clase Figura define un método area(); las clases Circulo y Cuadrado heredan de Figura y cada una implementa su propia versión de area(), de modo que al invocar area() sobre una referencia de tipo Figura se ejecuta la versión correspondiente al objeto real en tiempo de ejecución. ¿Qué pilar de la programación orientada a objetos permite este comportamiento?
El polimorfismo permite que una misma llamada a un método se comporte distinto según el tipo real del objeto en tiempo de ejecución; la herencia solo permite reutilizar y extender la clase base, sin por sí sola seleccionar la versión a ejecutar. (Booch, Object-Oriented Analysis and Design.)
7. ¿Cuál es una característica central del paradigma funcional que lo distingue claramente del paradigma imperativo?
El paradigma funcional se basa en funciones puras que no dependen de ni modifican un estado mutable compartido; las otras opciones describen rasgos del paradigma imperativo y del orientado a objetos. (Sebesta, Concepts of Programming Languages, cap. Programación funcional.)
8. Se tiene el siguiente fragmento de código escrito en estilo imperativo: entero total = 0 para i = 1 hasta 4 hacer total = total + i si i == 3 entonces total = total * 2 fin_para ¿Cuál es el valor final de la variable total al terminar la ejecución del ciclo?
Trazando el ciclo: total vale 1, 3, 6 (se duplica a 12 al cumplirse i==3) y finalmente 16 al sumar i=4; 12 omite la última suma, y 20 y 10 corresponden a aplicar la duplicación en un momento u orden incorrecto. (Sebesta, Concepts of Programming Languages, cap. Paradigma imperativo (control de flujo y asignación).)
9. En un lenguaje funcional se define la función recursiva factorial(n) = 1 si n = 0; en otro caso, factorial(n) = n × factorial(n − 1). Al invocar factorial(4), ¿cuántas llamadas recursivas adicionales a la función factorial se generan en total, sin contar la invocación inicial?
factorial(4) genera las llamadas a factorial(3), factorial(2), factorial(1) y factorial(0), es decir 4 llamadas adicionales; contar 3 omite la llamada que alcanza el caso base, y contar 5 incluiría erróneamente la invocación inicial. (Sebesta, Concepts of Programming Languages, cap. Programación funcional (recursión).)
10. Un equipo debe modelar un sistema de inventario con entidades como Producto, Almacén y Pedido, cada una con atributos propios y comportamientos que se reutilizan y especializan (por ejemplo, ProductoPerecedero especializa a Producto agregando fecha de caducidad). ¿Qué paradigma de programación resulta más adecuado para modelar este sistema?
Modelar entidades con atributos, comportamiento y jerarquías de especialización corresponde naturalmente a clases, herencia y polimorfismo del paradigma orientado a objetos, más que a un estilo funcional o puramente imperativo. (Booch, Object-Oriented Analysis and Design.)
11. ¿Cuál de las siguientes NO es una característica típica del paradigma funcional?
Modificar directamente variables globales compartidas es un rasgo del paradigma imperativo; el paradigma funcional privilegia funciones puras, funciones de primera clase y recursión en lugar de estado mutable. (Sebesta, Concepts of Programming Languages, cap. Programación funcional.)
12. ¿Cómo se calcula el tiempo de retorno (turnaround time) de un proceso en un sistema operativo?
El tiempo de retorno se define como finalización menos llegada, e incluye todo el tiempo transcurrido en ejecución y en espera; las otras opciones corresponden a las fórmulas de espera, respuesta y un promedio del sistema. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU.)
13. El proceso P1 llega a la cola de listos en el instante 3 y finaliza su ejecución en el instante 15. ¿Cuál es su tiempo de retorno (turnaround time)?
El tiempo de retorno es finalización menos llegada: 15 − 3 = 12; 15 ignora el instante de llegada, 18 suma en vez de restar y 9 aplica una resta incorrecta. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU.)
14. ¿Cuál fórmula define correctamente el tiempo de espera (waiting time) de un proceso?
El tiempo de espera equivale al tiempo de retorno menos la ráfaga total de CPU, es decir, el tiempo en la cola de listos sin ejecutarse; las otras fórmulas corresponden a turnaround, respuesta y una resta invertida incorrecta. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU (Scheduling Criteria).)
15. El proceso P2 tiene un tiempo de retorno de 20 unidades y una ráfaga total de CPU de 14 unidades. ¿Cuál es su tiempo de espera?
El tiempo de espera es tiempo de retorno menos ráfaga de CPU: 20 − 14 = 6; 14 confunde el resultado con la ráfaga misma, 20 con el turnaround y 34 surge de sumar en vez de restar. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU (Scheduling Criteria).)
16. En un sistema interactivo de tiempo compartido, interesa medir cuánto tarda un proceso desde que llega a la cola de listos hasta que recibe la CPU por primera vez, sin importar cuándo termine de ejecutarse por completo. ¿Qué métrica de planificación describe esta medición?
El tiempo de respuesta se mide desde la llegada hasta la primera vez que el proceso obtiene la CPU, a diferencia del turnaround, que se mide hasta la finalización completa del proceso. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU (Scheduling Criteria).)
17. ¿Por qué se considera óptimo el algoritmo de planificación SJF (trabajo más corto primero) frente a otros algoritmos de planificación de CPU?
SJF minimiza el tiempo de espera promedio para un conjunto dado de procesos; sin embargo, no elimina la inanición de procesos largos, y las otras opciones describen FCFS y Round Robin. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. CPU Scheduling (Shortest-Job-First Scheduling).)
18. En una cola de listos con planificación FCFS, un proceso con una ráfaga de CPU de 50 unidades llega primero, seguido de cinco procesos con ráfagas de solo 2 unidades cada uno. Aunque estos últimos son muy cortos, deben esperar a que el proceso largo termine antes de ejecutarse. ¿Qué fenómeno de planificación ejemplifica esta situación?
El efecto convoy ocurre en FCFS cuando procesos cortos quedan detrás de un proceso largo que llegó antes, elevando el tiempo de espera promedio; las otras tres son fenómenos reales pero de otros contextos (sincronización, memoria y deadlocks). (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. CPU Scheduling (First-Come, First-Served).)
19. Un administrador de sistemas configura un planificador Round Robin con un cuanto de tiempo extremadamente grande, mayor que la ráfaga de CPU de casi todos los procesos del sistema. ¿Qué consecuencia tiene esta configuración sobre el comportamiento del planificador?
Con un cuanto muy grande, cada proceso completa su ráfaga antes de que se agote el cuanto, por lo que Round Robin degenera en FCFS; el efecto contrario, exceso de cambios de contexto, ocurre cuando el cuanto es muy pequeño. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. CPU Scheduling (Round-Robin Scheduling).)
20. ¿Cuáles son las cuatro condiciones de Coffman que deben cumplirse simultáneamente para que ocurra un interbloqueo (deadlock)?
Las cuatro condiciones necesarias y simultáneas para un interbloqueo son exclusión mutua, retención y espera, no expropiación y espera circular; las demás combinaciones incluyen conceptos reales de otros temas que no forman parte de las condiciones de Coffman. (Coffman, Elphick & Shoshani (1971), System Deadlocks; Silberschatz, Operating System Concepts, cap. Deadlocks.)
21. Para prevenir interbloqueos, un sistema operativo obliga a cada proceso a solicitar de una sola vez todos los recursos que necesitará antes de comenzar su ejecución, en lugar de solicitarlos progresivamente mientras retiene los que ya obtuvo. ¿Cuál de las cuatro condiciones de Coffman se elimina con esta política?
Al solicitar todos los recursos de una sola vez, un proceso nunca retiene unos mientras espera otros, eliminando la condición de retención y espera (hold and wait); las demás condiciones de Coffman no se ven afectadas por esta política. (Coffman, Elphick & Shoshani (1971), System Deadlocks; Silberschatz, Operating System Concepts, cap. Deadlocks.)
22. Dos hilos de un mismo proceso ejecutan concurrentemente una función que declara una variable local entera y también incrementa un contador reservado en el montón (heap) y compartido entre ambos hilos. Un desarrollador observa que los valores de la variable local nunca se corrompen entre hilos, pero el contador compartido sí presenta resultados inconsistentes. ¿Cuál es la explicación más adecuada para esta diferencia?
Cada hilo tiene su propia pila para variables locales y marcos de activación, mientras que el montón es una región compartida por todos los hilos del proceso, lo que explica por qué el contador en el heap se corrompe por condiciones de carrera y las variables locales no. (Tanenbaum & Bos, Modern Operating Systems, cap. Memory Management; Silberschatz, Operating System Concepts (address space layout).)
23. ¿Cuál de las siguientes afirmaciones describe correctamente una diferencia entre un proceso y un hilo (thread) dentro de un sistema operativo?
Los hilos de un mismo proceso comparten el espacio de direcciones y los recursos abiertos del proceso, mientras que cada proceso posee su propio espacio de direcciones independiente; confundir proceso con hilo, o suponer que los procesos comparten memoria entre sí por defecto, son errores conceptuales comunes. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Threads & Concurrency.)
24. En el paradigma orientado a objetos, ¿qué principio consiste en ocultar los atributos internos de una clase y permitir su manipulación únicamente a través de métodos públicos definidos por la interfaz de la clase?
El encapsulamiento restringe el acceso directo al estado interno de un objeto, exponiendo solo los métodos públicos necesarios; la abstracción, en cambio, se refiere a mostrar solo los detalles esenciales sin implicar necesariamente control de acceso. (Booch, Object-Oriented Analysis and Design, cap. Fundamentos de la POO)
25. ¿Qué mecanismo de la programación orientada a objetos permite que una clase (subclase) adquiera automáticamente los atributos y métodos definidos en otra clase (superclase), favoreciendo la reutilización de código?
La herencia establece una relación superclase-subclase que reutiliza atributos y métodos ya definidos; la sobrecarga de métodos, en cambio, define varias versiones de un método dentro de la misma clase. (Sebesta, Concepts of Programming Languages, cap. Soporte para la programación orientada a objetos)
26. Considere el siguiente pseudocódigo orientado a objetos: la clase Figura define un método area() sin una implementación útil; la clase Circulo, que extiende Figura, redefine area() como 3.1416 multiplicado por el radio al cuadrado; la clase Cuadrado, que también extiende Figura, redefine area() como el lado al cuadrado. Se crea un arreglo de referencias de tipo Figura que contiene un objeto Circulo y un objeto Cuadrado, y se invoca figura.area() para cada elemento del arreglo. Cada llamada ejecuta la implementación correspondiente a la clase real del objeto en tiempo de ejecución. ¿Qué principio de la POO permite este comportamiento?
Aunque la herencia hace posible que Circulo y Cuadrado compartan el tipo Figura, es el polimorfismo el que permite que la llamada figura.area() se resuelva dinámicamente según la clase real de cada objeto. (Sebesta, Concepts of Programming Languages, cap. Soporte para la programación orientada a objetos)
27. En una subclase se define un método con el mismo nombre, los mismos parámetros y el mismo tipo de retorno que un método ya existente en la superclase, sustituyendo su comportamiento cuando se invoca sobre un objeto de la subclase. ¿Cómo se denomina esta técnica?
La redefinición (sobreescritura u overriding) sustituye la implementación heredada manteniendo idéntica firma, habilitando el polimorfismo en tiempo de ejecución; la sobrecarga, en cambio, define métodos con el mismo nombre pero distinta firma dentro de la misma clase. (Sebesta, Concepts of Programming Languages, cap. Soporte para la programación orientada a objetos)
28. En una clase que representa una cuenta bancaria, el atributo saldo se declara como privado y solo puede modificarse mediante un método depositar() que valida que el monto sea positivo antes de aplicarlo. ¿Qué principio de la POO se está aplicando al restringir el acceso directo al atributo saldo?
Declarar el atributo como privado y controlar su modificación mediante un método validador es una aplicación directa del encapsulamiento, que protege la integridad del estado interno del objeto. (Booch, Object-Oriented Analysis and Design, cap. Fundamentos de la POO)
29. En una relación de herencia entre dos clases, ¿cómo se denomina la clase que hereda los atributos y métodos, es decir, la que se define a partir de otra clase ya existente?
La subclase (o clase derivada) es la que hereda de la superclase (o clase base); confundir ambos términos es un error común al describir la dirección de la relación de herencia. (Booch, Object-Oriented Analysis and Design, cap. Fundamentos de la POO)
30. Un lenguaje orientado a objetos permite que una clase herede simultáneamente de dos superclases distintas, y ambas superclases definen un método con la misma firma. ¿Qué problema clásico de diseño surge en este escenario?
Cuando dos superclases aportan un método con idéntica firma, el compilador no puede determinar cuál implementación heredar, situación conocida como ambigüedad de herencia múltiple o 'problema del diamante'. (Sebesta, Concepts of Programming Languages, cap. Soporte para la programación orientada a objetos)
31. ¿Cuál de las siguientes acciones NO corresponde a una aplicación correcta del principio de encapsulamiento en el diseño de una clase?
Permitir el acceso directo a los atributos desde fuera de la clase anula el propósito del encapsulamiento, que exige controlar el acceso al estado interno exclusivamente mediante métodos de la propia clase. (Booch, Object-Oriented Analysis and Design, cap. Fundamentos de la POO)
32. Una clase abstracta declara un método sin proporcionar su implementación, obligando a que cada subclase concreta lo implemente según su propia lógica interna. ¿Qué concepto de la POO se ve reforzado directamente por este mecanismo?
Al forzar que cada subclase provea su propia implementación del método declarado, la clase abstracta habilita el polimorfismo: la misma llamada ejecutará código distinto según la subclase concreta. (Sebesta, Concepts of Programming Languages, cap. Soporte para la programación orientada a objetos)
33. ¿Cuál de los siguientes paradigmas de programación se basa en el uso de funciones puras y la inmutabilidad de los datos, en contraste con el paradigma orientado a objetos, que organiza el software en clases con estado encapsulado?
El paradigma funcional se distingue por evitar el estado mutable y basarse en funciones puras, a diferencia del paradigma lógico, que se basa en reglas y hechos (como Prolog). (Sebesta, Concepts of Programming Languages, cap. Paradigmas de programación)
34. En la planificación de CPU, ¿cómo se calcula el tiempo de retorno (turnaround time) de un proceso?
El tiempo de retorno se obtiene restando el instante de llegada al instante de finalización del proceso; la primera opción corresponde en realidad a la fórmula del tiempo de espera. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU (definición de turnaround time))
35. ¿Qué fórmula permite obtener el tiempo de espera (waiting time) de un proceso en un esquema de planificación de CPU?
El tiempo de espera equivale al tiempo de retorno menos la ráfaga total de CPU del proceso; la segunda opción corresponde a la fórmula del tiempo de retorno, no a la del tiempo de espera. (Silberschatz, Galvin & Gagne, Operating System Concepts, cap. Planificación de CPU (Scheduling Criteria))