Asignacion dinamicas de memoria

Page 1

Ministerio del poder popular para la defensa Universidad nacional experimental De la fuerza armada UNEFA-NIRGUA

Manejo de se帽ales, asignaci贸n de memoria y procesamiento

Ing. Luis Sequera.

Integrantes. Ortega Mariannis. 20.081.457 Ing. De

Junio 2014. sistemas.

8vo semestre.


MANEJOS DE SEÑALES Es un mecanismo de comunicación mínima entre procesos o entre el núcleo y un proceso o entre el teclado y un proceso, por el cual se envía un número (señal). Cada señal tiene un nombre SIGXXX con un significado específico. La comunicación es unidireccional. Es una comunicación rápida. Se genera una señal para Avisar a un proceso padre que un proceso hijo termina con un exit, SIGCHLD Abortar un proceso pulsando las teclas ctrl C, SIGINT Para matar a un proceso con el kill, SIGKILL Para avisar a un proceso que ha finalizado una alarma, SIGALRM Para despertar a un proceso que estaba en pausa Cuando un proceso recibe una señal, se interrumpe su ejecución, se almacena su estado para posteriormente reanudar su ejecución, se pasa a ejecutar la función que atiende esa señal, esta función está definida en el proceso receptor, una vez finalizada esta función se reanuda la ejecución del proceso en el punto que se interrumpió. 1) El estado del proceso se guarda en su stack.

2) Se ejecuta el manejador de la señal. 3) Se recupera el estado del proceso y se continúa.

Las señales son atendidas en modo usuario, si el proceso está en modo núcleo, la señal se añade al conjunto de señales pendientes y se atiende cuando se regresa a modo usuario, esto puede causar un pequeño retraso. Cuando un proceso recibe una señal, si el proceso no se ha preparado para recibirla, el resultado es la muerte del proceso. Los tipos de señales se encuentran definidos en include/asm-i386/signal.h, se pueden clasificar en dos tipos: Señales no tiempo real. Son la clásicas, son las primeras 31 señales, cuando se envían solo se envía su número de señal. Señales tiempo real. Definidas por la norma POSIX 1003, son configurables por los procesos, cuando se envían se manda información extra a través de la estructura info, si se reciben más señales cuando se está atendiendo la primera se encolan.


Veamos el listado de señales no tiempo real: SIGHUP 1

2

SIGINT

3

SIGQUIT

4 5

SIGILL SIGTRAP

6

SIGIOT, SIGABORT

7 8

SIGBUS SIFPE

9

SIGKILL

10

SIGUSR1

11

SIGSEGV

12

SIGUSR2

13

SIGPIPE

14

SIGALRM

15

SIGTERM

El modem ha detectado línea telefónica rota o ha terminado el proceso líder de la sesión Las teclas Ctrl C han sido pulsadas Las teclas Ctr \ han sido pulsadas, terminación de terminal

Instrucción ilegal Traza de los programas Instrucción IOT (I/O TRAP), Terminación anormal Error de bus Rebosamiento de coma flotante, error aritmético Matar un proceso, no puede ser desviada a una función Señal definida por el usuario Violación de segmentación Señal definida por el usuario Escritura en pipe sin lectores Señal enviada por el núcleo cuando fin del reloj ITIMER_REAL Software genera una


16

SIGSTKFLT

17

SIGCHLD

18

SIGCONT

19

SIGSTOP

20

SIGTSTP

21

SIGTTIN

22

SIGTTOU

23

SIGURG

24

SIGXCPU

25

SIGXFSZ

26

SIGVTALRM

27

SIGPROF

28

SIGWINCH

29

SIGIO, SIGPOLL, SIGSLOT

30 31

SIGPWR SIGUNUSED

32

SIGRTMIN

señal de terminación Desbordamiento coprocesador matemático Señal enviada por el núcleo a un padre cuando este hace un wait, para avisarle que un hijo ha terminado con un exit. El proceso se lleva a primer o segundo plano Suspensión de un proceso, por ejemplo por el debuger Suspensión del proceso debido a Ctrl Z del terminal Suspensión de un proceso en segundo plano que trata de leer del terminal Suspensión de un proceso en segundo plano que trata de escribir en el Terminal Datos urgentes para los sockets Sobrepasado límite de tiempo de CPU Sobrepasado tamaño de fichero Fin del temporizador ITIMER_VIRTUAL Fin del temporizador ITIMER_PROF Cambio del tamaño de una ventana, usado por X11 Datos disponibles para una entrada salida Fallo de alimentación Argumento erróneo en una llamada Marca el límite de señales en tiempo


