现在多数都是“时间片轮转法”来进行调度的,为啥还能有线程一直占用或消耗大量cpu时间呢

谢邀。简单答一下,可能有误,欢迎指正。
【现在多数都是“时间片轮转法”来进行调度的,为啥还能有线程一直占用或消耗大量cpu时间呢】 不严谨的说,cpu使用率是指执行线程(这里只内核的一个独立调度单元)在所有线程中占用cpu时间的比率。你用top看到的系统cpu使用不高,说明大部分时间都消耗在内核idle线程了。这个线程负责使cpu进入低功耗状态,比如使用x86的halt指令等。而其他线程并没有cpu消耗型的任务。如果没有这个idle线程,即便没有cpu消耗型的任务,用不了多久,你的cpu可能也可以煮鸡蛋了。从电源管理的角度讲,操作系统内核的一个重要功能就是要保证在没有cpu消耗型的线程运行时,尽量不消耗资源。可以做个试验,从内核里去掉idle线程看看效果(说不定哪天我就做了,看心情和时间)。想象一下,其实正常的桌面里,大部分程序都是事件驱动型的。比如等待鼠标移动,等待用户键盘输入等。在等待时,基本上是不消耗cpu的。只有外部事件发生时,才会被中断唤醒。一旦有外部事件到达cpu(中断),就会触发调度。不管哪种调度,如果当前系统没有其他cpu intensive的线程,就不会计算他们的cpu时间。那么就会很快重新调度回之前的线程,于是又会继续消耗cpu,指导它的时间片消耗完。于是从外部看,这个线程一直保持着高CPU使用率。但是,这并不影响系统的响应速度。一个好的调度系统(算法),会保证即便在这种情况下,也能够很迅速的对外部事件作出响应。所以,消不消耗cpu,跟时间片轮转调度没啥太大关系。事实上,许多优先级调度算法都有关于时间片的计算包含其中。
PS:现代内核里的idle线程功能远不止降低功能那么简单。不过,你要是从https://elixir.bootlin.com/linux/latest/source/kernel/sched/idle.c的default_idle_call函数追下去,最后总能看到sti; hlt指令。

■网友
把一袋猫粮给一只猫,和十只猫,对猫粮来说都是一样的。就是说不论你怎么管理十只猫,比如每只猫只吃两口就让其它猫吃,或者让某只猫多吃,对猫粮来说这不重要,它的生命长短取决于有没有猫在吃,这就是cpu高的原因,因为有几只特别饥饿的猫,而和时间片或优先级没关系

■网友
因为Linux现在主要是用的调度器是Completely Fair Scheduler(CFS),在这个调度器下,可以使用100%的CPU。实际的调度器往往是多个调度算法的结合,时间片轮转法更适用于嵌入式设备上简单的操作系统。现在还研究这个的人很稀少了。

■网友
看了下freebsd的源码,进程超过100ms后会被强制换出,添加到运行队列。如果队列里没有优先级比它高的或者其他进程都睡眠了,那他就又换回来执行了。

■网友
时间片是在可运行的任务之间轮转阻塞在IO或者在等事件、等锁的任务是不可运行的,不参与轮转


    推荐阅读