7
dio de un S.O. Gestión de procesos. Introducción y Tabla de Pr Juan-Carlos Perez-Cortes

08-3-gestion-de-procesos

Embed Size (px)

DESCRIPTION

tema asignatura eso

Citation preview

Page 1: 08-3-gestion-de-procesos

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos. Juan−Carlos Perez−Cortes

Page 2: 08-3-gestion-de-procesos

Table of Contents

Tema 8. Gestión de procesos..............................................................................................................................18.1 Introducción.......................................................................................................................................18.2 Cambiado el contexto de memoria....................................................................................................28.3 Cambiando la pila y el puntero de instrucción...................................................................................28.4 El resto del cambio de contexto.........................................................................................................48.5 Resgistros de coma flotante y MMX.................................................................................................4

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos.

i

Page 3: 08-3-gestion-de-procesos

Tema 8. Gestión de procesos

Cambio de contexto. Juan Carlos Pérez y Sergio Sáez

Juan Carlos PérezSergio Sáez

[email protected]@disca.upv.es

8.1 Introducción

• El algoritmo de planificación es el encargado de elegir, en un momento dado, el proceso másprioritario del sistema, de entre los que están preparados para ejecución.

• Una vez se ha elegido el siguiente proceso que debe ejecutarse en la CPU, hay que ponerlo enejecución, sustituyendo al proceso actual. Este proceso se denomina cambio de contexto.

• El cambio de contexto se lleva a cabo, una vez se ha elegido el siguiente proceso a ejecutar, en trespartes:

♦ Al final de la función schedule()[kernel/sched.c#L664] se realizan los cambios relacionadoscon la memoria.

♦ En la macro switch_to()[include/asm−i386/system.h#L16] se cambia el puntero de pila delproceso (%esp) y el puntero de instrucción (%eip).

♦ En la función __switch_to()[arch/i386/kernel/process.c#L679] se realizan el resto de loscambios.

Llevando a cabo el cambio de contexto

Si el proceso candidato (el más prioritario) no es el mismo que el último proceso en ejecución se producirá uncambio de contexto.

• Se incrementa el número de cambios de contexto. Dato que se puede consultar en el fichero especial/proc/stat.[#663]

• prepare_to_switch()[include/asm−i386/system.h#L15] es una función vacía en el i386. [#673]

• En este bloque de código se lleva a cabo el cambio de contexto del mapa de memoria. [#674−91]

• En la macro switch_to()[include/asm−i386/system.h#L16] se cambia la pila y el contador de programa, yse invoca a la función __switch_to()[arch/i386/kernel/process.c#L679]. [#697]

• La función __switch_to()[arch/i386/kernel/process.c#L679] realiza el resto de los cambios.

Tema 8. Gestión de procesos 1

Page 4: 08-3-gestion-de-procesos

8.2 Cambiado el contexto de memoria

En la función schedule()[kernel/sched.c#L664] se cambia el contexto de memoria del viejo proceso por elnuevo.

• Se hace una copia local del siguiente mapa de memoria, mm[#675] y del mapa de memoria activo hastael momento, oldmm[#676].

• Si el siguiente proceso no tiene mapa de memoria (un proceso del núcleo) entonces: [#677]

♦ Si todavía tiene un mapa de memoria activo, esto es un BUG (debería haberse desactivado enlas líneas 687−690 la última vez que estuvo en la CPU). [#678]

♦ El siguiente proceso no necesita un mapa de memoria, así pues se establece su mapa dememoria activo (next−>active_mm) al mapa activo hasta el momento (oldmm prev−>active_mm). [#679]

♦ Se incrementa la cuenta de los procesos que están usando el mapa de memoria activo. [#680]

♦ Y se retrasa el proceso de propagar las modificaciones de la TLB de esta CPU, con lafunción enter_lazy_tlb(). No hace nada en modo uniprocesador.[#681]

• Si el siguiente proceso tiene un mapa de memoria (un proceso de usuario) entonces:

♦ Si el mapa de memoria es distinto de su mapa de memoria activo eso es un BUG. [#683]

♦ Se cambia el mapa de memoria activo por el del nuevo proceso invocando a la funciónswitch_mm()[include/asm−i386/mmu_context.h#L17]. [#684]

♦ La función switch_mm()[include/asm−i386/mmu_context.h#L17] cambia entre otras cosas el punterode la tabla de páginas (%cr3) [#45][include/asm−i386/mmu_context.h#L44], si el nuevo mapa dememoria es distinto del anterior.

• Si el proceso que va a abandonar la CPU no tiene mapa de memoria (un proceso del núcleo) [#687], seborra la referencia al mapa de memoria activo (prev−>active_mm) [#688] y se invoca a la funciónmmdrop()[include/linux/sched.h#L756][#689]. La función mmdrop() decrementa el contador de procesosque están utilizando el mapa de memoria, y si llega a cero, lo destruye con la función __mmdrop().

8.3 Cambiando la pila y el puntero de instrucción

La macro switch_to()[include/asm−i386/system.h#L16] está en ensamblador y se encarga de cambiar el punterode pila y el puntero de instrucción del proceso actual al proceso siguiente.

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos.

8.2 Cambiado el contexto de memoria 2

Page 5: 08-3-gestion-de-procesos

• Primero se salvan algunos registros del procesador en la pila (%esi, %edi y %ebp) que serecuperará al final de la macro. [#17−9] y [#26−8]

• Posteriormente se intercambian los punteros de pila del proceso antiguo y el nuevo proceso,utilizando para ello la estructura thread de cada proceso. [#20−1] Este es uno de los puntos clave delcambio de contexto, ya que aquí es donde la pila de prev, asociada a su entrada en la tabla deprocesos, deja de ser la pila del procesador, pasando a ocupar este papel la pila de next. De estaforma, cuando se vuelva a código de usuario, se restaurarán los registros que guardó SAVE_ALL enla pila cuando next saltó a código de núcleo.

• Se establece la etiqueta 1 como dirección de retorno para el proceso que va a abandonar la CPU. [#22]

• ...

• Se almacena la dirección de retorno del nuevo proceso en la pila para que se cargue en el registro%eip con la instrucción ret al final de la función __switch_to(). [#23]

• Se salta a la función __switch_to() para que lleve a cabo el resto del cambio de contexto.Notese que al invocarse mediante una instrucción de salto no se almacenará la dirección de retornoen la pila y, por lo tanto, se utilizará la almacenada en la línea 22. [#24]

El resto de los parámetros de la directiva asm se utilizan para forzar al compilador a colocar los parámetrosde la macro switch_to en algunos registros específicos, utilizados por la función __switch_to().

• prev en el registro %eax, next en el %edx. Además se asegura que el valor que había en prev sealmacena en el registro %ebx y posteriormente en el parámetro last.

Necesitamos el valor de prev después del cambio de contexto, pero al haber cambiado la pila delnúcleo, el valor de prev no coincidiría con el valor real, sino con el que fue prev cuandonext adquirio la CPU por última vez.

Para solventar este problema se fuerza al compilador a que el valor que hay en prev este en last alfinal de la macro switch_to, es decir, se pasa el valor de prev almacenado en la pila del proceso

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos.

8.2 Cambiado el contexto de memoria 3

Page 6: 08-3-gestion-de-procesos

que va a dejar la CPU, a la variable representada por last en el contexto del nuevo proceso.

Además, recuérdese que los parámetros que se han pasado a la macro switch_to como parámetrosprev y last eran ambos la variable local prev de la función schedule(). De esta forma, secopia el contenido de la variable prev de la pila de un proceso a la pila del otro. Sencillo, ¿verdad?.

8.4 El resto del cambio de contexto

El resto del cambio de contexto se realiza en la función __switch_to()[arch/i386/kernel/process.c#L679].

• La función recibe los punteros al proceso previa, prev_p, y al proceso siguiente, next_p[#679]. Apartir de estos obtiene los punteros a la estructura thread de cada proceso, prev y next[#681−2].

• Obtiene el puntero a la TSS asociada a esta CPU. [#683]

• Comprueba si el proceso ha utilizado la unidad de coma flotante. [#685]

• Copia el puntero de pila de anillo cero del siguiente proceso en la TSS asociada a este procesador.[#690]

• Salva los registros %fs y %gs en la estructura thread asociada al proceso anterior. [#696−7]

• Carga los registros %fs y %gs con los valores de la estructura thread asociada al procesosiguiente. [#702−3]

• Si hay información útil en los registros de depuración del siguiente proceso, estos se cargan en losregistros del procesador. [#708−16]

• Si alguno de los dos procesos tenía acceso directo a los puesrtos de entrada/salida [#718], entonces:

♦ Si el proceso siguiente tiene un mapa válido de E/S, éste se copia en la TSS (io_bitmap) yse hace que el desplazamiento bitmap apunte al campo io_bitmap. [#719−30]

♦ Si el proceso siguiente no tiene un mapa válido de E/S, se hace que el campobitmap apunte a una posición inválida, de forma que se lance una excepción si se intentaacceder a un puerto de E/S. Cualquier llamada posterior a sys_ioperm() pondrá el campobitmap a un valor adecuado. [#738]

Recordemos que esta función se invocó mediante una instrucción de salto y que, por lo tanto, la dirección deretorno que hay en la pila corresponde con el puntero de instrucción %eip del siguiente proceso.

8.5 Resgistros de coma flotante y MMX

• Como normalmente los procesos no usan instrucciones de coma flotante o MMX, es poco eficientesalvar y restaurar en cada cambio de contexto todos los registros FP y MMX. Para salvar estosregistros hay que utilizar la instrucción fnsave y para recargarlos frstor.

• Justo antes del cambio de contexto, en __switch_to, se llama a la macrounlazy_fpu()[include/asm−i386/i387.h#L30], que comprueba si el bit PF_USEDFPU de los flags delproceso anterior está activado y, si es así, guarda los registros de coma flotante/MMX en la tabla deprocesos.

• Cuando se produce un cambio de contexto, se activa un bit de la palabra de estado (TS) que implicaque cualquier intento de realizar una operación matemática (FP o MMX) generará una excepción.Sólo si se ejecuta el manejador de esta excepción,

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos.

8.4 El resto del cambio de contexto 4

Page 7: 08-3-gestion-de-procesos

math_state_restore()[arch/i386/kernel/traps.c#L698], se restaurarán los registros de coma flotantedel proceso en la CPU y se activará el bit PF_USEDFPU.

Estudio de un S.O. Gestión de procesos. Introducción y Tabla de Procesos.

8.4 El resto del cambio de contexto 5