real, < 32 no tiempo

4.2 Llamadas al sistema para señales s = kill (pid, sig) - envía una señal a un proceso. s = signal (sig, &función) – recibe una señal y define la función que la atiende. s = sigaction (sig, &act, &oldact) - define la acción a realizar cuando se recibe una señal, es la versión POSIX de signal. Residual = alarm (segundos) - planifica una señal SIGALRM después de un cierto tiempo. s = pause () - suspende al proceso solicitante hasta recibir una señal. s = sigreturn (&context) - regresa de una señal. Llamadas al sistema que afectan a grupos de señales: s = sigemptyset (sigset_t *set) – crea un conjunto de señales vacío. s = sigfillset (sigset_t *set) – crea un conjunto con todas las señales. s = sigaddset (sigset_t *set) – añade una señal a un conjunto de señales. s = sigdelset (sigset_t *set) – borra una señal de un conjunto de señales. s = sigismemberset (sigset_t *set) – comprueba si una señal pertenece a un conjunto. s = sigprocmask (how, &set, &old) - examina o cambia la máscara de las señales que se van a bloquear para que queden pendientes. s = sigpending (set) – un proceso obtiene el conjunto de señales pendientes de ser atendidas. s = sigsuspend (sigmask) - sustituye la máscara de señales y suspende el proceso

RECEPCIÓN DE SEÑALES Esta llamada se utiliza para recibir algún tipo de señal y suministrar la dirección de la función que va a atender la señal. SIGNAL (señal, función) Int señal; señal a recibir Int (*función) (); función que se ejecuta cuando se recibe la señal.


1.1 CLASIFICACIÓN DE LOS PERIFÉRICOS . Se denominan periféricos tanto a las unidades o dispositivos a través de los cuales el ordenador se comunica con el mundo exterior, como a los sistemas que almacenan o archivan la información, sirviendo de memoria auxiliar de la memoria principal. Se entenderá por periférico a todo conjunto de dispositivos que, sin pertenecer al núcleo fundamental de la CPU-Memoria Central, permitan realizar operaciones de E/S, complementarias al proceso de


Su volatilidad, pues al desconectar el ordenador de la red eléctrica se borra su contenido. Atendiendo a la definición dada, los periféricos se pueden clasificar en tres tipos: en unidades de entrada, unidades de salida y unidades de memoria masiva. Y aunque la memoria puede considerarse también como una unidad de entrada / salida, hay una característica que la diferencia del resto de unidades: la información almacenada no es directamente entendible por el usuario, pues suele estar codificada, comprimida e incluso a veces encriptado por motivos de seguridad. Esto hace que la interacción con el usuario no sea directa como en el resto de unidades. Los dispositivos de E/S transforman la información externa como una pulsación en una tecla en impulsos eléctricos que son codificados enviados hacia el procesador para su interpretación, procesamiento y almacenamiento de forma automática. Estas señales eléctricas se codifican según unos códigos como el ASCII y la CPU recibe la información codificada si.

1.2 CONEXIÓN DE PERIFÉRICOS AL COMPUTADOR . Los periféricos se conectan a la CPU a través de grupos de hilos que se conoce como buses. En el interior del computador el bus transmite la información de los datos en paralelo. El bus que conecta la CPU con los otros elementos del procesador se conoce como bus local o bus de la CPU. Es un bus muy rápido y conecta la CPU con las tarjetas de la placa base y los controladores de los dispositivos externos. Las conexiones entre los periféricos y los controladores o tarjetas de la placa base se realizan a través de un bus más general llamado bus del sistema. También suele conectar algunas ampliaciones de memoria. Algunos periféricos requieren un bus especializado que se adapte a su velocidad de transferencia, sus niveles de tensión, la naturaleza de sus señales de control y otros requerimientos. A estos buses se les llama bus de entrada/salida o bus de expansión.


