请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

cpu占用率问题

消费者sleep(10)的过程中,生产者会持续霸占着cpu,top命令是看到接近100%的。
不是很理解这里,场景1:
1、这是一个多核cpu,消费者对资源进行自旋锁加锁操作到解锁这一段过程中,它是不是也需要一个cpu来工作?同时生产者在等待锁的解开也会霸占着一个cpu?
2、如果是这样的话 为什么cpu占用率会差不多100%,这里的top命令查看的是单个cpu的利用率吗(生产者霸占的那个cpu)?
3、如果top命令查看的cpu是所有核数总的利用率,那生产者都已经霸占了几乎100%,消费者那边怎么办(它还没工作完)?好模糊,请老师解释一下

场景2:
1、单核cpu,不知道有没有理解错:单核cpu模拟出来的多个线程,线程A用于消费者,线程B用于生产者。消费者sleep(10)过程中,线程B霸占了唯一的那个cpu,线程A获取不到cpu不能完成消费者的任务,所以会一直卡死。(这就是自旋锁不适用单核cpu的原因吗?)

问题有点多麻烦老师解释一下哈谢谢

正在回答 回答被采纳积分+3

1回答

咚咚呛 2019-10-02 20:59:08

问题挺细,突然觉得慕课网的问答区也是非常好的,也可以帮助同学们解决这么细致的疑问。

  1. 加锁操作和等待解锁的操作需要CPU去执行,但是不会一直占用CPU,事实上,他们是通过其他机制去实现解锁操作的,我们称为通知机制,当sleep完成以后,操作系统会发出信号通知等待的生产者,生产者得到通知以后再去处理,不需要一直霸占CPU。

  2. 是的,当一个核被完全占满就是100%,如果有四个核,每个核都跑满的话,CPU的利用率就是400%。

  3. 和1一样,是通过通知机制去处理的,不会一直霸占。

  4. 这里有一句话说的很对,就是单核CPU模拟出多个线程,这个也是操作系统篇老师所介绍的操作系统的虚拟性,当一个线程卡住的时候,这个线程可以先调度出CPU,让其他CPU去执行。这里可以结合之前的内容重新理解一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 evahere #1
    但课程里面 说的 '自旋锁不会让出CPU,是一种忙等待' ,和老师上面回答的 ‘会让出cpu,让其他cpu去执行’不是矛盾的吗(还是不懂)
    回复 有任何疑惑可以回复我~ 2019-10-02 21:21:07
  • 咚咚呛 回复 提问者 evahere #2
    是的,自旋锁在工作过程中会一直占用CPU,但是不意味着等待锁操作完成也需要另外霸占一个CPU,你这里说的是生产者等待解锁也会占用一个CPU,这个是不对的。
    -----------
    2020.10.17更新:
    
    这里的回答有误,以前对问题的理解应该有些问题。自旋锁在工作过程中会一直占用CPU,因此生产者在等待自旋锁解锁的过程也是占用CPU的。而消费者在占用自旋锁操作资源的过程中,也是占用CPU的,也就是两个线程并行的在执行,所以两个线程都会占用CPU。
    回复 有任何疑惑可以回复我~ 2019-10-02 21:32:23
  • 提问者 evahere 回复 咚咚呛 #3
    原来是这样 谢谢
    回复 有任何疑惑可以回复我~ 2019-10-02 21:44:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信