Relación entre el planificador de IO y el progtwigdor de CPU / process?

Los conceptos del planificador IO y el progtwigdor de la CPU me confunden. A continuación están mi entendimiento:

  1. Linux usa el planificador de CFS + valores agradables de forma pnetworkingeterminada para progtwigr processs.
  2. Cada process tiene una queue IO.
  3. Hay un hilo del kernel del planificador IO.
  4. El planificador IO está en el nivel de bloque, no en el nivel de file.
  5. El progtwigdor IO es un module del sistema de files.

Preguntas:

¿Cuál es la relación entre el planificador de IO y el progtwigdor de la CPU? Conceptualmente, me parece que el progtwigdor de CPU es superior al progtwigdor de IO. La progtwigción de CPU ocurre primero. El progtwigdor IO es un subprocess en sí mismo y está sujeto a la progtwigción de la CPU.

Un escenario artificial se ve así:

Paso 1: el progtwigdor de la CPU selecciona un process P1 para ejecutar

Paso 2: P1 coloca las requestes de IO en su propia queue de IO

Paso 3+: el progtwigdor de la CPU selecciona otros hilos para ejecutar. (Suponiendo que ningún process tiene IO aparte de P1)

….(después de un time)

Paso n: el progtwigdor de la CPU selecciona el hilo del progtwigdor IO para que se ejecute.

Paso n + 1: 'Avisos' de hilos del progtwigdor de IO P1 tiene requestes de IO en queue y emite esas requestes al disco.

¿Tiene sentido mi entendimiento y el escenario?

Comencemos con el planificador IO primero. Hay un progtwigdor IO por dispositivo de bloque. Su trabajo es progtwigr (orderar) las requestes que se acumulan en la queue del dispositivo. Hay tres algorithms diferentes que se envían actualmente en el kernel de Linux: deadline , noop y cfq . cfq es el pnetworkingeterminado, y de acuerdo con su documento:

El planificador de E / S de CFQ intenta distribuir el ancho de banda por igual entre todos los processs del sistema. Debe proporcionar un entorno de trabajo de latencia justa y baja, adecuado para sistemas de escritorio y server

Puede configurar qué progtwigdor gobierna qué dispositivo a través del file de scheduler correspondiente a su dispositivo de bloque en /sys/ (Puede emitir el siguiente command para encontrarlo: find /sys | grep queue/scheduler ).

Lo que esa breve descripción no dice es que cfq es el único progtwigdor que mira el ioprio de un process. ioprio es una configuration que puede asignar al process, y el algorithm la tendrá en count al elegir una request antes que otra. ioprio se puede establecer a través de la utilidad ionice .

Luego, está el progtwigdor de tareas. Su trabajo es asignar las CPU entre los processs que están listos para ejecutarse . Tiene en count aspectos como la prioridad, la class y la bondad de un process de entrega, así como el time que ese process se ha ejecutado y otras heurísticas.

Ahora, a tus preguntas:

¿Cuál es la relación entre el planificador de IO y el progtwigdor de la CPU?

No mucho, además del nombre. Ellos progtwign diferentes resources compartidos. El primero ordera las requestes que van a los discos, y el segundo progtwig las 'requestes' (puede ver un process como solicitar time de CPU para poder ejecutar) a la CPU.

La progtwigción de CPU ocurre primero. El progtwigdor IO es un subprocess en sí mismo y está sujeto a la progtwigción de la CPU.

No sucede que el algorithm del planificador IO se ejecute según el process que esté haciendo queue en una request. Una buena forma de ver esto es observar los lockings que tienen elv_add_request() en su ruta. Por ejemplo :

  [...] [<c027fac4>] error_code+0x74/0x7c [<c019ed65>] elv_next_request+0x6b/0x116 [<e08335db>] scsi_request_fn+0x5e/0x26d [scsi_mod] [<c019ee6a>] elv_insert+0x5a/0x134 [<c019efc1>] __elv_add_request+0x7d/0x82 [<c019f0ab>] elv_add_request+0x16/0x1d [<e0e8d2ed>] pkt_generic_packet+0x107/0x133 [pktcdvd] [<e0e8d772>] pkt_get_disc_info+0x42/0x7b [pktcdvd] [<e0e8eae3>] pkt_open+0xbf/0xc56 [pktcdvd] [<c0168078>] do_open+0x7e/0x246 [<c01683df>] blkdev_open+0x28/0x51 [<c014a057>] __dentry_open+0xb5/0x160 [<c014a183>] nameidata_to_filp+0x27/0x37 [<c014a1c6>] do_filp_open+0x33/0x3b [<c014a211>] do_sys_open+0x43/0xc7 [<c014a2cd>] sys_open+0x1c/0x1e [<c0102b82>] sysenter_past_esp+0x5f/0x85 

Observe cómo el process ingresa al kernel llamando a open (), y esto termina involucrando el algorithm del elevador ( elv ).