PLUG/UNPLUG即蓄流/泄流,蓄流的目的是为了提高bio在elevator queue合并和排序的机会,以提高 IO效率。
PLUG/UNPLUG对应blk_start_plug()和blk_finish_plug()两个函数,blk_start_plug()很简单,仅仅做了初始化:
plug主要是在blk_queue_bio()里完成,bio先尝试merge,merge try的顺序是先plug list然后elevator queue,因为对于文件里一段连续的数据在磁盘上分配的多个块很可能是相邻或相近的;当bio不能merge时就分配一个request并加入plug list。当plug list里的request超过BLK_MAX_REQUEST_COUNT时会提前进行泄流:
当一次用户读写请求的bio plug完之后,会调用blk_finish_plug()进行unplug:将plug list里的request再次尝试与elevator queue进行merge,不能merge再添加到elevator queue;plug list处理完之后再将elevator queue的request往块设备分发(queue_unplugged())。
当进程因等待某个资源而切换出运行队列时(schedule()或io_schedule()),会提前unplug: