1. ¿Qué es un S. O.?
Los sistemas operativos son ante todo
administradores de recursos; el principal
recurso que administra es el hardware de
la computadora: los procesadores, los
medios de almacenamiento, dispositivos
de E/S, dispositivos de comunicación y
datos,etc.
3. SUBSISTEMAS DE UN SO.
SUBSISTEMAS DEFINICIÓN
PROCESO
Es una estancia de ejecución de un programa identificable y
controlable por el sistema operativo.
ADMON DE LA
MEMORIA
Sección del sistema operativo que controla el uso de la memoria.
ARCHIVOS Estructura de directorio con algún tipo de organización.
SEGURIDAD Garantiza la identidad de los usuarios y definir lo que puede hacer
cada uno de ellos.
ENTRADA Y
SALIDA
Periféricos de E/S de la computadora, que se utilizan para
comunicarse.
BLOQUEOS
Estado del trabajo que significa que no puede continuar mientras
no se le asigne un recurso especifico o haya terminado una
operación de E/S.
4. Tipos de Sistemas Operativos
Sistemas operativos de tiempo real
Sistemas operativos multitarea
Sistemas operativos multiprocesador.
Sistemas operativos de tiempo compartido
Sistemas operativos distribuidos
Sistemas operativos de red
Sistemas operativos integrados.
5. SO de Tiempo Real
Aquellos en los cuales no tiene importancia el
usuario, sino los procesos. Están
subutilizados sus recursos con la finalidad de
prestar atención a los procesos en el
momento que lo requieran.
Son construidos para aplicaciones muy
específicas como control de tráfico aéreo,
bolsas de valores, control de refinerías,
control de laminadores.
Algunos ejemplos de Sistemas Operativos de
tiempo real son: VxWorks, Solaris, Lyns OS y
Spectra, QNX, RT Linux.
6. Características SO de Tiempo Real
Se dan en entornos en donde deben ser
procesados sucesos externos al sistema, en
breve tiempo o dentro de ciertos plazos.
Procesa ráfagas de miles de interrupciones
por segundo sin perder un solo suceso.
Población de procesos estática .
Poco movimiento de programas entre
almacenamiento secundario y memoria.
Gestión de archivos orientada más a
velocidad de acceso que a utilización
eficiente del recurso.
7. SO multitarea
Se distinguen por sus habilidades para poder
soportar la ejecución de dos o más trabajos
activos al mismo tiempo.
La CPU siempre tenga alguna tarea que
ejecutar, aprovechándola al máximo.
Su objetivo es tener a varias tareas en la
memoria principal, de manera que cada uno
está usando el procesador, o un procesador
distinto, es decir, involucra máquinas con
más de una CPU
8. Características de SO multitarea
Mejora la productividad y el uso de recursos.
Multiplexa recursos entre varios programas.
Generalmente soportan múltiples usuarios
que requieren validación para seguridad y
protección.
Proporcionan contabilidad del uso de los
recursos.
Múltiples programas activos compitiendo por
los recursos del sistema.
Ejemplos: Windows, Unix, Linux, OS/2.
9. SO de tiempo compartido
Permiten la simulación de que el sistema y
sus recursos son todos para cada usuario.
El usuario hace una petición a la
computadora, esta la procesa tan pronto
como le es posible en la terminal del usuario.
Le dan a cada usuario la ilusión de que tiene
el sistema dedicado para sí mismo.
Esto trae como consecuencia una gran carga
de trabajo al SO.
Ejemplos : Multics, OS/360, OS/2 y DEC-10.
10. Características SO tiempo
compartido
Programas se ejecutan con prioridad rotatoria
que se incrementa con la espera y disminuye
después de concedido el servicio.
Evitan monopolización del sistema asignando
tiempos de procesador.
Gestión de memoria proporciona protección a
programas residentes.
Protección de archivos ya que pueden existir
múltiples usuarios accediendo un mismo
archivo.
11. SO distribuidos
Permiten distribuir trabajos, entre un conjunto de
CPU´s en un equipo o en diferentes.
Existen dos esquemas básicos: Un sistema
fuertemente acoplado es aquel que comparte la
memoria y un reloj global.
En un sistema débilmente acoplado los
procesadores no comparten ni memoria ni reloj,
ya que cada uno cuenta con su memoria local.
Confiables, ya que si un componente del
sistema falla, otro componente lo reemplaza.
Ejemplos: Sprite, Solaris-MC, Mach, Chorus,
Spring, Amoeba, Taos.
12. SO de red
Son aquellos sistemas que mantienen a
dos o más computadoras unidas a través
de algún medio de comunicación con el
objetivo de compartir recursos y la
información del sistema.
Ejemplos: Windows, Linux, Unix.
13. El núcleo del SO
Consiste en la parte principal del código
del SO, el cual se encargan de controlar y
administrar los servicios y peticiones de
los recursos SW y HW de los procesos.
Es el código que más se utiliza. Reside en
RAM, mientras que otras partes del SO
son cargadas sólo cuando se necesitan.
Se diseñan para realizar el mínimo
posible de procesamiento en cada
interrupción y dejar que el resto lo realice
el proceso apropiado.
14. IMAGEN DEL NUCLEO
Figura que muestra
como el núcleo actúa
como intermediario
entre el HW y las
aplicaciones del
usuario
16. Más sobre el núcleo
• No necesariamente se necesita un núcleo para
usar una computadora. Los programas pueden
cargarse y ejecutarse directamente sobre el HW
sin usar ninguna abstracción. Así operaban las
primeras computadoras.
• Con el tiempo, se empezó a dejar en memoria
pequeños programas auxiliares, como el
cargador y el depurador, o se cargaban desde
memoria de sólo lectura. A medida que se
fueron desarrollando, se convirtieron en los
fundamentos de lo que llegarían a ser los
primeros núcleos de SO.
17. Microkernel
• Proporcionan un pequeño
conjunto de abstracciones
simples del HW, y usan las
aplicaciones servidores para
ofrecer mayor funcionalidad.
• Su enfoque consiste en
definir una abstracción muy
simple sobre el HW, con un
conjunto de primitivas (call
system) que implementan
servicios del SO mínimos,
como la gestión de Threads
y la intercomunicación entre
procesos.
18. Microkernel
• El objetivo principal es la separación de la
implementación de los servicios básicos y
la política de funcionamiento del sistema.
• El SO opera en dos modos: modo usuario
y modo núcleo
19. Microkernel
• En el modo usuario es donde se ejecutan
todas las aplicaciones de los usuarios, las
aplicaciones cuentan con un conjunto de
instrucciones para operar.
• En el modo núcleo están un conjunto de
instrucciones privilegiadas que accesan al
HW.
20. Microkernel
• Entonces se observa que cuando el
sistema en ejecución, cambia de modo de
operación infinidad de veces, esto lo hace
utilizando un mecanismo especial llamado
llamadas al sistema.
21. Resumen de funciones del Núcleo
Manejo de interrupciones.
Creación y destrucción de procesos.
Cambio de estado de los procesos.
Despacho de procesos.
Suspensión y reanudación de procesos.
Sincronización de procesos.
Comunicación entre procesos.
Apoyo para las actividades de E/S.
Apoyo para asignación y liberación de memoria.
Apoyo para el sistema de archivos.
Apoyo para ciertas funciones de contabilidad del
sistema
22. Interrupciones
Evento que altera la secuencia en que el CPU
ejecuta las instrucciones.
¿Qué pasa cuando ocurre una interrupción?
El SO toma el control del hardware.
El SO guarda el estado del proceso al que se
interrumpió.
El SO analiza la interrupción y transfiere el control
a la rutina apropiada para atenderla.
La rutina del manejador de interrupciones procesa
la interrupción.
Se restablece el estado del proceso anterior a la
interrupción.
Continúa la ejecución del proceso
23. Interrupciones
Una interrupción puede ser iniciada
específicamente por un proceso en
ejecución (en cuyo caso se suele
denominar trap), y se dice que está
sincronizada con la operación del
proceso) o puede ser causada por
algún evento que puede estar
relacionado o no con el proceso en
ejecución (se dice que es asíncrona
con la operación del proceso).
24. Interrupciones
Las interrupciones surgen de la necesidades
que tienen los dispositivos periféricos de enviar
información al procesador principal de un
sistema de computación.
Cada dispositivo que desea comunicarse con el
procesador por interrupciones debe tener
asignada una línea única capaz de avisarle que
le requiere para una operación. Esta línea es la
llamada IRQ ("Interrupt ReQuest“)
25. Interruption ReQuest (IRQ)
• Son líneas que llegan al controlador de
interrupciones, HW dedicado a la gestión de
interrupciones, puede estar integrado al CPU o
ser un circuito separado conectado al CPU.
• El controlador de interrupciones debe ser capaz
de habilitar o inhibir líneas de interrupción
(operación llamada enmascaramiento), y fijar
prioridades entre las distintas interrupciones
habilitadas. Cuando varias líneas de IRQ se
activan a la vez, el controlador de interrupciones
utilizará estas prioridades para escoger la
interrupción sobre la que informará al CPU.
• Pero hay interrupciones que no se pueden
enmascarar o deshabilitar, las conocidas como
interrupciones no enmascarables o NMI
26. Interruption ReQuest (IRQ)
• A partir del número de IRQ el SO busca en el
vector de interrupciones qué rutina debe llamar
para atender una petición del dispositivo
asociado a dicha IRQ.
• Las rutinas de interrupción generalmente toman
un pequeño tiempo de ejecución y la mayoría no
pueden ser interrumpidas cuando se están
atendiendo, porque al entrar en ellas se
almacena el estado de los registros en una pila
y si se interrumpen muchas veces, la pila se
puede desbordar
27. Interruption ReQuest (IRQ)
• Dependiendo del tipo de computadora las IRQ
pueden ser de 8 canales, 16 canales o
superiores.
Antes de la existencia de los dispositivos plug
and play, los usuarios tenían que configurar los
valores IRQ de los dispositivos manualmente
cuando agregaban un dispositivo nuevo al
sistema. A continuación se listan los números
IRQ y para qué eran usados generalmente.
28. Números IRQ
•
IRQ 0: cronómetro del sistema. Este interruptor
está reservado para el timer del sistema y jamás
está disponible para otros dispositivos.
IRQ 1: controlador del teclado.
IRQ 2: Interrupciones en cascada para las
interrupciones IRQ del 8 al 15.
IRQ 3: Segundo Puerto Serie (COM2). A menudo
es también para el cuarto puerto serie (COM4).
IRQ 4: Primer Puerto Serie (COM1). También es
utilizado por defecto para el COM3.
IRQ 5: Tarjeta de sonido.
IRQ 6: Controlador de Unidad de disco.
29. Números IRQ
IRQ 7: Puerto Paralelo LPT1 para impresoras o
cualquier otro dispositivo que utiliza puerto
paralelo.
IRQ 8: Reloj del Sistema.
IRQ 9, 10, 11: Interrupción disponible para
periféricos extras.
IRQ 12: Mouse PS/2 o Placa de Red o similares.
IRQ 13: Coprocesador/Unidad de punto flotante
IRQ 14: Canal IDE Primario. En sistemas que no
se utiliza dispositivos IDE, este canal se utiliza
para otros periféricos
IRQ 15: Canal IDE Secundario
30. Interrupciones de SW
• En procesadores x86, también se
denomina interrupción (o interrupción
software) a las interrupciones causadas
por SW mediante una instrucción en
código ensamblador. Este tipo de
interrupciones se llaman también traps o
excepciones, para distinguirlas de las
interrupciones HW.
31. Llamadas al Sistema
Son iniciadas por un proceso en ejecución
que ejecute la instrucción SVC.
Una SVC es una petición generada por un
proceso para pedirle al núcleo la ejecución
de una instrucción privilegiada, como realizar
una operación de E/S.
El mecanismo de las SVC ayuda a proteger
al SO de las acciones de los usuarios. Un
usuario no puede entrar arbitrariamente al
SO, sino que debe solicitar un servicio por
medio de una SVC. El SO está al tanto de
todos los usuarios que intentan rebasar sus
limites y puede rechazar ciertas peticiones si
el usuario no tiene los privilegios necesarios
32. Tipos de Llamadas al Sistema
Llamadas al sistema para administración
de procesos.
Llamadas al sistema para administración
de archivos.
Llamadas al sistema para administración
de directorios.
La API Win32 de Windows.
33. Arquitectura del sistema UNIX
UNIX es el núcleo de un sistema operativo de tiempo compartido, y entre
otros brinda los siguientes servicios:
•Controla recursos de hardware
•Controla los dispositivos periféricos
•Permite a usuarios compartir recursos y ejecutar sus programas.
•Proporciona un sistema de archivos
34. Características del Núcleo de Linux
• Escrito en lenguaje C, primera capa en
ensamblador.
• Ejecutable en varias plataformas hardware.
• Se ejecuta en arquitectura des 32 bits y 64 bits.
• Estaciones de trabajo y servidores.
• Código y funcionamiento escrito bajo la familia de
estándares POSIX.
• Soporta uno o varios microprocesadores (SMP)
symmetric multiprocessing.
• Multitarea.
• Multiusuario.
• Gestión y protección de memoria
35. Características del Núcleo de Linux
• Memoria virtual.
• Varios sistemas de archivos.
• Comunicación entre procesos (señales,
pipes, IPC, sockets).
• Librerías compartidas y dinámicas.
• Permite trabajar en red TCP/IP.
• Soporte grafico para interfase con el usuario.
• Funcionalmente es muy parecido a UNIX.
• Comunidad de usuarios en aumento.
36. Características del Núcleo de Linux
• Todos los dispositivos periféricos son
manejados como archivos. (abstracción)
• Ejecuta algunas aplicaciones Windows a
través del proyecto WINE. Se mantiene
compatibilidad con archivos Windows a
través de los servicios SAMBA.
• Soporta protocolo de redes TCP/IP,
AppleTalk (Macintosh), protocolos de Novell
IPX(Internetwork Packet Exange), SPX
(Sequenced Packet Exange), NCP (NetWare
Core Protocol), y IPv6 la nueva versión de IP.
• Mantiene compatibilidad con una variedad de
dispositivos hardware
37. Características del Núcleo de Linux
• El núcleo define una interfaz abstracta a los
subsistemas de ficheros denominada VFS
(Virtual File System Interface), que permite
integrar en el sistema varios sistemas de
archivos reales.
• Mantiene una separación entre código fuente
dependiente de la arquitectura y código
fuente independiente de la arquitectura, que
le permite ejecutar Linux en diversas
plataformas como Intel, Alpha, Motorola,
Mips, PowerPC, Sparc, Macintoshes, Sun,
etc. Existen versiones del núcleo especificas
para portatiles, y PAD’s.
38. Interacción entre modo usuario y
modo núcleo de Linux
1. La interacción o solicitud de un servicio por parte
de un programa de usuario implica los siguientes
pasos:
2. El usuario en su programa solicita una función de
la librería libc.
3. La función de libc, hace una llamada al núcleo a
través de una llamada (syscall).
4. El núcleo recibe esa llamada mediante una función
(system call).
5. El núcleo redirige esta llamada a los módulos
implicados que a su vez llaman a otros hasta llegar
al hardware y realizar la solicitud del usuario.
6. El núcleo hace llegar a la aplicación del usuario el
resultado de su solicitud
39. Las Llamadas al Sistema en Linux
• En la mayoría de los casos no es necesario
invocar una llamada al sistema directamente,
pero hay veces en que la biblioteca C
estandar carece de una función adecuada.
• Lo importante a conocer sobre una llamada
al sistema es su prototipo. Es necesario
saber cuántos argumentos usa, sus tipos, y
el tipo retornado por la función. Hay seis
macros que facilitan la llamada real al
sistema
40. Las Llamadas al Sistema en Linux
• Un proceso de usuario no puede acceder a la memoria
del núcleo y no puede llamar a las funciones del núcleo.
El hardware de la CPU fuerza esto (modo protegido).
• Las CS son una excepción a la regla. Un proceso de
usuario rellena los registros con los valores apropiados y
entonces llama a una instrucción especial, que salta a
una posición previamente definida dentro del núcleo (la
posición es legible por los procesos de usuario, pero no
pueden escribir en ella).
• Bajo las CPUs de Intel, esto se hace por medio de la
interrupción 0x80. El HW sabe que una vez que salta a
esta localización, ya no se esta ejecutando en el modo
de usuario, sino en modo núcleo. Y entonces.. se
permite hacer todo lo que se quiera (si se tienen los
conocimientos de programación).
41. Las Llamadas al Sistema en Linux
• A la posición en el núcleo a la que un proceso
puede saltar se le llama system_call. El
procedimiento en esa posición verifica el
número de la llamada al sistema, que le dice al
núcleo qué servicio ha pedido el proceso. Luego
mira en la sys_call_table para ver la dirección
de la función del núcleo a llamar. A continuación
llama a la función, y después de retornar hace
unas pocas comprobaciones del sistema y luego
regresa al proceso (o a un proceso diferente, si
el tiempo del proceso ha finalizado
42. Las Llamadas al Sistema en Linux
• Entonces, si queremos cambiar la forma en que
funciona una cierta CS, lo que tenemos que
hacer es escribir nuestra propia función para
implementarla (normalmente añadiendo un poco
de nuestro código y después llamando a la
función original) y entonces cambiar el puntero
que está en sys_call_table para que apunte a
nuestra función. Como es posible que seamos
eliminados más tarde y no queremos dejar el
sistema en un estado inestable, es importante
que cleanup_module restaure la tabla a su
estado original.
43. Las Llamadas al Sistema en Linux
Tienen la siguiente forma:
_syscallX(tipo,nombre,tipo1,arg1,tipo2,arg2,...)
donde :
X es 0-5, el número de argumentos usado por la
llamada del sistema
tipo es el tipo devuelto por la llamada al sistema
nombre es el nombre de la llamada al sistema
tipoN es el tipo del argumento num N
argN es el nombre del argumento num N
44. El puente API/Syscall
• Para que nuestra aplicación de espacio de
usuario pueda emitir una syscall, es necesario
poder realizar la llamada mediante un API. Este
API lo proporciona la librería estándar de C de
nuestro sistema, la libc o glibc en el caso de
Linux. Una de las APIs más comunes del mundo
Unix es la basada en el estándar POSIX. Este
estándar aglutina un conjunto de estándares o
recomendaciones del instituto IEEE, que
intentan definir la base para la realización de SO
abiertos basados en Unix. Linux es considerado
compatible con POSIX.
45. • Hay que decir que el estándar POSIX se refiere
a las APIs, no a las syscalls, es decir, define un
comportamiento, pero no como lo debe hacer.
• Desde el punto de vista del programador de
aplicaciones, la distinción entre una API y una
syscall es irrelevante, lo único que importa es el
nombre de la función, los tipos de los
parámetros y el valor devuelto.
46. Ejemplo
• #include <stdio.h>
• #include <linux/unistd.h> /* para macros _syscallX */
• #include <linux/kernel.h> /* para la estructura sysinfo */
• _syscall1(int, sysinfo, struct sysinfo *, info);
• int main(void){
• struct sysinfo s_info;
• int error;
• error = sysinfo(&s_info);
• printf("Código de error = %dn", error);
• printf("Uptime = %dsnCarga: 1 min %d / 5 min %d / 15 min %dn"
• "RAM: total %d / libre %d / compartida %dn"
• "Memoria en bufers = %dnSwap: total %d / libre %dn"
• "Número de procesos = %dn",
• s_info.uptime, s_info.loads[0],
• s_info.loads[1], s_info.loads[2],
• s_info.totalram, s_info.freeram,
• s_info.sharedram, s_info.bufferram,
• s_info.totalswap, s_info.freeswap,
• s_info.procs);
• return(0);
• }
47. Salida del ejemplo
• Código de error = 0
• Uptime = 502034s
• Carga: 1 min 13376 / 5 min 5504 / 15 min 1152
• RAM: total 15343616 / libre 827392 / compartida
8237056
• Memoria en bufers = 5066752
• Swap: total 27881472 / libre 24698880
• Número de procesos = 40
48. Las Llamadas al Sistema en Linux
• Las llamadas al sistema no tienen porque
retornar sólo códigos de error positivos o
negativos. Es necesario examinar el código
fuente para estar seguro de cómo retornan los
errores. Generalmente, es el negativo de un
código de error estándar, por ejemplo,
-EPERM. Las macros _syscall() devolverán el
resultado r de la llamada al sistema cuando r
no sea negativo, pero devolverán -1 y
establecerán la variable errno a -r cuando r sea
negativo. Para los códigos de error vea errno
(3).
49. Módulos Cargables
• Un módulo cargable del núcleo es un archivo
que contiene código objeto que puede extender
el núcleo en ejecución.
• La mayoría de los sistemas estilo Unix, y
Windows soportan módulos cargables.
• Son generalmente utilizados para brindar
soporte a nuevos dispositivos de HW y FS, así
como para agregar llamadas al sistema. Cuando
la funcionalidad proveída por un módulo del
núcleo deja de ser requerida, éste puede ser
descargado, liberando su memoria.
50. Módulos cargables y Drivers
• Un típico empleo para los módulos cargables es
crear controladores de dispositivos de HW.
• Los drivers tienen un rol especial en el núcleo
Linux. Estos son los encargados de esconder
los detalles de cómo un dispositivo funciona
internamente a nivel del HW, permitiendo que
las actividades de los usuarios sean realizadas
mediante un conjunto de llamadas estándar,
independientes del controlador específico que
se está utilizando en realidad.
51. • Los desarrolladores de módulos cargables
deberían ser cuidadosos de no introducir errores
de seguridad en los módulos que desarrollan. El
lenguaje de programación C, utilizado en la
mayoría de Linux, hace que el introducir errores
sea fácil y muchos problemas de seguridad
suelen deberse a olvidan controlar cuánta
información es almacenada en una porción
asignada de memoria (buffer), derivando en
errores de sobreescritura que podrían ser
utilizados por un usuario malicioso para alterar
la memoria del núcleo y sus módulos.
52. Drivers
• Un driver es una capa de código entre el
dispositivo de hardware y la aplicación. Un
driver usa los privilegios con los que se
ejecuta su código para definir
exactamente como se quiere que un
dispositivo sea visto por una aplicación.
• El driver está en el kernel.
53. Drivers
• La idea es que un Driver permita acceder a los
dispositivos de hardware, sin imponer
restricciones arbitrarias a los que usan el driver.
En UNIX esto es una regla de diseño, que se
conoce como separación de mecanismos y
políticas.
• Para no escribir políticas en el driver, se puede
hacer una aplicación de usuario que se
encargue de configurar el dispositivo, y/o una
librería para acceder a él. La idea es que el
driver cambie muy poco
54. Tipos de Drivers
El kernel diferencia tres tipos de drivers:
– Drivers de carácter (char devices)
– Drivers de bloque (block devices)
– Drivers de red (network devices)
• No todos los drivers son de dispositivos,
algunos son de SW. Por ejemplo, el driver de un
FS como ext3 o reiserfs son drivers de software,
que mapea estructuras de datos de bajo nivel a
estructuras de datos de más alto nivel
55. El Scheduler
Gestiona el tiempo de CPU que tiene un
proceso.
Cada cierto tiempo decide si el proceso
actual tiene derecho a seguir en ejecución
(dependiendo de su prioridad y privilegios)
o hacer cambio de contexto.
56. El Swapping
Consiste en llevar procesos cuyo
tiempo de uso de RAM expira a
memoria secundaria o virtual.
Consiste en traer de la memoria virtual
a los procesos a los que el scheduler
les asigna tiempo de uso de RAM.
57. Tarea
Investigar los Sistemas Operativos QNX,
Symbian y gOS (Android de Google);
destacando características de:
• Seguridad.
• Sistema de archivos.
• Gestión de procesos.
Y elaborar una introducción de una
cuartilla en la indica la importancia de
conocer esta información.
58. Librerías de Enlace Dinámico (DLL)
• Son elementos indispensables en la
construcción de programas eficientes en
el manejo de memoria RAM.
• Casi todos los lenguajes permiten la
creación de estas librerías.
• En C, se encuentran disponibles gran
cantidad de librerías, como stdio.h,
conio.h, etc. Cada una con funciones y
declaraciones para un determinado fin.
59. Librerías de Enlace Dinámico (DLL)
• El programador puede crear sus propias
librerías que le ayuden a resolver un
problema particular, y éstas pueden
reutilizarse en otros proyectos.
• Las librerías nos permiten agrupar varias
funciones y variables en un mismo
archivo, de manera que luego podamos
referenciarlas.
60. Objetivo de las DLL
• El objetivo que se persigue con la
creación de librerías de funciones es
poder aprovechar el mismo código desde
diferentes aplicaciones, lo que supone un
ahorro de código evidente en cada una de
esas aplicaciones.
61. Definición de DLL
• Una DLL es un archivo ejecutable en
donde se encuentran funciones y/o
Recursos (Bitmaps, Definiciones de
Fuentes,...), que pueden ser utilizados por
cualquier aplicación en RunTime.
• La ventaja de las DLL frente a las
librerías convencionales es que sólo se
cargan en memoria, cuando se necesitan
los recursos de dicha DLL.
62. Características de DLL
• Las aplicaciones ligan el código de la
librería, reduciendo el espacio de
almacenamiento y evitando la duplicación
de código.
• Si un problema surge, o se quiere añadir
una nueva característica, simplemente se
actualizan las DLL’s y todas las
aplicaciones resultan beneficiadas.
63. La Carga de una DLL
La carga de una DLL se puede hacer de 2
formas:
1.Enlazado implícito
2.Enlazado explícito
64. Enlazado Implícito
• Cuando se enlaza una aplicación se debe
pasar una lista de archivos LIB. Los
archivos LIB, en la programación
Windows, contienen una lista de las
funciones que las DLL permiten llamar.
• Cada DLL tiene su correspondiente
archivo LIB.
65. Enlazado Implícito
• Cuando el enlazador se percata que la
aplicación está llamando a una función
incluida en el archivo LIB de una DLL,
pone información adicional en la imagen
del EXE que indican el nombre de la DLL
que se requiere.
• Luego, cuando el sistema operativo carga
el EXE, recorre esta lista de DLL’s
necesarias y trata de cargarlas una por
una.
66. Proceso de búsqueda de DLL
Cuando el SO busca una DLL, recorre:
1. El directorio que contiene la imagen del
EXE.
2. El directorio actual del proceso.
3. El directorio de sistema de Windows.
4. El directorio Windows.
5. Los directorios de la variable PATH
67. Enlazado explícito
• Es posible proyectar una DLL en el
espacio de un proceso en tiempo de
ejecución llamando a la función
LoadLibrary o LoadLibraryEx.
• Ambas funciones tratan de cargar una
DLL en el espacio de direcciones de un
proceso
68. Ventajas del uso de DLLs
• Una función definida dentro de una DLL
se encuentra disponible para cualquier
aplicación Windows.
• Reducción del tamaño de las aplicaciones
que utilizan la DLL, por la reutilizacion de
su código. Este hecho comporta dos
ventajas añadidas, como son:
69. Ventajas del uso de DLLs
• Mejora en el tiempo de compilación y/o
carga de la aplicación (el tamaño del
código se ha reducido)
• Ahorro de espacio en disco, esa función
se encuentra una sola vez en el disco,
independientemente del número de
aplicaciones que la usen.
• Las DLLs son independientes de la
aplicación
70. Desventajas del uso de DLLs
• Tienen que estar presentes antes de ser
usadas.
• Tiempo de Acceso a la DLL por parte de
la aplicación que usa esa DLL.
71. Acceso a los métodos de una
DLL
• Para poder acceder a las funciones de
esa DLL, existen dos métodos:
–Llamada Estática
–Llamada Dinámica a una DLL
72. Llamada Estática a DLL
• O Enlace Estático, es un método que
emplea la librería estática (archivo .lib)
generada durante el proceso de creación
de la DLL.
• Durante el proceso de compilación se
produce el enlace entre la DLL y la
aplicación que la va a usar.
• Genera un único archivo ejecutable (.exe)
para Windows.
73. Llamada Estática a DLL
• A partir de esto, se puede deducir que la
librería queda incluida dentro del archivo
ejecutable.
• Al estar incluida dentro del ejecutable, la
librería se carga al inicio de la aplicación y
se descarga al finalizar la ejecución.
74. Llamada Estática a DLL
• La llamadas a funciones de la DLL se
realizará de igual forma como se realizan
en forma convencional.
• Esto es debido a que se encuentran en la
misma zona de memoria de la aplicación
y, como se conoce su posición exacta, ya
que se ha fijado durante la carga del
ejecutable.
75. Inconvenientes de las
llamadas estáticas
• Como la DLL se carga junto como el
ejecutable de la aplicación y se descarga
al finalizar ésta, no hay forma de poder
controlar lo que sucede durante los
procesos de carga y descarga de la DLL.
• Y podría darse el caso que se intente
acceder a una DLL que no se ha podido
cargar en memoria por el motivo que sea.
76. Inconvenientes de las
llamadas estáticas
• Al estar incluido el archivo .lib dentro del
archivo ejecutable (.exe) de la aplicación,
cualquier cambio en la DLL implicaría una
recompilación de la aplicación, para
obtener dentro del archivo ejecutable.
77. Inconvenientes de las
llamadas estáticas
• AL incluir el archivo .lib dentro del
ejecutable de nuestra aplicación, hay
incremento del tamaño del archivo exe.
• Esto hace que la DLL esté ocupando
memoria RAM durante toda la ejecución
de la aplicación; aun cuando no se
acceda en ningún momento de la
ejecución de la aplicación, a las funciones
de la DLL.
78. Llamada Dinámica a DLL
• O Enlace Dinámico, es un método que
emplea la librería dinámica (archivo .dll)
generada durante el proceso de creación
de la DLL.
• El enlace entre la DLL y la aplicación que
la va a usar, se producirá durante la
ejecución de la aplicación.
79. Llamada Dinámica a DLL
• la Llamada Dinámica apuesta por tener un
mayor control sobre los procesos de
carga/descarga de la DLL, así como
obtener una mayor independencia entre la
DLL y la aplicación que la va a usar.
80. Llamada Dinámica a DLL
• la DLL no será incluida dentro del
ejecutable, sino que será cargada cuando
sea necesaria y será descargada en el
momento en que ya no sea necesaria.
• Esta carga/descarga de la DLL en función
de su uso, nos permite una mejor gestión
de los recursos, pues no ocupará espacio
en memoria, a menos que sea necesario.
81. Creación de una DLL en C#
• Considere el siguiente escenario:
• MyLibrary.DLL: archivo que contiene el método
Add que se utilizarán durante la ejecución.
• Add.cs: archivo que contiene el método
Add(long i, long j). Devuelve la suma de sus
parámetros. La clase AddClass, que contiene el
método Add, es un miembro del espacio de
nombres MyMethods.
82. Creación de una DLL en C#
– MyClient.cs: archivo que contiene el método
Main. Utiliza los métodos del archivo DLL
para calcular la suma y el producto de los
argumentos especificados en tiempo de
ejecución.
84. Archivo: MyClient.cs
using System;
using MyMethods;
class MyClient {
public static void Main(string[] args) {
long num1 = 5;
long num2 = 6;
long sum = AddClass.Add(num1, num2);
Console.WriteLine(“La suma de {0} y {1} es {2}",
num1, num2, sum);
}
}
85. • La directiva using situada al principio del
archivo permite utilizar los nombres de las
clases sin calificar para hacer referencia a
los métodos de la DLL en tiempo de
compilación, por ejemplo:
– AddClass.Add(num1, num2);
• De lo contrario, sería necesario usar
nombres completos, por ejemplo:
– MyMethods.AddClassClass.Add(num1,
num2);
86. Compilación
• Para crear el archivo MyLibrary.DLL,
compile los dos archivos Add.cs y Mult.cs
mediante la siguiente línea de comandos:
– csc /target:library /out:MyLibrary.DLL Add.cs
• La opción /target:library indica al
compilador que genere un archivo DLL en
vez de un archivo EXE.
87. • La opción /out del compilador seguida de
un nombre de archivo se utiliza para
especificar el nombre de archivo de la
DLL. Si no se utiliza, el compilador usa el
primer archivo (Add.cs) como nombre de
la DLL
88. Creación del ejecutable
• Utilice la siguiente línea de comandos:
– csc /out:MyClient.exe
/reference:MyLibrary.DLL MyClient.cs
• La opción /out indica al compilador que
genere un archivo EXE y especifica el
nombre del archivo (MyClient.exe). Esta
opción no es de uso obligado. La opción
/reference especifica el archivo o archivos
DLL que utiliza el programa