Por todo lo vistos, los computadores grandes al disponer de varios tipos de buses requieren de dispositivos adaptadores o de interconexión entre buses. Los procesadores suelen tener unas ranuras de expansión (6 normalmente) sobre la placa base que están conectadas al bus del sistema y que permiten conectar una serie de dispositivos a este bus a través de tarjetas de circuito integrado y que permiten conectar varios dispositivos a la CPU, como por ejemplo tarjetas digitalizadoras de imágenes, aceleradores gráficos con FPGAs, etc. Todos los buses poseen unas especificaciones normalizadas, como son: - protocolos de transmisión de datos, - velocidades y temporización de las transferencias, - anchuras de los sub-buses, - y sistema físico de conexión (conectores estandarizados EISA (“Extendet Industry Satandard Architecture”). Es un bus ideado por 9 fabricantes de ordenadores, para arquitecturas de 32 bits. Posee velocidad de transferencia de 33Mbits/seg. Es compatible con el bus ISA. Este bus puede solo ser controlado por microprocesadores 80386, 80486 o superiores, y es auto configurable. SCSI (“Small computer System Interface”) es un estándar universal para conexiones paralelas a periféricos. Suele utilizarse para unidades de discos magnéticos y ópticos. Admite hasta 7 dispositivos y fue ideado para entornos UNIX y Macintosh. Permite velocidades de transferencia de 5 Mbits/seg hasta 400 Mbits/seg. En la actualidad se está desarrollando el SCII-3, de 32 bits, que podrá admitir hasta 32 periféricos conectados a gran distancia por fibra óptica (comunicación serie). Futurebus+ (IEEE 896.1 e IEEE 896.2). Es una normalización proyectada para equipos de muy altas prestaciones, que puede considerarse como una evolución de las normas Multibus II y VME. Diseñado para arquitectura de 64 bits. Permite la construcción de sistemas multiprocesador (de hasta 32 procesadores) compartiendo memoria. USB o Bus Serie Universal, es un estándar de 1995 que define un bus para conectar periféricos al ordenador. Puede llegar a conectar hasta 127 dispositivos con una conexión de tipo estrella. El estándar


incluye la transmisión de energía eléctrica al dispositivo conectado

Soporta dos tipos de transferencias, una baja de 1,5 Mbps para conectar dispositivos lentos y de bajo coste (joyticks, ratones) y otra alta de hasta 12 Mbps para la conexión de dispositivos que requieren un mayor ancho de banda (discos y CD-Roms). Las especificaciones de este estándar has sido respaldada por las empresas líderes en informática, como Intel, DEC, Microsoft, Compac, NEC y Northem Telecom. Este bus permite instalar nuevos dispositivos sin necesidad de rearrancar el computador. El USB puede conectar los periféricos como ratones, teclados, escáneres, cámaras digitales, teléfonos móviles, reproductores multimedia, impresoras, discos duros externos, tarjetas de sonido, sistemas de adquisición de datos y componentes de red. Para dispositivos multimedia como escáneres y cámaras digitales, el USB se ha convertido en el método estándar de conexión. Para impresoras, el USB ha crecido tanto en popularidad que ha desplazado a un segundo plano a los puertos paralelos porque el USB hace mucho


más sencillo el poder agregar más de una impresora a una

computadora personal. La versión 2.0 es de Alta velocidad y posee una tasa de transferencia de hasta 480Mbit/s (60MB/s). Y se espera pronto la Súper velocidad (USB 3.0). Sus características básicas son: Velocidad de transferencia: ≈ 4,80 Gb/s (600 MB/s) Composición del cable: 5 líneas + 1 (compartida). Dos líneas de datos: 1 par de envío, 1 par de recepción. 1 línea de corriente, 1 línea de toma de tierra (compartida). Esta especificación se supone que está ya en funcionamiento

1.3 TECLADO. Los teclados son periféricos similares a las máquinas de escribir (Cristopher L. Sholes en 1867), con sus teclas dispuestas en una distribución que se conoce como QWERTY, y que se basa en la idea de que las teclas más utilizadas (en inglés) estén lo más separadas posibles entre si y además la mano izquierda se use en un 60% de las ocasiones (40% la mano derecha, más hábil).


Teclados QWERTY Y Dvorak. Y al lado, detalle de máquina de escribir tradicional. Al pulsar una tecla se cierra un conmutador que hay en el interior del teclado, y mediante el chip 8742 se detecta que tecla se ha pulsado para que posteriormente una lógica circuitos codificadores llamados controladores de teclado (8042) generen el código correspondiente al carácter seleccionado (ASCII, por ejemplo), y envíen una interrupción a la CPU para avisar de que tecla o teclas han sido pulsadas. Normalmente, el programa gestor de teclado hace un “eco” del carácter pulsado visualizándolo en el monitor, pero eso no quiere decir que ese carácter haya sido enviado a la CPU.

Su funcionamiento detallado es como sigue: los teclados poseen internamente una matriz de teclas y un circuito integrado (el 8742) que se encarga de supervisar esta matriz y detectar las pulsaciones. Cuando se detecta una pulsación, o la liberación de una tecla, se escribe su código en un buffer interno del teclado y a continuación el teclado transmite este código al controlador que se encuentra en la placa base del procesador vía serie a través del cable del teclado. Al pulsar se genera una interrupción o llamada que detecta el 8742 y genera el código ASCII de la tecla pulsada (con el bit-7 a “0”) y al soltar se genera el mismo código pero con el bit-7 activado a “1”. Por ejemplo, si se pulsa la 'A' se generará una INT 9 y aparecerá en el puerto del teclado (60h) el byte “1Eh”, al soltar la 'A' se generará otra


INT 9 y se podrá leer el byte “9Eh” del puerto del teclado. Este controlador 8742 incluido en el teclado posee las siguientes funciones: a) Prevenir falsas repeticiones (rebotes) o pulsaciones incorrectas. b) Traducir la tecla pulsada en un código único, llamado “scan-code”. Suele ocupar un byte. c) Repetir un carácter si se ha pulsado durante cierto tiempo (del orden de un segundo como min d) Detectar las pulsaciones simultáneas de varias teclas. El conector de teclado posee 5 hilos para transmitir las señales: Señal de reloj, datos, reset , tierra y alimentación imo


