http://algo.ing.unimo.it/people/paolo/disk_sched/
https://lwn.net/Articles/601799/
tl;dr:
> CFQ separates each process's I/O requests into a separate queue, then rotates through the queues trying to divide the available bandwidth as fairly as it can.
> The BFQ I/O scheduler also maintains per-process queues of I/O requests, but it does away with the round-robin approach used by CFQ. Instead, it assigns an "I/O budget" to each process.