330 likes | 468 Views
Proyecto del Curso. Diseño de un Kernel de Procesos Concurrentes. 1era Parte: Diseño del Mecanismo de Cambio de Contexto. 2da. Parte. Diseño del Manejador de Procesos. 3era Parte. Diseño del Manejador de Semaforos. 4a. Parte. Diseño del Manejador de Buzones.
E N D
Proyecto del Curso Diseño de un Kernel de Procesos Concurrentes. • 1era Parte: Diseño del Mecanismo de Cambio de Contexto. • 2da. Parte. Diseño del Manejador de Procesos. • 3era Parte. Diseño del Manejador de Semaforos. • 4a. Parte. Diseño del Manejador de Buzones. • 5a. Parte: Integracion del Kernel. Dr. Pedro Mejia Alvarez. http://delta.cs.cinvestav.mx/~pmejia~/ Dr. Pedro Mejia Alvarez
Contenido Diseno de un Kernel de Procesos Concurrentes. • Introduccion al Kernel. • Diseno de los Componentes. • 1era Parte: Diseno del Mecanismo de Cambio de Contexto. • Manejador de Interrupciones. Dr. Pedro Mejia Alvarez
Introduccion al Kernel Diseno de un Kernel de Procesos Concurrentes. • El kernel de procesos concurrentes es un programa que se ejecuta sobre MS-DOS y que permite ejecutar varios procesos de forma concurrente. • La concurrencia permite a varios procesos compartir el CPU a fin de que la ejecucion sea vista por el usuario como si cada proceso se estuviera ejecutando en distintos procesadores. • El kernel consta de manejador de procesos, manejador de semaforos y manejador de buzones. Las primitivas de estos manejadores son visibles al usuario. • Internamente el kernel contiene distintos manejadores que permiten accesar directamente a los recursos del sistema operativo y del hardware. Estos manejadores son: el manajador del CPU, el manajador del las colas y el PCB, el manejador del timer y de las interrupciones, el manajador de errores y el manejador de E/S y hardware. Dr. Pedro Mejia Alvarez
Introduccion al Kernel (cont) • El manejador de memoria utilizado por el kernel sera provisto por MS-DOS de forma transparente. • El manejador de procesos permite crear procesos, suspender la ejecucion de los procesos, cambiar de contexto, suspender temporalmente a los procesos y eliminar procesos. • El manejador de semaforos permite crear semaforos, y las operaciones senal y espera. • Con las operaciones que proporciona el manejador de semanforos sera posible implementar regiones de acceso exclusivo (secciones criticas), monitores de lectores y escritores o mecanismos de sincronizacion entre procesos. • Con las operaciones que proporciona el manejador de buzones sera posible implementar las operaciones: crear buzon, enviar y recibir mensajes. Con estas operaciones sera posibel comunicar a varios procesos de forma asincrona. Dr. Pedro Mejia Alvarez
Diseno de los Componentes Kernel de Procesos Concurrentes. • 1a. Parte: Diseno del Mecanismo de Cambio de Contexto. • 2a. Parte. Diseno del Manejador de Procesos. • 3a. Parte. Diseno del Manejador de Semaforos. • 4a. Parte. Diseno del Manejador de Buzones. • 5a. Parte: Integracion (arquitectura) del Kernel. Dr. Pedro Mejia Alvarez
Arquitectura del Kernel Procesos C B • Manejo de • Procesos • Timers • Semaforos • Buzones Planificacion y Cambio de Contexto A • Manejo de • E/S • Hardware Manejo de Colas y PCB Caracteristicas • Expulsividad. • Prioridades Fijas. • Planificacion Round Robin • con Prioridades. • Quantum = 50 mseg. Inicializacion MS-DOS Dr. Pedro Mejia Alvarez
Arquitectura del Kernel proceso_2( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0;} } proceso_1( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0;} } proceso_3() { while (1){ a = a+1; if (a == 1) return 0; else a = 0;} } Procesos Interface Semaforos crea_sem Senal espera Procesos crea elimina retrasa Buzones crea_buzon envia recibe Primitivas Tiempo & Interrupciones E/S & Hardware Colas Errores CPU Manejadores MS-DOS Dr. Pedro Mejia Alvarez
Proyecto del Curso (Primera Parte) • Cambio de Contexto. • Inicializacion del Sistema. • Manejo de Interrupciones. Dr. Pedro Mejia Alvarez
Fuente de Interrupcion controlador de interrupciones programable 8259 PIC kernel Cambio de Contexto Proceso 1 Timer proceso_1( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } Proceso 2 proceso_2( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } • el kernel contiene a la rutina de cambio de • contexto. • la rutina de cambio de contexto puede escoger • entre varios procesos a ejecutar. • cada proceso es interrumpible en cualquier • instruccion Dr. Pedro Mejia Alvarez
Generacion y Atencion de la Interrupcion Timer Vectores de Interrupcion Rutina de Servicio Proceso de usuario • Procedimiento: • El timer genera la interrupcion. • El PIC la atiende, y verifica el vector • de interrupcion. • 3. El vector de interrupcion contiene la • direccion de la rutina de servicio. • 4. Se tranfiere el control a la rutina de • servicio • 5. La rutina de servicio (cambio de • contexto) contiene un procedimiento • que permite ejecutar varios procesos • en forma concurrente PIC kernel Dr. Pedro Mejia Alvarez
main( ) { save_vect(); set_vect(08,context_switch); init_procesos(); } context_switch int 8( ) { disable_int(); salva_registros(); run = sig_proceso(); ejecuta_proc(run); enable_int(); } Cambio de Contexto proceso_1( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } kernel proceso_2( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } Proceso Principal. Inicializacion Cambio de contexto Dr. Pedro Mejia Alvarez
context_switch int 8( ) { disable_int(); salva_registros(); run = sig_proceso(); ejecuta_proc(run); enable_int(); } Cambio de Contexto • Procedimiento: • Al entrar se recupera la direccion del proceso • en ejecucion y se salva en su PCB. • Se verifica cual es el siguiente proceso a ejecutar. • Se consulta la cola de listos. • Si proceso siguiente es distinto al proceso actual, • se envia a ejecucion al proceso siguiente. • Se carga del PCB del proceso siguiente los • registros (CS:IP, DS, SS, SP, BP, Flags, etc) • proceso en ejecucion = proceso siguiente; • Push de registros del proceso siguiente en Stack. • IRET. • Se ejecuta cada 50 msegs • Existe un timer programado para interrumpir cada • 50 msegs. • Dentro de la rutina se desabilitan interrupciones. • Debe ser rapida. • No debe haber llamadas a otras interrupciones. Dr. Pedro Mejia Alvarez
Vector de Interrupciones Interrupt Assignment 0 Timer 3 COM 2 4 COM 1 5 Network card/other card 6 Floppy 7 Parallel port 14 Primary hard disk controller 15 Secondary hard disk controller 1 Keyboard 2 Slave 8259 Interrupcion para cambio de contexto 8 Realtime clock 9 Remapped interrupt 2 10 11 12 13 Math Co-processor Dr. Pedro Mejia Alvarez
main( ) { ptr8 = save_vect(8); set_vect(08,context_switch); init_procesos(); set_vect(08,ptr); } Proceso Principal (Inicializacion) • Procedimiento: • Inicializar colas. • Inicializar PCB. • Activar Procesos. • Habilitar <ctrl-c>. Procedimiento de exit. • Salva el vector de Interrupciones (8) • Desabilitar interrupciones. • Cambiar el vector 8 por la direccion de la • rutina de cambio de contexto. • Habilitar interrupciones. • Los procesos los activa el Kernel. • El main() no es un proceso, es la rutina de • inicializacion. • Las colas se inicializan en 0's. • Al activar los procesos se llena parte del PCB, con • las direcciones de inicio de los procesos. Dr. Pedro Mejia Alvarez
Activacion de Procesos • Procedimiento: • (verifica parametros) • Inicializar el PCB. • Incluir al proceso en la cola de listos. • Inicializar PCB. • Activar Procesos. activa(numero:2, &dir_proceso); 1 • PCB: • -numero • -estado: activo • -registros • CS • IP • FLAGS • DS • ES • AX,...DX Cola de Procesos Activos proceso_2( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } head tail proceso 2 direccion fisica 2 Dr. Pedro Mejia Alvarez
Por Entregar • Programa del Kernel que contiene: • Modulo (Programa) manejador de Interrupciones que efectue cambio de contexto. • 4 Procesos que manejen c/u 1/4 de la pantalla y que efectuen algun programa grafico: • Despliegue del reloj. • Manejo de una pelota que recorra la ventana. • Manejo de una serpiente que recorra la ventana. • Manejo de una tabla que cambie sus valores con el tiempo. • Un editor de caracteres sencillo, que acepte caracteres del teclado. • Procedimiento de Inicializacion del Sistema: Interrupciones, y PCB. • Ligar los 4 procesos con el Manejador en un solo programa. Dr. Pedro Mejia Alvarez
Interupciones • Se detiene la secuencia normal de ejecucion para atender algun evento (actividad de computo). • Mejora la eficiencia del procesamiento. • Permite al procesador ejecutar otras instrucciones mientras se espera por la ocurrencia de E/S. • Se atiende a un evento solo hasta que ocurre la interrupcion. • Al terminar de atender la interrupcion se regresa al procesamiento anterior. Dr. Pedro Mejia Alvarez
Clocks, Timers, e Interrupciones (PIC) • Proveen la hora, sirven de cronometro o de alarma. • Se puede programa para que interrumpa cada 10 mseg (periodicamante). • Al interrumpir se llama a una rutina de servicio (manejador de interrupcion). • Se puede prograna para atender eventos asincronos, que ocurren en cualquier momento y hay que darles atencion. P.ej. el teclado o el puerto serie. Dr. Pedro Mejia Alvarez
Funciones de una Interrupcion • La interrupcion transfiere el control (la ejecucion) a una rutina de servicio de la interrupcion. • En el vector de interrupciones se encuentra la direccion de la rutina de servicio. • En la rutina de servicio se debe de salvar la direccion de de donde ocurrio la interrupcion. • Mientras se atiende a una interrupcion, otras interupciones se desabilitan (temporalmente), para evitar que se pierdan. • El cambio de contexto se realiza mediante interrupciones. Dr. Pedro Mejia Alvarez
Clases de Interrupciones • Por Programa • overflow aritmetico • division por cero • ejecucion de instrucciones ilegales. • proteccion de memoria. • Timers: se programa un timer para que interrumpa despues de un tiempo. • E/S: se programa un driver para que se atienda a un dispositivo de E/S. • Fallo de Hardware (o de software): Si algun dispositivo falla, o si se detecta algun error de software, se ejecuta una excepcion. Dr. Pedro Mejia Alvarez
Manejador de Interruciones • Progrma que determina la naturaleza de la interrupcion y atiende el evento que la origino. • Se tranfiere el control a este programa: se deja de ejecutar el proceso actual. • Se salvan los registros del CPU (direccion del proceso actual), para poder regresar. • Para cada tipo de interrupcion, debe haber un manejador distinto. • Puede ser parte del sistema operativo (aunque tambien, puede ser inicializado por el usuario). • Es necesario verificar cual vector de interrupciones se utiliza. Algunas interupciones son del sistema, y pueden afectar al sistema de computo si son remplazadas. Dr. Pedro Mejia Alvarez
Ciclo de Interrupciones Dr. Pedro Mejia Alvarez
Ciclo de Interrupciones • Si las interrupciones estan habilitadas: el procesador checa interrupciones • Si las interupciones estan desabilitadas, al hacer el fetch el CPU ejecuta la proxima instruccion. • Si una interrupcion esta pendiente, se suspende la ejecucion del programa actual, y se llama al manejador de interrupciones. Dr. Pedro Mejia Alvarez
Multiples Interrupciones • Las interrupciones se desabilitan cuando se procesa una interrpcion. • El procesador "ignora" una senal de peticion de nueva interrupcion. Dr. Pedro Mejia Alvarez
Manejador de interrupcion( ) { disable_int(); salva_registros(); run = sig_proceso(); ejecuta_proc(run); enable_int(); } Una Interrupcion, varios manejadores de interrupcion. • En este caso, solo existe un manejador de interupciones. • El manejador elige una de entre varias rutinas de servicio. • El manejador interrumpe la ejecucion de las rutinas, y salva su estado, para darle el CPU a otra rutina. proceso_1( ) { .............. ............... } proceso_1( ) { .............. ............... } proceso_1( ) { .............. ............... } Cambio de contexto Dr. Pedro Mejia Alvarez
Multiples Prioridades de Interrupcion • Existen distintos niveles de interrupcion. • Las interrupciones de alta prioridad producen que las interrupciones de baja priorida esperen. • Las interrpciones de alta prioridad interrumpen a las de baja prioridad. Dr. Pedro Mejia Alvarez
main( ) { save_vect(); set_vect(08,context_switch; init_procesos(); } context_switch int 8( ) { disable_int(); salva_registros(); run = sig_proceso(); ejecuta_proc(run); enable_int(); } Cambio de Contexto proceso_1( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } kernel proceso_2( ) { while (1){ a = a+1; if (a == 1) return 0; else a = 0; } } Proceso Principal. Inicializacion Cambio de contexto Dr. Pedro Mejia Alvarez
main() void interrupt (*old_rutina) (void); main( ) { old_rutina = getvect(8); setvect(08,context_switch); inicializa_tarea(1); inicializa_tarea(2); inicializa_tarea(3); inicializa_tarea(4); while(1); } Dr. Pedro Mejia Alvarez
context_switch() void interrupt (*old_rutina) (void); int i; void interrupt rutina(void) { disable(); i++; if ((i%20)==0) printf("\n %d",i++); old_rutina(); enable(); } main() { i = 0; old_rutina = getvect(8); setvect(8, rutina); while(1); } Dr. Pedro Mejia Alvarez
context_switch() void interrupt context_switch(void){ disable(); DD[PtrRun->Este].ss=_SS; DD[PtrRun->Este].sp=_SP; InsertaListos(PtrRun,&Error); PtrRun=PrimeraTarea(&Error); _SS=DD[PtrRun->Este].ss; _SP=DD[PtrRun->Este].sp; old_rutina(); enable(); } Dr. Pedro Mejia Alvarez
Inicializacion (estructuras de datos) /* Estructura de los regitros internos en el orden que C++ los guarda en una llamada a funcion tipo interrupcion*/ struct RI{ unsigned bp; unsigned di; unsigned si; unsigned ds; unsigned es; unsigned dx; unsigned cx; unsigned bx; unsigned ax; unsigned ip; unsigned cs; unsigned flags; }; typedef RI Regs_Int; Dr. Pedro Mejia Alvarez
Inicializacion (estructuras de datos) /* Estructura del PCB para cada tarea */ struct procb{ unsigned id; //Identificador unsigned DirSeg; //Semento de inicio de la tarea unsigned DirOff; //Desplazamiento de inicio de la tarea unsigned status; //Tiempo de espera en colo de retraso unsigned sp; //Apuntador de Pila local unsigned ss; //Apuntador de Pila Local int estado; //Estado de la tarea unsigned prioridad; //Prioridad de la tarea char *nombre; //Nombre de la tarea char far stck[4096]; //Espacio de Pila Local }; typedef procb PCB[20]; // para 20 procesos Dr. Pedro Mejia Alvarez
Inicializacion de Tareas inicializa_tarea(TareaPtr Tarea, unsigned id){ Regs_Int *r; r = (Regs_Int *) DD[id].stck + 1024 - sizeof( Regs_Int); DD[id].sp = FP_OFF((Regs_Int far *) r); DD[id].ss = FP_SEG((Regs_Int far *) r); r->cs = FP_SEG(Tarea); r->ip = FP_OFF(Tarea); r->ds = _DS; r->es = _DS; r->flags = 0x20; DD[id].estado = READY; DD[id].DirSeg = FP_SEG(Tarea); DD[id].DirOff = FP_OFF(Tarea); inicializa_cola(id); } stack 0 SS SP ......... .......... IP CS FLAGS registros del CPU en stack (interrupcion) 1024 Dr. Pedro Mejia Alvarez