Ello permite establecer una comunicación bidireccional entre la CPU y el teclado. La línea de reset sirve para inicializar el teclado. Esquema gráfico de conexión de un teclado.

Cuando se produce una pulsación, el controlador transfiere un código al ordenador (“make-code”) que genera una interrupción para que la rutina de tratamiento lea el código enviado. Es el driver de teclado el que en estas interrupciones se encarga de combinar los códigos para generar los caracteres (mayúsculas, minúsculas, teclas de función, control, ...). Las teclas expandidas -las que han sido añadidas al teclado estándar de 83/84 teclas- o las combinaciones de teclas como ALT-teclado numérico, tienen un comportamiento especial, ya que pueden generar hasta 4 interrupciones consecutivas (con un intervalo de unos 1,5 milisegundos, ó 3 ms en los códigos dobles que convierte en uno el 8042). se observa un diagrama similar de cómo funciona el teclado de un ordenador.


Asignación Dinámica de Memoria, Introducción a las Listas Enlazadas Permite crear variables y arreglos de manera dinámica. Dinámica quiere decir que el espacio de memoria es asignado durante la ejecución o corrida del programa. En ocasiones el tamaño de los objetos no se sabe hasta el momento de la corrida. Por ejemplo, la longitud de una cadena de caracteres que introducirá el usuario no se sabe hasta el tiempo de corrida. El tamaño de un arreglo puede depender de un parámetro cuyo valor se desconoce previo al momento de ejecución. Ciertas estructuras de datos como listas enlazadas, pilas y colas utilizan memoria dinámica.

Cómo Asignar y Liberar Memoria La función malloc se utiliza para asignar memoria (stdlib.h). Su prototipo es Void *malloc (size_t nbytes);


Malloc retorna un apuntador a void. Puede asignarse a un apuntador a cualquier tipo, haciendo el casting adecuado. Si ocurre una falla, malloc retorna el apuntador null. El valor de retorno de malloc, debe chequearse para evitar errores: Char *cpt; ... if ((cpt = (char *) malloc (25)) == NULL) { printf ("Error on malloc\n"); } El tipo size_t es equivalente a un entero sin signo (unsigned). El número de bytes de memoria requeridos depende del número y tamaño de los objetos a almacenar. Char se almacena en un byte, float en 4 bytes. En la mayoría de las máquinas de 32 bits, int se almacenan en 4 bits. La manera más fácil de determinar el tamaño de una variable es utilizando el operador sizeof ,que devuelve el tamaño en bytes de un objeto. Sizeof puede ser llamado con cualquier tipo de datos como argumento. #include <stdio.h> typedef struct employee_st { char name [40]; int id; } Employee; Int main () { int myInt; Employee john; printf("Size of int is %d\n",sizeof(myInt)); /* the argument of sizeof is an object */ printf("Size of int is %d\n",sizeof(int)); /* The argument of sizeof is a data type */ printf("Size of Employee is %d\n",sizeof(Employee)); /* The argument of sizeof is an object */ printf("Size of john is %d\n",sizeof(john)); /* The argument of sizeof is a data type */


