Seleccionar principio de aplicación de función de análisis

  
 

select requiere soporte del controlador, el controlador implementa la función de sondeo en fops. Select determina si hay recursos disponibles (por ejemplo, legibles o de escritura) a través de la información proporcionada por la función de sondeo correspondiente a cada archivo de dispositivo, y si es así, devuelve la cantidad de descriptores de archivos de los recursos disponibles. Cuando está disponible, se activa y continúa ejecutándose.


El siguiente es un análisis de selección de dos procesos:


1. El proceso de suspensión de seleccionar


< Un controlador de dispositivo que admite operaciones de bloqueo normalmente implementa un conjunto de sus propias colas de espera, tales como colas de espera de lectura /escritura, para admitir las operaciones BLOQUEO o NON BLOQUEO requeridas por la capa superior (capa de usuario). Cuando la aplicación accede al dispositivo a través del controlador del dispositivo (el valor predeterminado es la operación BLOQUEAR), si el dispositivo actualmente no tiene datos para leer o escribir, el proceso del usuario se inserta en la cola de espera de lectura /escritura correspondiente al controlador del dispositivo para dejarlo dormir por un período de tiempo. Espere hasta que los datos se puedan leer /escribir y, a continuación, active el proceso.


select es un uso inteligente del mecanismo de cola de espera para permitir que el proceso de usuario se duerma correctamente cuando no hay recursos para leer /escribir, y para despertarse cuando el recurso es legible /escribible. Echemos un vistazo al proceso detallado de seleccionar el sueño.


selecciona bucles a través de la función de sondeo del controlador correspondiente a todos los descriptores de archivos en el fd_set que supervisa. La función de sondeo provista por el controlador primero inserta el proceso de usuario que llama a seleccionar en la cola de espera del recurso correspondiente del controlador del dispositivo (como la cola de lectura /escritura en espera), y luego devuelve una máscara de bits para indicar qué selección de los recursos actuales están disponibles. Cuando el bucle de selección atraviesa la función de sondeo correspondiente al descriptor de archivo especificado en todos los fd_sets, si no hay un recurso disponible (es decir, no hay ningún archivo disponible para la operación), la selección hace que el proceso se duerma, hasta que el recurso esté disponible, el proceso es El despertar (o tiempo de espera) continúa ejecutándose.


Después de analizar cómo se implementa el código.

La ruta de llamada de select es la siguiente: sys_select -> core_sys_select -> do_select

La función más importante es do_select, el trabajo principal está aquí, las dos primeras funciones principalmente hacen algunas Prepararse para el trabajo Do_select se define de la siguiente manera:

int do_select (int n, fd_set_bits * fds, s64 * timeout)

{

struct poll_wqueues table;

poll_table * wait;

int retval, i;


rcu_read_lock ();

retval = max_select_fd (n, fds);

rcu_read_unlock ();


if (retval < 0)

return retval;

n = retval;


poll_initwait (&table);

wait = &table.pt;

if (! * timeout)

wait = NULL;

retval = 0; //retval se usa para guardar el número de descriptores preparados, inicialmente 0

para (;;) {

long sin signo * rinp, * routp, * Rexp, * inp, * outp, * exp;

__timeout largo;


set_current_state (TASK_INTERRUPTIBLE); //Cambia el estado del proceso actual a TASK_INTERRUPTIBLE


inp = fds- > in; outp = fds- > out; exp = fds- > ex;

rinp = fds- > res_in; routp = fds- > res_out; rexp = fds- > res_ex;


para (i = 0; i < n; ++ rinp, ++ routp, ++ rexp) {//Recorra cada descriptor

sin signo largo dentro, fuera, ex, all_b Its, bit = 1, mask, j;

unsigned long res_in = 0, res_out = 0, res_ex = 0;

const struct file_operations * f_op = NULL;

Struct file * file = NULL;


in = * inp ++; out = * outp ++; ex = * exp ++;

all_bits = in

Copyright © Conocimiento de Windows All Rights Reserved