linux执行命令卡顿 linux卡顿( 三 )


# Linux内核能做到这种区分吗?
Linux可以通过计算一个进程的平均睡眠时间判定它是不是一个交互式IO进程,从而决定要不是给它一定的优先级提升,但是也仅能做到这个地步,因为Linux内核无法得到更进一步的信息 。
Linux内核不知道一个进程到底是不是IO进程还是说仅仅在一个时间段内有IO行为的CPU密集型进程,Linux内核也不知道一个进程被唤醒是因为键盘的数据到了,还是无关紧要的信号到了,所以这一切,Linux内核只能 启发式预测 。
Linux内核仅仅跟踪一个睡眠时间而且还是平均的睡眠时间,是区别不出进程当前的紧急性和重要性的 。没有外界的信息输入,仅靠启发预测 , 当前的AI算法貌似还没有到这个境界吧 。换句话说,启发算法是不准确的 。你看看Linux内核O(1) O(1)O(1)调度器的sleep_avg是如何计算并如何参与动态优先级调整的,就会明白我上面说的意思 。
既然Windows系统的GUI操作比Linux流畅 , 那么想必Windows肯定是做到了进程当前的紧急性和重要性的区分咯?那是当然 。它是如何做到的呢?
虽然Windows的调度器也是基于优先级的,也是抢占式的,也是同优先级轮转的,这看起来和Linux并没有什么区别 , 甚至从4.3BSD开始,几乎所有的操作系统的调度器基本都是按这个思路设计出来的,仅仅从 如何选出下一个投入运行的进程 这个算法上看,几乎所有的操作系统调度器都是一样的 。Windows与众不同的原因在于 其对优先级的不同处理方式 。
自4.3BSD以来 , 所有的基于优先级的抢占式调度器的优先级计算都包括两部分因子,即固有优先级和动态优先级:
一直以来,
只是起到了 微调 的作用,而
才更具有参考意义,其比重更大 。
Windows与众不同 , 其弱化了进程(其实应该是线程,但是我就统一写成进程吧,为了照顾不懂Windows内核原理的读者)的初始基优先级
【linux执行命令卡顿 linux卡顿】,而强化了动态优先级
,更重要的是,动态优先级的值并非来自预测 , 而是来自于 事件 ,事件本身的紧急性反馈到了动态优先级的值,而事件本身的重要性则反馈到了时间片:
可以看出,Windows对于不同的事件定义了不同的优先级提升的具体数值,将动态优先级的值和具体的事件做了精确的关联 。
这些数值的定义上,甚至精细而贴心 , 详细的数值参见ntddk.h:
//
// Priority increment definitions.The comment for each definition gives
// the names of the system services that use the definition when satisfying
// a wait.
//
//
// Priority increment used when satisfying a wait on an executive event
// (NtPulseEvent and NtSetEvent)
//
#define EVENT_INCREMENT1
//
// Priority increment when no I/O has been done.This is used by device
// and file system drivers when completing an IRP (IoCompleteRequest).
//
#define IO_NO_INCREMENT0
//
// Priority increment for completing CD-ROM I/O.This is used by CD-ROM device
// and file system drivers when completing an IRP (IoCompleteRequest)
//
#define IO_CD_ROM_INCREMENT1
//
// Priority increment for completing disk I/O.This is used by disk device
// and file system drivers when completing an IRP (IoCompleteRequest)
//
#define IO_DISK_INCREMENT1
//
// Priority increment for completing keyboard I/O.This is used by keyboard
// device drivers when completing an IRP (IoCompleteRequest)
//
#define IO_KEYBOARD_INCREMENT6
//
// Priority increment for completing mailslot I/O.This is used by the mail-

推荐阅读