Você está na página 1de 7

dio de un S.O. Gestin de procesos.

Introduccin y Tabla de Pr
JuanCarlos PerezCortes

Estudio de un S.O. Gestin de procesos. Introduccin y Tabla de Procesos.

Table of Contents
Tema 8. Gestin de procesos..............................................................................................................................1
8.1 Introduccin.......................................................................................................................................1
8.2 Cambiado el contexto de memoria....................................................................................................2
8.3 Cambiando la pila y el puntero de instruccin...................................................................................2
8.4 El resto del cambio de contexto.........................................................................................................4
8.5 Resgistros de coma flotante y MMX.................................................................................................4

Tema 8. Gestin de procesos


Cambio de contexto.
Juan Carlos Prez y Sergio Sez
Juan Carlos Prez jcperez@disca.upv.es
Sergio Sez ssaez@disca.upv.es

8.1 Introduccin
El algoritmo de planificacin es el encargado de elegir, en un momento dado, el proceso ms
prioritario del sistema, de entre los que estn preparados para ejecucin.
Una vez se ha elegido el siguiente proceso que debe ejecutarse en la CPU, hay que ponerlo en
ejecucin, 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 tres
partes:
Al final de la funcin schedule()[kernel/sched.c#L664] se realizan los cambios relacionados
con la memoria.
En la macro switch_to()[include/asmi386/system.h#L16] se cambia el puntero de pila del
proceso (%esp) y el puntero de instruccin (%eip).
En la funcin __switch_to()[arch/i386/kernel/process.c#L679] se realizan el resto de los
cambios.

Llevando a cabo el cambio de contexto


Si el proceso candidato (el ms prioritario) no es el mismo que el ltimo proceso en ejecucin se producir un
cambio de contexto.
Se incrementa el nmero de cambios de contexto. Dato que se puede consultar en el fichero especial
/proc/stat.[#663]
prepare_to_switch()[include/asmi386/system.h#L15] es una funcin vaca en el i386. [#673]
En este bloque de cdigo se lleva a cabo el cambio de contexto del mapa de memoria. [#67491]
En la macro switch_to()[include/asmi386/system.h#L16] se cambia la pila y el contador de programa, y
se invoca a la funcin __switch_to()[arch/i386/kernel/process.c#L679]. [#697]
La funcin __switch_to()[arch/i386/kernel/process.c#L679] realiza el resto de los cambios.

Tema 8. Gestin de procesos

Estudio de un S.O. Gestin de procesos. Introduccin y Tabla de Procesos.

8.2 Cambiado el contexto de memoria


En la funcin schedule()[kernel/sched.c#L664] se cambia el contexto de memoria del viejo proceso por el
nuevo.
Se hace una copia local del siguiente mapa de memoria, mm[#675] y del mapa de memoria activo hasta
el momento, oldmm[#676].
Si el siguiente proceso no tiene mapa de memoria (un proceso del ncleo) entonces: [#677]
Si todava tiene un mapa de memoria activo, esto es un BUG (debera haberse desactivado en
las lneas 687690 la ltima vez que estuvo en la CPU). [#678]
El siguiente proceso no necesita un mapa de memoria, as pues se establece su mapa de
memoria activo (next>active_mm) al mapa activo hasta el momento (oldmm
prev>active_mm). [#679]
Se incrementa la cuenta de los procesos que estn usando el mapa de memoria activo. [#680]
Y se retrasa el proceso de propagar las modificaciones de la TLB de esta CPU, con la
funcin 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 funcin
switch_mm()[include/asmi386/mmu_context.h#L17]. [#684]
La funcin switch_mm()[include/asmi386/mmu_context.h#L17] cambia entre otras cosas el puntero
de la tabla de pginas (%cr3) [#45][include/asmi386/mmu_context.h#L44], si el nuevo mapa de
memoria es distinto del anterior.
Si el proceso que va a abandonar la CPU no tiene mapa de memoria (un proceso del ncleo) [#687], se
borra la referencia al mapa de memoria activo (prev>active_mm) [#688] y se invoca a la funcin
mmdrop()[include/linux/sched.h#L756][#689]. La funcin mmdrop() decrementa el contador de procesos
que estn utilizando el mapa de memoria, y si llega a cero, lo destruye con la funcin __mmdrop().

8.3 Cambiando la pila y el puntero de instruccin


La macro switch_to()[include/asmi386/system.h#L16] est en ensamblador y se encarga de cambiar el puntero
de pila y el puntero de instruccin del proceso actual al proceso siguiente.

8.2 Cambiado el contexto de memoria

Estudio de un S.O. Gestin de procesos. Introduccin y Tabla de Procesos.

Primero se salvan algunos registros del procesador en la pila (%esi, %edi y %ebp) que se
recuperar al final de la macro. [#179] y [#268]
Posteriormente se intercambian los punteros de pila del proceso antiguo y el nuevo proceso,
utilizando para ello la estructura thread de cada proceso. [#201] Este es uno de los puntos clave del
cambio de contexto, ya que aqu es donde la pila de prev, asociada a su entrada en la tabla de
procesos, deja de ser la pila del procesador, pasando a ocupar este papel la pila de next. De esta
forma, cuando se vuelva a cdigo de usuario, se restaurarn los registros que guard SAVE_ALL en
la pila cuando next salt a cdigo de ncleo.
Se establece la etiqueta 1 como direccin de retorno para el proceso que va a abandonar la CPU. [#22]
...
Se almacena la direccin de retorno del nuevo proceso en la pila para que se cargue en el registro
%eip con la instruccin ret al final de la funcin __switch_to(). [#23]
Se salta a la funcin __switch_to() para que lleve a cabo el resto del cambio de contexto.
Notese que al invocarse mediante una instruccin de salto no se almacenar la direccin de retorno
en la pila y, por lo tanto, se utilizar la almacenada en la lnea 22. [#24]
El resto de los parmetros de la directiva asm se utilizan para forzar al compilador a colocar los parmetros
de la macro switch_to en algunos registros especficos, utilizados por la funcin __switch_to().
prev en el registro %eax, next en el %edx. Adems se asegura que el valor que haba en prev se
almacena en el registro %ebx y posteriormente en el parmetro last.
Necesitamos el valor de prev despus del cambio de contexto, pero al haber cambiado la pila del
ncleo, el valor de prev no coincidira con el valor real, sino con el que fue prev cuando
next 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 al
final de la macro switch_to, es decir, se pasa el valor de prev almacenado en la pila del proceso
8.2 Cambiado el contexto de memoria

Estudio de un S.O. Gestin de procesos. Introduccin y Tabla de Procesos.


que va a dejar la CPU, a la variable representada por last en el contexto del nuevo proceso.
Adems, recurdese que los parmetros que se han pasado a la macro switch_to como parmetros
prev y last eran ambos la variable local prev de la funcin schedule(). De esta forma, se
copia 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 funcin __switch_to()[arch/i386/kernel/process.c#L679].
La funcin recibe los punteros al proceso previa, prev_p, y al proceso siguiente, next_p[#679]. A
partir de estos obtiene los punteros a la estructura thread de cada proceso, prev y next[#6812].
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. [#6967]
Carga los registros %fs y %gs con los valores de la estructura thread asociada al proceso
siguiente. [#7023]
Si hay informacin til en los registros de depuracin del siguiente proceso, estos se cargan en los
registros del procesador. [#70816]
Si alguno de los dos procesos tena acceso directo a los puesrtos de entrada/salida [#718], entonces:
Si el proceso siguiente tiene un mapa vlido de E/S, ste se copia en la TSS (io_bitmap) y
se hace que el desplazamiento bitmap apunte al campo io_bitmap. [#71930]
Si el proceso siguiente no tiene un mapa vlido de E/S, se hace que el campo
bitmap apunte a una posicin invlida, de forma que se lance una excepcin si se intenta
acceder a un puerto de E/S. Cualquier llamada posterior a sys_ioperm() pondr el campo
bitmap a un valor adecuado. [#738]

Recordemos que esta funcin se invoc mediante una instruccin de salto y que, por lo tanto, la direccin de
retorno que hay en la pila corresponde con el puntero de instruccin %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 eficiente
salvar y restaurar en cada cambio de contexto todos los registros FP y MMX. Para salvar estos
registros hay que utilizar la instruccin fnsave y para recargarlos frstor.
Justo antes del cambio de contexto, en __switch_to, se llama a la macro
unlazy_fpu()[include/asmi386/i387.h#L30], que comprueba si el bit PF_USEDFPU de los flags del
proceso anterior est activado y, si es as, guarda los registros de coma flotante/MMX en la tabla de
procesos.
Cuando se produce un cambio de contexto, se activa un bit de la palabra de estado (TS) que implica
que cualquier intento de realizar una operacin matemtica (FP o MMX) generar una excepcin.
Slo si se ejecuta el manejador de esta excepcin,
8.4 El resto del cambio de contexto

Estudio de un S.O. Gestin de procesos. Introduccin y Tabla de Procesos.


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

8.4 El resto del cambio de contexto

Você também pode gostar