printf("Size of char is %d\n",sizeof(char)); printf("Size of short is %d\n",sizeof(short)); Printf ("Size of int is %d\n", sizeof (float)); printf ("Size of int is %d\n", sizeof (double)); } Cuando se usa memoria dinámica, es necesario que el programador libere la memoria luego de utilizarla, esto se hace usando la función de librera estándar d free: Void free (void *pt); Free puede recibir como argumento cualquier tipo de apuntador, no es necesario hacer un casting a void.

Ejercicio: Escribir un programa que asigne dinámicamente un arreglo de tipo Empleados. Pedir al usuario el número de empleados que debe crearse. Contrate algunos empleados (llene los campos de nombre y número de id.)


#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { Employee *workers, *wpt; int num; printf("How many employees do you want\n"); scanf("%d",&num); workers = (Employee *) malloc(num * sizeof(Employee)); if (workers == NULL) { printf("Unable to allocated space for employees\n"); return 1; /* A nonzero return is usually used to indicate an error */ } wpt = workers; strcpy(wpt->name,"John"); wpt->id = 12345; wpt++; strcpy(wpt->name,"Justin"); wpt->id = 12346; wpt = workers; printf("Employee %d is %s\n", wpt->id, wpt->name); wpt++; printf("Employee %d is %s\n", wpt->id, wpt->name); free(workers); workers = NULL; return 0; }


Listas Enlazadas Una lista enlazada está formada por una colección de elementos (denominados nodos) tales que cada uno de ellos almacena dos valores: (1) un valor de la lista y (2) un apuntador que indica la posición del nodo que contiene el siguiente valor de la lista. Un arreglo almacena todos sus elementos agrupados en un bloque de memoria. Mientras que en una lista enlazada la memoria se va tomando según se necesita. Se van agregando nodos. Cuando queremos añadir un nuevo elemento (nodo ) reservamos memoria para él y lo añadimos a la lista. La lista va tomando su estructura usando apuntadores que conectan todos sus nodos como los eslabones de una cadena, o las cuentas de un collar. Cuando queremos eliminar el elemento simplemente lo sacamos de la lista y liberamos la memoria usada.

Ejemplo de una Lista de números 1, 2, 3 Lista {1, 2, 3} El comienzo de la lista enlazada es almacenado en el apuntador head (cabeza) que apunta al primer nodo. El primer nodo contiene un apuntador al segundo nodo. El segundo contiene un apuntador al tercero, y así sucesivamente. El ultimo nodo en la lista tiene su campo .next asignado a NULL para indicar el fin de la lista. Se puede acceder cualquier nodo en la lista comenzando por la cabeza (head) y siguiendo los subsiguientes apuntadores .next a. Por tanto, las operaciones hacia el inicio de la lista son más rápidas mientras las operaciones de acceso hacia el final de la lista toman más tiempo a medida que están más alejadas del inicio. Costo de acceso mayor que el costo constante de acceso a un arreglo. En este sentido, los arreglos son mucho más eficientes que las listas. Antes de escribir el código que construye la lista descrita arriba, necesitamos dos tipos de datos:

Nodo


Tipo de los nodos que conformaran el cuerpo de la lista. Cada nodo contiene un campo de datos, y un apuntador al siguiente nodo de la lista. Tipo: struct node struct node { int data; struct node* next; };

Apuntador a nodo: Tipo apuntador a nodo. Sera el tipo de la cabeza de la lista y de los campos next de cada nodo. En C no se requiere una declaraci贸n de tipos aparte dado que el tipo apuntador es el nodo seguido de un '*'. Tipo: struct node*

