在实践中,许多操作系统被设计成具有为每个线程一个内核堆栈,或者至少为每个CPU。但是对于内核在每次进程陷阱时被锁定的操作系统,似乎没有必要为每个CPU分离内核堆栈。由于内核(具有自己的堆栈)只允许单个CPU访问,所以CPU不应该同时处于内核模式。 CPU始终被阻塞,直到前一个CPU离开并清除内核堆栈,即使在嵌套陷阱情况下也是如此。那么在这种情况下,在这样的操作系统中是否需要多个内核堆栈呢?谢谢。为什么我们需要单独的内核栈为每个CPU
4
A
回答
4
你是对的;在这种情况下,只要具有可靠的多核心锁定功能,多个内核堆栈就不会有用。
我们通常拥有多个内核堆栈(即至少为每个线程一个内核堆栈)用于以下目的:
- 当你想能够拧你的内核和可中断,就像在微内核架构。
- 当您想要将线程从一个核心迁移到另一个核心时,例如进行负载平衡时。将CPU1的内核堆栈复制到CPU2的内核堆栈会很麻烦。毋庸置疑,它会成为性能杀手,因为你正在为此目的而冻结两个核心。
- 取决于底层架构上,具有多内核堆栈,使MMU事情变得更容易(AS管理,...)。
1
在实践中,许多操作系统不限制运行的内核级代码的线程数。事实上,放置这个限制会严重限制内核的可扩展性。没有这个限制,需要多个内核堆栈。
此外,在实践中,操作系统可以允许当前在内核模式,它再次栓内核栈给线程而不是处理器执行的线程的抢占和迁移。
如果你正在设计一个操作系统,不具备这些功能,而是限制了内核级执行到单个线程,那么单栈将所有需要。
相关问题
- 1. 为什么我们需要cudaDeviceSynchronize();在device-printf的内核中?
- 2. 为什么我们需要内核空间?
- 3. 为什么我们需要为每个线程使用NSAutoreleasepool?
- 4. 当我们有内核时,为什么我们需要驱动程序?
- 5. 为什么我们需要数据库表中的审核列?
- 6. 为什么我们需要.htaccess的worpdress?
- 7. 为什么我们需要Android项目的多个清单?
- 8. 为什么我们需要list_for_each_safe()来删除内核链表中的节点?
- 9. 为什么我们需要simple_one_for_one?
- 10. 为什么我们需要TensorFlow tf.Graph?
- 11. 为什么我们需要使用prompt.start()?
- 12. 为什么我们需要scalaz.stream迭代?
- 13. 为什么我们需要WCF
- 14. 为什么我们需要Anaconda 2.7?
- 15. 为什么我们需要编写log.isDebugEnabled?
- 16. 为什么我们需要ng-click?
- 17. 为什么我们需要Control.Lens.Reified?
- 18. 我们为什么需要纤维
- 19. 为什么我们需要org.junit.ComparisonFailure?
- 20. 为什么我们需要addRequestHeader方法?
- 21. 为什么我们需要时代?
- 22. 为什么我们需要ContinueWith方法?
- 23. 为什么我们需要Java NIO Selector?
- 24. 为什么我们需要使用ExitWindowsEx
- 25. 为什么我们需要包装类
- 26. 为什么我们需要在JavaScript
- 27. 为什么我们需要设置SONAR_RUNNER_OPTS?
- 28. 为什么我们需要ioc容器
- 29. mongodb为什么我们需要getSisterDB
- 30. 为什么我们需要BeginGetResponse和BeginRead?