PROYECTO 1
en el post anterior de este curso le explique todos sobre la instalacion para trabajar con pintos ahora vamos a comenzar con lo que es la parte programativa con respecto a este sistema .
bueno el primer proyecto se trata de los siguiente :
Project 1: Threads
En esta tarea, le ofrecemos un sistema de hilo mínimamente funcional. Su trabajo consiste en ampliar la funcionalidad de este sistema para obtener una mejor comprensión de los problemas de sincronización.Usted va a trabajar principalmente en el directorio de "threads" para esta asignacion y tambien en el directorio de "devices" .
en este momento nos enfocaremos en esta parte luego iremos resolviendo las partes restantes de este proyecto .
pero primero antes que todo se tiene que saber como funcionan los thread y como se generan en el sistema operativo bueno lo voy a explicar ;
Understanding Threads(entendiendo los threads)
El primer paso es leer y entender el código para el sistema de hilo inicial. Pintos ya se implementa la creación del hilo y la finalización hilo, un planificador simple para cambiar entre los hilos, y primitivas de sincronización (semaphores, locks, condition variables, and optimization barriers). .Algunos de este código puede parecer un poco misteriosa. Usted puede leer a través de partes del código fuente para ver lo que está pasando. Si lo desea, puede agregar llamadas a printf () en casi cualquier lugar, a continuación, volver a compilar y ejecutar para ver qué pasa y en qué orden. También puede ejecutar el kernel en un depurador y establecer puntos de interrupción en los puntos de interés, de un solo paso a través de código y examinar los datos, y así sucesivamente.
Cuando un hilo se crea, se está creando un nuevo contexto para ser programado. Usted proporciona una función que se ejecuta en este contexto como un argumento para thread_create (). La primera vez que el hilo se planifica y se ejecuta, se inicia desde el principio de que la función y se ejecuta en ese contexto. Cuando la función retorna, el subproceso termina. Cada hilo, por lo tanto, actúa como un mini-programa que se ejecuta dentro de Pintos, con la función pasa a thread_create () a actuar como main ().
En cualquier momento dado, exactamente un hilo se ejecuta y el resto, en su caso, se vuelven inactivas. El planificador decide que hilo para la próxima. (Si no hay hilo está listo para funcionar en un momento dado, el especial "inactivo" hilo, implementado en idle (), se ejecuta.) Primitivas de sincronización puede forzar cambios de contexto cuando un hilo necesita esperar a que otro hilo que hacer algo.
La mecánica de un cambio de contexto se encuentran en "temas / switch.S", que es 80x86 código ensamblador. (Usted no tiene que entenderlo.) Se guarda el estado de los hilos en ejecución y restaura el estado de los hilos que estamos cambiando.
Con el depurador GDB, lentamente, traza a través de un cambio de contexto para ver qué sucede (véase la sección E.5 GDB). Puede establecer un punto de interrupción en la fecha prevista () para iniciar, y luego de un solo paso de allí. (2) Asegúrese de llevar un registro de dirección de cada subproceso y el Estado, y qué procedimientos se encuentran en la pila de llamadas para cada hilo. Usted se dará cuenta de que cuando un subproceso llama a switch_threads (), otro hilo empieza a correr, y lo primero que el nuevo hilo no es volver de switch_threads (). Usted va a entender el sistema de hilo una vez que comprendes por qué y cómo la switch_threads () que se llama es diferente de la switch_threads () que devuelve. Vea la sección A.2.3 Hilo de conmutación, para más información.
Advertencia: En Pintos, cada hilo se le asigna un pequeño, fijo ejecución tamaño de la pila poco menos de 4 kB de tamaño. El núcleo intenta detectar desbordamiento de pila, pero no puede hacerlo perfectamente. Puede causar problemas extraños, como un kernel panic misterioso, si declarar estructuras como no estáticos variables locales, por ejemplo, "int buf [1000];". Alternativas a la asignación de pila incluyen el asignador de páginas y el asignador de bloque (véase la sección A.5 de asignación de memoria).
por cierto el printf se usa de la siguiente manera
Sentencia printf()
La rutina printf permite la aparición de valores numéricos, caracteres y cadenas de texto por pantalla.
El prototipo de la sentencia printf es el siguiente:
En la cadena de control indicamos la forma en que se mostrarán los argumentos posteriores. También podemos introducir una cadena de texto ( sin necesidad de argumentos ), o combinar ambas posibilidades, así como secuencias de escape.
El modificador está compuesto por el caracter % seguido por un caracter de conversión, que indica de que tipo de dato se trata.
- Los modificadores más utilizados son:
- %c Un único caracter
- %d Un entero con signo, en base decimal
- %u Un entero sin signo, en base decimal
- %o Un entero en base octal
- %x Un entero en base hexadecimal
- %e Un número real en coma flotante, con exponente
- %f Un número real en coma flotante, sin exponente
- %s Una cadena de caracteres
- %p Un puntero o dirección de memoria
#include
int a=20,b=10;
printf("El valor de a es %d ",a);
printf("El valor de b es %d ",b);
printf("Por tanto %d+%d=%d",a,b,a+b);