Ejemplo de funci贸n simple que usa operaciones con apuntadores para construir la lista {1, 2, 3}: /* Build the list {1, 2, 3} in the heap and store Its head pointer in a local stack variable. Returns the head pointer to the caller. */ Struct node* BuildOneTwoThree () { Struct node* head = NULL; Struct node* second = NULL; Struct node* third = NULL; Head = malloc (sizeof (struct node)); // asigna 3 nodes Second = malloc (sizeof (struct node)); Third = malloc (sizeof (struct node)); Head->data = 1; // setup first node Head->next = second; // note: pointer assignment rule Second->data = 2; // setup second node Second->next = third; Third->data = 3; // setup third link Third->next = NULL;


Return head; }

La Asignación estática de memoria : consiste en el proceso de asignar memoria en tiempo de compilación antes de que el programa asociado sea ejecutado, a diferencia de la asignación dinámica o la automática donde la memoria se asigna a medida que se necesita en tiempo de ejecución. Una aplicación de esta técnica conlleva que un módulo de programa (por ejemplo función o subrutina) declara datos estáticos de forma local, de forma que estos datos son inaccesibles desde otros módulos a menos que se les pasen referenciados como parámetros o que les sean devueltos por la función. Se mantiene una copia simple de los datos estáticos, accesible a través de llamadas a la función en la cual han sido declarados. El uso de variables estáticas dentro de una clase en la programación orientada a objetos permite que una copia individual de tales datos se comparta entre todos los objetos de esa clase. Las constantes conocidas en tiempo de compilación, como literales de tipo cadena, se asignan normalmente de forma estática. En programación orientada a objetos, el método usual para las tablas de clases también es la asignación estática de memoria.

Asignación automática de memoria Las variables automáticas son variables locales a un bloque de sentencias (subrutina, función o procedimiento). Pueden ser asignadas automáticamente en la pila de datos cuando se entra en el bloque de código. Cuando se sale del bloque, las variables son automáticamente desasignadas.3 Las variables automáticas tendrán un valor sin definir cuando son declaradas, por tanto es buena práctica de programación inicializarlas con un valor válido antes de usarlas.


Asignación dinámica de memoria En ciencia de la computación, asignación dinámica de la memoria es la asignación de almacenamiento de memoria para utilización por parte de un programa de computador durante el tiempo de ejecución de ese programa. Es una manera de distribuir la propiedad de recursos de memoria limitada entre muchas piezas de código y datos. Un objeto asignado dinámicamente permanece asignado hasta que es desasignado explícitamente, o por el programador o por un recolector de basura; esto es notablemente diferente de la asignación automática de memoria y de la asignación estática de memoria (la de las variables estáticas). Se dice que tal objeto tiene tiempo de vida dinámico.

Soluciones para los problemas de asignación La tarea de satisfacer una petición de asignación, la cual conlleva encontrar un bloque de memoria sin usar de cierto tamaño en el heap, es un problema complicado. Se han propuesto una amplia variedad de soluciones, incluyendo listas de bloques libres, Paginación, y Asignación buddy de memoria.


El problema principal para la mayoría de algoritmos de asignación de memoria dinámica es evitar la fragmentación interna y externa mientras se mantiene la eficiencia del algoritmo. También, la mayoría de algoritmos en uso tienen el problema de que un número grande de pequeñas asignaciones pueden causar el desaprovechamiento del espacio debido a la recolección de metadatos; así la mayoría de los programadores intentan evitar esto, a veces usando una estrategia llamada chunking.

Asignación de bloques de tamaño fijo Una solución es tener una lista enlazada LIFO de bloques de memoria de tamaño fijo. Esto funciona bien para sistemas empotrados simples. Algoritmo Buddy Otra solución es tener un asignado buddy de bloques binarios. En este sistema, la memoria se asigna desde un gran bloque de memoria que es tamaño potencia de dos. Si el bloque es más del doble de grande de lo necesario, se parte en dos. Se selecciona una de las dos mitades, y el proceso se repite (comprobando el tamaño otra vez y partiendo si se necesita) hasta que el bloque sea justamente el necesitado. Todos los segmentos de memoria de un tamaño particular son guardados en una lista enlazada ordenada o una estructura de datos en árbol. Cuando se libera un bloque, se compara con su buddy (vecino). Si los dos están libres, son combinados y colocados en la lista de bloques buddy de siguiente mayor tamaño. (Cuando un bloque es asignado, los asignados empezará con el bloque grande suficientemente pequeño para evitar romper bloques innecesariamente) Que los asignados buddy de bloques no son únicamente para los Sistemas Operativos de Tiempo-Real (RTOS); ellos también son usados en sistemas operativos de propósito general (tales como Microsoft Windows y Linux).


