现在多数都是“时间片轮转法”来进行调度的,为啥还能有线程一直占用或消耗大量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或者在等事件、等锁的任务是不可运行的,不参与轮转
推荐阅读
- OC为何跌出语言榜前十
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 为啥到现在你还没有女朋友 ?
- 天赐的声音|33岁张雨绮为啥总离婚?看过这些照片就明白了,都是性感惹得祸
- 白皮书一般是政府发布的正式报告或文件,那么现在物联网、智慧城市等热门领域这么多企业发布的白皮书算咋回事呢
- 汽车|现在即未来
- 孩子|现在远离还来得及当心!这三种光也会伤害宝宝视力
- 为啥魔兽世界部落的大酋长全都是兽人族
