Dentro del núcleo Linux 2.4 - Bottom Halves
Tutorial creado por Tigran Aivazian. Extraido de: http://es.tldp.org/Manuales-LuCAS/DENTRO-NUCLEO-LINUX/dentro-nucleo-linux-html/
14 de Febrero de 2006
Linux
15 - Bottom Halves
A veces es razonable partir la cantidad de trabajo para ser realizada dentro de un manejador de interrupciones en un trabajo inmediato (ej. agradecer la interrupción, actualizar las estadísticas, etc. ) y el trabajo que puede ser postpuesto para más tarde, cuando las interrupciones están habilitadas (ej, para realizar algún post-procesamiento sobre los datos, despertar a los procesos esperando por estos datos, etc).
Los bottom halves son el mecanismo más viejo para posponer la ejecución de una tarea del núcleo y están disponibles desde Linux 1.x. En Linux 2.0, un nuevo mecanismo fue añadido, llamado 'colas de tareas', las cuales serán el título de la siguiente sección.
Los bottom halves son serializados por el spinlock global_bh_lock, esto es, sólo puede haber un bottom half funcionando en cualquier CPU a la vez. De cualquier modo, cuando se intenta ejecutar el manejador, si no está disponible global_bh_lock, el bottom half es marcado (esto es planificado) para ejecución - por lo tanto el procesamiento puede continuar, en opuesto a un bucle ocupado en global_bh_lock.
Sólo puede haber 32 bottom halves registrados en total. Las funciones requeridas para manipular los bottom halves son las siguientes (todas exportadas a módulos);
Los bottom halves son tasklets globalmente cerrados, por lo tanto la pregunta "¿cúando es el manejador bottom half ejecutado?" es realmente "¿cuándo son los tasklets ejecutados?". Y la respuesta es, en dos sitios: a) en cada schedule() y b) en cada camino de retorno de interrupciones/llamadas al sistema en entry.S (POR HACER: entonces, el caso schedule() es realmente aburrido - parece añadir todavía otra interrupción muy muy lenta, ¿por qué no desembarazarse de la etiqueta handle_softirq de schedule() en su conjunto?).
Los bottom halves son el mecanismo más viejo para posponer la ejecución de una tarea del núcleo y están disponibles desde Linux 1.x. En Linux 2.0, un nuevo mecanismo fue añadido, llamado 'colas de tareas', las cuales serán el título de la siguiente sección.
Los bottom halves son serializados por el spinlock global_bh_lock, esto es, sólo puede haber un bottom half funcionando en cualquier CPU a la vez. De cualquier modo, cuando se intenta ejecutar el manejador, si no está disponible global_bh_lock, el bottom half es marcado (esto es planificado) para ejecución - por lo tanto el procesamiento puede continuar, en opuesto a un bucle ocupado en global_bh_lock.
Sólo puede haber 32 bottom halves registrados en total. Las funciones requeridas para manipular los bottom halves son las siguientes (todas exportadas a módulos);
- void init_bh(int nr, void (*routine)(void)): instala un manejador de bottom half apuntado por el argumento routine en el slot nr. El slot debe de estar numerado en include/linux/interrupt.h en la forma XXXX_BH, ej. TIMER_BH o TQUEUE_BH. Típicamente, una rutina de inicialización del subsistema (init_module() para los módulos) instala el bottom half requerido usando esta función.
- void remove_bh(int nr): hace lo opuesto de init_bh(), esto es, desinstala el bottom half instalado en el slot nr. No hay chequeos de errores realizados aquí, por lo tanto, como ejemplo remove_bh(32) rompe el sistema. Típicamente, una rutina de limpieza del subsistema (cleanup_module() para los módulos) usa esta función para liberar el slot, que puede ser reusado por algún otro subsistema. (POR HACER: ¿no sería bonito tener una lista /proc/bottom_halves con todos los bottom halves en el sistema? Esto significa que global_bh_lock deberían hacer lecturas/escrituras, obviamente).
- void mark_bh(int nr): marca el bottom half en el slot nr para ejecución. Típicamente, un manejador de interrupciones marcará este bottom half (¡de aquí el nombre!) para ejecución en un "tiempo seguro".
Los bottom halves son tasklets globalmente cerrados, por lo tanto la pregunta "¿cúando es el manejador bottom half ejecutado?" es realmente "¿cuándo son los tasklets ejecutados?". Y la respuesta es, en dos sitios: a) en cada schedule() y b) en cada camino de retorno de interrupciones/llamadas al sistema en entry.S (POR HACER: entonces, el caso schedule() es realmente aburrido - parece añadir todavía otra interrupción muy muy lenta, ¿por qué no desembarazarse de la etiqueta handle_softirq de schedule() en su conjunto?).
Valora este capítulo:
Autor y licencia de 'Dentro del núcleo Linux 2.4 - Bottom Halves'
|
Opiniona sobre 'Dentro del núcleo Linux 2.4 - Bottom Halves' (4)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Dentro del núcleo Linux 2.4 - Bottom Halves'
Este documento describe cómo hacer el enmascarado (masqueradinq), proxy transparente, reenvío de puertos (port forwarding),...
Más »
La fijación de precios está convirtiéndose en un modo de vida para muchos minoristas y...
Más »
En este documento se presenta la información acerca de la instalación, configuración, ejecución y mantenimiento...
Más »
Esta es la primerísima edición del Linux en Castellano COMO. La audiencia a la que...
Más »
Este documento pretende ser el punto de entrada de los hispanohablantes al mundo Linux, intentando...
Más »