Asignación de memoria basada en Heap En la asignación de memoria basada en heap, la memoria es asignada desde un gran área común de memoria libre (sin usar) llamada heap (también llamada almacén de libres o 'memoria del montón'). "El heap" no tiene nada que ver con la estructura de datos Heap (o Montículo). El tamaño de la asignación de memoria puede ser determinado en tiempo de ejecución, y el tiempo de vida de la asignación no es dependiente del procedimiento actual o del marco de pila. La región de memoria asignada es accedida indirectamente, normalmente por medio de una referencia. El algoritmo preciso usado para organizar el área de memoria y asignar y desasignar los trozos está oculto detrás de una interfaz abstracta y puede usar cualquiera de los métodos descritos antes. En contraste, la memoria de la pila de llamadas es normalmente de tamaño limitado y el tiempo de vida de la asignación depende de la duración de las funciones correspondientes.

Introducción a los procesamientos gráficos El objetivo de este laboratorio es aprender a graficar todo tipo de tablas, a relacionar con qué tipo de expresión matemática está relacionada cada una de las curvas encontradas en la gráfica; Además, aprenderemos a rectificar las curvas de tal manera que queden en una línea recta encontrando sus respectivas constantes las que nos ayudaran a saber su significado físico dando a entender sus magnitudes y hacer un análisis más entendible de la situación estudiada. Realice para cada una de las tablas, n gráfico de la segunda variable en función de la primera. Tabla Grafico n°1 Tabla Grafico n°2



Algunos valores en especial los donde se tuvo que rectificar se aproxima de la manera simple para poder así no presentar problemas con las gráficas. ¿Qué tipo de curva representa cada una de ellas? ¿Conque tipo de expresión matemática está relacionada cada una de ellas?. La 1ª es una recta de la forma Y = mx + n


La 2ÂŞ es una parĂĄbola de la forma Y = ax2 + c


La 3ÂŞ es una parĂĄbola de la forma Y = ax2 + c


La 4ÂŞ es una hipĂŠrbola de la forma Y = 1/x


Tomemos la primera. Se observa que es una línea recta en consecuencia está asociada con la expresión matemática del tipo Y = mx+n. Tomando en


cuenta que nuestros ejes de coordenadas son r y t. ¿Cuál sería la expresión matemática usando los valores k y k' en lugar de m y n?. T= mr + n k = 3,6219 y k' = 7,4765 " t = 3,6219 m + 7,4765  Para el primer gráfico. Si la variable r media la posición de un objeto y la variable t los tiempos para los cuales, el objeto estaba en dichas posiciones. Las posiciones fueron medidas en centímetros y los tiempos en segundos, indique las unidades de cada una de las constantes k y k'. ¿Qué significado físico tienen? R = cm y t = seg. k = 3,6219 cm/seg. (Rapidez de la partícula) K' = 7,4765 esto indica que cuando el móvil esta en t=0 seg. El objeto se encuentra en la posición 7,4765 cm. Sí la constante k =-3,5 m/seg. y la k'=12,3m. Describa el tipo de movimiento que tendría el objeto. Tendría una rapidez de -3,5 m/s y en t=0 seg. Su posición seria de 12,3m. Este movimiento es retardado, ya que su rapidez es negativa. ¿Qué cambio de variable deberíamos realizar para que cada una de las curvas se transforme en una recta?. Para la 2ª se eleva al cuadrado, para la 3ª se eleva al cubo y para la 4ª se eleva a -1 o bien queda expresado 1/p. Haga los cambios que de variable que corresponda. Se adjunta en la pregunta numero 1 los respectivos valores con sus respectivos cambios. Calcule las nuevas tablas de acuerdo con los cambios de variables propuestos. Se adjunta en la pregunta numero 1 los respectivos valores con sus respectivos cambios.


Conclusión 1: En este grafico pudimos determinar que la línea recta representados por los primeros datos no vario mucho ya que la gráfica anterior representa una línea recta de la forma y = mx + n y por lo tanto en la siguiente rectificación que presentamos no vario en casi nada en comparación con la gráfica original


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.